skip assigning vars for inline bmesh flag funcs, just cast.
[blender.git] / source / blender / bmesh / bmesh_class.h
1 /**
2  *  bmesh_class.h    september 2010
3  *
4  *      BMesh API.
5  *
6  * $Id: $
7  *
8  * ***** BEGIN GPL LICENSE BLOCK *****
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2
13  * of the License, or (at your option) any later version. The Blender
14  * Foundation also sells licenses for use in proprietary software under
15  * the Blender License.  See http://www.blender.org/BL/ for information
16  * about this.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software Foundation,
25  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
26  *
27  * Contributor(s): Geoffrey Bantle, Levi Schooley, Joseph Eagar.
28  *
29  * ***** END GPL LICENSE BLOCK *****
30  */
31
32 #ifndef _BMESH_CLASS_H
33 #define _BMESH_CLASS_H
34
35 /*bmesh data structures*/
36
37 #include "DNA_listBase.h"
38
39 #include "BKE_utildefines.h"
40 #include "BLI_utildefines.h"
41
42 struct BMesh;
43 struct BMVert;
44 struct BMEdge;
45 struct BMLoop;
46 struct BMFace;
47 struct BMVert;
48 struct BMEdge;
49 struct BMLoop;
50 struct BMFace;
51 struct BMLayerType;
52 struct BMSubClassLayer;
53 struct BMFlagLayer;
54 struct BLI_mempool;
55 struct Object;
56
57 /*note: it is very important for BMHeader to start with two
58   pointers. this is a requirement of mempool's method of
59   iteration.
60 */
61 typedef struct BMHeader {
62         void *data; /*customdata layers*/
63         struct BMFlagLayer *flags;
64         short type; /*element geometric type (verts/edges/loops/faces)*/
65         short flag; /*this would be a CD layer, see below*/
66         int index; /*note: use BM_GetIndex/SetIndex macros for index*/
67 } BMHeader;
68
69 /*note: need some way to specify custom locations for custom data layers.  so we can
70 make them point directly into structs.  and some way to make it only happen to the
71 active layer, and properly update when switching active layers.*/
72
73 typedef struct BMVert {
74         BMHeader head;
75         float co[3];
76         float no[3];
77         struct BMEdge *e;
78 } BMVert;
79
80 typedef struct BMEdge {
81         BMHeader head;
82         struct BMVert *v1, *v2;
83         struct BMLoop *l;
84         
85         /*disk cycle pointers*/
86         struct {
87                 struct BMEdge *next, *prev;
88         } dlink1;
89         struct {
90                 struct BMEdge *next, *prev;
91         } dlink2;
92 } BMEdge;
93
94 typedef struct BMLoop {
95         BMHeader head;
96         struct BMVert *v;
97         struct BMEdge *e;
98         struct BMFace *f;
99
100         struct BMLoop *radial_next, *radial_prev;
101         
102         /*private variables*/
103         struct BMLoop *next, *prev; /*won't be able to use listbase API, ger, due to head*/\
104         int _index; /*used for sorting during tesselation*/
105 } BMLoop;
106
107 typedef struct BMLoopList {
108         struct BMLoopList *next, *prev;
109         struct BMLoop *first, *last;
110 } BMLoopList;
111
112 typedef struct BMFace {
113         BMHeader head;
114         int len; /*includes all boundary loops*/\
115         int totbounds; /*total boundaries, is one plus the number of holes in the face*/\
116         ListBase loops;
117         float no[3]; /*yes, we do store this here*/\
118         short mat_nr;
119 } BMFace;
120
121 typedef struct BMFlagLayer {
122         short f, pflag; /*flags*/
123         int index; /*generic index*/
124 } BMFlagLayer;
125
126 typedef struct BMesh {
127         int totvert, totedge, totloop, totface;
128         int totvertsel, totedgesel, totfacesel;
129         
130         /*element pools*/
131         struct BLI_mempool *vpool, *epool, *lpool, *fpool;
132
133         /*operator api stuff*/
134         struct BLI_mempool *toolflagpool;
135         int stackdepth;
136         struct BMOperator *currentop;
137         
138         CustomData vdata, edata, ldata, pdata;
139
140         struct BLI_mempool *looplistpool;
141         
142         /*should be copy of scene select mode*/
143         int selectmode;
144         
145         /*ID of the shape key this bmesh came from*/
146         int shapenr;
147         
148         int walkers, totflags;
149         ListBase selected, error_stack;
150         
151         BMFace *act_face;
152
153         ListBase errorstack;
154         struct Object *ob; /*owner object*/
155         
156         int opflag; /*current operator flag*/
157 } BMesh;
158
159 BMFace *BM_Copy_Face(BMesh *bm, BMFace *f, int copyedges, int copyverts);
160
161 #define BM_VERT         1
162 #define BM_EDGE         2
163 #define BM_LOOP         4
164 #define BM_FACE         8
165
166 #endif /* _BMESH_CLASS_H */