From b5ef644ef6b91787b7ae07c9650690c0978822c9 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 19 May 2020 11:36:06 +0200 Subject: OpenSubdiv: Refactor, pass higher level object through comparison --- .../internal/topology/topology_refiner_capi.cc | 97 +++++++++++----------- 1 file changed, 48 insertions(+), 49 deletions(-) (limited to 'intern') diff --git a/intern/opensubdiv/internal/topology/topology_refiner_capi.cc b/intern/opensubdiv/internal/topology/topology_refiner_capi.cc index 167d618804f..58c0ffbb7cf 100644 --- a/intern/opensubdiv/internal/topology/topology_refiner_capi.cc +++ b/intern/opensubdiv/internal/topology/topology_refiner_capi.cc @@ -35,10 +35,10 @@ const OpenSubdiv::Far::TopologyRefiner *getOSDTopologyRefiner( return topology_refiner->impl->topology_refiner; } -const OpenSubdiv::Far::TopologyLevel *getOSDTopologyBaseLevel( +const OpenSubdiv::Far::TopologyLevel &getOSDTopologyBaseLevel( const OpenSubdiv_TopologyRefiner *topology_refiner) { - return &getOSDTopologyRefiner(topology_refiner)->GetLevel(0); + return getOSDTopologyRefiner(topology_refiner)->GetLevel(0); } int getSubdivisionLevel(const OpenSubdiv_TopologyRefiner *topology_refiner) @@ -56,17 +56,17 @@ bool getIsAdaptive(const OpenSubdiv_TopologyRefiner *topology_refiner) int getNumVertices(const OpenSubdiv_TopologyRefiner *topology_refiner) { - return getOSDTopologyBaseLevel(topology_refiner)->GetNumVertices(); + return getOSDTopologyBaseLevel(topology_refiner).GetNumVertices(); } int getNumEdges(const OpenSubdiv_TopologyRefiner *topology_refiner) { - return getOSDTopologyBaseLevel(topology_refiner)->GetNumEdges(); + return getOSDTopologyBaseLevel(topology_refiner).GetNumEdges(); } int getNumFaces(const OpenSubdiv_TopologyRefiner *topology_refiner) { - return getOSDTopologyBaseLevel(topology_refiner)->GetNumFaces(); + return getOSDTopologyBaseLevel(topology_refiner).GetNumFaces(); } //////////////////////////////////////////////////////////////////////////////// @@ -81,31 +81,31 @@ static void convertArrayToRaw(const OpenSubdiv::Far::ConstIndexArray &array, int int getNumFaceVertices(const OpenSubdiv_TopologyRefiner *topology_refiner, const int face_index) { - const OpenSubdiv::Far::TopologyLevel *base_level = getOSDTopologyBaseLevel(topology_refiner); - return base_level->GetFaceVertices(face_index).size(); + const OpenSubdiv::Far::TopologyLevel &base_level = getOSDTopologyBaseLevel(topology_refiner); + return base_level.GetFaceVertices(face_index).size(); } void getFaceVertices(const OpenSubdiv_TopologyRefiner *topology_refiner, const int face_index, int *face_vertices_indices) { - const OpenSubdiv::Far::TopologyLevel *base_level = getOSDTopologyBaseLevel(topology_refiner); - OpenSubdiv::Far::ConstIndexArray array = base_level->GetFaceVertices(face_index); + const OpenSubdiv::Far::TopologyLevel &base_level = getOSDTopologyBaseLevel(topology_refiner); + OpenSubdiv::Far::ConstIndexArray array = base_level.GetFaceVertices(face_index); convertArrayToRaw(array, face_vertices_indices); } int getNumFaceEdges(const OpenSubdiv_TopologyRefiner *topology_refiner, const int face_index) { - const OpenSubdiv::Far::TopologyLevel *base_level = getOSDTopologyBaseLevel(topology_refiner); - return base_level->GetFaceEdges(face_index).size(); + const OpenSubdiv::Far::TopologyLevel &base_level = getOSDTopologyBaseLevel(topology_refiner); + return base_level.GetFaceEdges(face_index).size(); } void getFaceEdges(const OpenSubdiv_TopologyRefiner *topology_refiner, const int face_index, int *face_edges_indices) { - const OpenSubdiv::Far::TopologyLevel *base_level = getOSDTopologyBaseLevel(topology_refiner); - OpenSubdiv::Far::ConstIndexArray array = base_level->GetFaceEdges(face_index); + const OpenSubdiv::Far::TopologyLevel &base_level = getOSDTopologyBaseLevel(topology_refiner); + OpenSubdiv::Far::ConstIndexArray array = base_level.GetFaceEdges(face_index); convertArrayToRaw(array, face_edges_indices); } @@ -113,8 +113,8 @@ void getEdgeVertices(const OpenSubdiv_TopologyRefiner *topology_refiner, const int edge_index, int edge_vertices_indices[2]) { - const OpenSubdiv::Far::TopologyLevel *base_level = getOSDTopologyBaseLevel(topology_refiner); - OpenSubdiv::Far::ConstIndexArray array = base_level->GetEdgeVertices(edge_index); + const OpenSubdiv::Far::TopologyLevel &base_level = getOSDTopologyBaseLevel(topology_refiner); + OpenSubdiv::Far::ConstIndexArray array = base_level.GetEdgeVertices(edge_index); assert(array.size() == 2); edge_vertices_indices[0] = array[0]; edge_vertices_indices[1] = array[1]; @@ -122,16 +122,16 @@ void getEdgeVertices(const OpenSubdiv_TopologyRefiner *topology_refiner, int getNumVertexEdges(const OpenSubdiv_TopologyRefiner *topology_refiner, const int vertex_index) { - const OpenSubdiv::Far::TopologyLevel *base_level = getOSDTopologyBaseLevel(topology_refiner); - return base_level->GetVertexEdges(vertex_index).size(); + const OpenSubdiv::Far::TopologyLevel &base_level = getOSDTopologyBaseLevel(topology_refiner); + return base_level.GetVertexEdges(vertex_index).size(); } void getVertexEdges(const OpenSubdiv_TopologyRefiner *topology_refiner, const int vertex_index, int *vertex_edges_indices) { - const OpenSubdiv::Far::TopologyLevel *base_level = getOSDTopologyBaseLevel(topology_refiner); - OpenSubdiv::Far::ConstIndexArray array = base_level->GetVertexEdges(vertex_index); + const OpenSubdiv::Far::TopologyLevel &base_level = getOSDTopologyBaseLevel(topology_refiner); + OpenSubdiv::Far::ConstIndexArray array = base_level.GetVertexEdges(vertex_index); convertArrayToRaw(array, vertex_edges_indices); } @@ -172,8 +172,8 @@ void fillFacePtexIndexOffset(const OpenSubdiv_TopologyRefiner *topology_refiner, int getNumFVarChannels(const struct OpenSubdiv_TopologyRefiner *topology_refiner) { - const OpenSubdiv::Far::TopologyLevel *base_level = getOSDTopologyBaseLevel(topology_refiner); - return base_level->GetNumFVarChannels(); + const OpenSubdiv::Far::TopologyLevel &base_level = getOSDTopologyBaseLevel(topology_refiner); + return base_level.GetNumFVarChannels(); } OpenSubdiv_FVarLinearInterpolation getFVarLinearInterpolation( @@ -185,16 +185,16 @@ OpenSubdiv_FVarLinearInterpolation getFVarLinearInterpolation( int getNumFVarValues(const struct OpenSubdiv_TopologyRefiner *topology_refiner, const int channel) { - const OpenSubdiv::Far::TopologyLevel *base_level = getOSDTopologyBaseLevel(topology_refiner); - return base_level->GetNumFVarValues(channel); + const OpenSubdiv::Far::TopologyLevel &base_level = getOSDTopologyBaseLevel(topology_refiner); + return base_level.GetNumFVarValues(channel); } const int *getFaceFVarValueIndices(const struct OpenSubdiv_TopologyRefiner *topology_refiner, const int face_index, const int channel) { - const OpenSubdiv::Far::TopologyLevel *base_level = getOSDTopologyBaseLevel(topology_refiner); - return &base_level->GetFaceFVarValues(face_index, channel)[0]; + const OpenSubdiv::Far::TopologyLevel &base_level = getOSDTopologyBaseLevel(topology_refiner); + return &base_level.GetFaceFVarValues(face_index, channel)[0]; } //////////////////////////////////////////////////////////////////////////////// @@ -268,19 +268,19 @@ namespace { /////////////////////////////////////////////////////////// // Quick preliminary checks. -bool checkSchemeTypeMatches(const OpenSubdiv::Far::TopologyRefiner *topology_refiner, +bool checkSchemeTypeMatches(const OpenSubdiv_TopologyRefiner *topology_refiner, const OpenSubdiv_Converter *converter) { const OpenSubdiv::Sdc::SchemeType converter_scheme_type = blender::opensubdiv::getSchemeTypeFromCAPI(converter->getSchemeType(converter)); - return (converter_scheme_type == topology_refiner->GetSchemeType()); + return (converter_scheme_type == getOSDTopologyRefiner(topology_refiner)->GetSchemeType()); } -bool checkOptionsMatches(const OpenSubdiv::Far::TopologyRefiner *topology_refiner, +bool checkOptionsMatches(const OpenSubdiv_TopologyRefiner *topology_refiner, const OpenSubdiv_Converter *converter) { typedef OpenSubdiv::Sdc::Options Options; - const Options options = topology_refiner->GetSchemeOptions(); + const Options options = getOSDTopologyRefiner(topology_refiner)->GetSchemeOptions(); const Options::FVarLinearInterpolation fvar_interpolation = options.GetFVarLinearInterpolation(); const Options::FVarLinearInterpolation converter_fvar_interpolation = blender::opensubdiv::getFVarLinearInterpolationFromCAPI( @@ -291,17 +291,17 @@ bool checkOptionsMatches(const OpenSubdiv::Far::TopologyRefiner *topology_refine return true; } -bool checkGeometryCountersMatches(const OpenSubdiv::Far::TopologyRefiner *topology_refiner, +bool checkGeometryCountersMatches(const OpenSubdiv_TopologyRefiner *topology_refiner, const OpenSubdiv_Converter *converter) { using OpenSubdiv::Far::TopologyLevel; - const TopologyLevel &base_level = topology_refiner->GetLevel(0); + const TopologyLevel &base_level = getOSDTopologyBaseLevel(topology_refiner); return ((converter->getNumVertices(converter) == base_level.GetNumVertices()) && (converter->getNumEdges(converter) == base_level.GetNumEdges()) && (converter->getNumFaces(converter) == base_level.GetNumFaces())); } -bool checkPreliminaryMatches(const OpenSubdiv::Far::TopologyRefiner *topology_refiner, +bool checkPreliminaryMatches(const OpenSubdiv_TopologyRefiner *topology_refiner, const OpenSubdiv_Converter *converter) { return checkSchemeTypeMatches(topology_refiner, converter) && @@ -422,12 +422,12 @@ bool checkVerticesOfFacesMatch(const CyclicArray &indices_a, const CyclicArray & return false; } -bool checkGeometryFacesMatch(const OpenSubdiv::Far::TopologyRefiner *topology_refiner, +bool checkGeometryFacesMatch(const OpenSubdiv_TopologyRefiner *topology_refiner, const OpenSubdiv_Converter *converter) { using OpenSubdiv::Far::ConstIndexArray; using OpenSubdiv::Far::TopologyLevel; - const TopologyLevel &base_level = topology_refiner->GetLevel(0); + const TopologyLevel &base_level = getOSDTopologyBaseLevel(topology_refiner); const int num_faces = base_level.GetNumFaces(); // TODO(sergey): Consider using data structure which keeps handful of // elements on stack before doing heep allocation. @@ -447,7 +447,7 @@ bool checkGeometryFacesMatch(const OpenSubdiv::Far::TopologyRefiner *topology_re return true; } -bool checkGeometryMatches(const OpenSubdiv::Far::TopologyRefiner *topology_refiner, +bool checkGeometryMatches(const OpenSubdiv_TopologyRefiner *topology_refiner, const OpenSubdiv_Converter *converter) { // NOTE: Since OpenSubdiv's topology refiner doesn't contain loose edges, we @@ -492,12 +492,12 @@ inline bool checkSingleEdgeTagMatch(const OpenSubdiv::Far::TopologyLevel &base_l // Compares edge tags between topology refiner and converter in a case when // converter specifies a full topology. // This is simplest loop, since we know that order of edges matches. -bool checkEdgeTagsMatchFullTopology(const OpenSubdiv::Far::TopologyRefiner *topology_refiner, +bool checkEdgeTagsMatchFullTopology(const OpenSubdiv_TopologyRefiner *topology_refiner, const OpenSubdiv_Converter *converter) { using OpenSubdiv::Far::ConstIndexArray; using OpenSubdiv::Far::TopologyLevel; - const TopologyLevel &base_level = topology_refiner->GetLevel(0); + const TopologyLevel &base_level = getOSDTopologyBaseLevel(topology_refiner); const int num_edges = base_level.GetNumEdges(); for (int edge_index = 0; edge_index < num_edges; ++edge_index) { if (!checkSingleEdgeTagMatch(base_level, edge_index, converter, edge_index)) { @@ -510,12 +510,12 @@ bool checkEdgeTagsMatchFullTopology(const OpenSubdiv::Far::TopologyRefiner *topo // Compares tags of edges in the case when orientation of edges is left up to // OpenSubdiv. In this case we do need to take care of mapping edges from the // converter to current topology refiner, since the order is not guaranteed. -bool checkEdgeTagsMatchAutoOrient(const OpenSubdiv::Far::TopologyRefiner *topology_refiner, +bool checkEdgeTagsMatchAutoOrient(const OpenSubdiv_TopologyRefiner *topology_refiner, const OpenSubdiv_Converter *converter) { using OpenSubdiv::Far::ConstIndexArray; using OpenSubdiv::Far::TopologyLevel; - const TopologyLevel &base_level = topology_refiner->GetLevel(0); + const TopologyLevel &base_level = getOSDTopologyBaseLevel(topology_refiner); const int num_edges = base_level.GetNumEdges(); // Create mapping for quick lookup of edge index from its vertices indices. // @@ -542,7 +542,7 @@ bool checkEdgeTagsMatchAutoOrient(const OpenSubdiv::Far::TopologyRefiner *topolo return true; } -bool checkEdgeTagsMatch(const OpenSubdiv::Far::TopologyRefiner *topology_refiner, +bool checkEdgeTagsMatch(const OpenSubdiv_TopologyRefiner *topology_refiner, const OpenSubdiv_Converter *converter) { if (converter->specifiesFullTopology(converter)) { @@ -553,13 +553,13 @@ bool checkEdgeTagsMatch(const OpenSubdiv::Far::TopologyRefiner *topology_refiner } } -bool checkvertexSharpnessMatch(const OpenSubdiv::Far::TopologyRefiner *topology_refiner, +bool checkvertexSharpnessMatch(const OpenSubdiv_TopologyRefiner *topology_refiner, const OpenSubdiv_Converter *converter) { using OpenSubdiv::Far::ConstIndexArray; using OpenSubdiv::Far::TopologyLevel; using OpenSubdiv::Sdc::Crease; - const TopologyLevel &base_level = topology_refiner->GetLevel(0); + const TopologyLevel &base_level = getOSDTopologyRefiner(topology_refiner)->GetLevel(0); // Create mapping for quick lookup of edge index from its vertices indices. // // TODO(sergey): Consider caching it in some sort of wrapper around topology @@ -630,12 +630,12 @@ bool checkSingleUVLayerMatch(const OpenSubdiv::Far::TopologyLevel &base_level, return true; } -bool checkUVLayersMatch(const OpenSubdiv::Far::TopologyRefiner *topology_refiner, +bool checkUVLayersMatch(const OpenSubdiv_TopologyRefiner *topology_refiner, const OpenSubdiv_Converter *converter) { using OpenSubdiv::Far::TopologyLevel; const int num_layers = converter->getNumUVLayers(converter); - const TopologyLevel &base_level = topology_refiner->GetLevel(0); + const TopologyLevel &base_level = getOSDTopologyBaseLevel(topology_refiner); // Number of UV layers should match. if (base_level.GetNumFVarChannels() != num_layers) { return false; @@ -648,7 +648,7 @@ bool checkUVLayersMatch(const OpenSubdiv::Far::TopologyRefiner *topology_refiner return true; } -bool checkTopologyAttributesMatch(const OpenSubdiv::Far::TopologyRefiner *topology_refiner, +bool checkTopologyAttributesMatch(const OpenSubdiv_TopologyRefiner *topology_refiner, const OpenSubdiv_Converter *converter) { return checkEdgeTagsMatch(topology_refiner, converter) && @@ -663,8 +663,7 @@ bool checkTopologyAttributesMatch(const OpenSubdiv::Far::TopologyRefiner *topolo bool openSubdiv_topologyRefinerCompareWithConverter( const OpenSubdiv_TopologyRefiner *topology_refiner, const OpenSubdiv_Converter *converter) { - const OpenSubdiv::Far::TopologyRefiner *refiner = getOSDTopologyRefiner(topology_refiner); - return (blender::opensubdiv::checkPreliminaryMatches(refiner, converter) && - blender::opensubdiv::checkGeometryMatches(refiner, converter) && - blender::opensubdiv::checkTopologyAttributesMatch(refiner, converter)); + return (blender::opensubdiv::checkPreliminaryMatches(topology_refiner, converter) && + blender::opensubdiv::checkGeometryMatches(topology_refiner, converter) && + blender::opensubdiv::checkTopologyAttributesMatch(topology_refiner, converter)); } -- cgit v1.2.3