Merged changes in the trunk up to revision 51718.
[blender.git] / source / blender / makesdna / DNA_meshdata_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_meshdata_types.h
29  *  \ingroup DNA
30  */
31
32 #ifndef __DNA_MESHDATA_TYPES_H__
33 #define __DNA_MESHDATA_TYPES_H__
34
35 #include "DNA_customdata_types.h"
36 #include "DNA_listBase.h"
37
38 struct Bone;
39 struct Image;
40
41 /*tessellation face, see MLoop/MPoly for the real face data*/
42 typedef struct MFace {
43         unsigned int v1, v2, v3, v4;
44         short mat_nr;
45         char edcode, flag;      /* we keep edcode, for conversion to edges draw flags in old files */
46 } MFace;
47
48 typedef struct MEdge {
49         unsigned int v1, v2;
50         char crease, bweight;
51         short flag;
52 } MEdge;
53
54 typedef struct MDeformWeight {
55         int                             def_nr;
56         float                   weight;
57 } MDeformWeight;
58
59 typedef struct MDeformVert {
60         struct MDeformWeight *dw;
61         int totweight;
62         int flag;       /* flag only in use for weightpaint now */
63 } MDeformVert;
64
65 typedef struct MVert {
66         float   co[3];
67         short   no[3];
68         char flag, bweight;
69 } MVert;
70
71 /* tessellation vertex color data.
72  * at the moment alpha is abused for vertex painting
73  * and not used for transparency, note that red and blue are swapped */
74 typedef struct MCol {
75         char a, r, g, b;
76 } MCol;
77
78 /* new face structure, replaces MFace, which is now
79  * only used for storing tessellations.*/
80 typedef struct MPoly {
81         /* offset into loop array and number of loops in the face */
82         int loopstart;
83         int totloop; /* keep signed since we need to subtract when getting the previous loop */
84         short mat_nr;
85         char flag, pad;
86 } MPoly;
87
88 /* the e here is because we want to move away from
89  * relying on edge hashes.*/
90 typedef struct MLoop {
91         unsigned int v; /*vertex index*/
92         unsigned int e; /*edge index*/
93 } MLoop;
94
95 typedef struct MTexPoly {
96         struct Image *tpage;
97         char flag, transp;
98         short mode, tile, pad;
99 } MTexPoly;
100
101 /* can copy from/to MTexPoly/MTFace */
102 #define ME_MTEXFACE_CPY(dst, src)   \
103 {                                   \
104         (dst)->tpage  = (src)->tpage;   \
105         (dst)->flag   = (src)->flag;    \
106         (dst)->transp = (src)->transp;  \
107         (dst)->mode   = (src)->mode;    \
108         (dst)->tile   = (src)->tile;    \
109 } (void)0
110
111 typedef struct MLoopUV {
112         float uv[2];
113         int flag;
114 } MLoopUV;
115
116 /*mloopuv->flag*/
117 #define MLOOPUV_EDGESEL 1
118 #define MLOOPUV_VERTSEL 2
119 #define MLOOPUV_PINNED  4
120
121 /* at the moment alpha is abused for vertex painting
122  * and not used for transparency,
123  * note that red and blue are _not_ swapped, as they are with #MCol */
124 typedef struct MLoopCol {
125         char r, g, b, a;
126 } MLoopCol;
127
128 #define MESH_MLOOPCOL_FROM_MCOL(_mloopcol, _mcol) \
129 {                                                 \
130         MLoopCol   *mloopcol__tmp = _mloopcol;        \
131         const MCol *mcol__tmp     = _mcol;            \
132         mloopcol__tmp->r = mcol__tmp->b;              \
133         mloopcol__tmp->g = mcol__tmp->g;              \
134         mloopcol__tmp->b = mcol__tmp->r;              \
135         mloopcol__tmp->a = mcol__tmp->a;              \
136 } (void)0
137
138
139 #define MESH_MLOOPCOL_TO_MCOL(_mloopcol, _mcol) \
140 {                                               \
141         const MLoopCol *mloopcol__tmp = _mloopcol;  \
142         MCol           *mcol__tmp     = _mcol;      \
143         mcol__tmp->b = mloopcol__tmp->r;            \
144         mcol__tmp->g = mloopcol__tmp->g;            \
145         mcol__tmp->r = mloopcol__tmp->b;            \
146         mcol__tmp->a = mloopcol__tmp->a;            \
147 } (void)0
148
149 typedef struct MSelect {
150         int index;
151         int type;  /* ME_VSEL/ME_ESEL/ME_FSEL */
152 } MSelect;
153
154 /*tessellation uv face data*/
155 typedef struct MTFace {
156         float uv[4][2];
157         struct Image *tpage;
158         char flag, transp;
159         short mode, tile, unwrap;
160 } MTFace;
161
162 /*Custom Data Properties*/
163 typedef struct MFloatProperty {
164         float   f;
165 } MFloatProperty;
166 typedef struct MIntProperty {
167         int             i;
168 } MIntProperty;
169 typedef struct MStringProperty {
170         char    s[256];
171 } MStringProperty;
172
173 typedef struct OrigSpaceFace {
174         float uv[4][2];
175 } OrigSpaceFace;
176
177 typedef struct OrigSpaceLoop {
178         float uv[2];
179 } OrigSpaceLoop;
180
181 typedef struct MDisps {
182         /* Strange bug in SDNA: if disps pointer comes first, it fails to see totdisp */
183         int totdisp;
184         int level;
185         float (*disps)[3];
186         
187         /* Used for hiding parts of a multires mesh. Essentially the multires
188          * equivalent of MVert.flag's ME_HIDE bit.
189          *
190          * This is a bitmap, keep in sync with type used in BLI_bitmap.h */
191         unsigned int *hidden;
192 } MDisps;
193
194 /** Multires structs kept for compatibility with old files **/
195 typedef struct MultiresCol {
196         float a, r, g, b;
197 } MultiresCol;
198 typedef struct MultiresColFace {
199         /* vertex colors */
200         MultiresCol col[4];
201 } MultiresColFace;
202 typedef struct MultiresFace {
203         unsigned int v[4];
204         unsigned int mid;
205         char flag, mat_nr, pad[2];
206 } MultiresFace;
207 typedef struct MultiresEdge {
208         unsigned int v[2];
209         unsigned int mid;
210 } MultiresEdge;
211
212 struct MultiresMapNode;
213 typedef struct MultiresLevel {
214         struct MultiresLevel *next, *prev;
215
216         MultiresFace *faces;
217         MultiresColFace *colfaces;
218         MultiresEdge *edges;
219
220         unsigned int totvert, totface, totedge, pad;
221
222         /* Kept for compatibility with even older files */
223         MVert *verts;
224 } MultiresLevel;
225
226 typedef struct Multires {
227         ListBase levels;
228         MVert *verts;
229
230         unsigned char level_count, current, newlvl, edgelvl, pinlvl, renderlvl;
231         unsigned char use_col, flag;
232
233         /* Special level 1 data that cannot be modified from other levels */
234         CustomData vdata;
235         CustomData fdata;
236         short *edge_flags;
237         char *edge_creases;
238 } Multires;
239
240 /** End Multires **/
241
242 typedef struct MRecast {
243         int             i;
244 } MRecast;
245
246 typedef struct GridPaintMask {
247         /* The data array contains gridsize*gridsize elements */
248         float *data;
249
250         /* The maximum multires level associated with this grid */
251         unsigned int level;
252
253         int pad;
254 } GridPaintMask;
255
256 typedef enum MVertSkinFlag {
257         /* Marks a vertex as the edge-graph root, used for calculating
258          * rotations for all connected edges (recursively.) Also used to
259          * choose a root when generating an armature. */
260         MVERT_SKIN_ROOT = 1,
261
262         /* Marks a branch vertex (vertex with more than two connected
263          * edges) so that it's neighbors are directly hulled together,
264          * rather than the default of generating intermediate frames. */
265         MVERT_SKIN_LOOSE = 2
266 } MVertSkinFlag;
267
268 typedef struct MVertSkin {
269         /* Radii of the skin, define how big the generated frames
270          * are. Currently only the first two elements are used. */
271         float radius[3];
272
273         /* MVertSkinFlag */
274         int flag;
275 } MVertSkin;
276
277 /* mvert->flag (1=SELECT) */
278 #define ME_SPHERETEST           2
279 #define ME_VERT_TMP_TAG         4
280 #define ME_HIDE                         16
281 #define ME_VERT_MERGED          (1<<6)
282 #define ME_VERT_PBVH_UPDATE     (1<<7)
283
284 /* medge->flag (1=SELECT)*/
285 #define ME_EDGEDRAW                     (1<<1)
286 #define ME_SEAM                         (1<<2)
287 #define ME_FGON                         (1<<3) /* no longer used (now we have ngons), only defined so we can clear it */
288                                                 /* reserve 16 for ME_HIDE */
289 #define ME_EDGERENDER           (1<<5)
290 #define ME_LOOSEEDGE            (1<<7)
291 /* #define ME_SEAM_LAST         (1<<8) */ /* UNUSED */
292 #define ME_SHARP                        (1<<9)    /* only reason this flag remains a 'short' */
293 #define ME_FREESTYLE_EDGE       (1<<10)
294
295 /* puno = vertexnormal (mface) */
296 #define ME_PROJXY               16
297 #define ME_PROJXZ               32
298 #define ME_PROJYZ               64
299
300 /* edcode (mface) */
301 #define ME_V1V2                 1
302 #define ME_V2V3                 2
303 #define ME_V3V1                 4
304 #define ME_V3V4                 4
305 #define ME_V4V1                 8
306
307 /* flag (mface) */
308 #define ME_SMOOTH                       1
309 #define ME_FACE_SEL                     2
310 #define ME_FREESTYLE_FACE       4
311 /* flag ME_HIDE==16 is used here too */ 
312
313 #define ME_POLY_LOOP_PREV(mloop, mp, i)  (&(mloop)[(mp)->loopstart + (((i) + (mp)->totloop - 1) % (mp)->totloop)])
314 #define ME_POLY_LOOP_NEXT(mloop, mp, i)  (&(mloop)[(mp)->loopstart + (((i) + 1) % (mp)->totloop)])
315
316 /* mselect->type */
317 #define ME_VSEL 0
318 #define ME_ESEL 1
319 #define ME_FSEL 2
320
321 /* mtface->flag */
322 #define TF_SELECT       1 /* use MFace hide flag (after 2.43), should be able to reuse after 2.44 */
323 #define TF_ACTIVE       2 /* deprecated! */
324 #define TF_SEL1         4
325 #define TF_SEL2         8
326 #define TF_SEL3         16
327 #define TF_SEL4         32
328
329 /* mtface->mode */
330 #define TF_DYNAMIC              1
331 #define TF_ALPHASORT    2
332 #define TF_TEX                  4
333 #define TF_SHAREDVERT   8
334 #define TF_LIGHT                16
335
336 #define TF_CONVERTED 32 /* tface converted to material */
337
338 #define TF_SHAREDCOL    64
339 #define TF_TILES                128             /* deprecated */
340 #define TF_BILLBOARD    256
341 #define TF_TWOSIDE              512
342 #define TF_INVISIBLE    1024
343
344 #define TF_OBCOL                2048
345 #define TF_BILLBOARD2   4096    /* with Z axis constraint */
346 #define TF_SHADOW               8192
347 #define TF_BMFONT               16384
348
349 /* mtface->transp, values 1-4 are used as flags in the GL, WARNING, TF_SUB cant work with this */
350 #define TF_SOLID        0
351 #define TF_ADD          1
352 #define TF_ALPHA        2
353 #define TF_CLIP         4 /* clipmap alpha/binary alpha all or nothing! */
354
355 /* sub is not available in the user interface anymore */
356 #define TF_SUB          3
357
358
359 /* mtface->unwrap */
360 #define TF_DEPRECATED1     1
361 #define TF_DEPRECATED2     2
362 #define TF_DEPRECATED3     4
363 #define TF_DEPRECATED4     8
364 #define TF_PIN1            16
365 #define TF_PIN2            32
366 #define TF_PIN3                64
367 #define TF_PIN4            128
368
369 #endif