7#ifndef OPENSUBDIV3_VTR_FVAR_LEVEL_H
8#define OPENSUBDIV3_VTR_FVAR_LEVEL_H
10#include "../version.h"
24namespace OPENSUBDIV_VERSION {
73 void clear() { std::memset(
this, 0,
sizeof(ETag)); }
75 typedef unsigned char ETagSize;
77 ETagSize _mismatch : 1;
78 ETagSize _disctsV0 : 1;
79 ETagSize _disctsV1 : 1;
82 Level::ETag combineWithLevelETag(Level::ETag)
const;
94 void clear() { std::memset(
this, 0,
sizeof(ValueTag)); }
96 bool isMismatch()
const {
return _mismatch; }
97 bool isCrease()
const {
return _crease; }
98 bool isCorner()
const {
return !_crease; }
99 bool isSemiSharp()
const {
return _semiSharp; }
100 bool isInfSharp()
const {
return !_semiSharp && !_crease; }
101 bool isDepSharp()
const {
return _depSharp; }
102 bool hasCreaseEnds()
const {
return _crease || _semiSharp; }
104 bool hasInfSharpEdges()
const {
return _infSharpEdges; }
105 bool hasInfIrregularity()
const {
return _infIrregular; }
107 typedef unsigned char ValueTagSize;
110 ValueTagSize _mismatch : 1;
111 ValueTagSize _xordinary : 1;
112 ValueTagSize _nonManifold : 1;
113 ValueTagSize _crease : 1;
114 ValueTagSize _semiSharp : 1;
115 ValueTagSize _depSharp : 1;
117 ValueTagSize _infSharpEdges : 1;
118 ValueTagSize _infIrregular : 1;
120 Level::VTag combineWithLevelVTag(Level::VTag)
const;
123 explicit ValueTag(ValueTagSize bits) {
124 std::memcpy(
this, &bits,
sizeof(bits));
126 ValueTagSize getBits()
const {
128 std::memcpy(&bits,
this,
sizeof(bits));
133 typedef Vtr::ConstArray<ValueTag> ConstValueTagArray;
134 typedef Vtr::Array<ValueTag> ValueTagArray;
141 struct CreaseEndPair {
146 typedef Vtr::ConstArray<CreaseEndPair> ConstCreaseEndPairArray;
147 typedef Vtr::Array<CreaseEndPair> CreaseEndPairArray;
155 FVarLevel(Level
const& level);
159 Level
const& getLevel()
const {
return _level; }
161 int getNumValues()
const {
return _valueCount; }
162 int getNumFaceValuesTotal()
const {
return (
int) _faceVertValues.size(); }
164 bool isLinear()
const {
return _isLinear; }
165 bool hasLinearBoundaries()
const {
return _hasLinearBoundaries; }
166 bool hasSmoothBoundaries()
const {
return ! _hasLinearBoundaries; }
167 bool hasCreaseEnds()
const {
return hasSmoothBoundaries(); }
169 Sdc::Options getOptions()
const {
return _options; }
176 ETag getEdgeTag(
Index eIndex)
const {
return _edgeTags[eIndex]; }
177 bool edgeTopologyMatches(
Index eIndex)
const {
return !getEdgeTag(eIndex)._mismatch; }
180 int getNumVertexValues(
Index v)
const {
return _vertSiblingCounts[v]; }
181 Index getVertexValueOffset(
Index v, Sibling i = 0)
const {
return _vertSiblingOffsets[v] + i; }
183 Index getVertexValue(
Index v, Sibling i = 0)
const {
return _vertValueIndices[getVertexValueOffset(v,i)]; }
191 ConstValueTagArray getVertexValueTags(
Index vIndex)
const;
192 ValueTagArray getVertexValueTags(
Index vIndex);
194 ConstCreaseEndPairArray getVertexValueCreaseEnds(
Index vIndex)
const;
195 CreaseEndPairArray getVertexValueCreaseEnds(
Index vIndex);
197 ConstSiblingArray getVertexFaceSiblings(
Index vIndex)
const;
198 SiblingArray getVertexFaceSiblings(
Index vIndex);
201 ValueTag getValueTag(
Index valueIndex)
const {
return _vertValueTags[valueIndex]; }
202 bool valueTopologyMatches(
Index valueIndex)
const {
return !getValueTag(valueIndex)._mismatch; }
204 CreaseEndPair getValueCreaseEndPair(
Index valueIndex)
const {
return _vertValueCreaseEnds[valueIndex]; }
207 void getFaceValueTags(
Index faceIndex, ValueTag valueTags[])
const;
209 ValueTag getFaceCompositeValueTag(
Index faceIndex)
const;
212 void getEdgeFaceValues(
Index eIndex,
int fIncToEdge,
Index valuesPerVert[2])
const;
213 void getVertexEdgeValues(
Index vIndex,
Index valuesPerEdge[])
const;
214 void getVertexCreaseEndValues(
Index vIndex, Sibling sibling,
Index endValues[2])
const;
217 void setOptions(Sdc::Options
const& options);
218 void resizeVertexValues(
int numVertexValues);
219 void resizeValues(
int numValues);
220 void resizeComponents();
223 void completeTopologyFromFaceValues(
int regBoundaryValence);
224 void initializeFaceValuesFromFaceVertices();
225 void initializeFaceValuesFromVertexFaceSiblings();
228 void gatherValueSpans(
Index vIndex, ValueSpan * vValueSpans)
const;
231 bool validate()
const;
233 void buildFaceVertexSiblingsFromVertexFaceSiblings(std::vector<Sibling>& fvSiblings)
const;
237 friend class FVarRefinement;
239 Level
const & _level;
242 Sdc::Options _options;
245 bool _hasLinearBoundaries;
246 bool _hasDependentSharpness;
261 std::vector<Index> _faceVertValues;
264 std::vector<ETag> _edgeTags;
267 std::vector<Sibling> _vertSiblingCounts;
268 std::vector<int> _vertSiblingOffsets;
269 std::vector<Sibling> _vertFaceSiblings;
272 std::vector<Index> _vertValueIndices;
273 std::vector<ValueTag> _vertValueTags;
274 std::vector<CreaseEndPair> _vertValueCreaseEnds;
281FVarLevel::getFaceValues(
Index fIndex)
const {
283 int vCount = _level.getNumFaceVertices(fIndex);
284 int vOffset = _level.getOffsetOfFaceVertices(fIndex);
288FVarLevel::getFaceValues(
Index fIndex) {
290 int vCount = _level.getNumFaceVertices(fIndex);
291 int vOffset = _level.getOffsetOfFaceVertices(fIndex);
292 return IndexArray(&_faceVertValues[vOffset], vCount);
295inline FVarLevel::ConstSiblingArray
296FVarLevel::getVertexFaceSiblings(
Index vIndex)
const {
298 int vCount = _level.getNumVertexFaces(vIndex);
299 int vOffset = _level.getOffsetOfVertexFaces(vIndex);
300 return ConstSiblingArray(&_vertFaceSiblings[vOffset], vCount);
302inline FVarLevel::SiblingArray
303FVarLevel::getVertexFaceSiblings(
Index vIndex) {
305 int vCount = _level.getNumVertexFaces(vIndex);
306 int vOffset = _level.getOffsetOfVertexFaces(vIndex);
307 return SiblingArray(&_vertFaceSiblings[vOffset], vCount);
311FVarLevel::getVertexValues(
Index vIndex)
const
313 int vCount = getNumVertexValues(vIndex);
314 int vOffset = getVertexValueOffset(vIndex);
318FVarLevel::getVertexValues(
Index vIndex)
320 int vCount = getNumVertexValues(vIndex);
321 int vOffset = getVertexValueOffset(vIndex);
322 return IndexArray(&_vertValueIndices[vOffset], vCount);
325inline FVarLevel::ConstValueTagArray
326FVarLevel::getVertexValueTags(
Index vIndex)
const
328 int vCount = getNumVertexValues(vIndex);
329 int vOffset = getVertexValueOffset(vIndex);
330 return ConstValueTagArray(&_vertValueTags[vOffset], vCount);
332inline FVarLevel::ValueTagArray
333FVarLevel::getVertexValueTags(
Index vIndex)
335 int vCount = getNumVertexValues(vIndex);
336 int vOffset = getVertexValueOffset(vIndex);
337 return ValueTagArray(&_vertValueTags[vOffset], vCount);
340inline FVarLevel::ConstCreaseEndPairArray
341FVarLevel::getVertexValueCreaseEnds(
Index vIndex)
const
343 int vCount = getNumVertexValues(vIndex);
344 int vOffset = getVertexValueOffset(vIndex);
345 return ConstCreaseEndPairArray(&_vertValueCreaseEnds[vOffset], vCount);
347inline FVarLevel::CreaseEndPairArray
348FVarLevel::getVertexValueCreaseEnds(
Index vIndex)
350 int vCount = getNumVertexValues(vIndex);
351 int vOffset = getVertexValueOffset(vIndex);
352 return CreaseEndPairArray(&_vertValueCreaseEnds[vOffset], vCount);
356FVarLevel::findVertexValueIndex(
Index vertexIndex,
Index valueIndex)
const {
358 if (_level.getDepth() > 0)
return valueIndex;
360 Index vvIndex = getVertexValueOffset(vertexIndex);
361 while (_vertValueIndices[vvIndex] != valueIndex) {
371FVarLevel::ETag::combineWithLevelETag(Level::ETag levelTag)
const
373 if (this->_mismatch) {
374 levelTag._boundary =
true;
375 levelTag._infSharp =
true;
380FVarLevel::ValueTag::combineWithLevelVTag(Level::VTag levelTag)
const
382 if (this->_mismatch) {
390 if (this->isCorner()) {
395 if (this->isCrease() || this->isSemiSharp()) {
396 levelTag._infSharp =
false;
397 levelTag._infSharpCrease =
true;
398 levelTag._corner =
false;
400 levelTag._infSharp =
true;
401 levelTag._infSharpCrease =
false;
402 levelTag._corner = !this->_infIrregular && !this->_infSharpEdges;
404 levelTag._infSharpEdges =
true;
405 levelTag._infIrregular = this->_infIrregular;
407 levelTag._boundary =
true;
408 levelTag._xordinary = this->_xordinary;
410 levelTag._nonManifold |= this->_nonManifold;
419using namespace OPENSUBDIV_VERSION;
ConstArray< LocalIndex > ConstLocalIndexArray
Array< LocalIndex > LocalIndexArray
ConstArray< Index > ConstIndexArray
unsigned short LocalIndex
Array< Index > IndexArray