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-04-22 13:58:08 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2020-04-22 15:26:12 +0300
commit9aeb475e99b0b469bb6ce657da6480f971112a45 (patch)
tree8e04014183218ce8576b8dbbda72bbee9ecc96a7 /intern/opensubdiv
parent470f17f21c06709443b5634a6fc31dc4dc355daf (diff)
Subdiv: Fix wrong non-manifold subdivision in certain cases
Was happening when only partial subset of callbacks was specified. The reason was that there was a callback to specify edges sharpness but no callback to specify vertex sharpness, so the special case for non-manifold edges was not run. Fixes T75697: Multires in simple mode doesn't work correct on a plane
Diffstat (limited to 'intern/opensubdiv')
-rw-r--r--intern/opensubdiv/internal/opensubdiv_converter_factory.cc29
1 files changed, 19 insertions, 10 deletions
diff --git a/intern/opensubdiv/internal/opensubdiv_converter_factory.cc b/intern/opensubdiv/internal/opensubdiv_converter_factory.cc
index d5902918663..ab93b5ce952 100644
--- a/intern/opensubdiv/internal/opensubdiv_converter_factory.cc
+++ b/intern/opensubdiv/internal/opensubdiv_converter_factory.cc
@@ -173,18 +173,27 @@ inline bool TopologyRefinerFactory<TopologyRefinerData>::assignComponentTags(
setBaseVertexSharpness(refiner, vertex_index, Crease::SHARPNESS_INFINITE);
continue;
}
+
+ // Get sharpness provided by the converter.
+ float sharpness = 0.0f;
if (converter->getVertexSharpness != NULL) {
- float sharpness = converter->getVertexSharpness(converter, vertex_index);
- if (vertex_edges.size() == 2) {
- const int edge0 = vertex_edges[0], edge1 = vertex_edges[1];
- const float sharpness0 = refiner._levels[0]->getEdgeSharpness(edge0);
- const float sharpness1 = refiner._levels[0]->getEdgeSharpness(edge1);
- // TODO(sergey): Find a better mixing between edge and vertex sharpness.
- sharpness += min(sharpness0, sharpness1);
- sharpness = min(sharpness, 10.0f);
- }
- setBaseVertexSharpness(refiner, vertex_index, sharpness);
+ sharpness = converter->getVertexSharpness(converter, vertex_index);
}
+
+ // If it's vertex where 2 non-manifold edges meet adjust vertex sharpness to
+ // the edges.
+ // This way having a plane with all 4 edges set to be sharp produces sharp
+ // corners in the subdivided result.
+ if (vertex_edges.size() == 2) {
+ const int edge0 = vertex_edges[0], edge1 = vertex_edges[1];
+ const float sharpness0 = refiner._levels[0]->getEdgeSharpness(edge0);
+ const float sharpness1 = refiner._levels[0]->getEdgeSharpness(edge1);
+ // TODO(sergey): Find a better mixing between edge and vertex sharpness.
+ sharpness += min(sharpness0, sharpness1);
+ sharpness = min(sharpness, 10.0f);
+ }
+
+ setBaseVertexSharpness(refiner, vertex_index, sharpness);
}
return true;
}