[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