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
|
/** \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:
|
||||||
|
Loading…
Reference in New Issue
Block a user