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
Notes: blender-bot 2023-02-14 08:53:17 +01:00
Referenced by issue #45455, Select Linked is inconsistant
1 changed files with 40 additions and 5 deletions

View File

@ -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: