Style Cleanup: whitespace and some formatting.
[blender.git] / source / blender / bmesh / bmesh_iterators.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 /*
24  * BMESH ITERATORS
25  *
26  * The functions and structures in this file
27  * provide a unified method for iterating over
28  * the elements of a mesh and answering simple
29  * adjacency queries. Tool authors should use
30  * the iterators provided in this file instead
31  * of inspecting the structure directly.
32  *
33 */
34
35 #ifndef BM_ITERATORS_H
36 #define BM_ITERATORS_H
37
38 #include "BLI_mempool.h"
39
40 /* Defines for passing to BMIter_New.
41  *
42  * "OF" can be substituted for "around"
43  * so BM_VERTS_OF_FACE means "vertices
44  * around a face."
45  */
46
47 /* these iterator over all elements of a specific
48  * type in the mesh.*/
49 #define BM_VERTS_OF_MESH                        1
50 #define BM_EDGES_OF_MESH                        2
51 #define BM_FACES_OF_MESH                        3
52
53 /*these are topological iterators.*/
54 #define BM_EDGES_OF_VERT                        4
55 #define BM_FACES_OF_VERT                        5
56 #define BM_LOOPS_OF_VERT                        6
57 #define BM_FACES_OF_EDGE                        7
58 #define BM_VERTS_OF_FACE                        8
59 #define BM_EDGES_OF_FACE                        9
60 #define BM_LOOPS_OF_FACE                        10
61 /* returns elements from all boundaries, and returns
62  * the first element at the end to flag that we're entering
63  * a different face hole boundary*/
64 #define BM_ALL_LOOPS_OF_FACE            11
65
66 /* iterate through loops around this loop, which are fetched
67  * from the other faces in the radial cycle surrounding the
68  * input loop's edge.*/
69 #define BM_LOOPS_OF_LOOP                12
70 #define BM_LOOPS_OF_EDGE                13
71
72 #define BM_ITER(ele, iter, bm, itype, data)                                   \
73         ele = BMIter_New(iter, bm, itype, data);                                  \
74         for ( ; ele; ele=BMIter_Step(iter))
75
76 #define BM_ITER_INDEX(ele, iter, bm, itype, data, indexvar)                   \
77         ele = BMIter_New(iter, bm, itype, data);                                  \
78         for (indexvar=0; ele; indexvar++, ele=BMIter_Step(iter))
79
80 /*Iterator Structure*/
81 typedef struct BMIter {
82         BLI_mempool_iter pooliter;
83
84         struct BMVert *firstvert, *nextvert, *vdata;
85         struct BMEdge *firstedge, *nextedge, *edata;
86         struct BMLoop *firstloop, *nextloop, *ldata, *l;
87         struct BMFace *firstpoly, *nextpoly, *pdata;
88         struct BMesh *bm;
89         void (*begin)(struct BMIter *iter);
90         void *(*step)(struct BMIter *iter);
91         union {
92                 void       *p;
93                 int         i;
94                 long        l;
95                 float       f;
96         } filter;
97         int count;
98         char itype;
99 } BMIter;
100
101 void *BMIter_AtIndex(struct BMesh *bm, const char htype, void *data, int index);
102 int   BMIter_AsArray(struct BMesh *bm, const char htype, void *data, void **array, const int len);
103
104 /* private for bmesh_iterators_inline.c */
105 void  bmiter__vert_of_mesh_begin(struct BMIter *iter);
106 void *bmiter__vert_of_mesh_step(struct BMIter *iter);
107 void  bmiter__edge_of_mesh_begin(struct BMIter *iter);
108 void *bmiter__edge_of_mesh_step(struct BMIter *iter);
109 void  bmiter__face_of_mesh_begin(struct BMIter *iter);
110 void *bmiter__face_of_mesh_step(struct BMIter *iter);
111 void  bmiter__edge_of_vert_begin(struct BMIter *iter);
112 void *bmiter__edge_of_vert_step(struct BMIter *iter);
113 void  bmiter__face_of_vert_begin(struct BMIter *iter);
114 void *bmiter__face_of_vert_step(struct BMIter *iter);
115 void  bmiter__loop_of_vert_begin(struct BMIter *iter);
116 void *bmiter__loop_of_vert_step(struct BMIter *iter);
117 void  bmiter__loops_of_edge_begin(struct BMIter *iter);
118 void *bmiter__loops_of_edge_step(struct BMIter *iter);
119 void  bmiter__loops_of_loop_begin(struct BMIter *iter);
120 void *bmiter__loops_of_loop_step(struct BMIter *iter);
121 void  bmiter__face_of_edge_begin(struct BMIter *iter);
122 void *bmiter__face_of_edge_step(struct BMIter *iter);
123 void  bmiter__vert_of_face_begin(struct BMIter *iter);
124 void *bmiter__vert_of_face_step(struct BMIter *iter);
125 void  bmiter__edge_of_face_begin(struct BMIter *iter);
126 void *bmiter__edge_of_face_step(struct BMIter *iter);
127 void  bmiter__loop_of_face_begin(struct BMIter *iter);
128 void *bmiter__loop_of_face_step(struct BMIter *iter);
129
130 #include "intern/bmesh_iterators_inline.c"
131
132 #endif