diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2020-05-19 16:48:57 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2020-05-27 13:07:16 +0300 |
commit | 1e0de7c2ea74d0e390c8d306d70b46da1510d107 (patch) | |
tree | a9f7fa1ec563e92ba59f591bfb00eb76ddaeec74 /intern/opensubdiv/internal/topology/mesh_topology_compare.cc | |
parent | 6a8193e505a33c1a09c9afd01630c7a56a6019f2 (diff) |
OpenSubdiv: Compare edge topology
This change makes it so topology refiner comparison will check vertices
of all existing/provided edges.
The initial claim that due to manifold nature of mesh there is no need
in "deep" edges check was wrong: some areas might only provide edges
with non-zero creases. So if crease of one edge goes changes from 1.0
to 0.0 and crease of other edge goes from 0.0 to 1.0 the old comparison
code would not have caught it.
Diffstat (limited to 'intern/opensubdiv/internal/topology/mesh_topology_compare.cc')
-rw-r--r-- | intern/opensubdiv/internal/topology/mesh_topology_compare.cc | 67 |
1 files changed, 65 insertions, 2 deletions
diff --git a/intern/opensubdiv/internal/topology/mesh_topology_compare.cc b/intern/opensubdiv/internal/topology/mesh_topology_compare.cc index fd10a53dbe3..c8ae0638bed 100644 --- a/intern/opensubdiv/internal/topology/mesh_topology_compare.cc +++ b/intern/opensubdiv/internal/topology/mesh_topology_compare.cc @@ -29,6 +29,52 @@ namespace opensubdiv { namespace { //////////////////////////////////////////////////////////////////////////////// +// Geometry. + +// Edges. + +int getEffectiveNumEdges(const OpenSubdiv_Converter *converter) +{ + if (converter->getNumEdges == nullptr) { + return 0; + } + + return converter->getNumEdges(converter); +} + +bool isEqualEdgeGeometry(const MeshTopology &mesh_topology, const OpenSubdiv_Converter *converter) +{ + const int num_requested_edges = getEffectiveNumEdges(converter); + if (num_requested_edges != mesh_topology.getNumEdges()) { + return false; + } + + for (int edge_index = 0; edge_index < num_requested_edges; ++edge_index) { + int requested_edge_vertices[2]; + converter->getEdgeVertices(converter, edge_index, requested_edge_vertices); + + const EdgeTopology ¤t_edge = mesh_topology.getEdge(edge_index); + if (current_edge.v1 != requested_edge_vertices[0] || + current_edge.v2 != requested_edge_vertices[1]) { + return false; + } + } + + return true; +} + +// Geometry comparison entry point. + +bool isEqualGeometry(const MeshTopology &mesh_topology, const OpenSubdiv_Converter *converter) +{ + if (!isEqualEdgeGeometry(mesh_topology, converter)) { + return false; + } + + return true; +} + +//////////////////////////////////////////////////////////////////////////////// // Geometry tags. // Vertices. @@ -90,6 +136,20 @@ bool isEqualEdgeTags(const MeshTopology &mesh_topology, const OpenSubdiv_Convert return true; } +// Tags comparison entry point. + +bool isEqualTags(const MeshTopology &mesh_topology, const OpenSubdiv_Converter *converter) +{ + if (!isEqualVertexTags(mesh_topology, converter)) { + return false; + } + if (!isEqualEdgeTags(mesh_topology, converter)) { + return false; + } + + return true; +} + } // namespace //////////////////////////////////////////////////////////////////////////////// @@ -97,10 +157,13 @@ bool isEqualEdgeTags(const MeshTopology &mesh_topology, const OpenSubdiv_Convert bool MeshTopology::isEqualToConverter(const OpenSubdiv_Converter *converter) const { - if (!isEqualVertexTags(*this, converter)) { + // Geometry. + if (!isEqualGeometry(*this, converter)) { return false; } - if (!isEqualEdgeTags(*this, converter)) { + + // Tags. + if (!isEqualTags(*this, converter)) { return false; } |