25 #ifndef OPENSUBDIV3_FAR_PATCH_PARAM_H
26 #define OPENSUBDIV3_FAR_PATCH_PARAM_H
28 #include "../version.h"
30 #include "../far/types.h"
32 namespace OpenSubdiv {
33 namespace OPENSUBDIV_VERSION {
168 void Set(
Index faceid,
short u,
short v,
169 unsigned short depth,
bool nonquad,
170 unsigned short boundary,
unsigned short transition,
171 bool regular =
false);
181 unsigned short GetU()
const {
return (
unsigned short)unpack(
field1,10,22); }
185 unsigned short GetV()
const {
return (
unsigned short)unpack(
field1,10,12); }
208 template <
typename REAL>
209 void Normalize( REAL & u, REAL & v )
const;
210 template <
typename REAL>
219 template <
typename REAL>
221 template <
typename REAL>
234 unsigned int pack(
unsigned int value,
int width,
int offset)
const {
235 return (
unsigned int)((value & ((1<<width)-1)) << offset);
238 unsigned int unpack(
unsigned int value,
int width,
int offset)
const {
239 return (
unsigned int)((value >> offset) & ((1<<width)-1));
250 unsigned short depth,
bool nonquad,
251 unsigned short boundary,
unsigned short transition,
253 field0 = pack(faceid, 28, 0) |
254 pack(transition, 4, 28);
256 field1 = pack(u, 10, 22) |
258 pack(boundary, 5, 7) |
259 pack(regular, 1, 5) |
260 pack(nonquad, 1, 4) |
269 template <
typename REAL>
275 u = u * fracInv - (REAL)
GetU();
276 v = v * fracInv - (REAL)
GetV();
279 template <
typename REAL>
285 u = (u + (REAL)
GetU()) * frac;
286 v = (v + (REAL)
GetV()) * frac;
295 template <
typename REAL>
303 u = (REAL)(depthFactor -
GetU()) - (u * fracInv);
304 v = (REAL)(depthFactor -
GetV()) - (v * fracInv);
310 template <
typename REAL>
318 u = ((REAL)(depthFactor -
GetU()) - u) * frac;
319 v = ((REAL)(depthFactor -
GetV()) - v) * frac;
328 using namespace OPENSUBDIV_VERSION;
float GetParamFraction() const
Returns the fraction of unit parametric space covered by this face.
void Normalize(REAL &u, REAL &v) const
A (u,v) pair in the fraction of parametric space covered by this face is mapped into a normalized par...
unsigned short GetBoundary() const
Returns the boundary edge encoding for the patch.
unsigned short GetDepth() const
Returns the level of subdivision of the patch.
void Unnormalize(REAL &u, REAL &v) const
A (u,v) pair in a normalized parametric space is mapped back into the fraction of parametric space co...
void UnnormalizeTriangle(REAL &u, REAL &v) const
Vtr::Array< PatchParam > PatchParamArray
void NormalizeTriangle(REAL &u, REAL &v) const
unsigned short GetU() const
Returns the log2 value of the u parameter at the first corner of the patch.
unsigned short GetV() const
Returns the log2 value of the v parameter at the first corner of the patch.
bool NonQuadRoot() const
True if the parent base face is a non-quad.
std::vector< PatchParam > PatchParamTable
Index GetFaceId() const
Returns the faceid.
unsigned short GetTransition() const
Returns the transition edge encoding for the patch.
bool IsRegular() const
Returns whether the patch is regular.
bool IsTriangleRotated() const
Returns if a triangular patch is parametrically rotated 180 degrees.
void Set(Index faceid, short u, short v, unsigned short depth, bool nonquad, unsigned short boundary, unsigned short transition, bool regular=false)
Sets the values of the bit fields.
void Clear()
Resets everything to 0.
Vtr::ConstArray< PatchParam > ConstPatchParamArray