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