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.