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);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to