From 1d9fbdc9a0fd69027c8918de1851f95296eda006 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 21 Jul 2015 12:02:11 +1000 Subject: Fix T45455: Select linked issue w/ hidden faces --- source/blender/bmesh/intern/bmesh_walkers_impl.c | 45 +++++++++++++++++++++--- 1 file changed, 40 insertions(+), 5 deletions(-) (limited to 'source/blender/bmesh/intern/bmesh_walkers_impl.c') diff --git a/source/blender/bmesh/intern/bmesh_walkers_impl.c b/source/blender/bmesh/intern/bmesh_walkers_impl.c index cd08604541b..23a9f68dc98 100644 --- a/source/blender/bmesh/intern/bmesh_walkers_impl.c +++ b/source/blender/bmesh/intern/bmesh_walkers_impl.c @@ -86,6 +86,30 @@ static bool bmw_mask_check_face(BMWalker *walker, BMFace *f) /** \} */ +/** \name BMesh Queries (modified to check walker flags) + * \{ */ + +/** + * Check for a wire edge, taking ignoring hidden. + */ +static bool bmw_edge_is_wire(const BMWalker *walker, const BMEdge *e) +{ + if (walker->flag & BMW_FLAG_TEST_HIDDEN) { + /* check if this is a wire edge, ignoring hidden faces */ + if (BM_edge_is_wire(e)) { + return true; + } + else { + return BM_edge_is_all_face_flag_test(e, BM_ELEM_HIDDEN, false); + } + } + else { + return BM_edge_is_wire(e); + } +} +/** \} */ + + /** \name Shell Walker * \{ * @@ -239,6 +263,10 @@ static void bmw_LoopShellWalker_visitLoop(BMWalker *walker, BMLoop *l) return; } + if (!bmw_mask_check_face(walker, l->f)) { + return; + } + shellWalk = BMW_state_add(walker); shellWalk->curloop = l; BLI_gset_insert(walker->visit_set, l); @@ -364,12 +392,16 @@ static void bmw_LoopShellWalker_visitEdgeWire(BMWalker *walker, BMEdge *e) { BMwLoopShellWireWalker *shellWalk = NULL; - BLI_assert(BM_edge_is_wire(e)); + BLI_assert(bmw_edge_is_wire(walker, e)); if (BLI_gset_haskey(walker->visit_set_alt, e)) { return; } + if (!bmw_mask_check_edge(walker, e)) { + return; + } + shellWalk = BMW_state_add(walker); shellWalk->curelem = (BMElem *)e; BLI_gset_insert(walker->visit_set_alt, e); @@ -385,9 +417,13 @@ static void bmw_LoopShellWireWalker_visitVert(BMWalker *walker, BMVert *v, const return; } + if (!bmw_mask_check_vert(walker, v)) { + return; + } + e = v->e; do { - if (BM_edge_is_wire(e) && (e != e_from)) { + if (bmw_edge_is_wire(walker, e) && (e != e_from)) { BMVert *v_other; BMIter iter; BMLoop *l; @@ -397,6 +433,7 @@ static void bmw_LoopShellWireWalker_visitVert(BMWalker *walker, BMVert *v, const /* check if we step onto a non-wire vertex */ v_other = BM_edge_other_vert(e, v); BM_ITER_ELEM (l, &iter, v_other, BM_LOOPS_OF_VERT) { + bmw_LoopShellWalker_visitLoop(walker, l); } } @@ -434,9 +471,7 @@ static void bmw_LoopShellWireWalker_begin(BMWalker *walker, void *data) case BM_EDGE: { BMEdge *e = (BMEdge *)h; - if (BM_edge_is_wire(e)) { - bmw_LoopShellWalker_visitEdgeWire(walker, e); - } + bmw_LoopShellWalker_visitEdgeWire(walker, e); break; } case BM_FACE: -- cgit v1.2.3