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-26 13:42:13 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2020-05-27 13:07:16 +0300
commitefa4ae17f043f41b2d7d26dc8dfc7a7f90b4acfd (patch)
treef41f61afb89e4da4fbdac7dd75d5407decf2db4e /intern/opensubdiv/internal/topology/topology_refiner_factory.cc
parent8cd17a9529473e0bda31a9d33cdb7bdd58524600 (diff)
OpenSubdiv: Only store edges topology for non-smooth edges
This change makes it so vertices of edge are only stored when edge has non-zero crease. This allows to lower memory footprint of 1.5M faces from 78 MiB to 54 MiB in the case all creases are zero. Meshes with crease are more hard to predict due to array-based storage, so it all depends on index of edge with crease. Worst case (all edges are creased) still stays at 78 MiB.
Diffstat (limited to 'intern/opensubdiv/internal/topology/topology_refiner_factory.cc')
-rw-r--r--intern/opensubdiv/internal/topology/topology_refiner_factory.cc30
1 files changed, 6 insertions, 24 deletions
diff --git a/intern/opensubdiv/internal/topology/topology_refiner_factory.cc b/intern/opensubdiv/internal/topology/topology_refiner_factory.cc
index e0c5e18e504..9688bc9eb0f 100644
--- a/intern/opensubdiv/internal/topology/topology_refiner_factory.cc
+++ b/intern/opensubdiv/internal/topology/topology_refiner_factory.cc
@@ -130,21 +130,6 @@ inline bool TopologyRefinerFactory<TopologyRefinerData>::assignComponentTopology
const bool full_topology_specified = converter->specifiesFullTopology(converter);
- // Vertices of an edge.
- //
- // NOTE: Only specify for base mesh topology on our side.
- // They will be provided to the topology refiner only if the full topology is
- // specified.
- if (converter->getNumEdges != nullptr) {
- const int num_edges = converter->getNumEdges(converter);
- for (int edge_index = 0; edge_index < num_edges; ++edge_index) {
- int edge_vertices[2];
- converter->getEdgeVertices(converter, edge_index, edge_vertices);
-
- base_mesh_topology->setEdgeVertexIndices(edge_index, edge_vertices[0], edge_vertices[1]);
- }
- }
-
// Vertices of face.
const int num_faces = converter->getNumFaces(converter);
for (int face_index = 0; face_index < num_faces; ++face_index) {
@@ -186,12 +171,8 @@ inline bool TopologyRefinerFactory<TopologyRefinerData>::assignComponentTopology
const int num_edges = converter->getNumEdges(converter);
for (int edge_index = 0; edge_index < num_edges; ++edge_index) {
// Vertices this edge connects.
- int v1, v2;
- base_mesh_topology->getEdgeVertexIndices(edge_index, &v1, &v2);
-
IndexArray dst_edge_vertices = getBaseEdgeVertices(refiner, edge_index);
- dst_edge_vertices[0] = v1;
- dst_edge_vertices[1] = v2;
+ converter->getEdgeVertices(converter, edge_index, &dst_edge_vertices[0]);
// Faces adjacent to this edge.
IndexArray dst_edge_faces = getBaseEdgeFaces(refiner, edge_index);
@@ -224,20 +205,21 @@ inline bool TopologyRefinerFactory<TopologyRefinerData>::assignComponentTags(
const int num_edges = converter->getNumEdges(converter);
for (int edge_index = 0; edge_index < num_edges; ++edge_index) {
const float sharpness = converter->getEdgeSharpness(converter, edge_index);
- base_mesh_topology->setEdgeSharpness(edge_index, sharpness);
-
if (sharpness < 1e-6f) {
continue;
}
+ int edge_vertices[2];
+ converter->getEdgeVertices(converter, edge_index, edge_vertices);
+ base_mesh_topology->setEdgeVertexIndices(edge_index, edge_vertices[0], edge_vertices[1]);
+ base_mesh_topology->setEdgeSharpness(edge_index, sharpness);
+
if (full_topology_specified) {
setBaseEdgeSharpness(refiner, edge_index, sharpness);
}
else {
// TODO(sergey): Should be a faster way to find reconstructed edge to
// specify sharpness for (assuming, findBaseEdge has linear complexity).
- int edge_vertices[2];
- converter->getEdgeVertices(converter, edge_index, edge_vertices);
const int base_edge_index = findBaseEdge(refiner, edge_vertices[0], edge_vertices[1]);
if (base_edge_index == OpenSubdiv::Far::INDEX_INVALID) {
printf("OpenSubdiv Error: failed to find reconstructed edge\n");