191 template <Sdc::SchemeType SCHEME,
class T,
class U>
void interpFromFaces(
int, T
const &, U &)
const;
192 template <Sdc::SchemeType SCHEME,
class T,
class U>
void interpFromEdges(
int, T
const &, U &)
const;
193 template <Sdc::SchemeType SCHEME,
class T,
class U>
void interpFromVerts(
int, T
const &, U &)
const;
195 template <Sdc::SchemeType SCHEME,
class T,
class U>
void interpFVarFromFaces(
int, T
const &, U &,
int)
const;
196 template <Sdc::SchemeType SCHEME,
class T,
class U>
void interpFVarFromEdges(
int, T
const &, U &,
int)
const;
197 template <Sdc::SchemeType SCHEME,
class T,
class U>
void interpFVarFromVerts(
int, T
const &, U &,
int)
const;
199 template <Sdc::SchemeType SCHEME,
class T,
class U,
class U1,
class U2>
200 void limit(T
const & src, U & pos, U1 * tan1, U2 * tan2)
const;
202 template <Sdc::SchemeType SCHEME,
class T,
class U>
203 void limitFVar(T
const & src, U & dst,
int channel)
const;
206 TopologyRefiner
const & _refiner;
217 Mask(Weight* v, Weight* e, Weight* f) :
218 _vertWeights(v), _edgeWeights(e), _faceWeights(f),
219 _vertCount(0), _edgeCount(0), _faceCount(0),
220 _faceWeightsForFaceCenters(false)
226 int GetNumVertexWeights()
const {
return _vertCount; }
227 int GetNumEdgeWeights()
const {
return _edgeCount; }
228 int GetNumFaceWeights()
const {
return _faceCount; }
230 void SetNumVertexWeights(
int count) { _vertCount = count; }
231 void SetNumEdgeWeights(
int count) { _edgeCount = count; }
232 void SetNumFaceWeights(
int count) { _faceCount = count; }
234 Weight
const& VertexWeight(
int index)
const {
return _vertWeights[index]; }
235 Weight
const& EdgeWeight(
int index)
const {
return _edgeWeights[index]; }
236 Weight
const& FaceWeight(
int index)
const {
return _faceWeights[index]; }
238 Weight& VertexWeight(
int index) {
return _vertWeights[index]; }
239 Weight& EdgeWeight(
int index) {
return _edgeWeights[index]; }
240 Weight& FaceWeight(
int index) {
return _faceWeights[index]; }
242 bool AreFaceWeightsForFaceCenters()
const {
return _faceWeightsForFaceCenters; }
243 void SetFaceWeightsForFaceCenters(
bool on) { _faceWeightsForFaceCenters = on; }
246 Weight* _vertWeights;
247 Weight* _edgeWeights;
248 Weight* _faceWeights;
254 bool _faceWeightsForFaceCenters;
264template <
typename REAL>
265template <
class T,
class U>
271 switch (_refiner._subdivType) {
290template <
typename REAL>
291template <
class T,
class U>
297 switch (_refiner._subdivType) {
316template <
typename REAL>
317template <
class T,
class U>
321 if (_refiner.getLevel(_refiner.GetMaxLevel()).getNumVertexEdgesTotal() == 0) {
323 "Failure in PrimvarRefiner::Limit() -- "
324 "last level of refinement does not include full topology.");
328 switch (_refiner._subdivType) {
341template <
typename REAL>
342template <
class T,
class U,
class U1,
class U2>
346 if (_refiner.getLevel(_refiner.GetMaxLevel()).getNumVertexEdgesTotal() == 0) {
348 "Failure in PrimvarRefiner::Limit() -- "
349 "last level of refinement does not include full topology.");
353 switch (_refiner._subdivType) {
366template <
typename REAL>
367template <
class T,
class U>
371 if (_refiner.getLevel(_refiner.GetMaxLevel()).getNumVertexEdgesTotal() == 0) {
373 "Failure in PrimvarRefiner::LimitFaceVarying() -- "
374 "last level of refinement does not include full topology.");
378 switch (_refiner._subdivType) {
391template <
typename REAL>
392template <
class T,
class U>
409template <
typename REAL>
410template <
class T,
class U>
423 if (
refinement.getNumChildVerticesFromFaces() > 0) {
436 for (
int i = 0;
i <
fVerts.size(); ++
i) {
472template <
typename REAL>
473template <Sdc::SchemeType SCHEME,
class T,
class U>
480 if (
refinement.getNumChildVerticesFromFaces() == 0)
return;
503 for (
int i = 0;
i <
fVerts.size(); ++
i) {
510template <
typename REAL>
511template <Sdc::SchemeType SCHEME,
class T,
class U>
513PrimvarRefinerReal<REAL>::interpFromEdges(
int level, T
const & src, U & dst)
const {
515 Vtr::internal::Refinement
const &
refinement = _refiner.getRefinement(
level-1);
516 Vtr::internal::Level
const & parent =
refinement.parent();
517 Vtr::internal::Level
const & child =
refinement.child();
519 Sdc::Scheme<SCHEME>
scheme(_refiner._subdivOptions);
521 Vtr::internal::EdgeInterface
eHood(parent);
524 Vtr::internal::StackBuffer<Weight,8>
eFaceWeights(parent.getMaxEdgeFaces());
526 for (
int edge = 0;
edge < parent.getNumEdges(); ++
edge) {
551 if (
eMask.GetNumFaceWeights() > 0) {
553 for (
int i = 0;
i <
eFaces.size(); ++
i) {
555 if (
eMask.AreFaceWeightsForFaceCenters()) {
580template <
typename REAL>
581template <Sdc::SchemeType SCHEME,
class T,
class U>
583PrimvarRefinerReal<REAL>::interpFromVerts(
int level, T
const & src, U & dst)
const {
585 Vtr::internal::Refinement
const &
refinement = _refiner.getRefinement(
level-1);
586 Vtr::internal::Level
const & parent =
refinement.parent();
587 Vtr::internal::Level
const & child =
refinement.child();
589 Sdc::Scheme<SCHEME>
scheme(_refiner._subdivOptions);
591 Vtr::internal::VertexInterface
vHood(parent, child);
593 Vtr::internal::StackBuffer<Weight,32>
weightBuffer(2*parent.getMaxValence());
595 for (
int vert = 0;
vert < parent.getNumVertices(); ++
vert) {
626 if (
vMask.GetNumFaceWeights() > 0) {
629 for (
int i = 0;
i <
vFaces.size(); ++
i) {
636 if (
vMask.GetNumEdgeWeights() > 0) {
638 for (
int i = 0;
i <
vEdges.size(); ++
i) {
654template <
typename REAL>
655template <Sdc::SchemeType SCHEME,
class T,
class U>
657PrimvarRefinerReal<REAL>::interpFVarFromFaces(
int level, T
const & src, U & dst,
int channel)
const {
659 Vtr::internal::Refinement
const &
refinement = _refiner.getRefinement(
level-1);
661 if (
refinement.getNumChildVerticesFromFaces() == 0)
return;
663 Sdc::Scheme<SCHEME>
scheme(_refiner._subdivOptions);
703template <
typename REAL>
704template <Sdc::SchemeType SCHEME,
class T,
class U>
706PrimvarRefinerReal<REAL>::interpFVarFromEdges(
int level, T
const & src, U & dst,
int channel)
const {
708 Vtr::internal::Refinement
const &
refinement = _refiner.getRefinement(
level-1);
710 Sdc::Scheme<SCHEME>
scheme(_refiner._subdivOptions);
730 eMask.SetNumVertexWeights(2);
731 eMask.SetNumEdgeWeights(0);
732 eMask.SetNumFaceWeights(0);
793 if (
eMask.GetNumFaceWeights() > 0) {
797 for (
int i = 0;
i <
eFaces.size(); ++
i) {
798 if (
eMask.AreFaceWeightsForFaceCenters()) {
848template <
typename REAL>
849template <Sdc::SchemeType SCHEME,
class T,
class U>
851PrimvarRefinerReal<REAL>::interpFVarFromVerts(
int level, T
const & src, U & dst,
int channel)
const {
853 Vtr::internal::Refinement
const &
refinement = _refiner.getRefinement(
level-1);
855 Sdc::Scheme<SCHEME>
scheme(_refiner._subdivOptions);
938 if (
vMask.GetNumFaceWeights() > 0) {
943 for (
int i = 0;
i <
vFaces.size(); ++
i) {
952 if (
vMask.GetNumEdgeWeights() > 0) {
956 for (
int i = 0;
i <
vEdges.size(); ++
i) {
1016template <
typename REAL>
1017template <Sdc::SchemeType SCHEME,
class T,
class U,
class U1,
class U2>
1019PrimvarRefinerReal<REAL>::limit(T
const & src, U & dstPos, U1 * dstTan1Ptr, U2 * dstTan2Ptr)
const {
1021 Sdc::Scheme<SCHEME>
scheme(_refiner._subdivOptions);
1023 Vtr::internal::Level
const &
level = _refiner.getLevel(_refiner.GetMaxLevel());
1060 (*dstTan1Ptr)[
vert].Clear();
1061 (*dstTan2Ptr)[
vert].Clear();
1089 for (
int i = 0;
i <
vEdges.size(); ++
i) {
1098 for (
int i = 0;
i <
vFaces.size(); ++
i) {
1115 for (
int i = 0;
i <
posMask.GetNumFaceWeights(); ++
i) {
1118 for (
int i = 0;
i <
posMask.GetNumEdgeWeights(); ++
i) {
1137 for (
int i = 0;
i <
tan1Mask.GetNumFaceWeights(); ++
i) {
1141 for (
int i = 0;
i <
tan1Mask.GetNumEdgeWeights(); ++
i) {
1151template <
typename REAL>
1152template <Sdc::SchemeType SCHEME,
class T,
class U>
1154PrimvarRefinerReal<REAL>::limitFVar(T
const & src, U & dst,
int channel)
const {
1156 Sdc::Scheme<SCHEME>
scheme(_refiner._subdivOptions);
1158 Vtr::internal::Level
const &
level = _refiner.getLevel(_refiner.GetMaxLevel());
1159 Vtr::internal::FVarLevel
const & fvarChannel =
level.getFVarLevel(
channel);
1212 if (
vMask.GetNumFaceWeights() > 0) {
1218 for (
int i = 0;
i <
vFaces.size(); ++
i) {
1228 if (
vMask.GetNumEdgeWeights() > 0) {
1232 for (
int i = 0;
i <
vEdges.size(); ++
i) {
1245 if (fvarChannel.getValueTag(
vValue).isCorner()) {
1269using namespace OPENSUBDIV_VERSION;