24 #ifndef OPENSUBDIV3_VTR_LEVEL_H 25 #define OPENSUBDIV3_VTR_LEVEL_H 27 #include "../version.h" 29 #include "../sdc/types.h" 30 #include "../sdc/crease.h" 31 #include "../sdc/options.h" 32 #include "../vtr/types.h" 41 namespace OPENSUBDIV_VERSION {
129 explicit VTag(
VTagSize bits) { *
this = *reinterpret_cast<VTag const *>(&bits); }
148 explicit ETag(
ETagSize bits) { *
this = *reinterpret_cast<ETag const *>(&bits); }
344 int fvarChannel = -1)
const;
347 int fvarChannel = -1)
const;
349 int fvarChannel = -1)
const;
351 int fvarChannel = -1)
const;
354 int fvarChannel = -1)
const;
356 int fvarChannel = -1)
const;
514 std::vector<Index> _faceVertCountsAndOffsets;
515 std::vector<Index> _faceVertIndices;
516 std::vector<Index> _faceEdgeIndices;
517 std::vector<FTag> _faceTags;
520 std::vector<Index> _edgeVertIndices;
521 std::vector<Index> _edgeFaceCountsAndOffsets;
522 std::vector<Index> _edgeFaceIndices;
523 std::vector<LocalIndex> _edgeFaceLocalIndices;
525 std::vector<float> _edgeSharpness;
526 std::vector<ETag> _edgeTags;
529 std::vector<Index> _vertFaceCountsAndOffsets;
530 std::vector<Index> _vertFaceIndices;
531 std::vector<LocalIndex> _vertFaceLocalIndices;
533 std::vector<Index> _vertEdgeCountsAndOffsets;
534 std::vector<Index> _vertEdgeIndices;
535 std::vector<LocalIndex> _vertEdgeLocalIndices;
537 std::vector<float> _vertSharpness;
538 std::vector<VTag> _vertTags;
541 std::vector<FVarLevel*> _fvarChannels;
549 return ConstIndexArray(&_faceVertIndices[_faceVertCountsAndOffsets[faceIndex*2+1]],
550 _faceVertCountsAndOffsets[faceIndex*2]);
554 return IndexArray(&_faceVertIndices[_faceVertCountsAndOffsets[faceIndex*2+1]],
555 _faceVertCountsAndOffsets[faceIndex*2]);
561 int* countOffsetPair = &_faceVertCountsAndOffsets[faceIndex*2];
563 countOffsetPair[0] = count;
564 countOffsetPair[1] = (faceIndex == 0) ? 0 : (countOffsetPair[-2] + countOffsetPair[-1]);
566 _maxValence = std::max(_maxValence, count);
571 return ConstIndexArray(&_faceVertIndices[0], (
int)_faceVertIndices.size());
579 return ConstIndexArray(&_faceEdgeIndices[_faceVertCountsAndOffsets[faceIndex*2+1]],
580 _faceVertCountsAndOffsets[faceIndex*2]);
584 return IndexArray(&_faceEdgeIndices[_faceVertCountsAndOffsets[faceIndex*2+1]],
585 _faceVertCountsAndOffsets[faceIndex*2]);
593 return ConstIndexArray( (&_vertFaceIndices[0]) + _vertFaceCountsAndOffsets[vertIndex*2+1],
594 _vertFaceCountsAndOffsets[vertIndex*2]);
598 return IndexArray( (&_vertFaceIndices[0]) + _vertFaceCountsAndOffsets[vertIndex*2+1],
599 _vertFaceCountsAndOffsets[vertIndex*2]);
604 return ConstLocalIndexArray( (&_vertFaceLocalIndices[0]) + _vertFaceCountsAndOffsets[vertIndex*2+1],
605 _vertFaceCountsAndOffsets[vertIndex*2]);
609 return LocalIndexArray( (&_vertFaceLocalIndices[0]) + _vertFaceCountsAndOffsets[vertIndex*2+1],
610 _vertFaceCountsAndOffsets[vertIndex*2]);
615 int* countOffsetPair = &_vertFaceCountsAndOffsets[vertIndex*2];
617 countOffsetPair[0] = count;
618 countOffsetPair[1] = (vertIndex == 0) ? 0 : (countOffsetPair[-2] + countOffsetPair[-1]);
622 _vertFaceCountsAndOffsets[vertIndex*2] = count;
630 return ConstIndexArray( (&_vertEdgeIndices[0]) +_vertEdgeCountsAndOffsets[vertIndex*2+1],
631 _vertEdgeCountsAndOffsets[vertIndex*2]);
635 return IndexArray( (&_vertEdgeIndices[0]) +_vertEdgeCountsAndOffsets[vertIndex*2+1],
636 _vertEdgeCountsAndOffsets[vertIndex*2]);
641 return ConstLocalIndexArray( (&_vertEdgeLocalIndices[0]) + _vertEdgeCountsAndOffsets[vertIndex*2+1],
642 _vertEdgeCountsAndOffsets[vertIndex*2]);
646 return LocalIndexArray( (&_vertEdgeLocalIndices[0]) + _vertEdgeCountsAndOffsets[vertIndex*2+1],
647 _vertEdgeCountsAndOffsets[vertIndex*2]);
652 int* countOffsetPair = &_vertEdgeCountsAndOffsets[vertIndex*2];
654 countOffsetPair[0] = count;
655 countOffsetPair[1] = (vertIndex == 0) ? 0 : (countOffsetPair[-2] + countOffsetPair[-1]);
657 _maxValence = std::max(_maxValence, count);
661 _vertEdgeCountsAndOffsets[vertIndex*2] = count;
666 _maxValence = valence;
678 return IndexArray(&_edgeVertIndices[edgeIndex*2], 2);
687 _edgeFaceCountsAndOffsets[edgeIndex*2+1],
688 _edgeFaceCountsAndOffsets[edgeIndex*2]);
693 _edgeFaceCountsAndOffsets[edgeIndex*2+1],
694 _edgeFaceCountsAndOffsets[edgeIndex*2]);
700 _edgeFaceCountsAndOffsets[edgeIndex*2+1],
701 _edgeFaceCountsAndOffsets[edgeIndex*2]);
706 _edgeFaceCountsAndOffsets[edgeIndex*2+1],
707 _edgeFaceCountsAndOffsets[edgeIndex*2]);
712 int* countOffsetPair = &_edgeFaceCountsAndOffsets[edgeIndex*2];
714 countOffsetPair[0] = count;
715 countOffsetPair[1] = (edgeIndex == 0) ? 0 : (countOffsetPair[-2] + countOffsetPair[-1]);
717 _maxEdgeFaces = std::max(_maxEdgeFaces, count);
721 _edgeFaceCountsAndOffsets[edgeIndex*2] = count;
729 return _edgeSharpness[edgeIndex];
733 return _edgeSharpness[edgeIndex];
738 return _vertSharpness[vertIndex];
742 return _vertSharpness[vertIndex];
755 _faceTags[faceIndex]._hole = b;
759 return _faceTags[faceIndex]._hole;
767 _edgeTags[edgeIndex]._nonManifold = b;
771 return _edgeTags[edgeIndex]._nonManifold;
776 _vertTags[vertIndex]._nonManifold = b;
780 return _vertTags[vertIndex]._nonManifold;
788 _faceCount = faceCount;
789 _faceVertCountsAndOffsets.resize(2 * faceCount);
791 _faceTags.resize(faceCount);
792 std::memset(&_faceTags[0], 0, _faceCount *
sizeof(
FTag));
796 _faceVertIndices.resize(totalFaceVertCount);
800 _faceEdgeIndices.resize(totalFaceEdgeCount);
806 _edgeCount = edgeCount;
807 _edgeFaceCountsAndOffsets.resize(2 * edgeCount);
809 _edgeSharpness.resize(edgeCount);
810 _edgeTags.resize(edgeCount);
813 std::memset(&_edgeTags[0], 0, _edgeCount *
sizeof(
ETag));
819 _edgeVertIndices.resize(2 * _edgeCount);
824 _edgeFaceIndices.resize(totalEdgeFaceCount);
825 _edgeFaceLocalIndices.resize(totalEdgeFaceCount);
831 _vertCount = vertCount;
832 _vertFaceCountsAndOffsets.resize(2 * vertCount);
833 _vertEdgeCountsAndOffsets.resize(2 * vertCount);
835 _vertSharpness.resize(vertCount);
836 _vertTags.resize(vertCount);
837 std::memset(&_vertTags[0], 0, _vertCount *
sizeof(
VTag));
842 _vertFaceIndices.resize(totalVertFaceCount);
843 _vertFaceLocalIndices.resize(totalVertFaceCount);
848 _vertEdgeIndices.resize(totalVertEdgeCount);
849 _vertEdgeLocalIndices.resize(totalVertEdgeCount);
856 return IndexArray(const_cast<Index *>(&_faceVertCountsAndOffsets[0]),
857 (
int)_faceVertCountsAndOffsets.size());
864 using namespace OPENSUBDIV_VERSION;
void trimEdgeFaces(Index edgeIndex, int count)
Sdc::Options getFVarOptions(int channel) const
ConstIndexArray getVertexFaces(Index vertIndex) const
void getFaceETags(Index fIndex, ETag eTags[], int fvarChannel=-1) const
void setVertexNonManifold(Index vertIndex, bool b)
ETag & getEdgeTag(Index edgeIndex)
VTag & getVertexTag(Index vertIndex)
int gatherQuadRegularPartialRingAroundVertex(Index vIndex, VSpan const &span, Index ringPoints[], int fvarChannel=-1) const
int getOffsetOfEdgeVertices(Index edgeIndex) const
void orientIncidentComponents()
VTag getFaceCompositeVTag(Index fIndex, int fvarChannel=-1) const
int getNumVertexFacesTotal() const
void setFaceHole(Index faceIndex, bool b)
Sdc::Crease::Rule getVertexRule(Index vertIndex) const
int gatherTriRegularCornerVertexPatchPoints(Index fIndex, Index patchVerts[], int cornerVertInFace) const
void resizeFaces(int numFaces)
void getFaceVTags(Index fIndex, VTag vTags[], int fvarChannel=-1) const
bool validateTopology(ValidationCallback callback=0, void const *clientData=0) const
static char const * getTopologyErrorString(TopologyError errCode)
float getEdgeSharpness(Index edgeIndex) const
int getNumEdgeFacesTotal() const
ConstLocalIndexArray getVertexFaceLocalIndices(Index vertIndex) const
bool doesEdgeFVarTopologyMatch(Index eIndex, int fvarChannel) const
FVarLevel & getFVarLevel(int channel)
int getMaxValence() const
static VTag BitwiseOr(VTag const vTags[], int size=4)
int createFVarChannel(int fvarValueCount, Sdc::Options const &options)
bool orderVertexFacesAndEdges(Index vIndex, Index *vFaces, Index *vEdges) const
void resizeEdges(int numEdges)
ConstLocalIndexArray getVertexEdgeLocalIndices(Index vertIndex) const
bool doesVertexFVarTopologyMatch(Index vIndex, int fvarChannel) const
FTag const & getFaceTag(Index faceIndex) const
FVarLevel const & getFVarLevel(int channel) const
int gatherTriRegularBoundaryEdgePatchPoints(Index fIndex, Index patchVerts[], int boundaryEdgeInFace) const
void resizeFaceVertices(int numFaceVertsTotal)
void resizeVertexFaces(int numVertexFacesTotal)
VTag getVertexCompositeFVarVTag(Index vIndex, int fvarChannel) const
unsigned short LocalIndex
void trimVertexEdges(Index vertIndex, int count)
int getNumVertices() const
int gatherTriRegularBoundaryVertexPatchPoints(Index fIndex, Index patchVerts[], int boundaryVertInFace) const
friend class QuadRefinement
int getOffsetOfVertexEdges(Index vertIndex) const
ConstIndexArray getFaceFVarValues(Index faceIndex, int channel) const
void resizeFaceEdges(int numFaceEdgesTotal)
bool isEdgeNonManifold(Index edgeIndex) const
void setEdgeNonManifold(Index edgeIndex, bool b)
int getMaxEdgeFaces() const
ConstArray< Index > ConstIndexArray
int gatherQuadLinearPatchPoints(Index fIndex, Index patchPoints[], int rotation=0, int fvarChannel=-1) const
void resizeEdgeFaces(int numEdgeFacesTotal)
int getNumFVarChannels() const
ConstIndexArray getFaceEdges(Index faceIndex) const
int getNumVertexFaces(Index vertIndex) const
int getOffsetOfFaceVertices(Index faceIndex) const
int getNumEdgeFaces(Index edgeIndex) const
ConstIndexArray getEdgeVertices(Index edgeIndex) const
int gatherQuadRegularRingAroundVertex(Index vIndex, Index ringPoints[], int fvarChannel=-1) const
int getOffsetOfFaceEdges(Index faceIndex) const
All supported options applying to subdivision scheme.
ConstArray< LocalIndex > ConstLocalIndexArray
ConstIndexArray getEdgeFaces(Index edgeIndex) const
Index findEdge(Index v0Index, Index v1Index) const
bool completeTopologyFromFaceVertices()
IndexArray shareFaceVertCountsAndOffsets() const
int getNumFaceVertices(Index faceIndex) const
Array< LocalIndex > LocalIndexArray
int gatherQuadRegularBoundaryPatchPoints(Index fIndex, Index patchPoints[], int boundaryEdgeInFace, int fvarChannel=-1) const
int getNumVertexEdgesTotal() const
void print(const Refinement *parentRefinement=0) const
int getNumFaceVerticesTotal() const
friend class TriRefinement
int getNumEdgeVerticesTotal() const
void setMaxValence(int maxValence)
ConstLocalIndexArray getEdgeFaceLocalIndices(Index edgeIndex) const
bool isFaceHole(Index faceIndex) const
int gatherQuadRegularInteriorPatchPoints(Index fIndex, Index patchPoints[], int rotation=0, int fvarChannel=-1) const
int getNumVertexEdges(Index vertIndex) const
void completeFVarChannelTopology(int channel, int regBoundaryValence)
void resizeVertices(int numVertices)
ConstIndexArray getFaceVertices() const
int gatherTriRegularCornerEdgePatchPoints(Index fIndex, Index patchVerts[], int cornerEdgeInFace) const
ETag const & getEdgeTag(Index edgeIndex) const
bool isVertexNonManifold(Index vertIndex) const
float getVertexSharpness(Index vertIndex) const
void destroyFVarChannel(int channel)
void populateLocalIndices()
int getNumFaceEdges(Index faceIndex) const
int gatherTriRegularInteriorPatchPoints(Index fIndex, Index patchVerts[], int rotation=0) const
bool doesFaceFVarTopologyMatch(Index fIndex, int fvarChannel) const
Array< Index > IndexArray
int gatherQuadRegularCornerPatchPoints(Index fIndex, Index patchPoints[], int cornerVertInFace, int fvarChannel=-1) const
void trimVertexFaces(Index vertIndex, int count)
int getNumEdgeVertices(Index) const
void resizeVertexEdges(int numVertexEdgesTotal)
static ETag BitwiseOr(ETag const eTags[], int size=4)
VTag const & getVertexTag(Index vertIndex) const
int getOffsetOfVertexFaces(Index vertIndex) const
bool isSingleCreasePatch(Index face, float *sharpnessOut=NULL, int *rotationOut=NULL) const
void(* ValidationCallback)(TopologyError errCode, char const *msg, void const *clientData)
ConstIndexArray getVertexEdges(Index vertIndex) const
int getNumFaceEdgesTotal() const
int getNumFVarValues(int channel) const
FTag & getFaceTag(Index faceIndex)
void resizeEdgeVertices()
int getOffsetOfEdgeFaces(Index edgeIndex) const