[Bf-blender-cvs] [4bf26fd] master: OpenSubdiv: Mark non-manifold verts as sharp

Sergey Sharybin noreply at git.blender.org
Mon Aug 3 14:57:52 CEST 2015


Commit: 4bf26fda97d61bcaad8df52cac92e62c485e8513
Author: Sergey Sharybin
Date:   Mon Aug 3 13:44:41 2015 +0200
Branches: master
https://developer.blender.org/rB4bf26fda97d61bcaad8df52cac92e62c485e8513

OpenSubdiv: Mark non-manifold verts as sharp

===================================================================

M	intern/opensubdiv/opensubdiv_converter.cc

===================================================================

diff --git a/intern/opensubdiv/opensubdiv_converter.cc b/intern/opensubdiv/opensubdiv_converter.cc
index 117edc4..c0fca86 100644
--- a/intern/opensubdiv/opensubdiv_converter.cc
+++ b/intern/opensubdiv/opensubdiv_converter.cc
@@ -351,21 +351,23 @@ inline bool TopologyRefinerFactory<OpenSubdiv_Converter>::assignComponentTags(
 		setBaseEdgeSharpness(refiner, edge, sharpness);
 	}
 
-#if 0
-	/* Non-manifold vertices can't be always smooth.
-	 * I.e. when there's loose edge adjacent to the vertex
-	 * opensubdiv expects vertices to be sharp. But this needs
-	 * some further investigation.
+	/* OpenSubdiv expects non-manifold vertices to be sharp but at the
+	 * time it handles correct cases when vertex is a corner of plane.
+	 * Currently mark verts which are adjacent to a loose edge as sharp,
+	 * but this decision needs some more investigation.
 	 */
 	int num_vert = conv.get_num_verts(&conv);
 	for (int vert = 0; vert < num_vert; ++vert) {
-		IndexArray vert_faces = getBaseVertexFaces(refiner, vert),
-		           vert_edges = getBaseVertexEdges(refiner, vert);
-		if (vert_faces.size() != vert_edges.size()) {
-			setBaseVertexSharpness(refiner, vert, Crease::SHARPNESS_INFINITE);
+		ConstIndexArray vert_edges = getBaseVertexEdges(refiner, vert);
+		for (int edge_index = 0; edge_index < vert_edges.size(); ++edge_index) {
+			int edge = vert_edges[edge_index];
+			ConstIndexArray edge_faces = getBaseEdgeFaces(refiner, edge);
+			if (edge_faces.size() == 0) {
+				setBaseVertexSharpness(refiner, vert, Crease::SHARPNESS_INFINITE);
+				break;
+			}
 		}
 	}
-#endif
 
 	return true;
 }




More information about the Bf-blender-cvs mailing list