Merge branch 'master' into blender2.8
[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 (where data is actually computed)
77          *          shall always be protected by same lock as one used for looptris computing. */
78         struct MLoopTri *array, *array_wip;
79         int len;
80         int len_alloc;
81 };
82
83 /* not saved in file! */
84 typedef struct Mesh_Runtime {
85         struct EditMeshData *edit_data;
86         void *batch_cache;
87
88         struct SubdivCCG *subdiv_ccg;
89         void  *pad1;
90         int subdiv_ccg_tot_level;
91         int pad2;
92
93         int64_t cd_dirty_vert;
94         int64_t cd_dirty_edge;
95         int64_t cd_dirty_loop;
96         int64_t cd_dirty_poly;
97
98         struct MLoopTri_Store looptris;
99
100         /** 'BVHCache', for 'BKE_bvhutil.c' */
101         struct LinkNode *bvh_cache;
102
103         /** Non-manifold boundary data for Shrinkwrap Target Project. */
104         struct ShrinkwrapBoundaryData *shrinkwrap_data;
105
106         /** Set by modifier stack if only deformed from original. */
107         char deformed_only;
108         /**
109          * Copied from edit-mesh (hint, draw with editmesh data).
110          * In the future we may leave the mesh-data empty
111          * since its not needed if we can use edit-mesh data. */
112         char is_original;
113         char padding[6];
114 } Mesh_Runtime;
115
116 typedef struct Mesh {
117         ID id;
118         struct AnimData *adt;           /* animation data (must be immediately after id for utilities to use it) */
119
120         struct BoundBox *bb;
121
122         struct Ipo *ipo  DNA_DEPRECATED;  /* old animation system, deprecated for 2.5 */
123         struct Key *key;
124         struct Material **mat;
125         struct MSelect *mselect;
126
127 /* BMESH ONLY */
128         /*new face structures*/
129         struct MPoly *mpoly;
130         struct MLoop *mloop;
131         struct MLoopUV *mloopuv;
132         struct MLoopCol *mloopcol;
133 /* END BMESH ONLY */
134
135         /* mface stores the tessellation (triangulation) of the mesh,
136          * real faces are now stored in nface.*/
137         struct MFace *mface;    /* array of mesh object mode faces for tessellation */
138         struct MTFace *mtface;  /* store tessellation face UV's and texture here */
139         struct TFace *tface     DNA_DEPRECATED; /* deprecated, use mtface */
140         struct MVert *mvert;    /* array of verts */
141         struct MEdge *medge;    /* array of edges */
142         struct MDeformVert *dvert;      /* deformgroup vertices */
143
144         /* array of colors for the tessellated faces, must be number of tessellated
145          * faces * 4 in length */
146         struct MCol *mcol;
147         struct Mesh *texcomesh;
148
149         /* When the object is available, the preferred access method is: BKE_editmesh_from_object(ob) */
150         struct BMEditMesh *edit_btmesh; /* not saved in file! */
151
152         struct CustomData vdata, edata, fdata;
153
154 /* BMESH ONLY */
155         struct CustomData pdata, ldata;
156 /* END BMESH ONLY */
157
158         int totvert, totedge, totface, totselect;
159
160 /* BMESH ONLY */
161         int totpoly, totloop;
162 /* END BMESH ONLY */
163
164         /* the last selected vertex/edge/face are used for the active face however
165          * this means the active face must always be selected, this is to keep track
166          * of the last selected face and is similar to the old active face flag where
167          * the face does not need to be selected, -1 is inactive */
168         int act_face;
169
170         /* texture space, copied as one block in editobject.c */
171         float loc[3];
172         float size[3];
173         float rot[3];
174
175         int drawflag;
176         short texflag, flag;
177         float smoothresh;
178         int pad2;
179
180         /* customdata flag, for bevel-weight and crease, which are now optional */
181         char cd_flag, pad;
182
183         char subdiv  DNA_DEPRECATED, subdivr  DNA_DEPRECATED;
184         char subsurftype  DNA_DEPRECATED; /* only kept for backwards compat, not used anymore */
185         char editflag;
186
187         short totcol;
188
189         struct Multires *mr DNA_DEPRECATED; /* deprecated multiresolution modeling data, only keep for loading old files */
190
191         Mesh_Runtime runtime;
192 } Mesh;
193
194 /* deprecated by MTFace, only here for file reading */
195 #ifdef DNA_DEPRECATED
196 typedef struct TFace {
197         void *tpage;    /* the faces image for the active UVLayer */
198         float uv[4][2];
199         unsigned int col[4];
200         char flag, transp;
201         short mode, tile, unwrap;
202 } TFace;
203 #endif
204
205 /* **************** MESH ********************* */
206
207 /* texflag */
208 enum {
209         ME_AUTOSPACE = 1,
210 };
211
212 /* me->editflag */
213 enum {
214         ME_EDIT_MIRROR_X       = 1 << 0,
215         ME_EDIT_MIRROR_Y       = 1 << 1,  /* unused so far */
216         ME_EDIT_MIRROR_Z       = 1 << 2,  /* unused so far */
217
218         ME_EDIT_PAINT_FACE_SEL = 1 << 3,
219         ME_EDIT_MIRROR_TOPO    = 1 << 4,
220         ME_EDIT_PAINT_VERT_SEL = 1 << 5,
221 };
222
223 /* we cant have both flags enabled at once,
224  * flags defined in DNA_scene_types.h */
225 #define ME_EDIT_PAINT_SEL_MODE(_me)  (                                        \
226         (_me->editflag & ME_EDIT_PAINT_FACE_SEL) ? SCE_SELECT_FACE :              \
227                 (_me->editflag & ME_EDIT_PAINT_VERT_SEL) ? SCE_SELECT_VERTEX :        \
228                         0                                                                 \
229         )
230
231 /* me->flag */
232 enum {
233 /*      ME_ISDONE                  = 1 << 0, */
234 /*      ME_DEPRECATED              = 1 << 1, */
235         ME_TWOSIDED                = 1 << 2,
236         ME_UVEFFECT                = 1 << 3,
237         ME_VCOLEFFECT              = 1 << 4,
238         ME_AUTOSMOOTH              = 1 << 5,
239         ME_SMESH                   = 1 << 6,
240         ME_SUBSURF                 = 1 << 7,
241         ME_OPT_EDGES               = 1 << 8,
242         ME_DS_EXPAND               = 1 << 9,
243         ME_SCULPT_DYNAMIC_TOPOLOGY = 1 << 10,
244 };
245
246 /* me->cd_flag */
247 enum {
248         ME_CDFLAG_VERT_BWEIGHT = 1 << 0,
249         ME_CDFLAG_EDGE_BWEIGHT = 1 << 1,
250         ME_CDFLAG_EDGE_CREASE  = 1 << 2,
251 };
252
253 #if 0 /* Was moved to overlay options for 2.8 */
254 /* me->drawflag, short */
255 enum {
256         ME_DRAWEDGES           = 1 << 0,
257         ME_DRAWFACES           = 1 << 1,
258         ME_DRAWNORMALS         = 1 << 2,
259         ME_DRAW_VNORMALS       = 1 << 3,
260
261         ME_DRAWEIGHT           = 1 << 4,
262         ME_DRAW_FACE_DOT       = 1 << 5,
263
264         ME_DRAWCREASES         = 1 << 6,
265         ME_DRAWSEAMS           = 1 << 7,
266         ME_DRAWSHARP           = 1 << 8,
267         ME_DRAWBWEIGHTS        = 1 << 9,
268
269         ME_DRAWEXTRA_EDGELEN   = 1 << 10,
270         ME_DRAWEXTRA_FACEAREA  = 1 << 11,
271         ME_DRAWEXTRA_FACEANG   = 1 << 12,
272         ME_DRAWEXTRA_EDGEANG   = 1 << 13,
273
274 /* debug only option */
275         ME_DRAWEXTRA_INDICES   = 1 << 14,
276
277         ME_DRAW_FREESTYLE_EDGE = 1 << 15,
278         ME_DRAW_FREESTYLE_FACE = 1 << 16,
279
280 /* draw stats */
281         ME_DRAW_STATVIS        = 1 << 17,
282
283 /* draw loop normals */
284         ME_DRAW_LNORMALS       = 1 << 18,
285 };
286 #endif
287
288 /* Subsurf Type */
289 enum {
290         ME_CC_SUBSURF      = 0,
291         ME_SIMPLE_SUBSURF  = 1,
292 };
293
294 #define MESH_MAX_VERTS 2000000000L
295
296 /* this is so we can save bmesh files that load in trunk, ignoring NGons
297  * will eventually be removed */
298
299 /* enable this so meshes get tessfaces calculated by default */
300 /* #define USE_TESSFACE_DEFAULT */
301
302 #endif