diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-04-18 08:32:55 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-04-18 08:32:55 +0400 |
commit | a1337caac02fa0ecda0cd6ee7652c489d9c1c2d8 (patch) | |
tree | c7a3616824ebcd12c287fa0a619b4a757db7b1c7 /source/blender/bmesh | |
parent | fdea14acb4b79b59da44ec45149d94129e1e8a8c (diff) |
bmesh api: minor simplify & cleanup
- add BM_face_edge_share_loop(f, e) -- edge version of existing BM_face_vert_share_loop(f, v)
- simplify BM_edge_ordered_verts_ex(), check could be reduced.
- use BM_ELEM_INTERNAL_TAG for bmesh_jfke(), not BM_ELEM_TAG to avoid clobbering tagged data tools might use.
Diffstat (limited to 'source/blender/bmesh')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_core.c | 26 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_queries.c | 43 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_queries.h | 1 |
3 files changed, 38 insertions, 32 deletions
diff --git a/source/blender/bmesh/intern/bmesh_core.c b/source/blender/bmesh/intern/bmesh_core.c index 6b80faf1c0d..765c1c3e774 100644 --- a/source/blender/bmesh/intern/bmesh_core.c +++ b/source/blender/bmesh/intern/bmesh_core.c @@ -1618,7 +1618,6 @@ BMFace *bmesh_jfke(BMesh *bm, BMFace *f1, BMFace *f2, BMEdge *e) { BMLoop *l_iter, *f1loop = NULL, *f2loop = NULL; int newlen = 0, i, f1len = 0, f2len = 0, radlen = 0, edok, shared; - BMIter iter; /* can't join a face to itsel */ if (f1 == f2) { @@ -1628,19 +1627,10 @@ BMFace *bmesh_jfke(BMesh *bm, BMFace *f1, BMFace *f2, BMEdge *e) /* verify that e is in both f1 and f2 */ f1len = f1->len; f2len = f2->len; - BM_ITER(l_iter, &iter, bm, BM_LOOPS_OF_FACE, f1) { - if (l_iter->e == e) { - f1loop = l_iter; - break; - } - } - BM_ITER(l_iter, &iter, bm, BM_LOOPS_OF_FACE, f2) { - if (l_iter->e == e) { - f2loop = l_iter; - break; - } - } - if (!(f1loop && f2loop)) { + + if (!((f1loop = BM_face_edge_share_loop(f1, e)) && + (f2loop = BM_face_edge_share_loop(f2, e)))) + { return NULL; } @@ -1673,21 +1663,21 @@ BMFace *bmesh_jfke(BMesh *bm, BMFace *f1, BMFace *f2, BMEdge *e) /* validate no internal join */ for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f1); i < f1len; i++, l_iter = l_iter->next) { - BM_elem_flag_disable(l_iter->v, BM_ELEM_TAG); + BM_elem_flag_disable(l_iter->v, BM_ELEM_INTERNAL_TAG); } for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f2); i < f2len; i++, l_iter = l_iter->next) { - BM_elem_flag_disable(l_iter->v, BM_ELEM_TAG); + BM_elem_flag_disable(l_iter->v, BM_ELEM_INTERNAL_TAG); } for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f1); i < f1len; i++, l_iter = l_iter->next) { if (l_iter != f1loop) { - BM_elem_flag_enable(l_iter->v, BM_ELEM_TAG); + BM_elem_flag_enable(l_iter->v, BM_ELEM_INTERNAL_TAG); } } for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f2); i < f2len; i++, l_iter = l_iter->next) { if (l_iter != f2loop) { /* as soon as a duplicate is found, bail out */ - if (BM_elem_flag_test(l_iter->v, BM_ELEM_TAG)) { + if (BM_elem_flag_test(l_iter->v, BM_ELEM_INTERNAL_TAG)) { return NULL; } } diff --git a/source/blender/bmesh/intern/bmesh_queries.c b/source/blender/bmesh/intern/bmesh_queries.c index 45edfd9628a..f85105651d4 100644 --- a/source/blender/bmesh/intern/bmesh_queries.c +++ b/source/blender/bmesh/intern/bmesh_queries.c @@ -652,7 +652,7 @@ BMVert *BM_edge_share_vert(BMEdge *e1, BMEdge *e2) } /** - * \brief Radial Find a Vertex Loop in Face + * \brief Return the Loop Shared by Face and Vertex * * Finds the loop used which uses \a v in face loop \a l * @@ -675,30 +675,45 @@ BMLoop *BM_face_vert_share_loop(BMFace *f, BMVert *v) } /** + * \brief Return the Loop Shared by Face and Edge + * + * Finds the loop used which uses \a e in face loop \a l + * + * \note currenly this just uses simple loop in future may be speeded up + * using radial vars + */ +BMLoop *BM_face_edge_share_loop(BMFace *f, BMEdge *e) +{ + BMLoop *l_first; + BMLoop *l_iter; + + l_iter = l_first = e->l; + do { + if (l_iter->f == f) { + return l_iter; + } + } while ((l_iter = l_iter->radial_next) != l_first); + + return NULL; +} + +/** * Returns the verts of an edge as used in a face * if used in a face at all, otherwise just assign as used in the edge. * * Useful to get a deterministic winding order when calling * BM_face_create_ngon() on an arbitrary array of verts, * though be sure to pick an edge which has a face. + * + * \note This is infact quite a simple check, mainly include this function so the intent is more obvious. + * We know these 2 verts will _always_ make up the loops edge */ void BM_edge_ordered_verts_ex(BMEdge *edge, BMVert **r_v1, BMVert **r_v2, BMLoop *edge_loop) { BLI_assert(edge_loop->e == edge); - - if ((edge_loop == NULL) || - (((edge_loop->prev->v == edge->v1) && (edge_loop->v == edge->v2)) || - ((edge_loop->v == edge->v1) && (edge_loop->next->v == edge->v2))) - ) - { - *r_v1 = edge->v1; - *r_v2 = edge->v2; - } - else { - *r_v1 = edge->v2; - *r_v2 = edge->v1; - } + *r_v1 = edge_loop->v; + *r_v2 = edge_loop->next->v; } void BM_edge_ordered_verts(BMEdge *edge, BMVert **r_v1, BMVert **r_v2) diff --git a/source/blender/bmesh/intern/bmesh_queries.h b/source/blender/bmesh/intern/bmesh_queries.h index f3dfa754f00..567d60eeac6 100644 --- a/source/blender/bmesh/intern/bmesh_queries.h +++ b/source/blender/bmesh/intern/bmesh_queries.h @@ -79,6 +79,7 @@ int BM_edge_share_vert_count(BMEdge *e1, BMEdge *e2); BMVert *BM_edge_share_vert(BMEdge *e1, BMEdge *e2); BMLoop *BM_face_vert_share_loop(BMFace *f, BMVert *v); +BMLoop *BM_face_edge_share_loop(BMFace *f, BMEdge *e); void BM_edge_ordered_verts(BMEdge *edge, BMVert **r_v1, BMVert **r_v2); void BM_edge_ordered_verts_ex(BMEdge *edge, BMVert **r_v1, BMVert **r_v2, |