[Bf-blender-cvs] [d7723df] master: BMesh: partial-connection could make duplicate edges

Campbell Barton noreply at git.blender.org
Thu Dec 17 08:17:40 CET 2015


Commit: d7723df8466a9aa34ab51f5c3640ae17d48637eb
Author: Campbell Barton
Date:   Thu Dec 17 17:49:56 2015 +1100
Branches: master
https://developer.blender.org/rBd7723df8466a9aa34ab51f5c3640ae17d48637eb

BMesh: partial-connection could make duplicate edges

Avoiding to make duplicate edges is too involved, do a remove-duplicates pass at the end instead.

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

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 85efffb..d2a20be 100644
--- a/source/blender/bmesh/intern/bmesh_polygon_edgenet.c
+++ b/source/blender/bmesh/intern/bmesh_polygon_edgenet.c
@@ -1046,40 +1046,21 @@ static BMVert *bm_face_split_edgenet_partial_connect(BMesh *bm, BMVert *v_delimi
 
 
 /**
- * Check if creating a connection between 2 edges will later overlap when splicing vertices back together.
+ * Check if connecting vertices would cause an edge with duplicate verts.
  */
 static bool bm_vert_partial_connect_check_overlap(
-        BMVert **vert_arr, const int *remap,
+        const int *remap,
         const int v_a_index, const int v_b_index)
 {
-	int v_a_remap = remap[v_a_index];
-	int v_b_remap = remap[v_b_index];
-
-	if (v_a_remap == -1 && v_b_remap == -1) {
-		return false;
-	}
-	else if (UNLIKELY((v_a_remap == v_b_index) || (v_b_remap == v_a_index))) {
-		/* connected to eachother */
+	/* connected to eachother */
+	if (UNLIKELY((remap[v_a_index] == v_b_index) ||
+	             (remap[v_b_index] == v_a_index)))
+	{
 		return true;
 	}
 	else {
-		/* check that creating an edge here will overlap an existing edge
-		 * once adjacent vertices are spliced together. */
-		const int v_pair[2] = {v_a_index, v_b_index};
-		for (int i = 0; i < 2; i++) {
-			BMVert *v = vert_arr[v_pair[i]];
-			BMEdge *e_iter = v->e;
-			do {
-				BMVert *v_step = BM_edge_other_vert(e_iter, v);
-				const int v_step_index = BM_elem_index_get(v_step);
-				if (remap[v_step_index] == v_pair[!i]) {
-					return true;
-				}
-			} while ((e_iter = BM_DISK_EDGE_NEXT(e_iter, v)) != v->e);
-		}
+		return false;
 	}
-
-	return false;
 }
 
 
@@ -1438,13 +1419,16 @@ bool BM_face_split_edgenet_connect_islands(
 #ifdef USE_PARTIAL_CONNECT
 					if ((use_partial_connect == false) ||
 					    (bm_vert_partial_connect_check_overlap(
-					         vert_arr, temp_vert_pairs.remap,
+					         temp_vert_pairs.remap,
 					         BM_elem_index_get(v_origin), index_other) == false))
 #endif
 					{
 						BMVert *v_end = vert_arr[index_other];
 
 						edge_net_new[edge_net_new_index] = BM_edge_create(bm, v_origin, v_end, NULL, 0);
+#ifdef USE_PARTIAL_CONNECT
+						BM_elem_index_set(edge_net_new[edge_net_new_index], edge_net_new_index);
+#endif
 						edge_net_new_index++;
 						args.edge_arr_new_len++;
 					}
@@ -1462,12 +1446,15 @@ bool BM_face_split_edgenet_connect_islands(
 #ifdef USE_PARTIAL_CONNECT
 					if ((use_partial_connect == false) ||
 					    (bm_vert_partial_connect_check_overlap(
-					         vert_arr, temp_vert_pairs.remap,
+					         temp_vert_pairs.remap,
 					         BM_elem_index_get(v_origin), index_other) == false))
 #endif
 					{
 						BMVert *v_end = vert_arr[index_other];
 						edge_net_new[edge_net_new_index] = BM_edge_create(bm, v_origin, v_end, NULL, 0);
+#ifdef USE_PARTIAL_CONNECT
+						BM_elem_index_set(edge_net_new[edge_net_new_index], edge_net_new_index);
+#endif
 						edge_net_new_index++;
 						args.edge_arr_new_len++;
 					}
@@ -1505,6 +1492,21 @@ finally:
 			BLI_assert(BM_edge_exists(tvp->v_orig, tvp->v_temp) == NULL);
 			BM_vert_splice(bm, tvp->v_orig, tvp->v_temp);
 		} while ((tvp = tvp->next));
+
+		/* Remove edges which have become doubles since splicing vertices together,
+		 * its less trouble then detecting future-doubles on edge-creation. */
+		for (unsigned int i = edge_net_init_len; i < edge_net_new_len; i++) {
+			while (BM_edge_find_double(edge_net_new[i])) {
+				BM_edge_kill(bm, edge_net_new[i]);
+				edge_net_new_len--;
+				if (i == edge_net_new_len) {
+					break;
+				}
+				edge_net_new[i] = edge_net_new[edge_net_new_len];
+			}
+		}
+
+		*r_edge_net_new_len = edge_net_new_len;
 	}
 #endif




More information about the Bf-blender-cvs mailing list