* rename BM_face_other_loop --> BM_face_other_edge_loop
* 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.
This commit is contained in:
@@ -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 \a 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.
|
||||
*
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user