Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2020-05-19 12:39:07 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2020-05-27 13:07:16 +0300
commit717d968fb9fd2daa5326a8e2322c3accee335ce3 (patch)
treedfd40593114178acb58a7c0314474cd94ebf24e0 /intern/opensubdiv
parent5d8515ed86cebd8af990e3f79362a00f58a1b1a9 (diff)
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.
Diffstat (limited to 'intern/opensubdiv')
-rw-r--r--intern/opensubdiv/CMakeLists.txt2
-rw-r--r--intern/opensubdiv/internal/topology/mesh_topology.cc52
-rw-r--r--intern/opensubdiv/internal/topology/mesh_topology.h61
3 files changed, 115 insertions, 0 deletions
diff --git a/intern/opensubdiv/CMakeLists.txt b/intern/opensubdiv/CMakeLists.txt
index 4387daf40e4..70c5453d3bd 100644
--- a/intern/opensubdiv/CMakeLists.txt
+++ b/intern/opensubdiv/CMakeLists.txt
@@ -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
diff --git a/intern/opensubdiv/internal/topology/mesh_topology.cc b/intern/opensubdiv/internal/topology/mesh_topology.cc
new file mode 100644
index 00000000000..f8832d61cd0
--- /dev/null
+++ b/intern/opensubdiv/internal/topology/mesh_topology.cc
@@ -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
diff --git a/intern/opensubdiv/internal/topology/mesh_topology.h b/intern/opensubdiv/internal/topology/mesh_topology.h
new file mode 100644
index 00000000000..9893c70dac8
--- /dev/null
+++ b/intern/opensubdiv/internal/topology/mesh_topology.h
@@ -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_