diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-07-31 16:09:29 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-08-01 19:42:59 +0300 |
commit | 08e6bccdf4a2114847194fbe8adcb1fc83a1746f (patch) | |
tree | 757f36fc7cf376288e0301cdbd9bc9ad50824b1e /intern | |
parent | 9e2f678ba25cb292257fc9949373917ec48a6d46 (diff) |
Subsurf: Support subdivision of loose elements
Applies to vertices and edges. Biggest annoyance here is that OpenSubdiv's
topology converter expects that there is no loose geometry, otherwise it
is getting confused.
For now solution is to create some sort of mapping from real Mesh vertex
and edge index to a non-loose-index. Now the annoying part is that this
is an extra step to calculate before we can compare topology, meaning FPS
will not be as great as if we knew for sure that topology didn't change.
Loose edges subdivision is different from what it used to be with old
subdivision code, but probably nice feature now is that endpoints of loose
edges are stay at the coarse vertex locations. This allows to have things
like plane with hair strands, without need to duplicate edge vertices at
endpoints.
All this required some re-work of topology refiner creation, which is now
only passing edges and vertices which are adjacent to face. This is how
topology refiner is supposed to be used, and this is how its validator
also works. Vertices which are adjacent to loose edges are marked as
infinite sharp. This seems to be good-enough approximation for now. In the
future we might tweaks things a bit and push such vertices in average
direction of loose edges, to match old subdivision code closer.
Diffstat (limited to 'intern')
-rw-r--r-- | intern/opensubdiv/internal/opensubdiv_converter_factory.cc | 14 | ||||
-rw-r--r-- | intern/opensubdiv/internal/opensubdiv_internal.h | 3 | ||||
-rw-r--r-- | intern/opensubdiv/opensubdiv_converter_capi.h | 8 |
3 files changed, 12 insertions, 13 deletions
diff --git a/intern/opensubdiv/internal/opensubdiv_converter_factory.cc b/intern/opensubdiv/internal/opensubdiv_converter_factory.cc index 48516cc80b7..06707cbf418 100644 --- a/intern/opensubdiv/internal/opensubdiv_converter_factory.cc +++ b/intern/opensubdiv/internal/opensubdiv_converter_factory.cc @@ -346,16 +346,10 @@ inline bool TopologyRefinerFactory<TopologyRefinerData>::assignComponentTags( const int num_vertices = converter->getNumVertices(converter); for (int vertex_index = 0; vertex_index < num_vertices; ++vertex_index) { ConstIndexArray vertex_edges = getBaseVertexEdges(refiner, vertex_index); - for (int i = 0; i < vertex_edges.size(); ++i) { - const int edge_index = vertex_edges[i]; - ConstIndexArray edge_faces = getBaseEdgeFaces(refiner, edge_index); - if (edge_faces.size() == 0) { - setBaseVertexSharpness(refiner, vertex_index, - Crease::SHARPNESS_INFINITE); - break; - } - } - if (vertex_edges.size() == 2) { + if (converter->isInfiniteSharpVertex(converter, vertex_index)) { + setBaseVertexSharpness( + refiner, vertex_index, Crease::SHARPNESS_INFINITE); + } else if (vertex_edges.size() == 2) { const int edge0 = vertex_edges[0], edge1 = vertex_edges[1]; const float sharpness0 = converter->getEdgeSharpness(converter, edge0); const float sharpness1 = converter->getEdgeSharpness(converter, edge1); diff --git a/intern/opensubdiv/internal/opensubdiv_internal.h b/intern/opensubdiv/internal/opensubdiv_internal.h index b9d196bbe9e..16365896edf 100644 --- a/intern/opensubdiv/internal/opensubdiv_internal.h +++ b/intern/opensubdiv/internal/opensubdiv_internal.h @@ -24,9 +24,6 @@ // Never do for release builds. # undef OPENSUBDIV_VALIDATE_TOPOLOGY #else -// TODO(sergey): Always disabled for now, the check doesn't handle multiple -// non-manifolds from the OpenSubdiv side currently. -// # undef OPENSUBDIV_VALIDATE_TOPOLOGY # define OPENSUBDIV_VALIDATE_TOPOLOGY #endif diff --git a/intern/opensubdiv/opensubdiv_converter_capi.h b/intern/opensubdiv/opensubdiv_converter_capi.h index a939f1117e0..58a231deb30 100644 --- a/intern/opensubdiv/opensubdiv_converter_capi.h +++ b/intern/opensubdiv/opensubdiv_converter_capi.h @@ -19,6 +19,8 @@ #ifndef OPENSUBDIV_CONVERTER_CAPI_H_ #define OPENSUBDIV_CONVERTER_CAPI_H_ +#include <stdint.h> // for bool + #include "opensubdiv_capi_type.h" #ifdef __cplusplus @@ -34,6 +36,7 @@ typedef struct OpenSubdiv_Converter { ////////////////////////////////////////////////////////////////////////////// // Global geometry counters. + // Number of faces/edges/vertices in the base mesh. int (*getNumFaces)(const struct OpenSubdiv_Converter* converter); int (*getNumEdges)(const struct OpenSubdiv_Converter* converter); @@ -92,6 +95,11 @@ typedef struct OpenSubdiv_Converter { const int vertex_index, int* vertex_faces); + // Check whether vertex is to be marked as an infinite sharp. + // This is a way to make sharp vertices which are adjacent to a loose edges. + bool (*isInfiniteSharpVertex)(const struct OpenSubdiv_Converter* converter, + const int vertex_index); + ////////////////////////////////////////////////////////////////////////////// // Face-varying data. |