From bb4bff35763163e9110444051b0d15731b4f3e39 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 11 Dec 2015 11:45:27 +1100 Subject: BMesh: Add BM_face_kill_loose Removes edges/verts that become unused. --- source/blender/bmesh/intern/bmesh_core.c | 60 ++++++++++++++++++++++++++++++++ source/blender/bmesh/intern/bmesh_core.h | 2 ++ 2 files changed, 62 insertions(+) (limited to 'source/blender/bmesh/intern') diff --git a/source/blender/bmesh/intern/bmesh_core.c b/source/blender/bmesh/intern/bmesh_core.c index 55a04767f51..7130d451ed7 100644 --- a/source/blender/bmesh/intern/bmesh_core.c +++ b/source/blender/bmesh/intern/bmesh_core.c @@ -823,6 +823,66 @@ void BM_face_kill(BMesh *bm, BMFace *f) bm_kill_only_face(bm, f); } + +/** + * A version of #BM_face_kill which removes edges and verts + * which have no remaining connected geometry. + */ +void BM_face_kill_loose(BMesh *bm, BMFace *f) +{ +#ifdef USE_BMESH_HOLES + BMLoopList *ls, *ls_next; +#endif + + BM_CHECK_ELEMENT(f); + +#ifdef USE_BMESH_HOLES + for (ls = f->loops.first; ls; ls = ls_next) +#else + if (f->l_first) +#endif + { + BMLoop *l_iter, *l_next, *l_first; + +#ifdef USE_BMESH_HOLES + ls_next = ls->next; + l_iter = l_first = ls->first; +#else + l_iter = l_first = f->l_first; +#endif + + do { + BMEdge *e; + l_next = l_iter->next; + + e = l_iter->e; + bmesh_radial_loop_remove(l_iter, e); + bm_kill_only_loop(bm, l_iter); + + if (e->l == NULL) { + BMVert *v1 = e->v1, *v2 = e->v2; + + bmesh_disk_edge_remove(e, e->v1); + bmesh_disk_edge_remove(e, e->v2); + bm_kill_only_edge(bm, e); + + if (v1->e == NULL) { + bm_kill_only_vert(bm, v1); + } + if (v2->e == NULL) { + bm_kill_only_vert(bm, v2); + } + } + } while ((l_iter = l_next) != l_first); + +#ifdef USE_BMESH_HOLES + BLI_mempool_free(bm->looplistpool, ls); +#endif + } + + bm_kill_only_face(bm, f); +} + /** * kills \a e and all faces that use it. */ diff --git a/source/blender/bmesh/intern/bmesh_core.h b/source/blender/bmesh/intern/bmesh_core.h index a18d96824b7..08f916faf4f 100644 --- a/source/blender/bmesh/intern/bmesh_core.h +++ b/source/blender/bmesh/intern/bmesh_core.h @@ -58,6 +58,8 @@ BMFace *BM_face_create_verts( void BM_face_edges_kill(BMesh *bm, BMFace *f); void BM_face_verts_kill(BMesh *bm, BMFace *f); +void BM_face_kill_loose(BMesh *bm, BMFace *f); + void BM_face_kill(BMesh *bm, BMFace *f); void BM_edge_kill(BMesh *bm, BMEdge *e); void BM_vert_kill(BMesh *bm, BMVert *v); -- cgit v1.2.3