* rename BM_face_other_loop --> BM_face_other_edge_loop
authorCampbell Barton <ideasman42@gmail.com>
Sun, 4 Mar 2012 16:36:31 +0000 (16:36 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Sun, 4 Mar 2012 16:36:31 +0000 (16:36 +0000)
* optimize BM_face_other_edge_loop to do about half as many iterations for quad heavy meshes, with ngons the gain is much more since searching around the entire ngon when the edge already stores its loop is silly.
 ... also nicer in cases where edge has no face users it avoids a loop on all face corners.

source/blender/bmesh/intern/bmesh_queries.c
source/blender/bmesh/intern/bmesh_queries.h
source/blender/bmesh/intern/bmesh_walkers_impl.c
source/blender/bmesh/operators/bmo_edgesplit.c
source/blender/editors/mesh/bmesh_tools.c
source/blender/editors/mesh/loopcut.c
source/blender/editors/transform/transform.c
source/blender/editors/util/crazyspace.c

index e78d577..986a60a 100644 (file)
@@ -67,18 +67,20 @@ int BM_vert_in_edge(BMEdge *e, BMVert *v)
  *
  * Finds the other loop that shares \a v with \a e loop in \a f.
  */
-BMLoop *BM_face_other_loop(BMFace *f, BMEdge *e, BMVert *v)
+BMLoop *BM_face_other_edge_loop(BMFace *f, BMEdge *e, BMVert *v)
 {
        BMLoop *l_iter;
        BMLoop *l_first;
 
-       l_iter = l_first = BM_FACE_FIRST_LOOP(f);
-       
+       /* we could loop around the face too, but turns out this uses a lot
+        * more iterations (approx double with quads, many more with 5+ ngons) */
+       l_iter = l_first = e->l;
+
        do {
-               if (l_iter->e == e) {
+               if (l_iter->e == e && l_iter->f == f) {
                        break;
                }
-       } while ((l_iter = l_iter->next) != l_first);
+       } while ((l_iter = l_iter->radial_next) != l_first);
        
        return l_iter->v == v ? l_iter->prev : l_iter->next;
 }
@@ -88,7 +90,7 @@ BMLoop *BM_face_other_loop(BMFace *f, BMEdge *e, BMVert *v)
  *
  * Finds the other loop in a face.
  *
- * This function returns a loop in \a f that shares an edge with \v
+ * This function returns a loop in \a f that shares an edge with \v
  * The direction is defined by \a v_prev, where the return value is
  * the loop of what would be 'v_next'
  *
@@ -99,7 +101,7 @@ BMLoop *BM_face_other_loop(BMFace *f, BMEdge *e, BMVert *v)
  *     |          |
  *     +----------+
  *     v_prev --> v
- *     ^^^^^^     ^ <-- These vert argumrnts define direction
+ *     ^^^^^^     ^ <-- These vert args define direction
  *                      in the face to check.
  *                      The faces loop direction is ignored.
  *
index bf340e5..6cad93d 100644 (file)
@@ -39,7 +39,7 @@ int     BM_verts_in_edge(BMVert *v1, BMVert *v2, BMEdge *e);
 
 int     BM_edge_face_pair(BMEdge *e, BMFace **r_fa, BMFace **r_fb);
 BMVert *BM_edge_other_vert(BMEdge *e, BMVert *v);
-BMLoop *BM_face_other_loop(BMFace *f, BMEdge *e, BMVert *v);
+BMLoop *BM_face_other_edge_loop(BMFace *f, BMEdge *e, BMVert *v);
 BMLoop *BM_face_other_vert_loop(BMFace *f, BMVert *v_prev, BMVert *v);
 
 int     BM_vert_edge_count(BMVert *v);
index 4f2682a..5c9a6c0 100644 (file)
@@ -273,7 +273,7 @@ static void *bmw_IslandboundWalker_step(BMWalker *walker)
        f = l->f;
        
        while (1) {
-               l = BM_face_other_loop(f, e, v);
+               l = BM_face_other_edge_loop(f, e, v);
                if (l != l->radial_next) {
                        l = l->radial_next;
                        f = l->f;
@@ -474,7 +474,7 @@ static void *bmw_LoopWalker_step(BMWalker *walker)
                while (1) {
                        if (rlen != 1 && i == stopi) break;
 
-                       l = BM_face_other_loop(l->f, l->e, v);
+                       l = BM_face_other_edge_loop(l->f, l->e, v);
 
                        if (!l)
                                break;
index 2b642a8..05a48f6 100644 (file)
@@ -180,7 +180,7 @@ static void tag_out_edges(BMesh *bm, EdgeTag *etags, BMOperator *UNUSED(op))
 
                                startl = l;
                                do {
-                                       l = BM_face_other_loop(l->f, l->e, v);
+                                       l = BM_face_other_edge_loop(l->f, l->e, v);
                                        if (l == startl || BM_edge_face_count(l->e) != 2) {
                                                break;
                                        }
@@ -317,7 +317,7 @@ void bmo_edgesplit_exec(BMesh *bm, BMOperator *op)
                                                }
 
                                                l3 = l3->radial_next;
-                                               l3 = BM_face_other_loop(l3->f, l3->e, v);
+                                               l3 = BM_face_other_edge_loop(l3->f, l3->e, v);
                                        } while (l3 != l2 && !BMO_elem_flag_test(bm, l3->e, EDGE_SEAM));
 
                                        if (l3 == NULL || (BMO_elem_flag_test(bm, l3->e, EDGE_SEAM) && l3->e != l->e)) {
@@ -333,7 +333,7 @@ void bmo_edgesplit_exec(BMesh *bm, BMOperator *op)
                                                                }
 
                                                                l3 = l3->radial_next;
-                                                               l3 = BM_face_other_loop(l3->f, l3->e, v);
+                                                               l3 = BM_face_other_edge_loop(l3->f, l3->e, v);
                                                                
                                                                et = &etags[BM_elem_index_get(l3->e)];
                                                        } while (l3 != l2 && !BMO_elem_flag_test(bm, l3->e, EDGE_SEAM));
index 037a641..b1833bc 100644 (file)
@@ -2398,12 +2398,12 @@ static int mesh_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
                }
                else if (BM_edge_face_count(e2) == 2) {
                        l = e2->l;
-                       e = BM_face_other_loop(l->f, e2, v)->e;
+                       e = BM_face_other_edge_loop(l->f, e2, v)->e;
                        BM_elem_flag_enable(e, BM_ELEM_TAG);
                        BM_elem_select_set(bm, e, TRUE);
                        
                        l = e2->l->radial_next;
-                       e = BM_face_other_loop(l->f, e2, v)->e;
+                       e = BM_face_other_edge_loop(l->f, e2, v)->e;
                        BM_elem_flag_enable(e, BM_ELEM_TAG);
                        BM_elem_select_set(bm, e, TRUE);
                }
@@ -2423,9 +2423,9 @@ static int mesh_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
                        }
                        
                        if (i == 1 && e2->l) {
-                               l = BM_face_other_loop(e2->l->f, e2, v);
+                               l = BM_face_other_edge_loop(e2->l->f, e2, v);
                                l = l->radial_next;
-                               l = BM_face_other_loop(l->f, l->e, v);
+                               l = BM_face_other_edge_loop(l->f, l->e, v);
 
                                if (l) {
                                        BM_elem_select_set(bm, l->e, TRUE);
index bbc4957..59151cf 100644 (file)
@@ -161,7 +161,7 @@ static void edgering_find_order(BMEditMesh *em, BMEdge *lasteed, BMEdge *eed,
                return;
        }
        
-       l2 = BM_face_other_loop(l->f, l->e, eed->v1);
+       l2 = BM_face_other_edge_loop(l->f, l->e, eed->v1);
        rev = (l2 == l->prev);
        while (l2->v != lasteed->v1 && l2->v != lasteed->v2) {
                l2 = rev ? l2->prev : l2->next;
index 8d2d4c4..dc01261 100644 (file)
@@ -4310,7 +4310,7 @@ static BMLoop *get_next_loop(BMesh *UNUSED(bm), BMVert *v, BMLoop *l,
 
        firstl = l;
        do {
-               l = BM_face_other_loop(l->f, l->e, v);
+               l = BM_face_other_edge_loop(l->f, l->e, v);
                if (l->radial_next == l)
                        return NULL;
                
@@ -4339,12 +4339,12 @@ static BMLoop *get_next_loop(BMesh *UNUSED(bm), BMVert *v, BMLoop *l,
                        i += 1;
                }
 
-               if (BM_face_other_loop(l->f, l->e, v)->e == nexte) {
+               if (BM_face_other_edge_loop(l->f, l->e, v)->e == nexte) {
                        if (i)
                                mul_v3_fl(a, 1.0f / (float)i);
                        
                        copy_v3_v3(vec, a);
-                       return BM_face_other_loop(l->f, l->e, v);
+                       return BM_face_other_edge_loop(l->f, l->e, v);
                }
                
                l = l->radial_next;
@@ -4477,11 +4477,11 @@ static int createSlideVerts(TransInfo *t)
                l1 = e->l;
                l2 = e->l->radial_next;
 
-               l = BM_face_other_loop(l1->f, l1->e, v);
+               l = BM_face_other_edge_loop(l1->f, l1->e, v);
                sub_v3_v3v3(vec, BM_edge_other_vert(l->e, v)->co, v->co);
 
                if (l2 != l1) {
-                       l = BM_face_other_loop(l2->f, l2->e, v);
+                       l = BM_face_other_edge_loop(l2->f, l2->e, v);
                        sub_v3_v3v3(vec2, BM_edge_other_vert(l->e, v)->co, v->co);
                } else {
                        l2 = NULL;
@@ -4498,11 +4498,11 @@ static int createSlideVerts(TransInfo *t)
                        if (l2)
                                copy_v3_v3(sv->downvec, vec2);
 
-                       l = BM_face_other_loop(l1->f, l1->e, v);
+                       l = BM_face_other_edge_loop(l1->f, l1->e, v);
                        sv->up = BM_edge_other_vert(l->e, v);
 
                        if (l2) {
-                               l = BM_face_other_loop(l2->f, l2->e, v);
+                               l = BM_face_other_edge_loop(l2->f, l2->e, v);
                                sv->down = BM_edge_other_vert(l->e, v);
                        }
 
@@ -4517,12 +4517,12 @@ static int createSlideVerts(TransInfo *t)
                                sv->v = v;
                                sv->origvert = *v;
                                
-                               l = BM_face_other_loop(l1->f, l1->e, v);
+                               l = BM_face_other_edge_loop(l1->f, l1->e, v);
                                sv->up = BM_edge_other_vert(l->e, v);
                                sub_v3_v3v3(sv->upvec, BM_edge_other_vert(l->e, v)->co, v->co);
 
                                if (l2) {
-                                       l = BM_face_other_loop(l2->f, l2->e, v);
+                                       l = BM_face_other_edge_loop(l2->f, l2->e, v);
                                        sv->down = BM_edge_other_vert(l->e, v);
                                        sub_v3_v3v3(sv->downvec, BM_edge_other_vert(l->e, v)->co, v->co);
                                }
index 8f9d32f..0630929 100644 (file)
@@ -153,7 +153,7 @@ void crazyspace_set_quats_editmesh(BMEditMesh *em, float *origcos, float *mapped
                        continue;
                
                BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_VERT, v) {
-                       BMLoop *l2 = BM_face_other_loop(l->f, l->e, v);
+                       BMLoop *l2 = BM_face_other_edge_loop(l->f, l->e, v);
                        
                        /* retrieve mapped coordinates */
                        v1= mappedcos + 3*BM_elem_index_get(l->v);