diff options
author | Campbell Barton <ideasman42@gmail.com> | 2015-12-17 10:10:04 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2015-12-17 10:10:04 +0300 |
commit | 4123b30323bd2e9af9220c2066528e6d22e447e4 (patch) | |
tree | 798fcb03295886dec9cecb1834ac2c4db7a0a57f /source/blender/editors/mesh/editmesh_intersect.c | |
parent | b6a49eb9498e5025bd7920f620bae1a44f34104e (diff) |
BMesh: split-by-edges minor fixes
- select all newly created edges
- remove redundant edges (not essential but nicer output).
Diffstat (limited to 'source/blender/editors/mesh/editmesh_intersect.c')
-rw-r--r-- | source/blender/editors/mesh/editmesh_intersect.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/source/blender/editors/mesh/editmesh_intersect.c b/source/blender/editors/mesh/editmesh_intersect.c index 86d1b9b8644..634c4e51566 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); + } + } + } + } + } } /** |