OpenSubdiv: Move preliminary geometry counters check to mesh topology

This commit is contained in:
Sergey Sharybin 2020-05-19 16:37:19 +02:00
parent a444400900
commit 8e9fdd2f31
2 changed files with 31 additions and 17 deletions

View File

@ -32,9 +32,7 @@ namespace opensubdiv {
namespace {
////////////////////////////////////////////////////////////////////////////////
// Geometry.
// Edges.
// Quick preliminary checks.
int getEffectiveNumEdges(const OpenSubdiv_Converter *converter)
{
@ -45,6 +43,27 @@ int getEffectiveNumEdges(const OpenSubdiv_Converter *converter)
return converter->getNumEdges(converter);
}
bool isEqualGeometryCounters(const MeshTopology &mesh_topology,
const OpenSubdiv_Converter *converter)
{
if (converter->getNumVertices(converter) != mesh_topology.getNumVertices()) {
return false;
}
if (converter->getNumFaces(converter) != mesh_topology.getNumFaces()) {
return false;
}
if (getEffectiveNumEdges(converter) != mesh_topology.getNumEdges()) {
return false;
}
return true;
}
////////////////////////////////////////////////////////////////////////////////
// Geometry.
// Edges.
bool isEqualGeometryEdge(const MeshTopology &mesh_topology, const OpenSubdiv_Converter *converter)
{
const int num_requested_edges = getEffectiveNumEdges(converter);
@ -192,6 +211,11 @@ bool isEqualTags(const MeshTopology &mesh_topology, const OpenSubdiv_Converter *
bool MeshTopology::isEqualToConverter(const OpenSubdiv_Converter *converter) const
{
// Preliminary checks.
if (!isEqualGeometryCounters(*this, converter)) {
return false;
}
// Geometry.
if (!isEqualGeometry(*this, converter)) {
return false;

View File

@ -67,22 +67,11 @@ bool checkOptionsMatches(const TopologyRefinerImpl *topology_refiner_impl,
return true;
}
bool checkGeometryCountersMatches(const TopologyRefinerImpl *topology_refiner_impl,
const OpenSubdiv_Converter *converter)
{
using OpenSubdiv::Far::TopologyLevel;
const TopologyLevel &base_level = getOSDTopologyBaseLevel(topology_refiner_impl);
return ((converter->getNumVertices(converter) == base_level.GetNumVertices()) &&
(converter->getNumEdges(converter) == base_level.GetNumEdges()) &&
(converter->getNumFaces(converter) == base_level.GetNumFaces()));
}
bool checkPreliminaryMatches(const TopologyRefinerImpl *topology_refiner_impl,
const OpenSubdiv_Converter *converter)
{
return checkSchemeTypeMatches(topology_refiner_impl, converter) &&
checkOptionsMatches(topology_refiner_impl, converter) &&
checkGeometryCountersMatches(topology_refiner_impl, converter);
checkOptionsMatches(topology_refiner_impl, converter);
}
////////////////////////////////////////////////////////////////////////////////
@ -142,11 +131,12 @@ bool TopologyRefinerImpl::isEqualToConverter(const OpenSubdiv_Converter *convert
if (!blender::opensubdiv::checkPreliminaryMatches(this, converter)) {
return false;
}
if (!blender::opensubdiv::checkTopologyAttributesMatch(this, converter)) {
if (!base_mesh_topology.isEqualToConverter(converter)) {
return false;
}
if (!base_mesh_topology.isEqualToConverter(converter)) {
if (!blender::opensubdiv::checkTopologyAttributesMatch(this, converter)) {
return false;
}