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);
869 (
int)_faceVertCountsAndOffsets.size());
876 using namespace OPENSUBDIV_VERSION;