Cleanup: trailing commas
[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 blender/bmesh/intern/bmesh_walkers.h
21  *  \ingroup bmesh
22  */
23
24 /*
25  * NOTE: do NOT modify topology while walking a mesh!
26  */
27
28 typedef enum {
29         BMW_DEPTH_FIRST,
30         BMW_BREADTH_FIRST
31 } BMWOrder;
32
33 typedef enum {
34         BMW_FLAG_NOP = 0,
35         BMW_FLAG_TEST_HIDDEN = (1 << 0),
36 } BMWFlag;
37
38 /*Walkers*/
39 typedef struct BMWalker {
40         char    begin_htype;  /* only for validating input */
41         void  (*begin) (struct BMWalker *walker, void *start);
42         void *(*step)  (struct BMWalker *walker);
43         void *(*yield) (struct BMWalker *walker);
44         int structsize;
45         BMWOrder order;
46         int valid_mask;
47
48         /* runtime */
49         int layer;
50
51         BMesh *bm;
52         BLI_mempool *worklist;
53         ListBase states;
54
55         /* these masks are to be tested against elements BMO_elem_flag_test(),
56          * should never be accessed directly only through BMW_init() and bmw_mask_check_*() functions */
57         short mask_vert;
58         short mask_edge;
59         short mask_face;
60
61         BMWFlag flag;
62
63         struct GSet *visit_set;
64         struct GSet *visit_set_alt;
65         int depth;
66 } BMWalker;
67
68 /* define to make BMW_init more clear */
69 #define BMW_MASK_NOP 0
70
71 /* initialize a walker.  searchmask restricts some (not all) walkers to
72  * elements with a specific tool flag set.  flags is specific to each walker.*/
73 void BMW_init(
74         struct BMWalker *walker, BMesh *bm, int type,
75         short mask_vert, short mask_edge, short mask_face,
76         BMWFlag flag,
77         int layer);
78 void *BMW_begin(BMWalker *walker, void *start);
79 void *BMW_step(struct BMWalker *walker);
80 void  BMW_end(struct BMWalker *walker);
81 int   BMW_current_depth(BMWalker *walker);
82
83 /*these are used by custom walkers*/
84 void *BMW_current_state(BMWalker *walker);
85 void *BMW_state_add(BMWalker *walker);
86 void  BMW_state_remove(BMWalker *walker);
87 void *BMW_walk(BMWalker *walker);
88 void  BMW_reset(BMWalker *walker);
89
90 #define BMW_ITER(ele, walker, data) \
91         for (BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BMW_begin(walker, (BM_CHECK_TYPE_ELEM(data), data)); \
92              ele; \
93              BM_CHECK_TYPE_ELEM_ASSIGN(ele) = BMW_step(walker))
94
95 /*
96  * example of usage, walking over an island of tool flagged faces:
97  *
98  * BMWalker walker;
99  * BMFace *f;
100  *
101  * BMW_init(&walker, bm, BMW_ISLAND, SOME_OP_FLAG);
102  *
103  * for (f = BMW_begin(&walker, some_start_face); f; f = BMW_step(&walker)) {
104  *     // do something with f
105  * }
106  * BMW_end(&walker);
107  */
108
109 enum {
110         BMW_VERT_SHELL,
111         BMW_LOOP_SHELL,
112         BMW_LOOP_SHELL_WIRE,
113         BMW_FACE_SHELL,
114         BMW_EDGELOOP,
115         BMW_FACELOOP,
116         BMW_EDGERING,
117         BMW_EDGEBOUNDARY,
118         /* BMW_RING, */
119         BMW_LOOPDATA_ISLAND,
120         BMW_ISLANDBOUND,
121         BMW_ISLAND,
122         BMW_ISLAND_MANIFOLD,
123         BMW_CONNECTED_VERTEX,
124         /* end of array index enum vals */
125
126         /* do not intitialze function pointers and struct size in BMW_init */
127         BMW_CUSTOM,
128         BMW_MAXWALKERS,
129 };
130
131 /* use with BMW_init, so as not to confuse with restrict flags */
132 #define BMW_NIL_LAY  0
133
134 #endif /* __BMESH_WALKERS_H__ */