45 inline float squared(
float x) {
return x*x; }
49 int faceid,
float u,
float v,
50 float uw1,
float vw1,
float uw2,
float vw2,
51 float width,
float blur)
54 if (!
_tx || nChannels <= 0)
return;
55 if (faceid < 0 || faceid >=
_tx->
numFaces())
return;
95 for (
int i = 0; i <
_nchan; i++) result[i] =
float(
_result[i] * scale);
104 float uw1,
float vw1,
float uw2,
float vw2,
105 float width,
float blur,
Res faceRes)
107 const float sqrt3 = 1.7320508075688772f;
110 float scaleAC = 0.25f * width*width;
111 float scaleB = -2.0f * scaleAC;
112 float A = (vw1*vw1 + vw2*vw2) * scaleAC;
113 float B = (uw1*vw1 + uw2*vw2) * scaleB;
114 float C = (uw1*uw1 + uw2*uw2) * scaleAC;
117 float Ac = 0.75f * A;
118 float Bc = float(sqrt3/2) * (B-A);
119 float Cc = 0.25f * A - 0.5f * B +
C;
122 const float maxEcc = 15.0f;
123 const float eccRatio = (maxEcc*maxEcc + 1.0f) / (maxEcc*maxEcc - 1.0f);
124 float X = sqrtf(squared(Ac - Cc) + squared(Bc));
125 float b_e = 0.5f * (eccRatio * X - (Ac + Cc));
129 float b_t = squared(0.5f / (
float)faceRes.
u());
132 float b_b = 0.25f * blur * blur;
138 float m = sqrtf(2.0f*(Ac*Cc - 0.25f*Bc*Bc) / (Ac + Cc + X));
144 A = float(4/3.0) * Ac;
145 B = float(2/sqrt3) * Bc + A;
146 C = -0.25f * A + 0.5f * B + Cc;
160 float w = 1.0f - u - v;
161 k.
set(
Res((int8_t)reslog2, (int8_t)reslog2), u, v, u-uw, v-vw, w-ww, u+uw, v+vw, w+ww, A, B, C);
227 int tileresu = tileres.
u();
228 int tileresv = tileres.
v();
231 int wOffsetBase = k.
rowlen - tileresu;
232 for (
int tilev = k.
v1 / tileresv, tilevEnd = (k.
v2-1) / tileresv; tilev <= tilevEnd; tilev++) {
233 int vOffset = tilev * tileresv;
234 kt.
v = k.
v - (float)vOffset;
237 for (
int tileu = k.
u1 / tileresu, tileuEnd = (k.
u2-1) / tileresu; tileu <= tileuEnd; tileu++) {
238 int uOffset = tileu * tileresu;
239 int wOffset = wOffsetBase - uOffset - vOffset;
240 kt.
u = k.
u - (float)uOffset;
243 kt.
w1 = k.
w1 - wOffset;
244 kt.
w2 = k.
w2 - wOffset;
248 if (th->isConstant())
void apply(PtexTriangleKernel &k, int faceid, const Ptex::FaceInfo &f)
int adjface(int eid) const
Access an adjacent face id. The eid value must be 0..3.
virtual int numChannels()=0
Number of channels stored in file.
void applyConst(float *dst, void *data, DataType dt, int nChan)
void splitU(PtexTriangleKernel &ka)
static int DataSize(DataType dt)
Look up size of given data type (in bytes).
void apply(float *dst, void *data, DataType dt, int nChan, int nTxChan)
void splitV(PtexTriangleKernel &ka)
void buildKernel(PtexTriangleKernel &k, float u, float v, float uw1, float vw1, float uw2, float vw2, float width, float blur, Res faceRes)
void reorient(int eid, int aeid)
Triangle filter kernel iterator (in texel coords)
bool isNeighborhoodConstant() const
Determine if neighborhood of face is constant (by checking a flag).
void splitAndApply(PtexTriangleKernel &k, int faceid, const Ptex::FaceInfo &f)
int v() const
V resolution in texels.
static float OneValue(DataType dt)
Look up value of given data type that corresponds to the normalized value of 1.0. ...
Per-face texture data accessor.
int u() const
U resolution in texels.
virtual void * getData()=0
Access the data from this data block.
static T clamp(T x, T lo, T hi)
virtual PtexFaceData * getTile(int tile)=0
Access a tile from the data block.
virtual void getData(int faceid, void *buffer, int stride)=0
Access texture data for a face at highest-resolution.
static int calcResFromWidth(float w)
virtual int numFaces()=0
Number of faces stored in file.
Triangle filter kernel (in normalized triangle coords)
void set(Res resVal, float uVal, float vVal, float u1Val, float v1Val, float w1Val, float u2Val, float v2Val, float w2Val, float AVal, float BVal, float CVal)
EdgeId adjedge(int eid) const
Access an adjacent edge id. The eid value must be 0..3.
virtual Ptex::DataType dataType()=0
Type of data stored in file.
void getIterators(PtexTriangleKernelIter &ke, PtexTriangleKernelIter &ko)
Smart-pointer for acquiring and releasing API objects.
virtual bool isTiled()=0
True if this data block is tiled.
virtual bool isConstant()=0
True if this data block is constant.
Pixel resolution of a given texture.
void applyAcrossEdge(PtexTriangleKernel &k, const Ptex::FaceInfo &f, int eid)
Res res
Resolution of face.
static const float PtexTriangleKernelWidth
Information about a face, as stored in the Ptex file header.
virtual void eval(float *result, int firstchan, int nchannels, int faceid, float u, float v, float uw1, float vw1, float uw2, float vw2, float width, float blur)
Apply filter to a ptex data file.
static void ConvertToFloat(float *dst, const void *src, Ptex::DataType dt, int numChannels)
Convert a number of data values from the given data type to float.
virtual const Ptex::FaceInfo & getFaceInfo(int faceid)=0
Access resolution and adjacency information about a face.
void applyIter(PtexTriangleKernelIter &k, PtexFaceData *dh)
void splitW(PtexTriangleKernel &ka)
virtual Ptex::Res tileRes()=0
Resolution of each tile in this data block.