Merge branch 'blender2.7'
[blender.git] / source / blender / makesdna / DNA_mesh_types.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  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file DNA_mesh_types.h
29  *  \ingroup DNA
30  */
31
32 #ifndef __DNA_MESH_TYPES_H__
33 #define __DNA_MESH_TYPES_H__
34
35 #include "DNA_defs.h"
36 #include "DNA_ID.h"
37 #include "DNA_customdata_types.h"
38
39 struct AnimData;
40 struct Ipo;
41 struct Key;
42 struct LinkNode;
43 struct MCol;
44 struct MEdge;
45 struct MFace;
46 struct MLoop;
47 struct MLoopCol;
48 struct MLoopTri;
49 struct MLoopUV;
50 struct MPoly;
51 struct MTexPoly;
52 struct MVert;
53 struct Material;
54 struct Mesh;
55 struct Multires;
56 struct SubdivCCG;
57
58 #
59 #
60 typedef struct EditMeshData {
61         /** when set, \a vertexNos, polyNos are lazy initialized */
62         const float (*vertexCos)[3];
63
64         /** lazy initialize (when \a vertexCos is set) */
65         float const (*vertexNos)[3];
66         float const (*polyNos)[3];
67         /** also lazy init but dont depend on \a vertexCos */
68         const float (*polyCos)[3];
69 } EditMeshData;
70
71
72 /**
73  * \warning Typical access is done via #BKE_mesh_runtime_looptri_ensure, #BKE_mesh_runtime_looptri_len.
74  */
75 struct MLoopTri_Store {
76         /* WARNING! swapping between array (ready-to-be-used data) and array_wip
77          * (where data is actually computed)
78          * shall always be protected by same lock as one used for looptris computing. */
79         struct MLoopTri *array, *array_wip;
80         int len;
81         int len_alloc;
82 };
83
84 /* not saved in file! */
85 typedef struct Mesh_Runtime {
86         struct EditMeshData *edit_data;
87         void *batch_cache;
88
89         struct SubdivCCG *subdiv_ccg;
90         void  *pad1;
91         int subdiv_ccg_tot_level;
92         int pad2;
93
94         int64_t cd_dirty_vert;
95         int64_t cd_dirty_edge;
96         int64_t cd_dirty_loop;
97         int64_t cd_dirty_poly;
98
99         struct MLoopTri_Store looptris;
100
101         /** 'BVHCache', for 'BKE_bvhutil.c' */
102         struct LinkNode *bvh_cache;
103
104         /** Non-manifold boundary data for Shrinkwrap Target Project. */
105         struct ShrinkwrapBoundaryData *shrinkwrap_data;
106
107         /** Set by modifier stack if only deformed from original. */
108         char deformed_only;
109         /**
110          * Copied from edit-mesh (hint, draw with editmesh data).
111          * In the future we may leave the mesh-data empty
112          * since its not needed if we can use edit-mesh data. */
113         char is_original;
114         char padding[6];
115 } Mesh_Runtime;
116
117 typedef struct Mesh {
118         ID id;
119         /** Animation data (must be immediately after id for utilities to use it). */
120         struct AnimData *adt;
121
122         struct BoundBox *bb;
123
124         /** Old animation system, deprecated for 2.5. */
125         struct Ipo *ipo  DNA_DEPRECATED;
126         struct Key *key;
127         struct Material **mat;
128         struct MSelect *mselect;
129
130 /* BMESH ONLY */
131         /*new face structures*/
132         struct MPoly *mpoly;
133         struct MLoop *mloop;
134         struct MLoopUV *mloopuv;
135         struct MLoopCol *mloopcol;
136 /* END BMESH ONLY */
137
138         /* mface stores the tessellation (triangulation) of the mesh,
139          * real faces are now stored in nface.*/
140         /** Array of mesh object mode faces for tessellation. */
141         struct MFace *mface;
142         /** Store tessellation face UV's and texture here. */
143         struct MTFace *mtface;
144         /** Deprecated, use mtface. */
145         struct TFace *tface     DNA_DEPRECATED;
146         /** Array of verts. */
147         struct MVert *mvert;
148         /** Array of edges. */
149         struct MEdge *medge;
150         /** Deformgroup vertices. */
151         struct MDeformVert *dvert;
152
153         /* array of colors for the tessellated faces, must be number of tessellated
154          * faces * 4 in length */
155         struct MCol *mcol;
156         struct Mesh *texcomesh;
157
158         /* When the object is available, the preferred access method is: BKE_editmesh_from_object(ob) */
159         /** Not saved in file!. */
160         struct BMEditMesh *edit_btmesh;
161
162         struct CustomData vdata, edata, fdata;
163
164 /* BMESH ONLY */
165         struct CustomData pdata, ldata;
166 /* END BMESH ONLY */
167
168         int totvert, totedge, totface, totselect;
169
170 /* BMESH ONLY */
171         int totpoly, totloop;
172 /* END BMESH ONLY */
173
174         /* the last selected vertex/edge/face are used for the active face however
175          * this means the active face must always be selected, this is to keep track
176          * of the last selected face and is similar to the old active face flag where
177          * the face does not need to be selected, -1 is inactive */
178         int act_face;
179
180         /* texture space, copied as one block in editobject.c */
181         float loc[3];
182         float size[3];
183         float rot[3];
184
185         short texflag, flag;
186         float smoothresh;
187
188         /* customdata flag, for bevel-weight and crease, which are now optional */
189         char cd_flag, pad;
190
191         char subdiv  DNA_DEPRECATED, subdivr  DNA_DEPRECATED;
192         /** Only kept for backwards compat, not used anymore. */
193         char subsurftype  DNA_DEPRECATED;
194         char editflag;
195
196         short totcol;
197
198         /** Deprecated multiresolution modeling data, only keep for loading old files. */
199         struct Multires *mr DNA_DEPRECATED;
200
201         Mesh_Runtime runtime;
202 } Mesh;
203
204 /* deprecated by MTFace, only here for file reading */
205 #ifdef DNA_DEPRECATED
206 typedef struct TFace {
207         /** The faces image for the active UVLayer. */
208         void *tpage;
209         float uv[4][2];
210         unsigned int col[4];
211         char flag, transp;
212         short mode, tile, unwrap;
213 } TFace;
214 #endif
215
216 /* **************** MESH ********************* */
217
218 /* texflag */
219 enum {
220         ME_AUTOSPACE = 1,
221 };
222
223 /* me->editflag */
224 enum {
225         ME_EDIT_MIRROR_X       = 1 << 0,
226         ME_EDIT_MIRROR_Y       = 1 << 1,  /* unused so far */
227         ME_EDIT_MIRROR_Z       = 1 << 2,  /* unused so far */
228
229         ME_EDIT_PAINT_FACE_SEL = 1 << 3,
230         ME_EDIT_MIRROR_TOPO    = 1 << 4,
231         ME_EDIT_PAINT_VERT_SEL = 1 << 5,
232 };
233
234 /* we cant have both flags enabled at once,
235  * flags defined in DNA_scene_types.h */
236 #define ME_EDIT_PAINT_SEL_MODE(_me)  (                                        \
237         (_me->editflag & ME_EDIT_PAINT_FACE_SEL) ? SCE_SELECT_FACE :              \
238                 (_me->editflag & ME_EDIT_PAINT_VERT_SEL) ? SCE_SELECT_VERTEX :        \
239                         0                                                                 \
240         )
241
242 /* me->flag */
243 enum {
244         ME_FLAG_DEPRECATED_0       = 1 << 0,  /* cleared */
245         ME_FLAG_DEPRECATED_1       = 1 << 1,  /* cleared */
246         ME_TWOSIDED                = 1 << 2,
247         ME_FLAG_DEPRECATED_3       = 1 << 3,  /* cleared */
248         ME_FLAG_DEPRECATED_4       = 1 << 4,  /* cleared */
249         ME_AUTOSMOOTH              = 1 << 5,
250         ME_FLAG_DEPRECATED_6       = 1 << 6,  /* cleared */
251         ME_FLAG_DEPRECATED_7       = 1 << 7,  /* cleared */
252         ME_FLAG_DEPRECATED_8       = 1 << 8,  /* cleared */
253         ME_DS_EXPAND               = 1 << 9,
254         ME_SCULPT_DYNAMIC_TOPOLOGY = 1 << 10,
255 };
256
257 /* me->cd_flag */
258 enum {
259         ME_CDFLAG_VERT_BWEIGHT = 1 << 0,
260         ME_CDFLAG_EDGE_BWEIGHT = 1 << 1,
261         ME_CDFLAG_EDGE_CREASE  = 1 << 2,
262 };
263
264 /* Subsurf Type */
265 enum {
266         ME_CC_SUBSURF      = 0,
267         ME_SIMPLE_SUBSURF  = 1,
268 };
269
270 #define MESH_MAX_VERTS 2000000000L
271
272 /* this is so we can save bmesh files that load in trunk, ignoring NGons
273  * will eventually be removed */
274
275 /* enable this so meshes get tessfaces calculated by default */
276 /* #define USE_TESSFACE_DEFAULT */
277
278 #endif