[Bf-blender-cvs] [d4726c9] master: BMesh: optimize BM_vert_splice to avoid getting a loop array first

Campbell Barton noreply at git.blender.org
Wed Jul 16 08:42:54 CEST 2014


Commit: d4726c9a4099d13098a1c32145ec4e357a71b751
Author: Campbell Barton
Date:   Wed Jul 16 16:38:41 2014 +1000
https://developer.blender.org/rBd4726c9a4099d13098a1c32145ec4e357a71b751

BMesh: optimize BM_vert_splice to avoid getting a loop array first

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

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

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

diff --git a/source/blender/bmesh/intern/bmesh_core.c b/source/blender/bmesh/intern/bmesh_core.c
index 3072e1a..47de0441 100644
--- a/source/blender/bmesh/intern/bmesh_core.c
+++ b/source/blender/bmesh/intern/bmesh_core.c
@@ -1953,10 +1953,6 @@ BMFace *bmesh_jfke(BMesh *bm, BMFace *f1, BMFace *f2, BMEdge *e)
  */
 bool BM_vert_splice(BMesh *bm, BMVert *v, BMVert *v_target)
 {
-	void *loops_stack[BM_DEFAULT_ITER_STACK_SIZE];
-	BMLoop **loops;
-	int i, loops_tot;
-
 	BMEdge *e;
 
 	/* verts already spliced */
@@ -1964,21 +1960,23 @@ bool BM_vert_splice(BMesh *bm, BMVert *v, BMVert *v_target)
 		return false;
 	}
 
-	/* we can't modify the vert while iterating so first allocate an array of loops */
-	loops = BM_iter_as_arrayN(bm, BM_LOOPS_OF_VERT, v, &loops_tot,
-	                          loops_stack, BM_DEFAULT_ITER_STACK_SIZE);
+	/* move all the edges from v's disk to vtarget's disk */
+	while ((e = v->e)) {
 
-	if (LIKELY(loops != NULL)) {
-		for (i = 0; i < loops_tot; i++) {
-			loops[i]->v = v_target;
-		}
-		if (loops != (BMLoop **)loops_stack) {
-			MEM_freeN(loops);
+		/* loop  */
+		BMLoop *l_first;
+		if ((l_first = e->l)) {
+			BMLoop *l_iter = l_first;
+			do {
+				if (l_iter->v == v) {
+					l_iter->v = v_target;
+				}
+				/* else if (l_iter->prev->v == v) {...}
+				 * (this case will be handled by a different edge) */
+			} while ((l_iter = l_iter->radial_next) != l_first);
 		}
-	}
 
-	/* move all the edges from v's disk to vtarget's disk */
-	while ((e = v->e)) {
+		/* disk */
 		bmesh_disk_edge_remove(e, v);
 		bmesh_edge_swapverts(e, v, v_target);
 		bmesh_disk_edge_append(e, v_target);




More information about the Bf-blender-cvs mailing list