Fix T45455: Select linked issue w/ hidden faces

This commit is contained in:
Campbell Barton 2015-07-21 12:02:11 +10:00
parent 1d02d34de9
commit 1d9fbdc9a0

@ -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 /** \name Shell Walker
* \{ * \{
* *
@ -239,6 +263,10 @@ static void bmw_LoopShellWalker_visitLoop(BMWalker *walker, BMLoop *l)
return; return;
} }
if (!bmw_mask_check_face(walker, l->f)) {
return;
}
shellWalk = BMW_state_add(walker); shellWalk = BMW_state_add(walker);
shellWalk->curloop = l; shellWalk->curloop = l;
BLI_gset_insert(walker->visit_set, l); BLI_gset_insert(walker->visit_set, l);
@ -364,12 +392,16 @@ static void bmw_LoopShellWalker_visitEdgeWire(BMWalker *walker, BMEdge *e)
{ {
BMwLoopShellWireWalker *shellWalk = NULL; 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)) { if (BLI_gset_haskey(walker->visit_set_alt, e)) {
return; return;
} }
if (!bmw_mask_check_edge(walker, e)) {
return;
}
shellWalk = BMW_state_add(walker); shellWalk = BMW_state_add(walker);
shellWalk->curelem = (BMElem *)e; shellWalk->curelem = (BMElem *)e;
BLI_gset_insert(walker->visit_set_alt, e); BLI_gset_insert(walker->visit_set_alt, e);
@ -385,9 +417,13 @@ static void bmw_LoopShellWireWalker_visitVert(BMWalker *walker, BMVert *v, const
return; return;
} }
if (!bmw_mask_check_vert(walker, v)) {
return;
}
e = v->e; e = v->e;
do { do {
if (BM_edge_is_wire(e) && (e != e_from)) { if (bmw_edge_is_wire(walker, e) && (e != e_from)) {
BMVert *v_other; BMVert *v_other;
BMIter iter; BMIter iter;
BMLoop *l; 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 */ /* check if we step onto a non-wire vertex */
v_other = BM_edge_other_vert(e, v); v_other = BM_edge_other_vert(e, v);
BM_ITER_ELEM (l, &iter, v_other, BM_LOOPS_OF_VERT) { BM_ITER_ELEM (l, &iter, v_other, BM_LOOPS_OF_VERT) {
bmw_LoopShellWalker_visitLoop(walker, l); bmw_LoopShellWalker_visitLoop(walker, l);
} }
} }
@ -434,9 +471,7 @@ static void bmw_LoopShellWireWalker_begin(BMWalker *walker, void *data)
case BM_EDGE: case BM_EDGE:
{ {
BMEdge *e = (BMEdge *)h; BMEdge *e = (BMEdge *)h;
if (BM_edge_is_wire(e)) {
bmw_LoopShellWalker_visitEdgeWire(walker, e); bmw_LoopShellWalker_visitEdgeWire(walker, e);
}
break; break;
} }
case BM_FACE: case BM_FACE: