added boolean type for bmesh operators, will make python wrapping clearer and also...
[blender.git] / source / blender / bmesh / bmesh_walkers.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor(s): Joseph Eagar.
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 #ifndef __BMESH_WALKERS_H__
24 #define __BMESH_WALKERS_H__
25
26 /** \file blender/bmesh/bmesh_walkers.h
27  *  \ingroup bmesh
28  */
29
30 #include "BLI_ghash.h"
31
32 /*
33   NOTE: do NOT modify topology while walking a mesh!
34 */
35
36 typedef enum {
37         BMW_DEPTH_FIRST,
38         BMW_BREADTH_FIRST
39 } BMWOrder;
40
41 /*Walkers*/
42 typedef struct BMWalker {
43         void (*begin) (struct BMWalker *walker, void *start);
44         void *(*step) (struct BMWalker *walker);
45         void *(*yield)(struct BMWalker *walker);
46         int structsize;
47         BMWOrder order;
48         int valid_mask;
49
50         /* runtime */
51         int layer;
52
53         BMesh *bm;
54         BLI_mempool *worklist;
55         ListBase states;
56
57         short mask_vert;
58         short mask_edge;
59         short mask_loop;
60         short mask_face;
61
62         GHash *visithash;
63         int depth;
64 } BMWalker;
65
66 /* define to make BMW_init more clear */
67 #define BMW_MASK_NOP 0
68
69 /* initialize a walker.  searchmask restricts some (not all) walkers to
70  * elements with a specific tool flag set.  flags is specific to each walker.*/
71 void BMW_init(struct BMWalker *walker, BMesh *bm, int type,
72               short mask_vert, short mask_edge, short mask_loop, short mask_face,
73               int layer);
74 void *BMW_begin(BMWalker *walker, void *start);
75 void *BMW_step(struct BMWalker *walker);
76 void  BMW_end(struct BMWalker *walker);
77 int   BMW_current_depth(BMWalker *walker);
78
79 /*these are used by custom walkers*/
80 void *BMW_current_state(BMWalker *walker);
81 void *BMW_state_add(BMWalker *walker);
82 void  BMW_state_remove(BMWalker *walker);
83 void *BMW_walk(BMWalker *walker);
84 void  BMW_reset(BMWalker *walker);
85
86 /*
87 example of usage, walking over an island of tool flagged faces:
88
89 BMWalker walker;
90 BMFace *f;
91
92 BMW_init(&walker, bm, BMW_ISLAND, SOME_OP_FLAG);
93 f = BMW_begin(&walker, some_start_face);
94 for (; f; f=BMW_step(&walker)) {
95         //do something with f
96 }
97 BMW_end(&walker);
98 */
99
100 enum {
101         /* walk over connected geometry.  can restrict to a search flag,
102          * or not, it's optional.
103          *
104          * takes a vert as an arugment, and spits out edges, restrict flag acts
105          * on the edges as well. */
106         BMW_SHELL,
107         /*walk over an edge loop.  search flag doesn't do anything.*/
108         BMW_LOOP,
109         BMW_FACELOOP,
110         BMW_EDGERING,
111         /* #define BMW_RING     2 */
112         /* walk over uv islands; takes a loop as input.  restrict flag
113          * restricts the walking to loops whose vert has restrict flag set as a
114          * tool flag.
115          *
116          * the flag parameter to BMW_init maps to a loop customdata layer index.
117          */
118         BMW_LOOPDATA_ISLAND,
119         /* walk over an island of flagged faces.  note, that this doesn't work on
120          * non-manifold geometry.  it might be better to rewrite this to extract
121          * boundary info from the island walker, rather then directly walking
122          * over the boundary.  raises an error if it encouters nonmanifold
123          * geometry. */
124         BMW_ISLANDBOUND,
125         /* walk over all faces in an island of tool flagged faces. */
126         BMW_ISLAND,
127         /* walk from a vertex to all connected vertices. */
128         BMW_CONNECTED_VERTEX,
129         /* end of array index enum vals */
130
131         /* do not intitialze function pointers and struct size in BMW_init */
132         BMW_CUSTOM,
133         BMW_MAXWALKERS
134 };
135
136 /* use with BMW_init, so as not to confuse with restrict flags */
137 #define BMW_NIL_LAY  0
138
139 #endif /* __BMESH_WALKERS_H__ */