diff options
author | Campbell Barton <ideasman42@gmail.com> | 2012-03-30 13:27:54 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2012-03-30 13:27:54 +0400 |
commit | 28889a3500ee5dcb1a4851f2d6c40ec3800c968f (patch) | |
tree | 19265fe30000a47ee0ac58426ab1f9a71716d392 /source/blender/bmesh/intern/bmesh_walkers_impl.c | |
parent | 0e972b6293e556da3716bdfa751b0b085455a111 (diff) |
fix [#30732] bmesh: loop select continues through hidden sections.
Diffstat (limited to 'source/blender/bmesh/intern/bmesh_walkers_impl.c')
-rw-r--r-- | source/blender/bmesh/intern/bmesh_walkers_impl.c | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/source/blender/bmesh/intern/bmesh_walkers_impl.c b/source/blender/bmesh/intern/bmesh_walkers_impl.c index 5275a988f7b..818a7fb3cfa 100644 --- a/source/blender/bmesh/intern/bmesh_walkers_impl.c +++ b/source/blender/bmesh/intern/bmesh_walkers_impl.c @@ -645,6 +645,10 @@ static int bmw_FaceLoopWalker_include_face(BMWalker *walker, BMLoop *l) return FALSE; } + if (!bmw_mask_check_face(walker, l->f)) { + return FALSE; + } + /* the face must not have been already visite */ if (BLI_ghash_haskey(walker->visithash, l->f) && BLI_ghash_haskey(walker->secvisithash, l->e)) { return FALSE; @@ -839,13 +843,15 @@ static void *bmw_EdgeringWalker_step(BMWalker *walker) int i, len; #endif +#define EDGE_CHECK(e) (bmw_mask_check_edge(walker, e) && BM_edge_is_manifold(e)) + BMW_state_remove(walker); if (!l) return lwalk->wireedge; e = l->e; - if (!BM_edge_is_manifold(e)) { + if (!EDGE_CHECK(e)) { /* walker won't traverse to a non-manifold edge, but may * be started on one, and should not traverse *away* from * a non-manfold edge (non-manifold edges are never in an @@ -862,7 +868,7 @@ static void *bmw_EdgeringWalker_step(BMWalker *walker) i -= 2; } - if ((len <= 0) || (len % 2 != 0) || !BM_edge_is_manifold(l->e)) { + if ((len <= 0) || (len % 2 != 0) || !EDGE_CHECK(l->e)) { l = lwalk->l; i = len; while (i > 0) { @@ -871,7 +877,7 @@ static void *bmw_EdgeringWalker_step(BMWalker *walker) } } /* only walk to manifold edge */ - if ((l->f->len % 2 == 0) && BM_edge_is_manifold(l->e) && + if ((l->f->len % 2 == 0) && EDGE_CHECK(l->e) && !BLI_ghash_haskey(walker->visithash, l->e)) #else @@ -879,11 +885,11 @@ static void *bmw_EdgeringWalker_step(BMWalker *walker) l = l->radial_next; l = l->next->next; - if ((l->f->len != 4) || !BM_edge_is_manifold(l->e)) { + if ((l->f->len != 4) || !EDGE_CHECK(l->e)) { l = lwalk->l->next->next; } /* only walk to manifold edge */ - if ((l->f->len == 4) && BM_edge_is_manifold(l->e) && + if ((l->f->len == 4) && EDGE_CHECK(l->e) && !BLI_ghash_haskey(walker->visithash, l->e)) #endif { @@ -895,6 +901,8 @@ static void *bmw_EdgeringWalker_step(BMWalker *walker) } return e; + +#undef EDGE_CHECK } static void bmw_UVEdgeWalker_begin(BMWalker *walker, void *data) |