doxygen: add newline after \file
[blender.git] / source / blender / bmesh / intern / bmesh_walkers.h
index 765576c..fc91195 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * ***** BEGIN GPL LICENSE BLOCK *****
- *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
  * as published by the Free Software Foundation; either version 2
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software Foundation,
  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * Contributor(s): Joseph Eagar.
- *
- * ***** END GPL LICENSE BLOCK *****
  */
 
 #ifndef __BMESH_WALKERS_H__
 #define __BMESH_WALKERS_H__
 
-/** \file blender/bmesh/intern/bmesh_walkers.h
- *  \ingroup bmesh
+/** \file
+ * \ingroup bmesh
  */
 
-#include "BLI_ghash.h"
-
 /*
-  NOTE: do NOT modify topology while walking a mesh!
-*/
* NOTE: do NOT modify topology while walking a mesh!
+ */
 
 typedef enum {
        BMW_DEPTH_FIRST,
        BMW_BREADTH_FIRST
 } BMWOrder;
 
+typedef enum {
+       BMW_FLAG_NOP = 0,
+       BMW_FLAG_TEST_HIDDEN = (1 << 0),
+} BMWFlag;
+
 /*Walkers*/
 typedef struct BMWalker {
+       char    begin_htype;  /* only for validating input */
        void  (*begin) (struct BMWalker *walker, void *start);
        void *(*step)  (struct BMWalker *walker);
        void *(*yield) (struct BMWalker *walker);
@@ -54,13 +52,16 @@ typedef struct BMWalker {
        BLI_mempool *worklist;
        ListBase states;
 
-       /* these masks are to be tested against elements BMO_elem_flag_test() */
+       /* these masks are to be tested against elements BMO_elem_flag_test(),
+        * should never be accessed directly only through BMW_init() and bmw_mask_check_*() functions */
        short mask_vert;
        short mask_edge;
-       short mask_loop;
        short mask_face;
 
-       GHash *visithash;
+       BMWFlag flag;
+
+       struct GSet *visit_set;
+       struct GSet *visit_set_alt;
        int depth;
 } BMWalker;
 
@@ -69,9 +70,11 @@ typedef struct BMWalker {
 
 /* initialize a walker.  searchmask restricts some (not all) walkers to
  * elements with a specific tool flag set.  flags is specific to each walker.*/
-void BMW_init(struct BMWalker *walker, BMesh *bm, int type,
-              short mask_vert, short mask_edge, short mask_loop, short mask_face,
-              int layer);
+void BMW_init(
+        struct BMWalker *walker, BMesh *bm, int type,
+        short mask_vert, short mask_edge, short mask_face,
+        BMWFlag flag,
+        int layer);
 void *BMW_begin(BMWalker *walker, void *start);
 void *BMW_step(struct BMWalker *walker);
 void  BMW_end(struct BMWalker *walker);
@@ -84,55 +87,45 @@ void  BMW_state_remove(BMWalker *walker);
 void *BMW_walk(BMWalker *walker);
 void  BMW_reset(BMWalker *walker);
 
-/*
-example of usage, walking over an island of tool flagged faces:
-
-BMWalker walker;
-BMFace *f;
+#define BMW_ITER(ele, walker, data) \
+       for (BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BMW_begin(walker, (BM_CHECK_TYPE_ELEM(data), data)); \
+            ele; \
+            BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BMW_step(walker))
 
-BMW_init(&walker, bm, BMW_ISLAND, SOME_OP_FLAG);
-f = BMW_begin(&walker, some_start_face);
-for (; f; f = BMW_step(&walker))
-{
-       //do something with f
-}
-BMW_end(&walker);
-*/
+/*
+ * example of usage, walking over an island of tool flagged faces:
+ *
+ * BMWalker walker;
+ * BMFace *f;
+ *
+ * BMW_init(&walker, bm, BMW_ISLAND, SOME_OP_FLAG);
+ *
+ * for (f = BMW_begin(&walker, some_start_face); f; f = BMW_step(&walker)) {
+ *     // do something with f
+ * }
+ * BMW_end(&walker);
+ */
 
 enum {
-       /* walk over connected geometry.  can restrict to a search flag,
-        * or not, it's optional.
-        *
-        * takes a vert as an arugment, and spits out edges, restrict flag acts
-        * on the edges as well. */
-       BMW_SHELL,
-       /*walk over an edge loop.  search flag doesn't do anything.*/
-       BMW_LOOP,
+       BMW_VERT_SHELL,
+       BMW_LOOP_SHELL,
+       BMW_LOOP_SHELL_WIRE,
+       BMW_FACE_SHELL,
+       BMW_EDGELOOP,
        BMW_FACELOOP,
        BMW_EDGERING,
-       /* #define BMW_RING     2 */
-       /* walk over uv islands; takes a loop as input.  restrict flag
-        * restricts the walking to loops whose vert has restrict flag set as a
-        * tool flag.
-        *
-        * the flag parameter to BMW_init maps to a loop customdata layer index.
-        */
+       BMW_EDGEBOUNDARY,
+       /* BMW_RING, */
        BMW_LOOPDATA_ISLAND,
-       /* walk over an island of flagged faces.  note, that this doesn't work on
-        * non-manifold geometry.  it might be better to rewrite this to extract
-        * boundary info from the island walker, rather then directly walking
-        * over the boundary.  raises an error if it encouters nonmanifold
-        * geometry. */
        BMW_ISLANDBOUND,
-       /* walk over all faces in an island of tool flagged faces. */
        BMW_ISLAND,
-       /* walk from a vertex to all connected vertices. */
+       BMW_ISLAND_MANIFOLD,
        BMW_CONNECTED_VERTEX,
        /* end of array index enum vals */
 
        /* do not intitialze function pointers and struct size in BMW_init */
        BMW_CUSTOM,
-       BMW_MAXWALKERS
+       BMW_MAXWALKERS,
 };
 
 /* use with BMW_init, so as not to confuse with restrict flags */