OpenSubdiv: Add explicit storage for mesh topology

The idea is to use this explicit storage for topology comparison rather
than using base level. While this will have memory overhead it allows
to simplify comparison of such things as:

- Vertex sharpness (where base level from topology refiner will have it
  refined, meaning it will be different from what application requested
  for non-manifold and corner vertices).

- It will allow to simplify face-vertices comparison, where currently
  O(N^2) algorithm is used due to possible difference in face winding.

- It will also allow to avoid comparison-time allocation of edge map.

Currently no functional changes, just preparing for development which
will happen next.
This commit is contained in:
Sergey Sharybin 2020-05-19 11:39:07 +02:00
parent 5d8515ed86
commit 717d968fb9
3 changed files with 115 additions and 0 deletions

View File

@ -78,6 +78,8 @@ if(WITH_OPENSUBDIV)
internal/evaluator/evaluator_impl.h
# Topology.
internal/topology/mesh_topology.cc
internal/topology/mesh_topology.h
internal/topology/topology_refiner_capi.cc
internal/topology/topology_refiner_factory.cc
internal/topology/topology_refiner_impl.cc

View File

@ -0,0 +1,52 @@
// Copyright 2020 Blender Foundation. All rights reserved.
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software Foundation,
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
// Author: Sergey Sharybin
#include "internal/topology/mesh_topology.h"
#include <cassert>
namespace blender {
namespace opensubdiv {
MeshTopology::MeshTopology()
{
}
MeshTopology::~MeshTopology()
{
}
void MeshTopology::setNumVertices(int num_vertices)
{
vertices.resize(num_vertices);
}
int MeshTopology::getNumVertices() const
{
return vertices.size();
}
void MeshTopology::setVertexSharpness(int vertex_index, float sharpness)
{
assert(vertex_index >= 0);
assert(vertex_index < vertices.size());
vertices[vertex_index].sharpness = sharpness;
}
} // namespace opensubdiv
} // namespace blender

View File

@ -0,0 +1,61 @@
// Copyright 2020 Blender Foundation. All rights reserved.
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software Foundation,
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
// Author: Sergey Sharybin
#ifndef OPENSUBDIV_MESH_TOPOLOGY_H_
#define OPENSUBDIV_MESH_TOPOLOGY_H_
#include "internal/base/memory.h"
#include "internal/base/type.h"
struct OpenSubdiv_Converter;
namespace blender {
namespace opensubdiv {
class VertexTopology {
public:
float sharpness = 0.0f;
};
// Simplified representation of mesh topology.
// Only includes parts of actual mesh topology which is needed to perform
// comparison between Application side and OpenSubddiv side.
class MeshTopology {
public:
MeshTopology();
MeshTopology(const MeshTopology &other) = default;
MeshTopology(MeshTopology &&other) noexcept = default;
~MeshTopology();
MeshTopology &operator=(const MeshTopology &other) = default;
MeshTopology &operator=(MeshTopology &&other) = default;
void setNumVertices(int num_vertices);
int getNumVertices() const;
void setVertexSharpness(int vertex_index, float sharpness);
vector<VertexTopology> vertices;
MEM_CXX_CLASS_ALLOC_FUNCS("MeshTopology");
};
} // namespace opensubdiv
} // namespace blender
#endif // OPENSUBDIV_MESH_TOPOLOGY_H_