diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2020-05-26 13:42:13 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2020-05-27 13:07:16 +0300 |
commit | efa4ae17f043f41b2d7d26dc8dfc7a7f90b4acfd (patch) | |
tree | f41f61afb89e4da4fbdac7dd75d5407decf2db4e /intern/opensubdiv/internal/topology/topology_refiner_factory.cc | |
parent | 8cd17a9529473e0bda31a9d33cdb7bdd58524600 (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.cc | 30 |
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"); |