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>2014-05-23 14:29:15 +0400
committerCampbell Barton <ideasman42@gmail.com>2014-05-23 14:50:27 +0400
commitfad267bf57ce290b88392a5b895911f08f20748e (patch)
tree1b551b879131690961d9bcd7968eab54eed345fd /source/blender/bmesh/intern/bmesh_walkers_impl.c
parent7e78322eef40ae0e874ff483b34ed58cd8d4090a (diff)
BMesh Walker: add face-shell walker
Diffstat (limited to 'source/blender/bmesh/intern/bmesh_walkers_impl.c')
-rw-r--r--source/blender/bmesh/intern/bmesh_walkers_impl.c75
1 files changed, 75 insertions, 0 deletions
diff --git a/source/blender/bmesh/intern/bmesh_walkers_impl.c b/source/blender/bmesh/intern/bmesh_walkers_impl.c
index cf53d1ceec2..8ca254a94f1 100644
--- a/source/blender/bmesh/intern/bmesh_walkers_impl.c
+++ b/source/blender/bmesh/intern/bmesh_walkers_impl.c
@@ -225,6 +225,70 @@ static void *bmw_VertShellWalker_step(BMWalker *walker)
/** \} */
+/** \name FaceShell Walker
+ * \{
+ *
+ * Starts at an edge on the mesh and walks over the 'shell' it belongs
+ * to via visiting connected faces.
+ */
+static void bmw_FaceShellWalker_visitEdge(BMWalker *walker, BMEdge *e)
+{
+ BMwShellWalker *shellWalk = NULL;
+
+ if (BLI_gset_haskey(walker->visit_set, e)) {
+ return;
+ }
+
+ if (!bmw_mask_check_edge(walker, e)) {
+ return;
+ }
+
+ shellWalk = BMW_state_add(walker);
+ shellWalk->curedge = e;
+ BLI_gset_insert(walker->visit_set, e);
+}
+
+static void bmw_FaceShellWalker_begin(BMWalker *walker, void *data)
+{
+ BMEdge *e = data;
+ bmw_FaceShellWalker_visitEdge(walker, e);
+}
+
+static void *bmw_FaceShellWalker_yield(BMWalker *walker)
+{
+ BMwShellWalker *shellWalk = BMW_current_state(walker);
+ return shellWalk->curedge;
+}
+
+static void *bmw_FaceShellWalker_step(BMWalker *walker)
+{
+ BMwShellWalker *swalk, owalk;
+ BMEdge *e, *e2;
+ BMIter iter;
+
+ BMW_state_remove_r(walker, &owalk);
+ swalk = &owalk;
+
+ e = swalk->curedge;
+
+ if (e->l) {
+ BMLoop *l_iter, *l_first;
+
+ l_iter = l_first = e->l;
+ do {
+ BM_ITER_ELEM (e2, &iter, l_iter->f, BM_EDGES_OF_FACE) {
+ if (e2 != e) {
+ bmw_FaceShellWalker_visitEdge(walker, e2);
+ }
+ }
+ } while ((l_iter = l_iter->radial_next) != l_first);
+ }
+
+ return e;
+}
+/** \} */
+
+
/** \name Connected Vertex Walker
* \{
*
@@ -1185,6 +1249,16 @@ static BMWalker bmw_VertShellWalker_Type = {
BM_EDGE, /* valid restrict masks */
};
+static BMWalker bmw_FaceShellWalker_Type = {
+ BM_EDGE,
+ bmw_FaceShellWalker_begin,
+ bmw_FaceShellWalker_step,
+ bmw_FaceShellWalker_yield,
+ sizeof(BMwShellWalker),
+ BMW_BREADTH_FIRST,
+ BM_EDGE, /* valid restrict masks */
+};
+
static BMWalker bmw_IslandboundWalker_Type = {
BM_LOOP,
bmw_IslandboundWalker_begin,
@@ -1267,6 +1341,7 @@ static BMWalker bmw_ConnectedVertexWalker_Type = {
BMWalker *bm_walker_types[] = {
&bmw_VertShellWalker_Type, /* BMW_VERT_SHELL */
+ &bmw_FaceShellWalker_Type, /* BMW_FACE_SHELL */
&bmw_LoopWalker_Type, /* BMW_LOOP */
&bmw_FaceLoopWalker_Type, /* BMW_FACELOOP */
&bmw_EdgeringWalker_Type, /* BMW_EDGERING */