diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-08-14 13:14:33 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-08-14 13:14:33 +0400 |
commit | 7d67261a7b04dbccc39684a0be61e05a6bf101af (patch) | |
tree | eaf2cde47a06179e1aadb662185a2ec2b319f0a0 /source/blender/bmesh/tools/bmesh_edgesplit.c | |
parent | 731672fc9bbafe7dfcd0e46921276fa8f0643a5f (diff) |
fix bug with editmesh rip, active edge could be left on the unselected side of the edge loops.
Diffstat (limited to 'source/blender/bmesh/tools/bmesh_edgesplit.c')
-rw-r--r-- | source/blender/bmesh/tools/bmesh_edgesplit.c | 69 |
1 files changed, 59 insertions, 10 deletions
diff --git a/source/blender/bmesh/tools/bmesh_edgesplit.c b/source/blender/bmesh/tools/bmesh_edgesplit.c index adcf325b51c..aad600d13fa 100644 --- a/source/blender/bmesh/tools/bmesh_edgesplit.c +++ b/source/blender/bmesh/tools/bmesh_edgesplit.c @@ -103,6 +103,21 @@ void BM_mesh_edgesplit(BMesh *bm, const bool use_verts, const bool tag_only, con BMIter iter; BMEdge *e; + bool use_ese = false; + GHash *ese_gh = NULL; + + if (copy_select && bm->selected.first) { + BMEditSelection *ese; + + ese_gh = BLI_ghash_ptr_new(__func__); + for (ese = bm->selected.first; ese; ese = ese->next) { + if (ese->htype != BM_FACE) { + BLI_ghash_insert(ese_gh, ese->ele, ese); + } + } + + use_ese = true; + } if (tag_only == false) { BM_mesh_elem_hflag_enable_all(bm, BM_EDGE | (use_verts ? BM_VERT : 0), BM_ELEM_TAG, false); @@ -135,9 +150,18 @@ void BM_mesh_edgesplit(BMesh *bm, const bool use_verts, const bool tag_only, con BM_elem_flag_enable(e, BM_ELEM_INTERNAL_TAG); /* keep splitting until each loop has its own edge */ - do { - bmesh_edge_separate(bm, e, e->l, copy_select); - } while (!BM_edge_is_boundary(e)); + while (!BM_edge_is_boundary(e)) { + BMLoop *l_sep = e->l; + bmesh_edge_separate(bm, e, l_sep, copy_select); + BLI_assert(l_sep->e != e); + + if (use_ese) { + BMEditSelection *ese = BLI_ghash_lookup(ese_gh, e); + if (UNLIKELY(ese)) { + BM_select_history_store_after_notest(bm, ese, l_sep->e); + } + } + } BM_elem_flag_enable(e->v1, BM_ELEM_TAG); BM_elem_flag_enable(e->v2, BM_ELEM_TAG); @@ -157,14 +181,39 @@ void BM_mesh_edgesplit(BMesh *bm, const bool use_verts, const bool tag_only, con BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) { if (BM_elem_flag_test(e, BM_ELEM_TAG)) { - if (BM_elem_flag_test(e->v1, BM_ELEM_TAG)) { - BM_elem_flag_disable(e->v1, BM_ELEM_TAG); - bmesh_vert_separate(bm, e->v1, NULL, NULL, copy_select); - } - if (BM_elem_flag_test(e->v2, BM_ELEM_TAG)) { - BM_elem_flag_disable(e->v2, BM_ELEM_TAG); - bmesh_vert_separate(bm, e->v2, NULL, NULL, copy_select); + unsigned int i; + for (i = 0; i < 2; i++) { + BMVert *v = ((&e->v1)[i]); + if (BM_elem_flag_test(v, BM_ELEM_TAG)) { + BM_elem_flag_disable(v, BM_ELEM_TAG); + + if (use_ese) { + BMVert **vtar; + int vtar_len; + + bmesh_vert_separate(bm, v, &vtar, &vtar_len, copy_select); + + if (vtar_len) { + BMEditSelection *ese = BLI_ghash_lookup(ese_gh, v); + if (UNLIKELY(ese)) { + int j; + for (j = 0; j < vtar_len; j++) { + BLI_assert(v != vtar[j]); + BM_select_history_store_after_notest(bm, ese, vtar[j]); + } + } + } + MEM_freeN(vtar); + } + else { + bmesh_vert_separate(bm, v, NULL, NULL, copy_select); + } + } } } } + + if (use_ese) { + BLI_ghash_free(ese_gh, NULL, NULL); + } } |