6c052a402c9067fc0873852c43662f76fb028386
[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 struct BMFlagLayer;
41 struct BMLayerType;
42 struct BMSubClassLayer;
43
44 struct BLI_mempool;
45 struct Object;
46
47 /*note: it is very important for BMHeader to start with two
48   pointers. this is a requirement of mempool's method of
49   iteration.
50 */
51 typedef struct BMHeader {
52         void *data; /* customdata layers */
53         int index; /* notes:
54                     * - Use BM_elem_index_get/SetIndex macros for index
55                     * - Unitialized to -1 so we can easily tell its not set.
56                     * - Used for edge/vert/face, check BMesh.elem_index_dirty for valid index values,
57                     *   this is abused by various tools which set it dirty.
58                     * - For loops this is used for sorting during tesselation. */
59
60         char htype; /* element geometric type (verts/edges/loops/faces) */
61         char hflag; /* this would be a CD layer, see below */
62 } BMHeader;
63
64 /* note: need some way to specify custom locations for custom data layers.  so we can
65  * make them point directly into structs.  and some way to make it only happen to the
66  * active layer, and properly update when switching active layers.*/
67
68 typedef struct BMVert {
69         BMHeader head;
70         struct BMFlagLayer *oflags; /* keep after header, an array of flags, mostly used by the operator stack */
71
72         float co[3];
73         float no[3];
74         struct BMEdge *e;
75 } BMVert;
76
77 /* disk link structure, only used by edges */
78 typedef struct BMDiskLink {
79         struct BMEdge *next, *prev;
80 } BMDiskLink;
81
82 typedef struct BMEdge {
83         BMHeader head;
84         struct BMFlagLayer *oflags; /* keep after header, an array of flags, mostly used by the operator stack */
85
86         struct BMVert *v1, *v2;
87         struct BMLoop *l;
88         
89         /* disk cycle pointers */
90         BMDiskLink v1_disk_link, v2_disk_link;
91 } BMEdge;
92
93 typedef struct BMLoop {
94         BMHeader head;
95         /* notice no flags layer */
96
97         struct BMVert *v;
98         struct BMEdge *e;
99         struct BMFace *f;
100
101         struct BMLoop *radial_next, *radial_prev;
102         
103         /* these were originally commented as private but are used all over the code */
104         /* can't use ListBase API, due to head */
105         struct BMLoop *next, *prev;
106 } BMLoop;
107
108 /* can cast BMFace/BMEdge/BMVert, but NOT BMLoop, since these dont have a flag layer */
109 typedef struct BMElemF {
110         BMHeader head;
111         struct BMFlagLayer *oflags; /* keep after header, an array of flags, mostly used by the operator stack */
112 } BMElemF;
113
114 #ifdef USE_BMESH_HOLES
115 /* eventually, this structure will be used for supporting holes in faces */
116 typedef struct BMLoopList {
117         struct BMLoopList *next, *prev;
118         struct BMLoop *first, *last;
119 } BMLoopList;
120 #endif
121
122 typedef struct BMFace {
123         BMHeader head;
124         struct BMFlagLayer *oflags; /* an array of flags, mostly used by the operator stack */
125
126         int len; /*includes all boundary loops*/
127 #ifdef USE_BMESH_HOLES
128         int totbounds; /*total boundaries, is one plus the number of holes in the face*/
129         ListBase loops;
130 #else
131         BMLoop *l_first;
132 #endif
133         float no[3]; /*yes, we do store this here*/
134         short mat_nr;
135 } BMFace;
136
137 typedef struct BMFlagLayer {
138         short f, pflag; /* flags */
139 } BMFlagLayer;
140
141 typedef struct BMesh {
142         int totvert, totedge, totloop, totface;
143         int totvertsel, totedgesel, totfacesel;
144
145         /* flag index arrays as being dirty so we can check if they are clean and
146          * avoid looping over the entire vert/edge/face array in those cases.
147          * valid flags are - BM_VERT | BM_EDGE | BM_FACE.
148          * BM_LOOP isnt handled so far. */
149         char elem_index_dirty;
150         
151         /*element pools*/
152         struct BLI_mempool *vpool, *epool, *lpool, *fpool;
153
154         /*operator api stuff*/
155         struct BLI_mempool *toolflagpool;
156         int stackdepth;
157         struct BMOperator *currentop;
158         
159         CustomData vdata, edata, ldata, pdata;
160
161 #ifdef USE_BMESH_HOLES
162         struct BLI_mempool *looplistpool;
163 #endif
164
165         /* should be copy of scene select mode */
166         /* stored in BMEditMesh too, this is a bit confusing,
167          * make sure the're in sync!
168          * Only use when the edit mesh cant be accessed - campbell */
169         short selectmode;
170         
171         /*ID of the shape key this bmesh came from*/
172         int shapenr;
173         
174         int walkers, totflags;
175         ListBase selected, error_stack;
176         
177         BMFace *act_face;
178
179         ListBase errorstack;
180         struct Object *ob; /* owner object */
181         
182         void *py_handle;
183
184         int opflag; /* current operator flag */
185 } BMesh;
186
187 #define BM_VERT         1
188 #define BM_EDGE         2
189 #define BM_LOOP         4
190 #define BM_FACE         8
191
192 #endif /* __BMESH_CLASS_H__ */