opensubdiv/vtr/fvarLevel.h Source File

- Main Page
- Namespaces
- Classes
- Files

- File List

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends
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
100 //
101 // Tag per Value:
102 // - informs both refinement and interpolation
103 // - every value spawns a child value in refinement
104 // - given ordering of values (1-per-vertex first) serves as a vertex tag
105 //
106 struct ValueTag {
107 ValueTag() { }
108
109 void clear() { std::memset(this, 0, sizeof(ValueTag)); }
110
111 bool isMismatch() const { return _mismatch; }
112 bool isCrease() const { return _crease; }
113 bool isCorner() const { return !_crease; }
114 bool isSemiSharp() const { return _semiSharp; }
115 bool isInfSharp() const { return !_semiSharp && !_crease; }
116 bool isDepSharp() const { return _depSharp; }
117
118 typedef unsigned char ValueTagSize;
119
120 ValueTagSize _mismatch : 1; // local FVar topology does not match
121 ValueTagSize _crease : 1; // value is a crease, otherwise a corner
122 ValueTagSize _semiSharp : 1; // value is a corner decaying to crease
123 ValueTagSize _depSharp : 1; // value is a corner by dependency on another
124 ValueTagSize _xordinary : 1; // value is an x-ordinary crease in the limit
125 };
126
127 typedef Vtr::ConstArray<ValueTag> ConstValueTagArray;
128 typedef Vtr::Array<ValueTag> ValueTagArray;
129
130 ValueTag getFaceCompositeValueTag(ConstIndexArray & faceValues,
131 ConstIndexArray & faceVerts) const;
132
133 Level::VTag getFaceCompositeValueAndVTag(ConstIndexArray & faceValues,
134 ConstIndexArray & faceVerts,
135 Level::VTag * fvarVTags) const;
136
137 Level::ETag getFaceCompositeCombinedEdgeTag(ConstIndexArray & faceEdges,
138 Level::ETag * fvarETags) const;
139
140 //
141 // Simple struct containing the "end faces" of a crease, i.e. the faces which
142 // contain the FVar values to be used when interpolating the crease. (Prefer
143 // the struct over std::pair for its member names)
144 //
145 struct CreaseEndPair {
146 LocalIndex _startFace;
147 LocalIndex _endFace;
148 };
149
150 typedef Vtr::ConstArray<CreaseEndPair> ConstCreaseEndPairArray;
151 typedef Vtr::Array<CreaseEndPair> CreaseEndPairArray;
152
153 typedef LocalIndex Sibling;
154
155 typedef ConstLocalIndexArray ConstSiblingArray;
156 typedef LocalIndexArray SiblingArray;
157
158 public:
159 FVarLevel(Level const& level);
160 ~FVarLevel();
161
162 // Queries for the entire channel:
163 Level const& getLevel() const { return _level; }
164
165 int getNumValues() const { return _valueCount; }
166 int getNumFaceValuesTotal() const { return (int) _faceVertValues.size(); }
167
168 bool isLinear() const { return _isLinear; }
169 bool hasLinearBoundaries() const { return _hasLinearBoundaries; }
170 bool hasSmoothBoundaries() const { return not _hasLinearBoundaries; }
171
172 Sdc::Options getOptions() const { return _options; }
173
174 // Queries per face:
175 ConstIndexArray getFaceValues(Index fIndex) const;
176 IndexArray getFaceValues(Index fIndex);
177
178 // Queries per edge:
179 ETag getEdgeTag(Index eIndex) const { return _edgeTags[eIndex]; }
180 bool edgeTopologyMatches(Index eIndex) const { return !getEdgeTag(eIndex)._mismatch; }
181
182 // Queries per vertex (and its potential sibling values):
183 int getNumVertexValues(Index v) const { return _vertSiblingCounts[v]; }
184 Index getVertexValueOffset(Index v, Sibling i = 0) const { return _vertSiblingOffsets[v] + i; }
185
186 Index getVertexValue(Index v, Sibling i = 0) const { return _vertValueIndices[getVertexValueOffset(v,i)]; }
187
188 Index findVertexValueIndex(Index vertexIndex, Index valueIndex) const;
189
190 // Methods to access/modify array properties per vertex:
191 ConstIndexArray getVertexValues(Index vIndex) const;
192 IndexArray getVertexValues(Index vIndex);
193
194 ConstValueTagArray getVertexValueTags(Index vIndex) const;
195 ValueTagArray getVertexValueTags(Index vIndex);
196
197 ConstCreaseEndPairArray getVertexValueCreaseEnds(Index vIndex) const;
198 CreaseEndPairArray getVertexValueCreaseEnds(Index vIndex);
199
200 ConstSiblingArray getVertexFaceSiblings(Index vIndex) const;
201 SiblingArray getVertexFaceSiblings(Index vIndex);
202
203 // Queries per value:
204 ValueTag getValueTag(Index valueIndex) const { return _vertValueTags[valueIndex]; }
205 bool valueTopologyMatches(Index valueIndex) const { return !getValueTag(valueIndex)._mismatch; }
206
207 // Higher-level topological queries, i.e. values in a neighborhood:
208 void getEdgeFaceValues(Index eIndex, int fIncToEdge, Index valuesPerVert[2]) const;
209 void getVertexEdgeValues(Index vIndex, Index valuesPerEdge[]) const;
210 void getVertexCreaseEndValues(Index vIndex, Sibling sibling, Index endValues[2]) const;
211
212 // Initialization and allocation helpers:
213 void setOptions(Sdc::Options const& options);
214 void resizeVertexValues(int numVertexValues);
215 void resizeValues(int numValues);
216 void resizeComponents();
217
218 // Topological analysis methods -- tagging and face-value population:
219 void completeTopologyFromFaceValues(int regBoundaryValence);
220 void initializeFaceValuesFromFaceVertices();
221 void initializeFaceValuesFromVertexFaceSiblings();
222
223 // Information about the "span" for a value:
224 struct ValueSpan {
225 LocalIndex _size;
226 LocalIndex _start;
227 LocalIndex _disjoint;
228 LocalIndex _semiSharp;
229 };
230 void gatherValueSpans(Index vIndex, ValueSpan * vValueSpans) const;
231
232 // Debugging methods:
233 bool validate() const;
234 void print() const;
235 void buildFaceVertexSiblingsFromVertexFaceSiblings(std::vector<Sibling>& fvSiblings) const;
236
237 private:
238 // Just as Refinements build Levels, FVarRefinements build FVarLevels...
239 friend class FVarRefinement;
240
241 Level const & _level;
242
243 // Linear interpolation options vary between channels:
244 Sdc::Options _options;
245
246 bool _isLinear;
247 bool _hasLinearBoundaries;
248 bool _hasDependentSharpness;
249 int _valueCount;
250
251 //
252 // Vectors recording face-varying topology including tags that help propagate
253 // data through the refinement hierarchy. Vectors are not sparse but most use
254 // 8-bit values relative to the local topology.
255 //
256 // The vector of face-values is actually redundant here, but is constructed as
257 // it is most convenient for clients. It represents almost half the memory of
258 // the topology (4 32-bit integers per face) and not surprisingly, populating
259 // it takes a considerable amount of the refinement time (1/3). We can reduce
260 // both if we are willing to compute these on demand for clients.
261 //
262 // Per-face (matches face-verts of corresponding level):
263 std::vector<Index> _faceVertValues;
264
265 // Per-edge:
266 std::vector<ETag> _edgeTags;
267
268 // Per-vertex:
269 std::vector<Sibling> _vertSiblingCounts;
270 std::vector<int> _vertSiblingOffsets;
271 std::vector<Sibling> _vertFaceSiblings;
272
273 // Per-value:
274 std::vector<Index> _vertValueIndices;
275 std::vector<ValueTag> _vertValueTags;
276 std::vector<CreaseEndPair> _vertValueCreaseEnds;
277 };
278
279 //
280 // Access/modify the values associated with each face:
281 //
282 inline ConstIndexArray
283 FVarLevel::getFaceValues(Index fIndex) const {
284
285 int vCount = _level.getNumFaceVertices(fIndex);
286 int vOffset = _level.getOffsetOfFaceVertices(fIndex);
287 return ConstIndexArray(&_faceVertValues[vOffset], vCount);
288 }
289 inline IndexArray
290 FVarLevel::getFaceValues(Index fIndex) {
291
292 int vCount = _level.getNumFaceVertices(fIndex);
293 int vOffset = _level.getOffsetOfFaceVertices(fIndex);
294 return IndexArray(&_faceVertValues[vOffset], vCount);
295 }
296
297 inline FVarLevel::ConstSiblingArray
298 FVarLevel::getVertexFaceSiblings(Index vIndex) const {
299
300 int vCount = _level.getNumVertexFaces(vIndex);
301 int vOffset = _level.getOffsetOfVertexFaces(vIndex);
302 return ConstSiblingArray(&_vertFaceSiblings[vOffset], vCount);
303 }
304 inline FVarLevel::SiblingArray
305 FVarLevel::getVertexFaceSiblings(Index vIndex) {
306
307 int vCount = _level.getNumVertexFaces(vIndex);
308 int vOffset = _level.getOffsetOfVertexFaces(vIndex);
309 return SiblingArray(&_vertFaceSiblings[vOffset], vCount);
310 }
311
312 inline ConstIndexArray
313 FVarLevel::getVertexValues(Index vIndex) const
314 {
315 int vCount = getNumVertexValues(vIndex);
316 int vOffset = getVertexValueOffset(vIndex);
317 return ConstIndexArray(&_vertValueIndices[vOffset], vCount);
318 }
319 inline IndexArray
320 FVarLevel::getVertexValues(Index vIndex)
321 {
322 int vCount = getNumVertexValues(vIndex);
323 int vOffset = getVertexValueOffset(vIndex);
324 return IndexArray(&_vertValueIndices[vOffset], vCount);
325 }
326
327 inline FVarLevel::ConstValueTagArray
328 FVarLevel::getVertexValueTags(Index vIndex) const
329 {
330 int vCount = getNumVertexValues(vIndex);
331 int vOffset = getVertexValueOffset(vIndex);
332 return ConstValueTagArray(&_vertValueTags[vOffset], vCount);
333 }
334 inline FVarLevel::ValueTagArray
335 FVarLevel::getVertexValueTags(Index vIndex)
336 {
337 int vCount = getNumVertexValues(vIndex);
338 int vOffset = getVertexValueOffset(vIndex);
339 return ValueTagArray(&_vertValueTags[vOffset], vCount);
340 }
341
342 inline FVarLevel::ConstCreaseEndPairArray
343 FVarLevel::getVertexValueCreaseEnds(Index vIndex) const
344 {
345 int vCount = getNumVertexValues(vIndex);
346 int vOffset = getVertexValueOffset(vIndex);
347 return ConstCreaseEndPairArray(&_vertValueCreaseEnds[vOffset], vCount);
348 }
349 inline FVarLevel::CreaseEndPairArray
350 FVarLevel::getVertexValueCreaseEnds(Index vIndex)
351 {
352 int vCount = getNumVertexValues(vIndex);
353 int vOffset = getVertexValueOffset(vIndex);
354 return CreaseEndPairArray(&_vertValueCreaseEnds[vOffset], vCount);
355 }
356
357 inline Index
358 FVarLevel::findVertexValueIndex(Index vertexIndex, Index valueIndex) const {
359
360 if (_level.getDepth() > 0) return valueIndex;
361
362 Index vvIndex = getVertexValueOffset(vertexIndex);
363 while (_vertValueIndices[vvIndex] != valueIndex) {
364 ++ vvIndex;
365 }
366 return vvIndex;
367 }
368
369 } // end namespace internal
370 } // end namespace Vtr
371
372 } // end namespace OPENSUBDIV_VERSION
373 using namespace OPENSUBDIV_VERSION;
374 } // end namespace OpenSubdiv
375
376 #endif /* OPENSUBDIV3_VTR_FVAR_LEVEL_H */
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ETag::clear
void clear()
Definition: fvarLevel.h:90
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::ValueTagSize
unsigned char ValueTagSize
Definition: fvarLevel.h:118
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::ConstArray
Definition: array.h:53
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ETag::_linear
ETagSize _linear
Definition: fvarLevel.h:97
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Level::VTag
Definition: level.h:97
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::findVertexValueIndex
Index findVertexValueIndex(Index vertexIndex, Index valueIndex) const
Definition: fvarLevel.h:358
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getVertexValueOffset
Index getVertexValueOffset(Index v, Sibling i=0) const
Definition: fvarLevel.h:184
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag
Definition: fvarLevel.h:106
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::IndexArray
Array< Index > IndexArray
Definition: types.h:79
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::_crease
ValueTagSize _crease
Definition: fvarLevel.h:121
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::clear
void clear()
Definition: fvarLevel.h:109
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::isSemiSharp
bool isSemiSharp() const
Definition: fvarLevel.h:114
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Level::ETag
Definition: level.h:122
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::valueTopologyMatches
bool valueTopologyMatches(Index valueIndex) const
Definition: fvarLevel.h:205
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTagArray
Vtr::Array< ValueTag > ValueTagArray
Definition: fvarLevel.h:128
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::print
void print() const
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel
Definition: fvarLevel.h:78
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::_depSharp
ValueTagSize _depSharp
Definition: fvarLevel.h:123
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::CreaseEndPair::_startFace
LocalIndex _startFace
Definition: fvarLevel.h:146
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getFaceValues
ConstIndexArray getFaceValues(Index fIndex) const
Definition: fvarLevel.h:283
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::resizeComponents
void resizeComponents()
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ConstValueTagArray
Vtr::ConstArray< ValueTag > ConstValueTagArray
Definition: fvarLevel.h:127
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::isCrease
bool isCrease() const
Definition: fvarLevel.h:112
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:186
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::resizeVertexValues
void resizeVertexValues(int numVertexValues)
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::buildFaceVertexSiblingsFromVertexFaceSiblings
void buildFaceVertexSiblingsFromVertexFaceSiblings(std::vector< Sibling > &fvSiblings) const
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::_xordinary
ValueTagSize _xordinary
Definition: fvarLevel.h:124
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ETag::_disctsV0
ETagSize _disctsV0
Definition: fvarLevel.h:95
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::gatherValueSpans
void gatherValueSpans(Index vIndex, ValueSpan *vValueSpans) const
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getNumVertexValues
int getNumVertexValues(Index v) const
Definition: fvarLevel.h:183
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::CreaseEndPair::_endFace
LocalIndex _endFace
Definition: fvarLevel.h:147
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ConstSiblingArray
ConstLocalIndexArray ConstSiblingArray
Definition: fvarLevel.h:155
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getVertexCreaseEndValues
void getVertexCreaseEndValues(Index vIndex, Sibling sibling, Index endValues[2]) const
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ETag::_disctsV1
ETagSize _disctsV1
Definition: fvarLevel.h:96
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::FVarLevel
FVarLevel(Level const &level)
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getVertexValueCreaseEnds
ConstCreaseEndPairArray getVertexValueCreaseEnds(Index vIndex) const
Definition: fvarLevel.h:343
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getValueTag
ValueTag getValueTag(Index valueIndex) const
Definition: fvarLevel.h:204
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueSpan
Definition: fvarLevel.h:224
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Level::getNumFaceVertices
int getNumFaceVertices(Index faceIndex) const
Definition: level.h:338
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::_mismatch
ValueTagSize _mismatch
Definition: fvarLevel.h:120
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::initializeFaceValuesFromVertexFaceSiblings
void initializeFaceValuesFromVertexFaceSiblings()
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::isCorner
bool isCorner() const
Definition: fvarLevel.h:113
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getOptions
Sdc::Options getOptions() const
Definition: fvarLevel.h:172
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getVertexValues
ConstIndexArray getVertexValues(Index vIndex) const
Definition: fvarLevel.h:313
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getVertexEdgeValues
void getVertexEdgeValues(Index vIndex, Index valuesPerEdge[]) const
OpenSubdiv::OPENSUBDIV_VERSION::Sdc::Options
All supported options applying to subdivision scheme.
Definition: options.h:51
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ETag
Definition: fvarLevel.h:87
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Level
Definition: level.h:83
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::CreaseEndPair
Definition: fvarLevel.h:145
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueSpan::_semiSharp
LocalIndex _semiSharp
Definition: fvarLevel.h:228
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::isLinear
bool isLinear() const
Definition: fvarLevel.h:168
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getNumFaceValuesTotal
int getNumFaceValuesTotal() const
Definition: fvarLevel.h:166
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::LocalIndex
unsigned short LocalIndex
Definition: types.h:66
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Level::getNumVertexFaces
int getNumVertexFaces(Index vertIndex) const
Definition: level.h:350
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::Sibling
LocalIndex Sibling
Definition: fvarLevel.h:153
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::edgeTopologyMatches
bool edgeTopologyMatches(Index eIndex) const
Definition: fvarLevel.h:180
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ETag::ETagSize
unsigned char ETagSize
Definition: fvarLevel.h:92
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::ValueTag
ValueTag()
Definition: fvarLevel.h:107
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::_semiSharp
ValueTagSize _semiSharp
Definition: fvarLevel.h:122
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ETag::_mismatch
ETagSize _mismatch
Definition: fvarLevel.h:94
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::isMismatch
bool isMismatch() const
Definition: fvarLevel.h:111
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::setOptions
void setOptions(Sdc::Options const &options)
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueSpan::_disjoint
LocalIndex _disjoint
Definition: fvarLevel.h:227
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::completeTopologyFromFaceValues
void completeTopologyFromFaceValues(int regBoundaryValence)
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::CreaseEndPairArray
Vtr::Array< CreaseEndPair > CreaseEndPairArray
Definition: fvarLevel.h:151
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::SiblingArray
LocalIndexArray SiblingArray
Definition: fvarLevel.h:156
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Level::getOffsetOfVertexFaces
int getOffsetOfVertexFaces(Index vertIndex) const
Definition: level.h:351
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueSpan::_size
LocalIndex _size
Definition: fvarLevel.h:225
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::isDepSharp
bool isDepSharp() const
Definition: fvarLevel.h:116
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getFaceCompositeCombinedEdgeTag
Level::ETag getFaceCompositeCombinedEdgeTag(ConstIndexArray &faceEdges, Level::ETag *fvarETags) const
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::ConstIndexArray
ConstArray< Index > ConstIndexArray
Definition: types.h:80
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::validate
bool validate() const
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getNumValues
int getNumValues() const
Definition: fvarLevel.h:165
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::~FVarLevel
~FVarLevel()
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Level::getOffsetOfFaceVertices
int getOffsetOfFaceVertices(Index faceIndex) const
Definition: level.h:339
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getEdgeFaceValues
void getEdgeFaceValues(Index eIndex, int fIncToEdge, Index valuesPerVert[2]) const
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::hasSmoothBoundaries
bool hasSmoothBoundaries() const
Definition: fvarLevel.h:170
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Level::getDepth
int getDepth() const
Definition: level.h:157
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::resizeValues
void resizeValues(int numValues)
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::initializeFaceValuesFromFaceVertices
void initializeFaceValuesFromFaceVertices()
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getFaceCompositeValueTag
ValueTag getFaceCompositeValueTag(ConstIndexArray &faceValues, ConstIndexArray &faceVerts) const
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueTag::isInfSharp
bool isInfSharp() const
Definition: fvarLevel.h:115
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getVertexValueTags
ConstValueTagArray getVertexValueTags(Index vIndex) const
Definition: fvarLevel.h:328
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getEdgeTag
ETag getEdgeTag(Index eIndex) const
Definition: fvarLevel.h:179
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::Index
int Index
Definition: types.h:54
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::hasLinearBoundaries
bool hasLinearBoundaries() const
Definition: fvarLevel.h:169
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::Array
Definition: array.h:105
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getLevel
Level const & getLevel() const
Definition: fvarLevel.h:163
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getVertexFaceSiblings
ConstSiblingArray getVertexFaceSiblings(Index vIndex) const
Definition: fvarLevel.h:298
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ConstCreaseEndPairArray
Vtr::ConstArray< CreaseEndPair > ConstCreaseEndPairArray
Definition: fvarLevel.h:150
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getFaceCompositeValueAndVTag
Level::VTag getFaceCompositeValueAndVTag(ConstIndexArray &faceValues, ConstIndexArray &faceVerts, Level::VTag *fvarVTags) const
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarRefinement
Definition: fvarRefinement.h:59
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::ValueSpan::_start
LocalIndex _start
Definition: fvarLevel.h:226