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