diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-04-19 05:02:58 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-04-19 05:02:58 +0400 |
commit | 34f993241840120c1847410756cb2bf8af1be119 (patch) | |
tree | 5af1464868f7ee20b53cc5b4336af5721d004db2 /source/blender/bmesh | |
parent | f2f27bf8325432ec8995f16385c7d65ef975eee1 (diff) |
simple optimization, replace BM_face_other_edge_loop() with BM_loop_other_edge_loop() in situations where the loop is known this avoids a lookup.
Diffstat (limited to 'source/blender/bmesh')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_queries.c | 27 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_queries.h | 1 | ||||
-rw-r--r-- | source/blender/bmesh/intern/bmesh_walkers_impl.c | 4 |
3 files changed, 17 insertions, 15 deletions
diff --git a/source/blender/bmesh/intern/bmesh_queries.c b/source/blender/bmesh/intern/bmesh_queries.c index c0db2c0a19e..f61c63ee6c5 100644 --- a/source/blender/bmesh/intern/bmesh_queries.c +++ b/source/blender/bmesh/intern/bmesh_queries.c @@ -63,23 +63,24 @@ bool BM_vert_in_edge(const BMEdge *e, const BMVert *v) * in the face to check. * The faces loop direction is ignored. * </pre> + * + * \note caller must ensure \a e is used in \a f */ BMLoop *BM_face_other_edge_loop(BMFace *f, BMEdge *e, BMVert *v) { - BMLoop *l_iter; - BMLoop *l_first; - - /* 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; + BMLoop *l = BM_face_edge_share_loop(f, e); + BLI_assert(l != NULL); + return BM_loop_other_edge_loop(l, v); +} - do { - if (l_iter->e == e && l_iter->f == f) { - break; - } - } while ((l_iter = l_iter->radial_next) != l_first); - - return l_iter->v == v ? l_iter->prev : l_iter->next; +/** + * See #BM_face_other_edge_loop This is the same functionality + * to be used when the edges loop is already known. + */ +BMLoop *BM_loop_other_edge_loop(BMLoop *l, BMVert *v) +{ + BLI_assert(BM_vert_in_edge(l->e, v)); + return l->v == v ? l->prev : l->next; } /** diff --git a/source/blender/bmesh/intern/bmesh_queries.h b/source/blender/bmesh/intern/bmesh_queries.h index ec52a7af162..3d3e1a3d9d9 100644 --- a/source/blender/bmesh/intern/bmesh_queries.h +++ b/source/blender/bmesh/intern/bmesh_queries.h @@ -44,6 +44,7 @@ bool BM_edge_loop_pair(BMEdge *e, BMLoop **r_la, BMLoop **r_lb); BMVert *BM_edge_other_vert(BMEdge *e, BMVert *v); BMLoop *BM_edge_other_loop(BMEdge *e, BMLoop *l); BMLoop *BM_face_other_edge_loop(BMFace *f, BMEdge *e, BMVert *v); +BMLoop *BM_loop_other_edge_loop(BMLoop *l, BMVert *v); BMLoop *BM_face_other_vert_loop(BMFace *f, BMVert *v_prev, BMVert *v); BMLoop *BM_loop_other_vert_loop(BMLoop *l, BMVert *v); BMLoop *BM_vert_step_fan_loop(BMLoop *l, BMEdge **e_step); diff --git a/source/blender/bmesh/intern/bmesh_walkers_impl.c b/source/blender/bmesh/intern/bmesh_walkers_impl.c index a50b708961c..55d9153fd63 100644 --- a/source/blender/bmesh/intern/bmesh_walkers_impl.c +++ b/source/blender/bmesh/intern/bmesh_walkers_impl.c @@ -313,7 +313,7 @@ static void *bmw_IslandboundWalker_step(BMWalker *walker) f = l->f; while (1) { - l = BM_face_other_edge_loop(f, e, v); + l = BM_loop_other_edge_loop(l, v); if (l != l->radial_next) { l = l->radial_next; f = l->f; @@ -564,7 +564,7 @@ static void *bmw_LoopWalker_step(BMWalker *walker) break; } - l = BM_face_other_edge_loop(l->f, l->e, v); + l = BM_loop_other_edge_loop(l, v); if (l == NULL) { break; |