[Bf-blender-cvs] [1d9fbdc] master: Fix T45455: Select linked issue w/ hidden faces

Campbell Barton noreply at git.blender.org
Tue Jul 21 04:07:46 CEST 2015


Commit: 1d9fbdc9a0fd69027c8918de1851f95296eda006
Author: Campbell Barton
Date:   Tue Jul 21 12:02:11 2015 +1000
Branches: master
https://developer.blender.org/rB1d9fbdc9a0fd69027c8918de1851f95296eda006

Fix T45455: Select linked issue w/ hidden faces

===================================================================

M	source/blender/bmesh/intern/bmesh_walkers_impl.c

===================================================================

diff --git a/source/blender/bmesh/intern/bmesh_walkers_impl.c b/source/blender/bmesh/intern/bmesh_walkers_impl.c
index cd08604..23a9f68 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:




More information about the Bf-blender-cvs mailing list