[Bf-blender-cvs] [73a9c56] master: Fix T48716: Knife cut creates inverted normals

Campbell Barton noreply at git.blender.org
Fri Jun 24 10:55:50 CEST 2016


Commit: 73a9c56607272be410b8e87336f4e05d87a44ed5
Author: Campbell Barton
Date:   Fri Jun 24 18:58:42 2016 +1000
Branches: master
https://developer.blender.org/rB73a9c56607272be410b8e87336f4e05d87a44ed5

Fix T48716: Knife cut creates inverted normals

In the case of having 3+ boundary edges, we need to find the best.

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

M	source/blender/bmesh/intern/bmesh_polygon_edgenet.c

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

diff --git a/source/blender/bmesh/intern/bmesh_polygon_edgenet.c b/source/blender/bmesh/intern/bmesh_polygon_edgenet.c
index 5ef19b5..5c07ffc 100644
--- a/source/blender/bmesh/intern/bmesh_polygon_edgenet.c
+++ b/source/blender/bmesh/intern/bmesh_polygon_edgenet.c
@@ -142,10 +142,17 @@ static bool bm_face_split_edgenet_find_loop_pair(
 	}
 	e_pair[0] = BLI_SMALLSTACK_POP(edges_boundary);
 
+	/* use to hold boundary OR wire edges */
+	BLI_SMALLSTACK_DECLARE(edges_search, BMEdge *);
+
 	/* attempt one boundary and one wire, or 2 boundary */
 	if (edges_wire_len == 0) {
-		if (edges_boundary_len >= 2) {
+		if (edges_boundary_len > 1) {
 			e_pair[1] = BLI_SMALLSTACK_POP(edges_boundary);
+
+			if (edges_boundary_len > 2) {
+				BLI_SMALLSTACK_SWAP(edges_search, edges_wire);
+			}
 		}
 		else {
 			/* one boundary and no wire */
@@ -154,28 +161,27 @@ static bool bm_face_split_edgenet_find_loop_pair(
 	}
 	else {
 		e_pair[1] = BLI_SMALLSTACK_POP(edges_wire);
-
 		if (edges_wire_len > 1) {
-			BMVert *v_prev = BM_edge_other_vert(e_pair[0], v_init);
-			BMVert *v_next;
-			float angle_best;
-
-			v_next = BM_edge_other_vert(e_pair[1], v_init);
-			angle_best = angle_on_axis_v3v3v3_v3(v_prev->co, v_init->co, v_next->co, face_normal);
-
-			BMEdge *e;
-			while ((e = BLI_SMALLSTACK_POP(edges_wire))) {
-				float angle_test;
-				v_next = BM_edge_other_vert(e, v_init);
-				angle_test = angle_on_axis_v3v3v3_v3(v_prev->co, v_init->co, v_next->co, face_normal);
-				if (angle_test < angle_best) {
-					angle_best = angle_test;
-					e_pair[1] = e;
-				}
-			}
+			BLI_SMALLSTACK_SWAP(edges_search, edges_wire);
 		}
 	}
 
+	/* if we swapped above, search this list for the best edge */
+	if (!BLI_SMALLSTACK_IS_EMPTY(edges_search)) {
+		/* find the best edge in 'edge_list' to use for 'e_pair[1]' */
+		const BMVert *v_prev = BM_edge_other_vert(e_pair[0], v_init);
+		const BMVert *v_next = BM_edge_other_vert(e_pair[1], v_init);
+		float angle_best = angle_on_axis_v3v3v3_v3(v_prev->co, v_init->co, v_next->co, face_normal);
+		BMEdge *e;
+		while ((e = BLI_SMALLSTACK_POP(edges_search))) {
+			v_next = BM_edge_other_vert(e, v_init);
+			const float angle_test = angle_on_axis_v3v3v3_v3(v_prev->co, v_init->co, v_next->co, face_normal);
+			if (angle_test < angle_best) {
+				angle_best = angle_test;
+				e_pair[1] = e;
+			}
+		}
+	}
 
 	/* flip based on winding */
 	l_walk = bm_edge_flagged_radial_first(e_pair[0]);




More information about the Bf-blender-cvs mailing list