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 {
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;
int getMaxValence() const
friend class QuadRefinement
int getNumFVarValues(int channel) const
FTag const & getFaceTag(Index faceIndex) const
int getOffsetOfEdgeFaces(Index edgeIndex) const
void populateLocalIndices()
ConstIndexArray getFaceEdges(Index faceIndex) const
int gatherQuadRegularRingAroundVertex(Index vIndex, Index ringPoints[], int fvarChannel=-1) const
int getOffsetOfFaceEdges(Index faceIndex) const
void getFaceETags(Index fIndex, ETag eTags[], int fvarChannel=-1) const
Sdc::Options getFVarOptions(int channel) const
float getVertexSharpness(Index vertIndex) const
int getNumFVarChannels() const
FVarLevel & getFVarLevel(int channel)
int getNumVertices() const
int getOffsetOfVertexFaces(Index vertIndex) const
void resizeVertices(int numVertices)
int getNumEdgeFaces(Index edgeIndex) const
int getNumFaceVertices(Index faceIndex) const
ConstLocalIndexArray getVertexFaceLocalIndices(Index vertIndex) const
int getNumEdgeVertices(Index) const
bool isVertexNonManifold(Index vertIndex) const
void resizeVertexFaces(int numVertexFacesTotal)
ConstIndexArray getEdgeFaces(Index edgeIndex) const
bool isFaceHole(Index faceIndex) const
bool doesEdgeFVarTopologyMatch(Index eIndex, int fvarChannel) const
int gatherQuadRegularBoundaryPatchPoints(Index fIndex, Index patchPoints[], int boundaryEdgeInFace, int fvarChannel=-1) const
ConstArray< LocalIndex > ConstLocalIndexArray
bool isEdgeNonManifold(Index edgeIndex) const
static VTag BitwiseOr(VTag const vTags[], int size=4)
int getNumVertexFaces(Index vertIndex) const
static char const * getTopologyErrorString(TopologyError errCode)
int gatherTriRegularCornerVertexPatchPoints(Index fIndex, Index patchVerts[], int cornerVertInFace) const
void resizeFaces(int numFaces)
Array< LocalIndex > LocalIndexArray
friend class TriRefinement
int gatherTriRegularCornerEdgePatchPoints(Index fIndex, Index patchVerts[], int cornerEdgeInFace) const
FTag & getFaceTag(Index faceIndex)
int getNumEdgeFacesTotal() const
VTag getFaceCompositeVTag(Index fIndex, int fvarChannel=-1) const
void completeFVarChannelTopology(int channel, int regBoundaryValence)
static ETag BitwiseOr(ETag const eTags[], int size=4)
Sdc::Crease::Rule getVertexRule(Index vertIndex) const
bool doesVertexFVarTopologyMatch(Index vIndex, int fvarChannel) const
int createFVarChannel(int fvarValueCount, Sdc::Options const &options)
float getEdgeSharpness(Index edgeIndex) const
void resizeEdges(int numEdges)
int gatherTriRegularBoundaryEdgePatchPoints(Index fIndex, Index patchVerts[], int boundaryEdgeInFace) const
void resizeFaceEdges(int numFaceEdgesTotal)
void trimVertexFaces(Index vertIndex, int count)
VTag getVertexCompositeFVarVTag(Index vIndex, int fvarChannel) const
int getOffsetOfEdgeVertices(Index edgeIndex) const
Array< Index > IndexArray
Index findEdge(Index v0Index, Index v1Index) const
VTag const & getVertexTag(Index vertIndex) const
IndexArray shareFaceVertCountsAndOffsets() const
void setMaxValence(int maxValence)
FVarLevel const & getFVarLevel(int channel) const
ConstArray< Index > ConstIndexArray
void destroyFVarChannel(int channel)
void resizeEdgeFaces(int numEdgeFacesTotal)
int getNumVertexFacesTotal() const
ConstIndexArray getVertexFaces(Index vertIndex) const
void orientIncidentComponents()
void(* ValidationCallback)(TopologyError errCode, char const *msg, void const *clientData)
int getNumVertexEdges(Index vertIndex) const
void resizeFaceVertices(int numFaceVertsTotal)
All supported options applying to subdivision scheme.
void getFaceVTags(Index fIndex, VTag vTags[], int fvarChannel=-1) const
ETag & getEdgeTag(Index edgeIndex)
void setVertexNonManifold(Index vertIndex, bool b)
int getMaxEdgeFaces() const
void setFaceHole(Index faceIndex, bool b)
void trimEdgeFaces(Index edgeIndex, int count)
int getNumVertexEdgesTotal() const
void trimVertexEdges(Index vertIndex, int count)
unsigned short LocalIndex
int getNumFaceEdgesTotal() const
int getNumFaceVerticesTotal() const
void resizeEdgeVertices()
int gatherQuadLinearPatchPoints(Index fIndex, Index patchPoints[], int rotation=0, int fvarChannel=-1) const
void setEdgeNonManifold(Index edgeIndex, bool b)
bool completeTopologyFromFaceVertices()
int getOffsetOfFaceVertices(Index faceIndex) const
ConstLocalIndexArray getEdgeFaceLocalIndices(Index edgeIndex) const
int gatherQuadRegularInteriorPatchPoints(Index fIndex, Index patchPoints[], int rotation=0, int fvarChannel=-1) const
int getNumFaceEdges(Index faceIndex) const
int gatherQuadRegularPartialRingAroundVertex(Index vIndex, VSpan const &span, Index ringPoints[], int fvarChannel=-1) const
void print(const Refinement *parentRefinement=0) const
ConstIndexArray getEdgeVertices(Index edgeIndex) const
bool isSingleCreasePatch(Index face, float *sharpnessOut=NULL, int *rotationOut=NULL) const
int gatherTriRegularBoundaryVertexPatchPoints(Index fIndex, Index patchVerts[], int boundaryVertInFace) const
bool validateTopology(ValidationCallback callback=0, void const *clientData=0) const
ConstIndexArray getVertexEdges(Index vertIndex) const
int gatherTriRegularInteriorPatchPoints(Index fIndex, Index patchVerts[], int rotation=0) const
ETag const & getEdgeTag(Index edgeIndex) const
void resizeVertexEdges(int numVertexEdgesTotal)
int getNumEdgeVerticesTotal() const
ConstIndexArray getFaceVertices() const
ConstLocalIndexArray getVertexEdgeLocalIndices(Index vertIndex) const
bool orderVertexFacesAndEdges(Index vIndex, Index *vFaces, Index *vEdges) const
int gatherQuadRegularCornerPatchPoints(Index fIndex, Index patchPoints[], int cornerVertInFace, int fvarChannel=-1) const
VTag & getVertexTag(Index vertIndex)
bool doesFaceFVarTopologyMatch(Index fIndex, int fvarChannel) const
int getOffsetOfVertexEdges(Index vertIndex) const
ConstIndexArray getFaceFVarValues(Index faceIndex, int channel) const