fvarLevel.h
Go to the documentation of this file.
1 //
2 // Copyright 2014 DreamWorks Animation LLC.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "Apache License")
5 // with the following modification; you may not use this file except in
6 // compliance with the Apache License and the following modification to it:
7 // Section 6. Trademarks. is deleted and replaced with:
8 //
9 // 6. Trademarks. This License does not grant permission to use the trade
10 // names, trademarks, service marks, or product names of the Licensor
11 // and its affiliates, except as required to comply with Section 4(c) of
12 // the License and to reproduce the content of the NOTICE file.
13 //
14 // You may obtain a copy of the Apache License at
15 //
16 // http://www.apache.org/licenses/LICENSE-2.0
17 //
18 // Unless required by applicable law or agreed to in writing, software
19 // distributed under the Apache License with the above modification is
20 // distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
21 // KIND, either express or implied. See the Apache License for the specific
22 // language governing permissions and limitations under the Apache License.
23 //
24 #ifndef OPENSUBDIV3_VTR_FVAR_LEVEL_H
25 #define OPENSUBDIV3_VTR_FVAR_LEVEL_H
26
27 #include "../version.h"
28
29 #include "../sdc/types.h"
30 #include "../sdc/crease.h"
31 #include "../sdc/options.h"
32 #include "../vtr/types.h"
33 #include "../vtr/level.h"
34
35 #include <vector>
36 #include <cassert>
37 #include <cstring>
38
39
40 namespace OpenSubdiv {
41 namespace OPENSUBDIV_VERSION {
42
43 namespace Vtr {
44 namespace internal {
45
46 //
47 // FVarLevel:
48 // A "face-varying channel" includes the topology for a set of face-varying
49 // data, relative to the topology of the Level with which it is associated.
50 //
51 // Analogous to a set of vertices and face-vertices that define the topology for
52 // the geometry, a channel requires a set of "values" and "face-values". The
53 // "values" are indices of entries in a set of face-varying data, just as vertices
54 // are indices into a set of vertex data. The face-values identify a value for
55 // each vertex of the face, and so define topology for the values that may be
56 // unique to each channel.
57 //
58 // In addition to the value size and the vector of face-values (which matches the
59 // size of the geometry's face-vertices), tags are associated with each component
60 // to identify deviations of the face-varying topology from the vertex topology.
61 // And since there may be a one-to-many mapping between vertices and face-varying
62 // values, that mapping is also allocated.
63 //
64 // It turns out that the mapping used is able to completely encode the set of
65 // face-values and is more amenable to refinement. Currently the face-values
66 // take up almost half the memory of this representation, so if memory does
67 // become a concern, we do not need to store them. The only reason we do so now
68 // is that the face-value interface for specifying base topology and inspecting
69 // subsequent levels is very familar to that of face-vertices for clients. So
70 // having them available for such access is convenient.
71 //
72 // Regarding scope and access...
73 // Unclear at this early state, but leaning towards nesting this class within
74 // Level, given the intimate dependency between the two.
75 // Everything is being declared public for now to facilitate access until its
76 // clearer how this functionality will be provided.
77 //
78 class FVarLevel {
79 public:
80 //
81 // Component tags -- trying to minimize the types needed here:
82 //
83 // Tag per Edge:
84 // - facilitates topological analysis around each vertex
85 // - required during refinement to spawn one or more edge-values
86 //
87 struct ETag {
88 ETag() { }
89
90 void clear() { std::memset(this, 0, sizeof(ETag)); }
91
92 typedef unsigned char ETagSize;
93
94 ETagSize _mismatch : 1; // local FVar topology does not match
95 ETagSize _disctsV0 : 1; // discontinuous at vertex 0
96 ETagSize _disctsV1 : 1; // discontinuous at vertex 1
97 ETagSize _linear : 1; // linear boundary constraints
98
99 Level::ETag combineWithLevelETag(Level::ETag) const;
100 };
101
102 //
103 // Tag per Value:
104 // - informs both refinement and interpolation
105 // - every value spawns a child value in refinement
106 // - includes a subset of Level::VTag to be later combined with a VTag
107 //
108 struct ValueTag {
109 ValueTag() { }
110
111 void clear() { std::memset(this, 0, sizeof(ValueTag)); }
112
113 bool isMismatch() const { return _mismatch; }
114 bool isCrease() const { return _crease; }
115 bool isCorner() const { return !_crease; }
116 bool isSemiSharp() const { return _semiSharp; }
117 bool isInfSharp() const { return !_semiSharp && !_crease; }
118 bool isDepSharp() const { return _depSharp; }
119 bool hasCreaseEnds() const { return _crease || _semiSharp; }
120
121 bool hasInfSharpEdges() const { return _infSharpEdges; }
122 bool hasInfIrregularity() const { return _infIrregular; }
123
124 typedef unsigned char ValueTagSize;
125
126 // If there is no mismatch, no other members should be inspected
127 ValueTagSize _mismatch : 1; // local FVar topology does not match
128 ValueTagSize _xordinary : 1; // local FVar topology is extra-ordinary
129 ValueTagSize _nonManifold : 1; // local FVar topology is non-manifold
130 ValueTagSize _crease : 1; // value is a crease, otherwise a corner
131 ValueTagSize _semiSharp : 1; // value is a corner decaying to crease
132 ValueTagSize _depSharp : 1; // value is a corner by dependency on another
133
134 ValueTagSize _infSharpEdges : 1; // value is a corner by inf-sharp features
135 ValueTagSize _infIrregular : 1; // value span includes inf-sharp irregularity
136
137 Level::VTag combineWithLevelVTag(Level::VTag) const;
138 };
139
140 typedef Vtr::ConstArray<ValueTag> ConstValueTagArray;
141 typedef Vtr::Array<ValueTag> ValueTagArray;
142
143 //
144 // Simple struct containing the "end faces" of a crease, i.e. the faces which
145 // contain the FVar values to be used when interpolating the crease. (Prefer
146 // the struct over std::pair for its member names)
147 //
148 struct CreaseEndPair {
149 LocalIndex _startFace;
150 LocalIndex _endFace;
151 };
152
153 typedef Vtr::ConstArray<CreaseEndPair> ConstCreaseEndPairArray;
154 typedef Vtr::Array<CreaseEndPair> CreaseEndPairArray;
155
156 typedef LocalIndex Sibling;
157
158 typedef ConstLocalIndexArray ConstSiblingArray;
159 typedef LocalIndexArray SiblingArray;
160
161 public:
162 FVarLevel(Level const& level);
163 ~FVarLevel();
164
165 // Queries for the entire channel:
166 Level const& getLevel() const { return _level; }
167
168 int getNumValues() const { return _valueCount; }
169 int getNumFaceValuesTotal() const { return (int) _faceVertValues.size(); }
170
171 bool isLinear() const { return _isLinear; }
172 bool hasLinearBoundaries() const { return _hasLinearBoundaries; }
173 bool hasSmoothBoundaries() const { return ! _hasLinearBoundaries; }
174 bool hasCreaseEnds() const { return hasSmoothBoundaries(); }
175
176 Sdc::Options getOptions() const { return _options; }
177
178 // Queries per face:
179 ConstIndexArray getFaceValues(Index fIndex) const;
180 IndexArray getFaceValues(Index fIndex);
181
182 // Queries per edge:
183 ETag getEdgeTag(Index eIndex) const { return _edgeTags[eIndex]; }
184 bool edgeTopologyMatches(Index eIndex) const { return !getEdgeTag(eIndex)._mismatch; }
185
186 // Queries per vertex (and its potential sibling values):
187 int getNumVertexValues(Index v) const { return _vertSiblingCounts[v]; }
188 Index getVertexValueOffset(Index v, Sibling i = 0) const { return _vertSiblingOffsets[v] + i; }
189
190 Index getVertexValue(Index v, Sibling i = 0) const { return _vertValueIndices[getVertexValueOffset(v,i)]; }
191
192 Index findVertexValueIndex(Index vertexIndex, Index valueIndex) const;
193
194 // Methods to access/modify array properties per vertex:
195 ConstIndexArray getVertexValues(Index vIndex) const;
196 IndexArray getVertexValues(Index vIndex);
197
198 ConstValueTagArray getVertexValueTags(Index vIndex) const;
199 ValueTagArray getVertexValueTags(Index vIndex);
200
201 ConstCreaseEndPairArray getVertexValueCreaseEnds(Index vIndex) const;
202 CreaseEndPairArray getVertexValueCreaseEnds(Index vIndex);
203
204 ConstSiblingArray getVertexFaceSiblings(Index vIndex) const;
205 SiblingArray getVertexFaceSiblings(Index vIndex);
206
207 // Queries per value:
208 ValueTag getValueTag(Index valueIndex) const { return _vertValueTags[valueIndex]; }
209 bool valueTopologyMatches(Index valueIndex) const { return !getValueTag(valueIndex)._mismatch; }
210
211 CreaseEndPair getValueCreaseEndPair(Index valueIndex) const { return _vertValueCreaseEnds[valueIndex]; }
212
213 // Tag queries related to faces (use Level methods for those returning Level::VTag/ETag)
214 void getFaceValueTags(Index faceIndex, ValueTag valueTags[]) const;
215
216 ValueTag getFaceCompositeValueTag(Index faceIndex) const;
217
218 // Higher-level topological queries, i.e. values in a neighborhood:
219 void getEdgeFaceValues(Index eIndex, int fIncToEdge, Index valuesPerVert[2]) const;
220 void getVertexEdgeValues(Index vIndex, Index valuesPerEdge[]) const;
221 void getVertexCreaseEndValues(Index vIndex, Sibling sibling, Index endValues[2]) const;
222
223 // Initialization and allocation helpers:
224 void setOptions(Sdc::Options const& options);
225 void resizeVertexValues(int numVertexValues);
226 void resizeValues(int numValues);
227 void resizeComponents();
228
229 // Topological analysis methods -- tagging and face-value population:
230 void completeTopologyFromFaceValues(int regBoundaryValence);
231 void initializeFaceValuesFromFaceVertices();
232 void initializeFaceValuesFromVertexFaceSiblings();
233
234 struct ValueSpan;
235 void gatherValueSpans(Index vIndex, ValueSpan * vValueSpans) const;
236
237 // Debugging methods:
238 bool validate() const;
239 void print() const;
240 void buildFaceVertexSiblingsFromVertexFaceSiblings(std::vector<Sibling>& fvSiblings) const;
241
242 private:
243 // Just as Refinements build Levels, FVarRefinements build FVarLevels...
244 friend class FVarRefinement;
245
246 Level const & _level;
247
248 // Linear interpolation options vary between channels:
249 Sdc::Options _options;
250
251 bool _isLinear;
252 bool _hasLinearBoundaries;
253 bool _hasDependentSharpness;
254 int _valueCount;
255
256 //
257 // Vectors recording face-varying topology including tags that help propagate
258 // data through the refinement hierarchy. Vectors are not sparse but most use
259 // 8-bit values relative to the local topology.
260 //
261 // The vector of face-values is actually redundant here, but is constructed as
262 // it is most convenient for clients. It represents almost half the memory of
263 // the topology (4 32-bit integers per face) and not surprisingly, populating
264 // it takes a considerable amount of the refinement time (1/3). We can reduce
265 // both if we are willing to compute these on demand for clients.
266 //
267 // Per-face (matches face-verts of corresponding level):
268 std::vector<Index> _faceVertValues;
269
270 // Per-edge:
271 std::vector<ETag> _edgeTags;
272
273 // Per-vertex:
274 std::vector<Sibling> _vertSiblingCounts;
275 std::vector<int> _vertSiblingOffsets;
276 std::vector<Sibling> _vertFaceSiblings;
277
278 // Per-value:
279 std::vector<Index> _vertValueIndices;
280 std::vector<ValueTag> _vertValueTags;
281 std::vector<CreaseEndPair> _vertValueCreaseEnds;
282 };
283
284 //
285 // Access/modify the values associated with each face:
286 //
287 inline ConstIndexArray
288 FVarLevel::getFaceValues(Index fIndex) const {
289
290 int vCount = _level.getNumFaceVertices(fIndex);
291 int vOffset = _level.getOffsetOfFaceVertices(fIndex);
292 return ConstIndexArray(&_faceVertValues[vOffset], vCount);
293 }
294 inline IndexArray
295 FVarLevel::getFaceValues(Index fIndex) {
296
297 int vCount = _level.getNumFaceVertices(fIndex);
298 int vOffset = _level.getOffsetOfFaceVertices(fIndex);
299 return IndexArray(&_faceVertValues[vOffset], vCount);
300 }
301
302 inline FVarLevel::ConstSiblingArray
303 FVarLevel::getVertexFaceSiblings(Index vIndex) const {
304
305 int vCount = _level.getNumVertexFaces(vIndex);
306 int vOffset = _level.getOffsetOfVertexFaces(vIndex);
307 return ConstSiblingArray(&_vertFaceSiblings[vOffset], vCount);
308 }
309 inline FVarLevel::SiblingArray
310 FVarLevel::getVertexFaceSiblings(Index vIndex) {
311
312 int vCount = _level.getNumVertexFaces(vIndex);
313 int vOffset = _level.getOffsetOfVertexFaces(vIndex);
314 return SiblingArray(&_vertFaceSiblings[vOffset], vCount);
315 }
316
317 inline ConstIndexArray
318 FVarLevel::getVertexValues(Index vIndex) const
319 {
320 int vCount = getNumVertexValues(vIndex);
321 int vOffset = getVertexValueOffset(vIndex);
322 return ConstIndexArray(&_vertValueIndices[vOffset], vCount);
323 }
324 inline IndexArray
325 FVarLevel::getVertexValues(Index vIndex)
326 {
327 int vCount = getNumVertexValues(vIndex);
328 int vOffset = getVertexValueOffset(vIndex);
329 return IndexArray(&_vertValueIndices[vOffset], vCount);
330 }
331
332 inline FVarLevel::ConstValueTagArray
333 FVarLevel::getVertexValueTags(Index vIndex) const
334 {
335 int vCount = getNumVertexValues(vIndex);
336 int vOffset = getVertexValueOffset(vIndex);
337 return ConstValueTagArray(&_vertValueTags[vOffset], vCount);
338 }
339 inline FVarLevel::ValueTagArray
340 FVarLevel::getVertexValueTags(Index vIndex)
341 {
342 int vCount = getNumVertexValues(vIndex);
343 int vOffset = getVertexValueOffset(vIndex);
344 return ValueTagArray(&_vertValueTags[vOffset], vCount);
345 }
346
347 inline FVarLevel::ConstCreaseEndPairArray
348 FVarLevel::getVertexValueCreaseEnds(Index vIndex) const
349 {
350 int vCount = getNumVertexValues(vIndex);
351 int vOffset = getVertexValueOffset(vIndex);
352 return ConstCreaseEndPairArray(&_vertValueCreaseEnds[vOffset], vCount);
353 }
354 inline FVarLevel::CreaseEndPairArray
355 FVarLevel::getVertexValueCreaseEnds(Index vIndex)
356 {
357 int vCount = getNumVertexValues(vIndex);
358 int vOffset = getVertexValueOffset(vIndex);
359 return CreaseEndPairArray(&_vertValueCreaseEnds[vOffset], vCount);
360 }
361
362 inline Index
363 FVarLevel::findVertexValueIndex(Index vertexIndex, Index valueIndex) const {
364
365 if (_level.getDepth() > 0) return valueIndex;
366
367 Index vvIndex = getVertexValueOffset(vertexIndex);
368 while (_vertValueIndices[vvIndex] != valueIndex) {
369 ++ vvIndex;
370 }
371 return vvIndex;
372 }
373
374 //
375 // Methods related to tagging:
376 //
377 inline Level::ETag
378 FVarLevel::ETag::combineWithLevelETag(Level::ETag levelTag) const
379 {
380 if (this->_mismatch) {
381 levelTag._boundary = true;
382 levelTag._infSharp = true;
383 }
384 return levelTag;
385 }
386 inline Level::VTag
387 FVarLevel::ValueTag::combineWithLevelVTag(Level::VTag levelTag) const
388 {
389 if (this->_mismatch) {
390 if (this->isCorner()) {
391 levelTag._rule = (Level::VTag::VTagSize) Sdc::Crease::RULE_CORNER;
392 levelTag._infSharp = true;
393 levelTag._infSharpCrease = false;
394 levelTag._corner = !this->_infIrregular && !this->_infSharpEdges;
395 } else {
396 levelTag._rule = (Level::VTag::VTagSize) Sdc::Crease::RULE_CREASE;
397 levelTag._infSharp = false;
398 levelTag._infSharpCrease = true;
399 levelTag._corner = false;
400 }
401 levelTag._infSharpEdges = true;
402 levelTag._infIrregular = this->_infIrregular;
403
404 levelTag._boundary = true;
405 levelTag._xordinary = this->_xordinary;
406 levelTag._nonManifold = this->_nonManifold;
407 }
408 return levelTag;
409 }
410
411 } // end namespace internal
412 } // end namespace Vtr
413
414 } // end namespace OPENSUBDIV_VERSION
415 using namespace OPENSUBDIV_VERSION;
416 } // end namespace OpenSubdiv
417
418 #endif /* OPENSUBDIV3_VTR_FVAR_LEVEL_H */
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ETag::_linear
ETagSize _linear
Definition: fvarLevel.h:97
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ETag
Definition: fvarLevel.h:87
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::IndexArray
Array< Index > IndexArray
Definition: types.h:79
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::findVertexValueIndex
Index findVertexValueIndex(Index vertexIndex, Index valueIndex) const
Definition: fvarLevel.h:363
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Level::VTag::_infSharpCrease
VTagSize _infSharpCrease
Definition: level.h:119
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::setOptions
void setOptions(Sdc::Options const &options)
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::gatherValueSpans
void gatherValueSpans(Index vIndex, ValueSpan *vValueSpans) const
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::hasCreaseEnds
bool hasCreaseEnds() const
Definition: fvarLevel.h:119
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Level::VTag
Definition: level.h:97
OpenSubdiv::OPENSUBDIV_VERSION::Sdc::Crease::RULE_CORNER
Definition: crease.h:87
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::CreaseEndPair
Definition: fvarLevel.h:148
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Level::VTag::_infIrregular
VTagSize _infIrregular
Definition: level.h:120
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel
Definition: fvarLevel.h:78
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::combineWithLevelVTag
Level::VTag combineWithLevelVTag(Level::VTag) const
Definition: fvarLevel.h:387
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::SiblingArray
LocalIndexArray SiblingArray
Definition: fvarLevel.h:159
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::ValueTag
ValueTag()
Definition: fvarLevel.h:109
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Level
Definition: level.h:83
OpenSubdiv::OPENSUBDIV_VERSION::Sdc::Crease::RULE_CREASE
Definition: crease.h:86
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Level::VTag::_corner
VTagSize _corner
Definition: level.h:110
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::valueTopologyMatches
bool valueTopologyMatches(Index valueIndex) const
Definition: fvarLevel.h:209
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getNumValues
int getNumValues() const
Definition: fvarLevel.h:168
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Level::VTag::_infSharpEdges
VTagSize _infSharpEdges
Definition: level.h:118
OpenSubdiv::OPENSUBDIV_VERSION::Sdc::Options
All supported options applying to subdivision scheme.
Definition: options.h:51
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::isInfSharp
bool isInfSharp() const
Definition: fvarLevel.h:117
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ETag::ETag
ETag()
Definition: fvarLevel.h:88
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getVertexValue
Index getVertexValue(Index v, Sibling i=0) const
Definition: fvarLevel.h:190
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ETag::combineWithLevelETag
Level::ETag combineWithLevelETag(Level::ETag) const
Definition: fvarLevel.h:378
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::resizeComponents
void resizeComponents()
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::edgeTopologyMatches
bool edgeTopologyMatches(Index eIndex) const
Definition: fvarLevel.h:184
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ETag::_disctsV0
ETagSize _disctsV0
Definition: fvarLevel.h:95
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::isSemiSharp
bool isSemiSharp() const
Definition: fvarLevel.h:116
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ETag::ETagSize
unsigned char ETagSize
Definition: fvarLevel.h:92
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ETag::_mismatch
ETagSize _mismatch
Definition: fvarLevel.h:94
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::Array
Definition: array.h:105
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::hasInfSharpEdges
bool hasInfSharpEdges() const
Definition: fvarLevel.h:121
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Level::ETag::_infSharp
ETagSize _infSharp
Definition: level.h:134
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::~FVarLevel
~FVarLevel()
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Level::VTag::_infSharp
VTagSize _infSharp
Definition: level.h:111
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::clear
void clear()
Definition: fvarLevel.h:111
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getFaceCompositeValueTag
ValueTag getFaceCompositeValueTag(Index faceIndex) const
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::CreaseEndPair::_endFace
LocalIndex _endFace
Definition: fvarLevel.h:150
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::print
void print() const
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ETag::_disctsV1
ETagSize _disctsV1
Definition: fvarLevel.h:96
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::initializeFaceValuesFromVertexFaceSiblings
void initializeFaceValuesFromVertexFaceSiblings()
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::isCrease
bool isCrease() const
Definition: fvarLevel.h:114
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getEdgeFaceValues
void getEdgeFaceValues(Index eIndex, int fIncToEdge, Index valuesPerVert[2]) const
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::isLinear
bool isLinear() const
Definition: fvarLevel.h:171
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::FVarLevel
FVarLevel(Level const &level)
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::Index
int Index
Definition: types.h:54
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTagArray
Vtr::Array< ValueTag > ValueTagArray
Definition: fvarLevel.h:141
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Level::ETag::_boundary
ETagSize _boundary
Definition: level.h:133
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::ConstArray
Definition: array.h:53
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::hasCreaseEnds
bool hasCreaseEnds() const
Definition: fvarLevel.h:174
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::resizeVertexValues
void resizeVertexValues(int numVertexValues)
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getFaceValueTags
void getFaceValueTags(Index faceIndex, ValueTag valueTags[]) const
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getFaceValues
ConstIndexArray getFaceValues(Index fIndex) const
Definition: fvarLevel.h:288
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getVertexValueOffset
Index getVertexValueOffset(Index v, Sibling i=0) const
Definition: fvarLevel.h:188
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getLevel
Level const & getLevel() const
Definition: fvarLevel.h:166
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::isDepSharp
bool isDepSharp() const
Definition: fvarLevel.h:118
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Level::VTag::VTagSize
unsigned short VTagSize
Definition: level.h:105
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::isCorner
bool isCorner() const
Definition: fvarLevel.h:115
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ETag::clear
void clear()
Definition: fvarLevel.h:90
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getVertexCreaseEndValues
void getVertexCreaseEndValues(Index vIndex, Sibling sibling, Index endValues[2]) const
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getVertexValueTags
ConstValueTagArray getVertexValueTags(Index vIndex) const
Definition: fvarLevel.h:333
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getVertexEdgeValues
void getVertexEdgeValues(Index vIndex, Index valuesPerEdge[]) const
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getValueTag
ValueTag getValueTag(Index valueIndex) const
Definition: fvarLevel.h:208
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ConstValueTagArray
Vtr::ConstArray< ValueTag > ConstValueTagArray
Definition: fvarLevel.h:140
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag
Definition: fvarLevel.h:108
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::isMismatch
bool isMismatch() const
Definition: fvarLevel.h:113
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getOptions
Sdc::Options getOptions() const
Definition: fvarLevel.h:176
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::ConstIndexArray
ConstArray< Index > ConstIndexArray
Definition: types.h:80
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Level::VTag::_rule
VTagSize _rule
Definition: level.h:114
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::hasLinearBoundaries
bool hasLinearBoundaries() const
Definition: fvarLevel.h:172
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Level::VTag::_boundary
VTagSize _boundary
Definition: level.h:109
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Level::VTag::_nonManifold
VTagSize _nonManifold
Definition: level.h:107
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getEdgeTag
ETag getEdgeTag(Index eIndex) const
Definition: fvarLevel.h:183
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::CreaseEndPairArray
Vtr::Array< CreaseEndPair > CreaseEndPairArray
Definition: fvarLevel.h:154
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getValueCreaseEndPair
CreaseEndPair getValueCreaseEndPair(Index valueIndex) const
Definition: fvarLevel.h:211
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::hasSmoothBoundaries
bool hasSmoothBoundaries() const
Definition: fvarLevel.h:173
OpenSubdiv
Definition: error.h:30
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Level::ETag
Definition: level.h:124
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::_mismatch
ValueTagSize _mismatch
Definition: fvarLevel.h:127
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::resizeValues
void resizeValues(int numValues)
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ConstSiblingArray
ConstLocalIndexArray ConstSiblingArray
Definition: fvarLevel.h:158
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::initializeFaceValuesFromFaceVertices
void initializeFaceValuesFromFaceVertices()
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ConstCreaseEndPairArray
Vtr::ConstArray< CreaseEndPair > ConstCreaseEndPairArray
Definition: fvarLevel.h:153
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getNumFaceValuesTotal
int getNumFaceValuesTotal() const
Definition: fvarLevel.h:169
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::LocalIndex
unsigned short LocalIndex
Definition: types.h:66
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getNumVertexValues
int getNumVertexValues(Index v) const
Definition: fvarLevel.h:187
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::CreaseEndPair::_startFace
LocalIndex _startFace
Definition: fvarLevel.h:149
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::buildFaceVertexSiblingsFromVertexFaceSiblings
void buildFaceVertexSiblingsFromVertexFaceSiblings(std::vector< Sibling > &fvSiblings) const
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getVertexValues
ConstIndexArray getVertexValues(Index vIndex) const
Definition: fvarLevel.h:318
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getVertexFaceSiblings
ConstSiblingArray getVertexFaceSiblings(Index vIndex) const
Definition: fvarLevel.h:303
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::validate
bool validate() const
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::Sibling
LocalIndex Sibling
Definition: fvarLevel.h:156
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::hasInfIrregularity
bool hasInfIrregularity() const
Definition: fvarLevel.h:122
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getVertexValueCreaseEnds
ConstCreaseEndPairArray getVertexValueCreaseEnds(Index vIndex) const
Definition: fvarLevel.h:348
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::ValueTagSize
unsigned char ValueTagSize
Definition: fvarLevel.h:124
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::completeTopologyFromFaceValues
void completeTopologyFromFaceValues(int regBoundaryValence)
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarRefinement
Definition: fvarRefinement.h:59
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Level::VTag::_xordinary
VTagSize _xordinary
Definition: level.h:108