29 namespace opensubdiv {
32 const OpenSubdiv::Far::TopologyRefiner *getOSDTopologyRefiner(
33 const TopologyRefinerImpl *topology_refiner_impl)
35 return topology_refiner_impl->topology_refiner;
38 const OpenSubdiv::Far::TopologyLevel &getOSDTopologyBaseLevel(
39 const TopologyRefinerImpl *topology_refiner_impl)
41 return getOSDTopologyRefiner(topology_refiner_impl)->GetLevel(0);
47 bool checkSchemeTypeMatches(
const TopologyRefinerImpl *topology_refiner_impl,
50 const OpenSubdiv::Sdc::SchemeType converter_scheme_type =
52 return (converter_scheme_type == getOSDTopologyRefiner(topology_refiner_impl)->GetSchemeType());
55 bool checkOptionsMatches(
const TopologyRefinerImpl *topology_refiner_impl,
58 typedef OpenSubdiv::Sdc::Options
Options;
59 const Options options = getOSDTopologyRefiner(topology_refiner_impl)->GetSchemeOptions();
60 const Options::FVarLinearInterpolation fvar_interpolation =
options.GetFVarLinearInterpolation();
61 const Options::FVarLinearInterpolation converter_fvar_interpolation =
64 if (fvar_interpolation != converter_fvar_interpolation) {
70 bool checkPreliminaryMatches(
const TopologyRefinerImpl *topology_refiner_impl,
73 return checkSchemeTypeMatches(topology_refiner_impl, converter) &&
74 checkOptionsMatches(topology_refiner_impl, converter);
84 bool checkSingleUVLayerMatch(
const OpenSubdiv::Far::TopologyLevel &base_level,
86 const int layer_index)
89 const int num_faces = base_level.GetNumFaces();
92 for (
int face_index = 0; face_index < num_faces; ++face_index) {
93 OpenSubdiv::Far::ConstIndexArray base_level_face_uvs = base_level.GetFaceFVarValues(
94 face_index, layer_index);
97 if (base_level_face_uvs[
corner] != uv_index) {
107 bool checkUVLayersMatch(
const TopologyRefinerImpl *topology_refiner_impl,
110 using OpenSubdiv::Far::TopologyLevel;
112 const TopologyLevel &base_level = getOSDTopologyBaseLevel(topology_refiner_impl);
114 if (base_level.GetNumFVarChannels() != num_layers) {
117 for (
int layer_index = 0; layer_index < num_layers; ++layer_index) {
118 if (!checkSingleUVLayerMatch(base_level, converter, layer_index)) {
125 bool checkTopologyAttributesMatch(
const TopologyRefinerImpl *topology_refiner_impl,
128 return checkUVLayersMatch(topology_refiner_impl, converter);
135 if (!blender::opensubdiv::checkPreliminaryMatches(
this, converter)) {
145 if (!blender::opensubdiv::checkTopologyAttributesMatch(
this, converter)) {
bool isEqualToConverter(const OpenSubdiv_Converter *converter) const
MeshTopology base_mesh_topology
bool isEqualToConverter(const OpenSubdiv_Converter *converter) const
CCL_NAMESPACE_BEGIN struct Options options
OpenSubdiv::Sdc::SchemeType getSchemeTypeFromCAPI(OpenSubdiv_SchemeType type)
OpenSubdiv::Sdc::Options::FVarLinearInterpolation getFVarLinearInterpolationFromCAPI(OpenSubdiv_FVarLinearInterpolation linear_interpolation)
int(* getNumUVLayers)(const struct OpenSubdiv_Converter *converter)
OpenSubdiv_FVarLinearInterpolation(* getFVarLinearInterpolation)(const struct OpenSubdiv_Converter *converter)
OpenSubdiv_SchemeType(* getSchemeType)(const struct OpenSubdiv_Converter *converter)
void(* finishUVLayer)(const struct OpenSubdiv_Converter *converter)
void(* precalcUVLayer)(const struct OpenSubdiv_Converter *converter, const int layer_index)
int(* getFaceCornerUVIndex)(const struct OpenSubdiv_Converter *converter, const int face_index, const int corner_index)