Merged changes in the trunk up to revision 47056.
[blender-staging.git] / source / blender / bmesh / bmesh_class.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): Geoffrey Bantle, Levi Schooley, Joseph Eagar.
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 #ifndef __BMESH_CLASS_H__
24 #define __BMESH_CLASS_H__
25
26 /** \file blender/bmesh/bmesh_class.h
27  *  \ingroup bmesh
28  */
29
30 /* bmesh data structures */
31
32 /* dissable holes for now, these are ifdef'd because they use more memory and cant be saved in DNA currently */
33 // #define USE_BMESH_HOLES
34
35 struct BMesh;
36 struct BMVert;
37 struct BMEdge;
38 struct BMLoop;
39 struct BMFace;
40
41 struct BLI_mempool;
42 struct Object;
43
44 /* note: it is very important for BMHeader to start with two
45  * pointers. this is a requirement of mempool's method of
46  * iteration.
47  *
48  * hrm. it doesn't but stull works ok, remove the comment above? - campbell.
49  */
50
51 /**
52  * BMHeader
53  *
54  * All mesh elements begin with a BMHeader. This structure
55  * hold several types of data
56  *
57  * 1: The type of the element (vert, edge, loop or face)
58  * 2: Persistent "header" flags/markings (smooth, seam, select, hidden, etc)
59  *     note that this is different from the "tool" flags.
60  * 3: Unique ID in the bmesh.
61  * 4: some elements for internal record keeping.
62  */
63 typedef struct BMHeader {
64         void *data; /* customdata layers */
65         int index; /* notes:
66                     * - Use BM_elem_index_get/set macros for index
67                     * - Unitialized to -1 so we can easily tell its not set.
68                     * - Used for edge/vert/face, check BMesh.elem_index_dirty for valid index values,
69                     *   this is abused by various tools which set it dirty.
70                     * - For loops this is used for sorting during tessellation. */
71
72         char htype; /* element geometric type (verts/edges/loops/faces) */
73         char hflag; /* this would be a CD layer, see below */
74 } BMHeader;
75
76 /* note: need some way to specify custom locations for custom data layers.  so we can
77  * make them point directly into structs.  and some way to make it only happen to the
78  * active layer, and properly update when switching active layers.*/
79
80 typedef struct BMVert {
81         BMHeader head;
82         struct BMFlagLayer *oflags; /* keep after header, an array of flags, mostly used by the operator stack */
83
84         float co[3];
85         float no[3];
86         struct BMEdge *e;
87 } BMVert;
88
89 /* disk link structure, only used by edges */
90 typedef struct BMDiskLink {
91         struct BMEdge *next, *prev;
92 } BMDiskLink;
93
94 typedef struct BMEdge {
95         BMHeader head;
96         struct BMFlagLayer *oflags; /* keep after header, an array of flags, mostly used by the operator stack */
97
98         struct BMVert *v1, *v2;
99         struct BMLoop *l;
100         
101         /* disk cycle pointers */
102         BMDiskLink v1_disk_link, v2_disk_link;
103 } BMEdge;
104
105 typedef struct BMLoop {
106         BMHeader head;
107         /* notice no flags layer */
108
109         struct BMVert *v;
110         struct BMEdge *e; /* edge, using verts (v, next->v) */
111         struct BMFace *f;
112
113         /* circular linked list of loops which all use the same edge as this one '->e',
114          * but not necessarily the same vertex (can be either v1 or v2 of our own '->e') */
115         struct BMLoop *radial_next, *radial_prev;
116
117         /* these were originally commented as private but are used all over the code */
118         /* can't use ListBase API, due to head */
119         struct BMLoop *next, *prev; /* next/prev verts around the face */
120 } BMLoop;
121
122 /* can cast BMFace/BMEdge/BMVert, but NOT BMLoop, since these don't have a flag layer */
123 typedef struct BMElemF {
124         BMHeader head;
125         struct BMFlagLayer *oflags; /* keep after header, an array of flags, mostly used by the operator stack */
126 } BMElemF;
127
128 /* can cast anything to this, including BMLoop */
129 typedef struct BMElem {
130         BMHeader head;
131 } BMElem;
132
133 #ifdef USE_BMESH_HOLES
134 /* eventually, this structure will be used for supporting holes in faces */
135 typedef struct BMLoopList {
136         struct BMLoopList *next, *prev;
137         struct BMLoop *first, *last;
138 } BMLoopList;
139 #endif
140
141 typedef struct BMFace {
142         BMHeader head;
143         struct BMFlagLayer *oflags; /* an array of flags, mostly used by the operator stack */
144
145         int len; /*includes all boundary loops*/
146 #ifdef USE_BMESH_HOLES
147         int totbounds; /*total boundaries, is one plus the number of holes in the face*/
148         ListBase loops;
149 #else
150         BMLoop *l_first;
151 #endif
152         float no[3]; /*yes, we do store this here*/
153         short mat_nr;
154 } BMFace;
155
156 typedef struct BMFlagLayer {
157         short f, pflag; /* flags */
158 } BMFlagLayer;
159
160 typedef struct BMesh {
161         int totvert, totedge, totloop, totface;
162         int totvertsel, totedgesel, totfacesel;
163
164         /* flag index arrays as being dirty so we can check if they are clean and
165          * avoid looping over the entire vert/edge/face array in those cases.
166          * valid flags are - BM_VERT | BM_EDGE | BM_FACE.
167          * BM_LOOP isn't handled so far. */
168         char elem_index_dirty;
169         
170         /*element pools*/
171         struct BLI_mempool *vpool, *epool, *lpool, *fpool;
172
173         /*operator api stuff*/
174         struct BLI_mempool *toolflagpool;
175         int stackdepth;
176         struct BMOperator *currentop;
177         
178         CustomData vdata, edata, ldata, pdata;
179
180 #ifdef USE_BMESH_HOLES
181         struct BLI_mempool *looplistpool;
182 #endif
183
184         /* should be copy of scene select mode */
185         /* stored in BMEditMesh too, this is a bit confusing,
186          * make sure they're in sync!
187          * Only use when the edit mesh cant be accessed - campbell */
188         short selectmode;
189         
190         /*ID of the shape key this bmesh came from*/
191         int shapenr;
192         
193         int walkers, totflags;
194         ListBase selected, error_stack;
195         
196         BMFace *act_face;
197
198         ListBase errorstack;
199
200         void *py_handle;
201
202         int opflag; /* current operator flag */
203 } BMesh;
204
205 /* BMHeader->htype (char) */
206 enum {
207         BM_VERT = 1,
208         BM_EDGE = 2,
209         BM_LOOP = 4,
210         BM_FACE = 8
211 };
212
213 #define BM_ALL (BM_VERT | BM_EDGE | BM_LOOP | BM_FACE)
214
215 /* BMHeader->hflag (char) */
216 enum {
217         BM_ELEM_SELECT  = (1 << 0),
218         BM_ELEM_HIDDEN  = (1 << 1),
219         BM_ELEM_SEAM    = (1 << 2),
220         BM_ELEM_SMOOTH  = (1 << 3), /* used for faces and edges, note from the user POV,
221                                  * this is a sharp edge when disabled */
222
223         BM_ELEM_TAG     = (1 << 4), /* internal flag, used for ensuring correct normals
224                                  * during multires interpolation, and any other time
225                                  * when temp tagging is handy.
226                                  * always assume dirty & clear before use. */
227
228         BM_ELEM_DRAW    = (1 << 5), /* edge display */
229
230         /* we have 1 spare flag which is awesome but since we're limited to 8
231          * only add new flags with care! - campbell */
232         /* BM_ELEM_SPARE  = (1 << 6), */
233         BM_ELEM_FREESTYLE = (1 << 6), /* used for Freestyle faces and edges */
234
235         BM_ELEM_INTERNAL_TAG = (1 << 7) /* for low level internal API tagging,
236                                      * since tools may want to tag verts and
237                                      * not have functions clobber them */
238 };
239
240 /* defines */
241
242 /*forward declarations*/
243
244 #ifdef USE_BMESH_HOLES
245 #  define BM_FACE_FIRST_LOOP(p) (((BMLoopList *)((p)->loops.first))->first)
246 #else
247 #  define BM_FACE_FIRST_LOOP(p) ((p)->l_first)
248 #endif
249
250 /* size to use for static arrays when dealing with NGons,
251  * alloc after this limit is reached.
252  * this value is rather arbitrary */
253 #define BM_NGON_STACK_SIZE 32
254
255 /* avoid inf loop, this value is arbitrary
256  * but should not error on valid cases */
257 #define BM_LOOP_RADIAL_MAX 10000
258 #define BM_NGON_MAX 100000
259
260 #endif /* __BMESH_CLASS_H__ */