Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2012-03-30 13:27:54 +0400
committerCampbell Barton <ideasman42@gmail.com>2012-03-30 13:27:54 +0400
commit28889a3500ee5dcb1a4851f2d6c40ec3800c968f (patch)
tree19265fe30000a47ee0ac58426ab1f9a71716d392 /source/blender/bmesh/intern/bmesh_walkers_impl.c
parent0e972b6293e556da3716bdfa751b0b085455a111 (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.c18
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)