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 {
130 std::memcpy(
this, &bits,
sizeof(bits));
134 std::memcpy(&bits,
this,
sizeof(bits));
155 std::memcpy(
this, &bits,
sizeof(bits));
159 std::memcpy(&bits,
this,
sizeof(bits));
356 int fvarChannel = -1)
const;
359 int fvarChannel = -1)
const;
361 int fvarChannel = -1)
const;
363 int fvarChannel = -1)
const;
366 int fvarChannel = -1)
const;
368 int fvarChannel = -1)
const;
526 std::vector<Index> _faceVertCountsAndOffsets;
527 std::vector<Index> _faceVertIndices;
528 std::vector<Index> _faceEdgeIndices;
529 std::vector<FTag> _faceTags;
532 std::vector<Index> _edgeVertIndices;
533 std::vector<Index> _edgeFaceCountsAndOffsets;
534 std::vector<Index> _edgeFaceIndices;
535 std::vector<LocalIndex> _edgeFaceLocalIndices;
537 std::vector<float> _edgeSharpness;
538 std::vector<ETag> _edgeTags;
541 std::vector<Index> _vertFaceCountsAndOffsets;
542 std::vector<Index> _vertFaceIndices;
543 std::vector<LocalIndex> _vertFaceLocalIndices;
545 std::vector<Index> _vertEdgeCountsAndOffsets;
546 std::vector<Index> _vertEdgeIndices;
547 std::vector<LocalIndex> _vertEdgeLocalIndices;
549 std::vector<float> _vertSharpness;
550 std::vector<VTag> _vertTags;
553 std::vector<FVarLevel*> _fvarChannels;
561 return ConstIndexArray(&_faceVertIndices[_faceVertCountsAndOffsets[faceIndex*2+1]],
562 _faceVertCountsAndOffsets[faceIndex*2]);
566 return IndexArray(&_faceVertIndices[_faceVertCountsAndOffsets[faceIndex*2+1]],
567 _faceVertCountsAndOffsets[faceIndex*2]);
573 int* countOffsetPair = &_faceVertCountsAndOffsets[faceIndex*2];
575 countOffsetPair[0] = count;
576 countOffsetPair[1] = (faceIndex == 0) ? 0 : (countOffsetPair[-2] + countOffsetPair[-1]);
578 _maxValence = std::max(_maxValence, count);
583 return ConstIndexArray(&_faceVertIndices[0], (
int)_faceVertIndices.size());
591 return ConstIndexArray(&_faceEdgeIndices[_faceVertCountsAndOffsets[faceIndex*2+1]],
592 _faceVertCountsAndOffsets[faceIndex*2]);
596 return IndexArray(&_faceEdgeIndices[_faceVertCountsAndOffsets[faceIndex*2+1]],
597 _faceVertCountsAndOffsets[faceIndex*2]);
605 return ConstIndexArray( (&_vertFaceIndices[0]) + _vertFaceCountsAndOffsets[vertIndex*2+1],
606 _vertFaceCountsAndOffsets[vertIndex*2]);
610 return IndexArray( (&_vertFaceIndices[0]) + _vertFaceCountsAndOffsets[vertIndex*2+1],
611 _vertFaceCountsAndOffsets[vertIndex*2]);
616 return ConstLocalIndexArray( (&_vertFaceLocalIndices[0]) + _vertFaceCountsAndOffsets[vertIndex*2+1],
617 _vertFaceCountsAndOffsets[vertIndex*2]);
621 return LocalIndexArray( (&_vertFaceLocalIndices[0]) + _vertFaceCountsAndOffsets[vertIndex*2+1],
622 _vertFaceCountsAndOffsets[vertIndex*2]);
627 int* countOffsetPair = &_vertFaceCountsAndOffsets[vertIndex*2];
629 countOffsetPair[0] = count;
630 countOffsetPair[1] = (vertIndex == 0) ? 0 : (countOffsetPair[-2] + countOffsetPair[-1]);
634 _vertFaceCountsAndOffsets[vertIndex*2] = count;
642 return ConstIndexArray( (&_vertEdgeIndices[0]) +_vertEdgeCountsAndOffsets[vertIndex*2+1],
643 _vertEdgeCountsAndOffsets[vertIndex*2]);
647 return IndexArray( (&_vertEdgeIndices[0]) +_vertEdgeCountsAndOffsets[vertIndex*2+1],
648 _vertEdgeCountsAndOffsets[vertIndex*2]);
653 return ConstLocalIndexArray( (&_vertEdgeLocalIndices[0]) + _vertEdgeCountsAndOffsets[vertIndex*2+1],
654 _vertEdgeCountsAndOffsets[vertIndex*2]);
658 return LocalIndexArray( (&_vertEdgeLocalIndices[0]) + _vertEdgeCountsAndOffsets[vertIndex*2+1],
659 _vertEdgeCountsAndOffsets[vertIndex*2]);
664 int* countOffsetPair = &_vertEdgeCountsAndOffsets[vertIndex*2];
666 countOffsetPair[0] = count;
667 countOffsetPair[1] = (vertIndex == 0) ? 0 : (countOffsetPair[-2] + countOffsetPair[-1]);
669 _maxValence = std::max(_maxValence, count);
673 _vertEdgeCountsAndOffsets[vertIndex*2] = count;
678 _maxValence = valence;
690 return IndexArray(&_edgeVertIndices[edgeIndex*2], 2);
699 _edgeFaceCountsAndOffsets[edgeIndex*2+1],
700 _edgeFaceCountsAndOffsets[edgeIndex*2]);
705 _edgeFaceCountsAndOffsets[edgeIndex*2+1],
706 _edgeFaceCountsAndOffsets[edgeIndex*2]);
712 _edgeFaceCountsAndOffsets[edgeIndex*2+1],
713 _edgeFaceCountsAndOffsets[edgeIndex*2]);
718 _edgeFaceCountsAndOffsets[edgeIndex*2+1],
719 _edgeFaceCountsAndOffsets[edgeIndex*2]);
724 int* countOffsetPair = &_edgeFaceCountsAndOffsets[edgeIndex*2];
726 countOffsetPair[0] = count;
727 countOffsetPair[1] = (edgeIndex == 0) ? 0 : (countOffsetPair[-2] + countOffsetPair[-1]);
729 _maxEdgeFaces = std::max(_maxEdgeFaces, count);
733 _edgeFaceCountsAndOffsets[edgeIndex*2] = count;
741 return _edgeSharpness[edgeIndex];
745 return _edgeSharpness[edgeIndex];
750 return _vertSharpness[vertIndex];
754 return _vertSharpness[vertIndex];
767 _faceTags[faceIndex]._hole = b;
771 return _faceTags[faceIndex]._hole;
779 _edgeTags[edgeIndex]._nonManifold = b;
783 return _edgeTags[edgeIndex]._nonManifold;
788 _vertTags[vertIndex]._nonManifold = b;
792 return _vertTags[vertIndex]._nonManifold;
800 _faceCount = faceCount;
801 _faceVertCountsAndOffsets.resize(2 * faceCount);
803 _faceTags.resize(faceCount);
804 std::memset(&_faceTags[0], 0, _faceCount *
sizeof(
FTag));
808 _faceVertIndices.resize(totalFaceVertCount);
812 _faceEdgeIndices.resize(totalFaceEdgeCount);
818 _edgeCount = edgeCount;
819 _edgeFaceCountsAndOffsets.resize(2 * edgeCount);
821 _edgeSharpness.resize(edgeCount);
822 _edgeTags.resize(edgeCount);
825 std::memset(&_edgeTags[0], 0, _edgeCount *
sizeof(
ETag));
831 _edgeVertIndices.resize(2 * _edgeCount);
836 _edgeFaceIndices.resize(totalEdgeFaceCount);
837 _edgeFaceLocalIndices.resize(totalEdgeFaceCount);
843 _vertCount = vertCount;
844 _vertFaceCountsAndOffsets.resize(2 * vertCount);
845 _vertEdgeCountsAndOffsets.resize(2 * vertCount);
847 _vertSharpness.resize(vertCount);
848 _vertTags.resize(vertCount);
849 std::memset(&_vertTags[0], 0, _vertCount *
sizeof(
VTag));
854 _vertFaceIndices.resize(totalVertFaceCount);
855 _vertFaceLocalIndices.resize(totalVertFaceCount);
860 _vertEdgeIndices.resize(totalVertEdgeCount);
861 _vertEdgeLocalIndices.resize(totalVertEdgeCount);
868 return IndexArray(const_cast<Index *>(&_faceVertCountsAndOffsets[0]),
869 (
int)_faceVertCountsAndOffsets.size());
876 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