Cleanup: remove redundant doxygen \file argument
[blender.git] / source / blender / bmesh / intern / bmesh_walkers.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  */
16
17 #ifndef __BMESH_WALKERS_H__
18 #define __BMESH_WALKERS_H__
19
20 /** \file \ingroup bmesh
21  */
22
23 /*
24  * NOTE: do NOT modify topology while walking a mesh!
25  */
26
27 typedef enum {
28         BMW_DEPTH_FIRST,
29         BMW_BREADTH_FIRST
30 } BMWOrder;
31
32 typedef enum {
33         BMW_FLAG_NOP = 0,
34         BMW_FLAG_TEST_HIDDEN = (1 << 0),
35 } BMWFlag;
36
37 /*Walkers*/
38 typedef struct BMWalker {
39         char    begin_htype;  /* only for validating input */
40         void  (*begin) (struct BMWalker *walker, void *start);
41         void *(*step)  (struct BMWalker *walker);
42         void *(*yield) (struct BMWalker *walker);
43         int structsize;
44         BMWOrder order;
45         int valid_mask;
46
47         /* runtime */
48         int layer;
49
50         BMesh *bm;
51         BLI_mempool *worklist;
52         ListBase states;
53
54         /* these masks are to be tested against elements BMO_elem_flag_test(),
55          * should never be accessed directly only through BMW_init() and bmw_mask_check_*() functions */
56         short mask_vert;
57         short mask_edge;
58         short mask_face;
59
60         BMWFlag flag;
61
62         struct GSet *visit_set;
63         struct GSet *visit_set_alt;
64         int depth;
65 } BMWalker;
66
67 /* define to make BMW_init more clear */
68 #define BMW_MASK_NOP 0
69
70 /* initialize a walker.  searchmask restricts some (not all) walkers to
71  * elements with a specific tool flag set.  flags is specific to each walker.*/
72 void BMW_init(
73         struct BMWalker *walker, BMesh *bm, int type,
74         short mask_vert, short mask_edge, short mask_face,
75         BMWFlag flag,
76         int layer);
77 void *BMW_begin(BMWalker *walker, void *start);
78 void *BMW_step(struct BMWalker *walker);
79 void  BMW_end(struct BMWalker *walker);
80 int   BMW_current_depth(BMWalker *walker);
81
82 /*these are used by custom walkers*/
83 void *BMW_current_state(BMWalker *walker);
84 void *BMW_state_add(BMWalker *walker);
85 void  BMW_state_remove(BMWalker *walker);
86 void *BMW_walk(BMWalker *walker);
87 void  BMW_reset(BMWalker *walker);
88
89 #define BMW_ITER(ele, walker, data) \
90         for (BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BMW_begin(walker, (BM_CHECK_TYPE_ELEM(data), data)); \
91              ele; \
92              BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BMW_step(walker))
93
94 /*
95  * example of usage, walking over an island of tool flagged faces:
96  *
97  * BMWalker walker;
98  * BMFace *f;
99  *
100  * BMW_init(&walker, bm, BMW_ISLAND, SOME_OP_FLAG);
101  *
102  * for (f = BMW_begin(&walker, some_start_face); f; f = BMW_step(&walker)) {
103  *     // do something with f
104  * }
105  * BMW_end(&walker);
106  */
107
108 enum {
109         BMW_VERT_SHELL,
110         BMW_LOOP_SHELL,
111         BMW_LOOP_SHELL_WIRE,
112         BMW_FACE_SHELL,
113         BMW_EDGELOOP,
114         BMW_FACELOOP,
115         BMW_EDGERING,
116         BMW_EDGEBOUNDARY,
117         /* BMW_RING, */
118         BMW_LOOPDATA_ISLAND,
119         BMW_ISLANDBOUND,
120         BMW_ISLAND,
121         BMW_ISLAND_MANIFOLD,
122         BMW_CONNECTED_VERTEX,
123         /* end of array index enum vals */
124
125         /* do not intitialze function pointers and struct size in BMW_init */
126         BMW_CUSTOM,
127         BMW_MAXWALKERS,
128 };
129
130 /* use with BMW_init, so as not to confuse with restrict flags */
131 #define BMW_NIL_LAY  0
132
133 #endif /* __BMESH_WALKERS_H__ */