[Bf-blender-cvs] [9aeb475e99b] blender-v2.83-release: Subdiv: Fix wrong non-manifold subdivision in certain cases
Sergey Sharybin
noreply at git.blender.org
Wed Apr 22 14:27:55 CEST 2020
Commit: 9aeb475e99b0b469bb6ce657da6480f971112a45
Author: Sergey Sharybin
Date: Wed Apr 22 12:58:08 2020 +0200
Branches: blender-v2.83-release
https://developer.blender.org/rB9aeb475e99b0b469bb6ce657da6480f971112a45
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
===================================================================
M intern/opensubdiv/internal/opensubdiv_converter_factory.cc
===================================================================
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;
}
More information about the Bf-blender-cvs
mailing list