fvarRefinement.h
Go to the documentation of this file.
//
// Copyright 2014 DreamWorks Animation LLC.
//
// Licensed under the Apache License, Version 2.0 (the "Apache License")
// with the following modification; you may not use this file except in
// compliance with the Apache License and the following modification to it:
// Section 6. Trademarks. is deleted and replaced with:
//
// 6. Trademarks. This License does not grant permission to use the trade
// names, trademarks, service marks, or product names of the Licensor
// and its affiliates, except as required to comply with Section 4(c) of
// the License and to reproduce the content of the NOTICE file.
//
// You may obtain a copy of the Apache License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the Apache License with the above modification is
// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the Apache License for the specific
// language governing permissions and limitations under the Apache License.
//
#ifndef OPENSUBDIV3_VTR_FVAR_REFINEMENT_H
#define OPENSUBDIV3_VTR_FVAR_REFINEMENT_H
#include "../version.h"
#include "../sdc/types.h"
#include "../sdc/crease.h"
#include "../vtr/types.h"
#include "../vtr/refinement.h"
#include "../vtr/fvarLevel.h"
#include <vector>
#include <cassert>
#include <cstring>
namespace OpenSubdiv {
namespace OPENSUBDIV_VERSION {
namespace Vtr {
namespace internal {
//
// FVarRefinement:
// A face-varying refinement contains data to support the refinement of a
// particular face-varying "channel". Just as Refinement maintains a mapping
// between the components of a parent Level and its child, the face-varying
// analog maintains a mapping between the face-varying values of a parent
// FVarLevel and its child.
//
// It turns out there is little data necessary here, so the class consists
// mainly of methods that populate the child FVarLevel. The mapping data in
// the refinement between Levels serves most purposes and all that is required
// in addition is a mapping from values in the child FVarLevel to the parent.
//
class FVarRefinement {
public:
FVarRefinement(Refinement const& refinement, FVarLevel& parent, FVarLevel& child);
~FVarRefinement();
int getChildValueParentSource(Index vIndex, int sibling) const {
return _childValueParentSource[_childFVar.getVertexValueOffset(vIndex, (LocalIndex)sibling)];
}
float getFractionalWeight(Index pVert, LocalIndex pSibling,
Index cVert, LocalIndex cSibling) const;
// Modifiers supporting application of the refinement:
void applyRefinement();
void estimateAndAllocateChildValues();
void populateChildValues();
void populateChildValuesFromFaceVertices();
void populateChildValuesFromEdgeVertices();
int populateChildValuesForEdgeVertex(Index cVert, Index pEdge);
void populateChildValuesFromVertexVertices();
int populateChildValuesForVertexVertex(Index cVert, Index pVert);
void trimAndFinalizeChildValues();
void propagateEdgeTags();
void propagateValueTags();
void propagateValueCreases();
void reclassifySemisharpValues();
private:
//
// Identify the Refinement, its Levels and assigned FVarLevels for more
// immediate access -- child FVarLevel is non-const as it is to be assigned:
//
Refinement const & _refinement;
Level const & _parentLevel;
FVarLevel const & _parentFVar;
Level const & _childLevel;
FVarLevel & _childFVar;
// When refinement is sparse, we need a mapping between siblings of a vertex
// value in the parent and child -- and for some child values, there will not
// be a parent value, in which case the source of the parent component will
// be stored. So we refer to the parent "source" rather than "sibling":
//
std::vector<LocalIndex> _childValueParentSource;
};
} // end namespace internal
} // end namespace Vtr
} // end namespace OPENSUBDIV_VERSION
using namespace OPENSUBDIV_VERSION;
} // end namespace OpenSubdiv
#endif /* OPENSUBDIV3_VTR_FVAR_REFINEMENT_H */
OpenSubdiv
Definition: error.h:30
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::Index
int Index
Definition: types.h:54
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::LocalIndex
unsigned short LocalIndex
Definition: types.h:66
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel
Definition: fvarLevel.h:78
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarLevel::getVertexValueOffset
Index getVertexValueOffset(Index v, Sibling i=0) const
Definition: fvarLevel.h:198
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarRefinement
Definition: fvarRefinement.h:59
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarRefinement::propagateValueTags
void propagateValueTags()
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarRefinement::populateChildValuesFromEdgeVertices
void populateChildValuesFromEdgeVertices()
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarRefinement::~FVarRefinement
~FVarRefinement()
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarRefinement::propagateEdgeTags
void propagateEdgeTags()
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarRefinement::estimateAndAllocateChildValues
void estimateAndAllocateChildValues()
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarRefinement::getFractionalWeight
float getFractionalWeight(Index pVert, LocalIndex pSibling, Index cVert, LocalIndex cSibling) const
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarRefinement::FVarRefinement
FVarRefinement(Refinement const &refinement, FVarLevel &parent, FVarLevel &child)
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarRefinement::reclassifySemisharpValues
void reclassifySemisharpValues()
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarRefinement::populateChildValuesFromFaceVertices
void populateChildValuesFromFaceVertices()
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarRefinement::populateChildValuesForVertexVertex
int populateChildValuesForVertexVertex(Index cVert, Index pVert)
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarRefinement::trimAndFinalizeChildValues
void trimAndFinalizeChildValues()
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarRefinement::populateChildValuesForEdgeVertex
int populateChildValuesForEdgeVertex(Index cVert, Index pEdge)
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarRefinement::populateChildValues
void populateChildValues()
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarRefinement::propagateValueCreases
void propagateValueCreases()
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarRefinement::applyRefinement
void applyRefinement()
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarRefinement::getChildValueParentSource
int getChildValueParentSource(Index vIndex, int sibling) const
Definition: fvarRefinement.h:64
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::FVarRefinement::populateChildValuesFromVertexVertices
void populateChildValuesFromVertexVertices()
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Level
Definition: level.h:83
OpenSubdiv::OPENSUBDIV_VERSION::Vtr::internal::Refinement
Definition: refinement.h:69