OpenSubdiv
Toggle main menu visibility
Loading...
Searching...
No Matches
patchParam.h
Go to the documentation of this file.
1
//
2
// Copyright 2013 Pixar
3
//
4
// Licensed under the terms set forth in the LICENSE.txt file available at
5
// https://opensubdiv.org/license.
6
//
7
8
#ifndef OPENSUBDIV3_FAR_PATCH_PARAM_H
9
#define OPENSUBDIV3_FAR_PATCH_PARAM_H
10
11
#include "../version.h"
12
13
#include "
../far/types.h
"
14
15
namespace
OpenSubdiv
{
16
namespace
OPENSUBDIV_VERSION
{
17
18
namespace
Far
{
19
84
134
135
struct
PatchParam
{
151
void
Set
(
Index
faceid,
short
u,
short
v,
152
unsigned
short
depth,
bool
nonquad,
153
unsigned
short
boundary,
unsigned
short
transition,
154
bool
regular =
false
);
155
157
void
Clear
() {
field0
=
field1
= 0; }
158
160
Index
GetFaceId
()
const
{
return
Index
(unpack(
field0
,28,0)); }
161
164
unsigned
short
GetU
()
const
{
return
(
unsigned
short
)unpack(
field1
,10,22); }
165
168
unsigned
short
GetV
()
const
{
return
(
unsigned
short
)unpack(
field1
,10,12); }
169
171
unsigned
short
GetTransition
()
const
{
return
(
unsigned
short
)unpack(
field0
,4,28); }
172
174
unsigned
short
GetBoundary
()
const
{
return
(
unsigned
short
)unpack(
field1
,5,7); }
175
177
bool
NonQuadRoot
()
const
{
return
(unpack(
field1
,1,4) != 0); }
178
180
unsigned
short
GetDepth
()
const
{
return
(
unsigned
short
)unpack(
field1
,4,0); }
181
183
float
GetParamFraction
()
const
;
184
191
template
<
typename
REAL>
192
void
Normalize
( REAL & u, REAL & v )
const
;
193
template
<
typename
REAL>
194
void
NormalizeTriangle
( REAL & u, REAL & v )
const
;
195
202
template
<
typename
REAL>
203
void
Unnormalize
( REAL & u, REAL & v )
const
;
204
template
<
typename
REAL>
205
void
UnnormalizeTriangle
( REAL & u, REAL & v )
const
;
206
208
bool
IsTriangleRotated
()
const
;
209
211
bool
IsRegular
()
const
{
return
(unpack(
field1
,1,5) != 0); }
212
213
unsigned
int
field0
:32;
214
unsigned
int
field1
:32;
215
216
private
:
217
unsigned
int
pack(
unsigned
int
value,
int
width,
int
offset)
const
{
218
return
(
unsigned
int
)((value & ((1<<width)-1)) << offset);
219
}
220
221
unsigned
int
unpack(
unsigned
int
value,
int
width,
int
offset)
const
{
222
return
(
unsigned
int
)((value >> offset) & ((1<<width)-1));
223
}
224
};
225
226
typedef
std::vector<PatchParam>
PatchParamTable
;
227
228
typedef
Vtr::Array<PatchParam>
PatchParamArray
;
229
typedef
Vtr::ConstArray<PatchParam>
ConstPatchParamArray
;
230
231
inline
void
232
PatchParam::Set
(
Index
faceid,
short
u,
short
v,
233
unsigned
short
depth,
bool
nonquad,
234
unsigned
short
boundary,
unsigned
short
transition,
235
bool
regular) {
236
field0
= pack(faceid, 28, 0) |
237
pack(transition, 4, 28);
238
239
field1
= pack(u, 10, 22) |
240
pack(v, 10, 12) |
241
pack(boundary, 5, 7) |
242
pack(regular, 1, 5) |
243
pack(nonquad, 1, 4) |
244
pack(depth, 4, 0);
245
}
246
247
inline
float
248
PatchParam::GetParamFraction
( )
const
{
249
return
1.0f / (float)(1 << (
GetDepth
() -
NonQuadRoot
()));
250
}
251
252
template
<
typename
REAL>
253
inline
void
254
PatchParam::Normalize
( REAL & u, REAL & v )
const
{
255
256
REAL fracInv = (REAL)(1.0f /
GetParamFraction
());
257
258
u = u * fracInv - (REAL)
GetU
();
259
v = v * fracInv - (REAL)
GetV
();
260
}
261
262
template
<
typename
REAL>
263
inline
void
264
PatchParam::Unnormalize
( REAL & u, REAL & v )
const
{
265
266
REAL frac = (REAL)
GetParamFraction
();
267
268
u = (u + (REAL)
GetU
()) * frac;
269
v = (v + (REAL)
GetV
()) * frac;
270
}
271
272
inline
bool
273
PatchParam::IsTriangleRotated
()
const
{
274
275
return
(
GetU
() +
GetV
()) >= (1 <<
GetDepth
());
276
}
277
278
template
<
typename
REAL>
279
inline
void
280
PatchParam::NormalizeTriangle
( REAL & u, REAL & v )
const
{
281
282
if
(
IsTriangleRotated
()) {
283
REAL fracInv = (REAL)(1.0f /
GetParamFraction
());
284
285
int
depthFactor = 1 <<
GetDepth
();
286
u = (REAL)(depthFactor -
GetU
()) - (u * fracInv);
287
v = (REAL)(depthFactor -
GetV
()) - (v * fracInv);
288
}
else
{
289
Normalize
(u, v);
290
}
291
}
292
293
template
<
typename
REAL>
294
inline
void
295
PatchParam::UnnormalizeTriangle
( REAL & u, REAL & v )
const
{
296
297
if
(
IsTriangleRotated
()) {
298
REAL frac =
GetParamFraction
();
299
300
int
depthFactor = 1 <<
GetDepth
();
301
u = ((REAL)(depthFactor -
GetU
()) - u) * frac;
302
v = ((REAL)(depthFactor -
GetV
()) - v) * frac;
303
}
else
{
304
Unnormalize
(u, v);
305
}
306
}
307
308
}
// end namespace Far
309
310
}
// end namespace OPENSUBDIV_VERSION
311
using namespace
OPENSUBDIV_VERSION
;
312
313
}
// end namespace OpenSubdiv
314
315
#endif
/* OPENSUBDIV3_FAR_PATCH_PARAM */
OpenSubdiv
Definition
limits.h:15
OpenSubdiv::OPENSUBDIV_VERSION
Definition
limits.h:16
OpenSubdiv::OPENSUBDIV_VERSION::Far
Definition
refinerSurfaceFactory.h:19
OpenSubdiv::OPENSUBDIV_VERSION::Far::ConstPatchParamArray
Vtr::ConstArray< PatchParam > ConstPatchParamArray
Definition
patchParam.h:229
OpenSubdiv::OPENSUBDIV_VERSION::Far::PatchParamTable
std::vector< PatchParam > PatchParamTable
Definition
patchParam.h:226
OpenSubdiv::OPENSUBDIV_VERSION::Far::Index
Vtr::Index Index
Definition
types.h:24
OpenSubdiv::OPENSUBDIV_VERSION::Far::PatchParamArray
Vtr::Array< PatchParam > PatchParamArray
Definition
patchParam.h:228
OpenSubdiv::OPENSUBDIV_VERSION::Far::PatchParam
Patch parameterization.
Definition
patchParam.h:135
OpenSubdiv::OPENSUBDIV_VERSION::Far::PatchParam::IsTriangleRotated
bool IsTriangleRotated() const
Returns if a triangular patch is parametrically rotated 180 degrees.
Definition
patchParam.h:273
OpenSubdiv::OPENSUBDIV_VERSION::Far::PatchParam::IsRegular
bool IsRegular() const
Returns whether the patch is regular.
Definition
patchParam.h:211
OpenSubdiv::OPENSUBDIV_VERSION::Far::PatchParam::NormalizeTriangle
void NormalizeTriangle(REAL &u, REAL &v) const
Definition
patchParam.h:280
OpenSubdiv::OPENSUBDIV_VERSION::Far::PatchParam::GetBoundary
unsigned short GetBoundary() const
Returns the boundary edge encoding for the patch.
Definition
patchParam.h:174
OpenSubdiv::OPENSUBDIV_VERSION::Far::PatchParam::GetTransition
unsigned short GetTransition() const
Returns the transition edge encoding for the patch.
Definition
patchParam.h:171
OpenSubdiv::OPENSUBDIV_VERSION::Far::PatchParam::GetParamFraction
float GetParamFraction() const
Returns the fraction of unit parametric space covered by this face.
Definition
patchParam.h:248
OpenSubdiv::OPENSUBDIV_VERSION::Far::PatchParam::GetU
unsigned short GetU() const
Returns the log2 value of the u parameter at the first corner of the patch.
Definition
patchParam.h:164
OpenSubdiv::OPENSUBDIV_VERSION::Far::PatchParam::GetFaceId
Index GetFaceId() const
Returns the faceid.
Definition
patchParam.h:160
OpenSubdiv::OPENSUBDIV_VERSION::Far::PatchParam::GetDepth
unsigned short GetDepth() const
Returns the level of subdivision of the patch.
Definition
patchParam.h:180
OpenSubdiv::OPENSUBDIV_VERSION::Far::PatchParam::NonQuadRoot
bool NonQuadRoot() const
True if the parent base face is a non-quad.
Definition
patchParam.h:177
OpenSubdiv::OPENSUBDIV_VERSION::Far::PatchParam::Set
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.
Definition
patchParam.h:232
OpenSubdiv::OPENSUBDIV_VERSION::Far::PatchParam::Clear
void Clear()
Resets everything to 0.
Definition
patchParam.h:157
OpenSubdiv::OPENSUBDIV_VERSION::Far::PatchParam::field1
unsigned int field1
Definition
patchParam.h:214
OpenSubdiv::OPENSUBDIV_VERSION::Far::PatchParam::Unnormalize
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...
Definition
patchParam.h:264
OpenSubdiv::OPENSUBDIV_VERSION::Far::PatchParam::UnnormalizeTriangle
void UnnormalizeTriangle(REAL &u, REAL &v) const
Definition
patchParam.h:295
OpenSubdiv::OPENSUBDIV_VERSION::Far::PatchParam::GetV
unsigned short GetV() const
Returns the log2 value of the v parameter at the first corner of the patch.
Definition
patchParam.h:168
OpenSubdiv::OPENSUBDIV_VERSION::Far::PatchParam::field0
unsigned int field0
Definition
patchParam.h:213
OpenSubdiv::OPENSUBDIV_VERSION::Far::PatchParam::Normalize
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...
Definition
patchParam.h:254
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::ConstArray
Definition
array.h:36
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::Array
Definition
array.h:88
types.h
opensubdiv
far
patchParam.h
Generated on
for OpenSubdiv by
1.18.0