[Bf-blender-cvs] [dd48ddd] master: BMesh: utility to split isolated loop regions

Campbell Barton noreply at git.blender.org
Sat May 2 22:19:02 CEST 2015


Commit: dd48ddd605708a64adb5d78307451ffca0cc1ad3
Author: Campbell Barton
Date:   Sun May 3 06:15:24 2015 +1000
Branches: master
https://developer.blender.org/rBdd48ddd605708a64adb5d78307451ffca0cc1ad3

BMesh: utility to split isolated loop regions

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

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 06bd622..2a69edd 100644
--- a/source/blender/bmesh/intern/bmesh_core.c
+++ b/source/blender/bmesh/intern/bmesh_core.c
@@ -2604,6 +2604,46 @@ BMVert *bmesh_urmv_loop_multi(
 	return v_new;
 }
 
+static void bmesh_edge_vert_swap__recursive(BMEdge *e, BMVert *v_dst, BMVert *v_src)
+{
+	BMLoop *l_iter, *l_first;
+
+	BLI_assert(ELEM(v_src, e->v1, e->v2));
+	bmesh_disk_vert_replace(e, v_dst, v_src);
+
+	l_iter = l_first = e->l;
+	do {
+		if (l_iter->v == v_src) {
+			l_iter->v = v_dst;
+			if (BM_vert_in_edge(l_iter->prev->e, v_src)) {
+				bmesh_edge_vert_swap__recursive(l_iter->prev->e, v_dst, v_src);
+			}
+		}
+		else if (l_iter->next->v == v_src) {
+			l_iter->next->v = v_dst;
+			if (BM_vert_in_edge(l_iter->next->e, v_src)) {
+				bmesh_edge_vert_swap__recursive(l_iter->next->e, v_dst, v_src);
+			}
+		}
+		else {
+			BLI_assert(l_iter->prev->v != v_src);
+		}
+	} while ((l_iter = l_iter->radial_next) != l_first);
+}
+
+/**
+ * This function assumes l_sep is apart of a larger fan which has already been
+ * isolated by calling bmesh_edge_separate to segragate it radially.
+ */
+BMVert *bmesh_urmv_loop_region(BMesh *bm, BMLoop *l_sep)
+{
+	BMVert *v_new = BM_vert_create(bm, l_sep->v->co, l_sep->v, BM_CREATE_NOP);
+	/* passing either 'l_sep->e', 'l_sep->prev->e' will work */
+	bmesh_edge_vert_swap__recursive(l_sep->e, v_new, l_sep->v);
+	BLI_assert(l_sep->v == v_new);
+	return v_new;
+}
+
 
 /**
  * \brief Unglue Region Make Vert (URMV)
diff --git a/source/blender/bmesh/intern/bmesh_core.h b/source/blender/bmesh/intern/bmesh_core.h
index 54656fc..2b100eb 100644
--- a/source/blender/bmesh/intern/bmesh_core.h
+++ b/source/blender/bmesh/intern/bmesh_core.h
@@ -104,6 +104,7 @@ BMVert *bmesh_urmv(BMesh *bm, BMFace *f_sep, BMVert *v_sep);
 BMVert *bmesh_urmv_loop(BMesh *bm, BMLoop *l_sep);
 BMVert *bmesh_urmv_loop_multi(
         BMesh *bm, BMLoop **larr, int larr_len);
+BMVert *bmesh_urmv_loop_region(BMesh *bm, BMLoop *l_sep);
 
 void    bmesh_face_swap_data(BMFace *f_a, BMFace *f_b);




More information about the Bf-blender-cvs mailing list