doxygen: add newline after \file
[blender.git] / source / blender / bmesh / intern / bmesh_walkers.h
index 8be362b..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!
  */
@@ -40,11 +32,12 @@ typedef enum {
 
 typedef enum {
        BMW_FLAG_NOP = 0,
-       BMW_FLAG_TEST_HIDDEN = (1 << 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);
@@ -67,8 +60,8 @@ typedef struct BMWalker {
 
        BMWFlag flag;
 
-       GHash *visithash;
-       GHash *secvisithash;
+       struct GSet *visit_set;
+       struct GSet *visit_set_alt;
        int depth;
 } BMWalker;
 
@@ -77,10 +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_face,
-              BMWFlag flag,
-              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);
@@ -93,6 +87,11 @@ void  BMW_state_remove(BMWalker *walker);
 void *BMW_walk(BMWalker *walker);
 void  BMW_reset(BMWalker *walker);
 
+#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))
+
 /*
  * example of usage, walking over an island of tool flagged faces:
  *
@@ -108,39 +107,25 @@ void  BMW_reset(BMWalker *walker);
  */
 
 enum {
-       /* walk over connected geometry.  can restrict to a search flag,
-        * or not, it's optional.
-        *
-        * takes a vert as an argument, 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 encounters 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 */