forked from bartvdbraak/blender
Fix T45455: Select linked issue w/ hidden faces
This commit is contained in:
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
|
||||
* \{
|
||||
*
|
||||
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user