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 {
176 unsigned short _periodic : 1;
177 unsigned short _sharp : 1;
329 int fvarChannel = -1)
const;
332 int fvarChannel = -1)
const;
334 int fvarChannel = -1)
const;
336 int fvarChannel = -1)
const;
339 int fvarChannel = -1)
const;
341 int fvarChannel = -1)
const;
499 std::vector<Index> _faceVertCountsAndOffsets;
500 std::vector<Index> _faceVertIndices;
501 std::vector<Index> _faceEdgeIndices;
502 std::vector<FTag> _faceTags;
505 std::vector<Index> _edgeVertIndices;
506 std::vector<Index> _edgeFaceCountsAndOffsets;
507 std::vector<Index> _edgeFaceIndices;
508 std::vector<LocalIndex> _edgeFaceLocalIndices;
510 std::vector<float> _edgeSharpness;
511 std::vector<ETag> _edgeTags;
514 std::vector<Index> _vertFaceCountsAndOffsets;
515 std::vector<Index> _vertFaceIndices;
516 std::vector<LocalIndex> _vertFaceLocalIndices;
518 std::vector<Index> _vertEdgeCountsAndOffsets;
519 std::vector<Index> _vertEdgeIndices;
520 std::vector<LocalIndex> _vertEdgeLocalIndices;
522 std::vector<float> _vertSharpness;
523 std::vector<VTag> _vertTags;
526 std::vector<FVarLevel*> _fvarChannels;
534 return ConstIndexArray(&_faceVertIndices[_faceVertCountsAndOffsets[faceIndex*2+1]],
535 _faceVertCountsAndOffsets[faceIndex*2]);
539 return IndexArray(&_faceVertIndices[_faceVertCountsAndOffsets[faceIndex*2+1]],
540 _faceVertCountsAndOffsets[faceIndex*2]);
546 int* countOffsetPair = &_faceVertCountsAndOffsets[faceIndex*2];
548 countOffsetPair[0] = count;
549 countOffsetPair[1] = (faceIndex == 0) ? 0 : (countOffsetPair[-2] + countOffsetPair[-1]);
551 _maxValence = std::max(_maxValence, count);
556 return ConstIndexArray(&_faceVertIndices[0], (
int)_faceVertIndices.size());
564 return ConstIndexArray(&_faceEdgeIndices[_faceVertCountsAndOffsets[faceIndex*2+1]],
565 _faceVertCountsAndOffsets[faceIndex*2]);
569 return IndexArray(&_faceEdgeIndices[_faceVertCountsAndOffsets[faceIndex*2+1]],
570 _faceVertCountsAndOffsets[faceIndex*2]);
578 return ConstIndexArray( (&_vertFaceIndices[0]) + _vertFaceCountsAndOffsets[vertIndex*2+1],
579 _vertFaceCountsAndOffsets[vertIndex*2]);
583 return IndexArray( (&_vertFaceIndices[0]) + _vertFaceCountsAndOffsets[vertIndex*2+1],
584 _vertFaceCountsAndOffsets[vertIndex*2]);
589 return ConstLocalIndexArray( (&_vertFaceLocalIndices[0]) + _vertFaceCountsAndOffsets[vertIndex*2+1],
590 _vertFaceCountsAndOffsets[vertIndex*2]);
594 return LocalIndexArray( (&_vertFaceLocalIndices[0]) + _vertFaceCountsAndOffsets[vertIndex*2+1],
595 _vertFaceCountsAndOffsets[vertIndex*2]);
600 int* countOffsetPair = &_vertFaceCountsAndOffsets[vertIndex*2];
602 countOffsetPair[0] = count;
603 countOffsetPair[1] = (vertIndex == 0) ? 0 : (countOffsetPair[-2] + countOffsetPair[-1]);
607 _vertFaceCountsAndOffsets[vertIndex*2] = count;
615 return ConstIndexArray( (&_vertEdgeIndices[0]) +_vertEdgeCountsAndOffsets[vertIndex*2+1],
616 _vertEdgeCountsAndOffsets[vertIndex*2]);
620 return IndexArray( (&_vertEdgeIndices[0]) +_vertEdgeCountsAndOffsets[vertIndex*2+1],
621 _vertEdgeCountsAndOffsets[vertIndex*2]);
626 return ConstLocalIndexArray( (&_vertEdgeLocalIndices[0]) + _vertEdgeCountsAndOffsets[vertIndex*2+1],
627 _vertEdgeCountsAndOffsets[vertIndex*2]);
631 return LocalIndexArray( (&_vertEdgeLocalIndices[0]) + _vertEdgeCountsAndOffsets[vertIndex*2+1],
632 _vertEdgeCountsAndOffsets[vertIndex*2]);
637 int* countOffsetPair = &_vertEdgeCountsAndOffsets[vertIndex*2];
639 countOffsetPair[0] = count;
640 countOffsetPair[1] = (vertIndex == 0) ? 0 : (countOffsetPair[-2] + countOffsetPair[-1]);
642 _maxValence = std::max(_maxValence, count);
646 _vertEdgeCountsAndOffsets[vertIndex*2] = count;
651 _maxValence = valence;
663 return IndexArray(&_edgeVertIndices[edgeIndex*2], 2);
672 _edgeFaceCountsAndOffsets[edgeIndex*2+1],
673 _edgeFaceCountsAndOffsets[edgeIndex*2]);
678 _edgeFaceCountsAndOffsets[edgeIndex*2+1],
679 _edgeFaceCountsAndOffsets[edgeIndex*2]);
685 _edgeFaceCountsAndOffsets[edgeIndex*2+1],
686 _edgeFaceCountsAndOffsets[edgeIndex*2]);
691 _edgeFaceCountsAndOffsets[edgeIndex*2+1],
692 _edgeFaceCountsAndOffsets[edgeIndex*2]);
697 int* countOffsetPair = &_edgeFaceCountsAndOffsets[edgeIndex*2];
699 countOffsetPair[0] = count;
700 countOffsetPair[1] = (edgeIndex == 0) ? 0 : (countOffsetPair[-2] + countOffsetPair[-1]);
702 _maxEdgeFaces = std::max(_maxEdgeFaces, count);
706 _edgeFaceCountsAndOffsets[edgeIndex*2] = count;
714 return _edgeSharpness[edgeIndex];
718 return _edgeSharpness[edgeIndex];
723 return _vertSharpness[vertIndex];
727 return _vertSharpness[vertIndex];
740 _faceTags[faceIndex]._hole = b;
744 return _faceTags[faceIndex]._hole;
752 _edgeTags[edgeIndex]._nonManifold = b;
756 return _edgeTags[edgeIndex]._nonManifold;
761 _vertTags[vertIndex]._nonManifold = b;
765 return _vertTags[vertIndex]._nonManifold;
773 _faceCount = faceCount;
774 _faceVertCountsAndOffsets.resize(2 * faceCount);
776 _faceTags.resize(faceCount);
777 std::memset(&_faceTags[0], 0, _faceCount *
sizeof(
FTag));
781 _faceVertIndices.resize(totalFaceVertCount);
785 _faceEdgeIndices.resize(totalFaceEdgeCount);
791 _edgeCount = edgeCount;
792 _edgeFaceCountsAndOffsets.resize(2 * edgeCount);
794 _edgeSharpness.resize(edgeCount);
795 _edgeTags.resize(edgeCount);
798 std::memset(&_edgeTags[0], 0, _edgeCount *
sizeof(
ETag));
804 _edgeVertIndices.resize(2 * _edgeCount);
809 _edgeFaceIndices.resize(totalEdgeFaceCount);
810 _edgeFaceLocalIndices.resize(totalEdgeFaceCount);
816 _vertCount = vertCount;
817 _vertFaceCountsAndOffsets.resize(2 * vertCount);
818 _vertEdgeCountsAndOffsets.resize(2 * vertCount);
820 _vertSharpness.resize(vertCount);
821 _vertTags.resize(vertCount);
822 std::memset(&_vertTags[0], 0, _vertCount *
sizeof(
VTag));
827 _vertFaceIndices.resize(totalVertFaceCount);
828 _vertFaceLocalIndices.resize(totalVertFaceCount);
833 _vertEdgeIndices.resize(totalVertEdgeCount);
834 _vertEdgeLocalIndices.resize(totalVertEdgeCount);
841 return IndexArray(const_cast<Index *>(&_faceVertCountsAndOffsets[0]),
842 (
int)_faceVertCountsAndOffsets.size());
849 using namespace OPENSUBDIV_VERSION;
friend class QuadRefinement
Array< Index > IndexArray
void getFaceVTags(Index fIndex, VTag vTags[], int fvarChannel=-1) const
void completeFVarChannelTopology(int channel, int regBoundaryValence)
bool isVertexNonManifold(Index vertIndex) const
VTag & getVertexTag(Index vertIndex)
ConstLocalIndexArray getVertexFaceLocalIndices(Index vertIndex) const
int createFVarChannel(int fvarValueCount, Sdc::Options const &options)
FTag const & getFaceTag(Index faceIndex) const
void setVertexNonManifold(Index vertIndex, bool b)
void setFaceHole(Index faceIndex, bool b)
FTag & getFaceTag(Index faceIndex)
Array< LocalIndex > LocalIndexArray
ConstIndexArray getFaceEdges(Index faceIndex) const
int getNumVertexFacesTotal() const
VTag const & getVertexTag(Index vertIndex) const
bool isFaceHole(Index faceIndex) const
int gatherQuadRegularInteriorPatchPoints(Index fIndex, Index patchPoints[], int rotation=0, int fvarChannel=-1) const
ConstIndexArray getVertexEdges(Index vertIndex) const
bool validateTopology(ValidationCallback callback=0, void const *clientData=0) const
ConstIndexArray getFaceFVarValues(Index faceIndex, int channel) const
Sdc::Crease::Rule getVertexRule(Index vertIndex) const
float getEdgeSharpness(Index edgeIndex) const
int getNumFVarValues(int channel) const
ConstIndexArray getVertexFaces(Index vertIndex) const
int gatherQuadRegularBoundaryPatchPoints(Index fIndex, Index patchPoints[], int boundaryEdgeInFace, int fvarChannel=-1) const
IndexArray shareFaceVertCountsAndOffsets() const
void setEdgeNonManifold(Index edgeIndex, bool b)
int getNumFaceEdges(Index faceIndex) const
All supported options applying to subdivision scheme.
bool isEdgeNonManifold(Index edgeIndex) const
int gatherQuadRegularCornerPatchPoints(Index fIndex, Index patchPoints[], int cornerVertInFace, int fvarChannel=-1) const
void resizeVertexFaces(int numVertexFacesTotal)
void trimVertexFaces(Index vertIndex, int count)
bool doesEdgeFVarTopologyMatch(Index eIndex, int fvarChannel) const
void resizeVertexEdges(int numVertexEdgesTotal)
void resizeFaceVertices(int numFaceVertsTotal)
int getNumVertexFaces(Index vertIndex) const
int gatherTriRegularCornerVertexPatchPoints(Index fIndex, Index patchVerts[], int cornerVertInFace) const
ConstLocalIndexArray getVertexEdgeLocalIndices(Index vertIndex) const
int getOffsetOfFaceVertices(Index faceIndex) const
static char const * getTopologyErrorString(TopologyError errCode)
int getMaxValence() const
ETag const & getEdgeTag(Index edgeIndex) const
int getOffsetOfEdgeFaces(Index edgeIndex) const
void resizeEdgeFaces(int numEdgeFacesTotal)
void resizeEdgeVertices()
int getNumFaceVertices(Index faceIndex) const
int getMaxEdgeFaces() const
static VTag BitwiseOr(VTag const vTags[], int size=4)
void getFaceETags(Index fIndex, ETag eTags[], int fvarChannel=-1) const
void populateLocalIndices()
void(* ValidationCallback)(TopologyError errCode, char const *msg, void const *clientData)
int getNumFVarChannels() const
int getNumEdgeFacesTotal() const
int getOffsetOfVertexFaces(Index vertIndex) const
int gatherTriRegularBoundaryEdgePatchPoints(Index fIndex, Index patchVerts[], int boundaryEdgeInFace) const
void resizeFaces(int numFaces)
VTag getVertexCompositeFVarVTag(Index vIndex, int fvarChannel) const
int gatherTriRegularCornerEdgePatchPoints(Index fIndex, Index patchVerts[], int cornerEdgeInFace) const
FVarLevel const & getFVarLevel(int channel) const
int getNumEdgeVertices(Index) const
int getOffsetOfFaceEdges(Index faceIndex) const
Sdc::Options getFVarOptions(int channel) const
float getVertexSharpness(Index vertIndex) const
FVarLevel & getFVarLevel(int channel)
ConstIndexArray getEdgeVertices(Index edgeIndex) const
int getNumEdgeFaces(Index edgeIndex) const
int gatherTriRegularBoundaryVertexPatchPoints(Index fIndex, Index patchVerts[], int boundaryVertInFace) const
bool doesVertexFVarTopologyMatch(Index vIndex, int fvarChannel) const
int getNumVertexEdgesTotal() const
int gatherQuadRegularRingAroundVertex(Index vIndex, Index ringPoints[], int fvarChannel=-1) const
void print(const Refinement *parentRefinement=0) const
void resizeEdges(int numEdges)
bool doesFaceFVarTopologyMatch(Index fIndex, int fvarChannel) const
void destroyFVarChannel(int channel)
Index findEdge(Index v0Index, Index v1Index) const
ConstLocalIndexArray getEdgeFaceLocalIndices(Index edgeIndex) const
ConstArray< Index > ConstIndexArray
friend class TriRefinement
bool isSingleCreasePatch(Index face, float *sharpnessOut=NULL, int *rotationOut=NULL) const
int getNumVertices() const
void trimEdgeFaces(Index edgeIndex, int count)
void resizeVertices(int numVertices)
int getNumEdgeVerticesTotal() const
int getOffsetOfVertexEdges(Index vertIndex) const
ConstArray< LocalIndex > ConstLocalIndexArray
ConstIndexArray getFaceVertices() const
bool orderVertexFacesAndEdges(Index vIndex, Index *vFaces, Index *vEdges) const
int gatherTriRegularInteriorPatchPoints(Index fIndex, Index patchVerts[], int rotation=0) const
unsigned short LocalIndex
ETag & getEdgeTag(Index edgeIndex)
int getOffsetOfEdgeVertices(Index edgeIndex) const
int gatherQuadRegularPartialRingAroundVertex(Index vIndex, VSpan const &span, Index ringPoints[], int fvarChannel=-1) const
bool completeTopologyFromFaceVertices()
void orientIncidentComponents()
void resizeFaceEdges(int numFaceEdgesTotal)
VTag getFaceCompositeVTag(Index fIndex, int fvarChannel=-1) const
ConstIndexArray getEdgeFaces(Index edgeIndex) const
void trimVertexEdges(Index vertIndex, int count)
int gatherQuadLinearPatchPoints(Index fIndex, Index patchPoints[], int rotation=0, int fvarChannel=-1) const
int getNumFaceVerticesTotal() const
int getNumFaceEdgesTotal() const
int getNumVertexEdges(Index vertIndex) const
void setMaxValence(int maxValence)