From 99811c283efaa8f5bc13b81bb5cc42761c42a8a0 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 30 Apr 2015 06:23:01 +1000 Subject: BMesh: use BM_face_loop_separate_multi for rip Resolves bug over-splitting non-manifold connected edges. --- source/blender/editors/mesh/editmesh_rip.c | 74 +++++++++++++++--------------- 1 file changed, 37 insertions(+), 37 deletions(-) (limited to 'source/blender') diff --git a/source/blender/editors/mesh/editmesh_rip.c b/source/blender/editors/mesh/editmesh_rip.c index 45e16ceff7b..f5d22eac641 100644 --- a/source/blender/editors/mesh/editmesh_rip.c +++ b/source/blender/editors/mesh/editmesh_rip.c @@ -734,20 +734,42 @@ static int edbm_rip_invoke__vert(bContext *C, wmOperator *op, const wmEvent *eve /* unlike edge split, for single vertex split we only use the operator in one of the cases * but both allocate fill */ - /* rip two adjacent edges */ - if (BM_edge_is_boundary(e2) || BM_vert_face_count_is_equal(v, 2)) { - /* Don't run the edge split operator in this case */ + { BMVert *v_rip; + BMLoop *larr[2]; + int larr_len = 0; + + /* rip two adjacent edges */ + if (BM_edge_is_boundary(e2) || BM_vert_face_count_is_equal(v, 2)) { + /* Don't run the edge split operator in this case */ - l = BM_edge_vert_share_loop(e2->l, v); + l = BM_edge_vert_share_loop(e2->l, v); + larr[larr_len] = l; + larr_len++; - /* only tag for face-fill (we don't call the operator) */ - if (BM_edge_is_boundary(e2)) { - BM_elem_flag_enable(e2, BM_ELEM_TAG); + /* only tag for face-fill (we don't call the operator) */ + if (BM_edge_is_boundary(e2)) { + BM_elem_flag_enable(e2, BM_ELEM_TAG); + } + else { + BM_elem_flag_enable(l->e, BM_ELEM_TAG); + BM_elem_flag_enable(l->prev->e, BM_ELEM_TAG); + } } else { - BM_elem_flag_enable(l->e, BM_ELEM_TAG); - BM_elem_flag_enable(l->prev->e, BM_ELEM_TAG); + if (BM_edge_is_manifold(e2)) { + BMLoop *l_iter, *l_first; + + l_iter = l_first = e2->l; + do { + larr[larr_len] = BM_edge_vert_share_loop(l_iter, v); + BM_elem_flag_enable(larr[larr_len]->e, BM_ELEM_TAG); + larr_len++; + } while ((l_iter = l_iter->radial_next) != l_first); + } + else { + /* looks like there are no split edges, we could just return/report-error? - Campbell */ + } } /* keep directly before edgesplit */ @@ -755,13 +777,12 @@ static int edbm_rip_invoke__vert(bContext *C, wmOperator *op, const wmEvent *eve fill_uloop_pairs = edbm_tagged_loop_pairs_to_fill(bm); } -#if 0 - v_rip = BM_face_vert_separate(bm, l->f, v); -#else - v_rip = BM_face_loop_separate(bm, l); -#endif - - BLI_assert(v_rip); + if (larr_len) { + v_rip = BM_face_loop_separate_multi(bm, larr, larr_len); + } + else { + v_rip = NULL; + } if (v_rip) { BM_vert_select_set(bm, v_rip, true); @@ -771,27 +792,6 @@ static int edbm_rip_invoke__vert(bContext *C, wmOperator *op, const wmEvent *eve return OPERATOR_CANCELLED; } } - else { - if (BM_edge_is_manifold(e2)) { - l = e2->l; - e = BM_loop_other_edge_loop(l, v)->e; - BM_elem_flag_enable(e, BM_ELEM_TAG); - - l = e2->l->radial_next; - e = BM_loop_other_edge_loop(l, v)->e; - BM_elem_flag_enable(e, BM_ELEM_TAG); - } - else { - /* looks like there are no split edges, we could just return/report-error? - Campbell */ - } - - /* keep directly before edgesplit */ - if (do_fill) { - fill_uloop_pairs = edbm_tagged_loop_pairs_to_fill(bm); - } - - BM_mesh_edgesplit(em->bm, true, true, true); - } { /* --- select which vert --- */ -- cgit v1.2.3