[Bf-blender-cvs] [4123b30] master: BMesh: split-by-edges minor fixes

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


Commit: 4123b30323bd2e9af9220c2066528e6d22e447e4
Author: Campbell Barton
Date:   Thu Dec 17 18:10:04 2015 +1100
Branches: master
https://developer.blender.org/rB4123b30323bd2e9af9220c2066528e6d22e447e4

BMesh: split-by-edges minor fixes

- select all newly created edges
- remove redundant edges (not essential but nicer output).

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

M	source/blender/editors/mesh/editmesh_intersect.c

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

diff --git a/source/blender/editors/mesh/editmesh_intersect.c b/source/blender/editors/mesh/editmesh_intersect.c
index 86d1b9b..634c4e5 100644
--- a/source/blender/editors/mesh/editmesh_intersect.c
+++ b/source/blender/editors/mesh/editmesh_intersect.c
@@ -404,6 +404,16 @@ static void ghash_insert_face_edge_link(
 	ls_base->list_len += 1;
 }
 
+static int bm_edge_sort_length_cb(const void *e_a_v, const void *e_b_v)
+{
+	const float val_a = -BM_edge_calc_length_squared(*((BMEdge **)e_a_v));
+	const float val_b = -BM_edge_calc_length_squared(*((BMEdge **)e_b_v));
+
+	if      (val_a > val_b) return  1;
+	else if (val_a < val_b) return -1;
+	else                    return  0;
+}
+
 static void bm_face_split_by_edges_island_connect(
         BMesh *bm, BMFace *f,
         LinkNode *e_link, const int e_link_len,
@@ -435,6 +445,27 @@ static void bm_face_split_by_edges_island_connect(
 	BM_face_split_edgenet(
 	        bm, f, edge_arr, edge_arr_len,
 	        NULL, NULL);
+
+	for (int i = e_link_len; i < edge_arr_len; i++) {
+		BM_edge_select_set(bm, edge_arr[i], true);
+	}
+
+	if (e_link_len != edge_arr_len) {
+		/* connecting partial islands can add redundant edges
+		 * sort before removal to give deterministic outcome */
+		qsort(edge_arr, edge_arr_len - e_link_len, sizeof(*edge_arr), bm_edge_sort_length_cb);
+		for (int i = e_link_len; i < edge_arr_len; i++) {
+			BMFace *f_pair[2];
+			if (BM_edge_face_pair(edge_arr[i], &f_pair[0], &f_pair[1])) {
+				if (BM_face_share_vert_count(f_pair[0], f_pair[1]) == 2) {
+					BMFace *f_new = BM_faces_join(bm, f_pair, 2, true);
+					if (f_new) {
+						BM_face_select_set(bm, f_new, true);
+					}
+				}
+			}
+		}
+	}
 }
 
 /**




More information about the Bf-blender-cvs mailing list