Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2015-07-21 05:02:11 +0300
committerCampbell Barton <ideasman42@gmail.com>2015-07-21 05:02:11 +0300
commit1d9fbdc9a0fd69027c8918de1851f95296eda006 (patch)
treea3eb7e78db1b0a56cb2ac1a72c1b1fb57a0de17b /source/blender/bmesh
parent1d02d34de913e61698cf3d61d0538645140fcf87 (diff)
Fix T45455: Select linked issue w/ hidden faces
Diffstat (limited to 'source/blender/bmesh')
-rw-r--r--source/blender/bmesh/intern/bmesh_walkers_impl.c45
1 files changed, 40 insertions, 5 deletions
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: