diff options
author | Campbell Barton <ideasman42@gmail.com> | 2014-06-27 16:05:57 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2014-06-27 16:06:49 +0400 |
commit | beedb0b27471f34b321bc44a9a6b07bbb07b3e49 (patch) | |
tree | 6bd52dab3ad4e0a0f7460e26be4f929844f322eb /source/blender/bmesh/operators/bmo_dissolve.c | |
parent | c73505fb439d2c07380b66e2362231c42e513225 (diff) |
BMesh: more edits to vertex dissolve, handle mixing wire edges with faces better
Diffstat (limited to 'source/blender/bmesh/operators/bmo_dissolve.c')
-rw-r--r-- | source/blender/bmesh/operators/bmo_dissolve.c | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/source/blender/bmesh/operators/bmo_dissolve.c b/source/blender/bmesh/operators/bmo_dissolve.c index f7b8352ed78..209ca30ddc3 100644 --- a/source/blender/bmesh/operators/bmo_dissolve.c +++ b/source/blender/bmesh/operators/bmo_dissolve.c @@ -357,6 +357,7 @@ void bmo_dissolve_verts_exec(BMesh *bm, BMOperator *op) BMO_ITER (v, &oiter, op->slots_in, "verts", BM_VERT) { BMIter itersub; BMLoop *l_first; + BMEdge *e_first = NULL; BM_ITER_ELEM (l_first, &itersub, v, BM_LOOPS_OF_VERT) { BMLoop *l_iter; l_iter = l_first; @@ -364,26 +365,26 @@ void bmo_dissolve_verts_exec(BMesh *bm, BMOperator *op) BMO_elem_flag_enable(bm, l_iter->v, VERT_ISGC); BMO_elem_flag_enable(bm, l_iter->e, EDGE_ISGC); } while ((l_iter = l_iter->next) != l_first); + + e_first = l_first->e; } - /* clean wire edges and mark vert-edge-pairs (unrelated to checks above) */ - if ((e = v->e)) { - int edge_count = 0; + /* important e_first won't be deleted */ + if (e_first) { + e = e_first; do { e_next = BM_DISK_EDGE_NEXT(e, v); if (BM_edge_is_wire(e)) { BM_edge_kill(bm, e); } - else { - BMO_elem_flag_enable(bm, e, EDGE_ISGC); - edge_count += 1; - } - } while (v->e && (e = e_next) != v->e); + } while ((e = e_next) != e_first); + } + } - /* tag here so we avoid feedback loop (checking topology as we edit) */ - if (edge_count == 2) { - BMO_elem_flag_enable(bm, v, VERT_MARK_PAIR); - } + BMO_ITER (v, &oiter, op->slots_in, "verts", BM_VERT) { + /* tag here so we avoid feedback loop (checking topology as we edit) */ + if (BM_vert_is_edge_pair(v)) { + BMO_elem_flag_enable(bm, v, VERT_MARK_PAIR); } } |