[Bf-blender-cvs] [bb4bff3] master: BMesh: Add BM_face_kill_loose

Campbell Barton noreply at git.blender.org
Fri Dec 11 02:08:14 CET 2015


Commit: bb4bff35763163e9110444051b0d15731b4f3e39
Author: Campbell Barton
Date:   Fri Dec 11 11:45:27 2015 +1100
Branches: master
https://developer.blender.org/rBbb4bff35763163e9110444051b0d15731b4f3e39

BMesh: Add BM_face_kill_loose

Removes edges/verts that become unused.

===================================================================

M	source/blender/bmesh/intern/bmesh_core.c
M	source/blender/bmesh/intern/bmesh_core.h

===================================================================

diff --git a/source/blender/bmesh/intern/bmesh_core.c b/source/blender/bmesh/intern/bmesh_core.c
index 55a0476..7130d45 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 a18d968..08f916f 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);




More information about the Bf-blender-cvs mailing list