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