Merge from trunk
[blender.git] / source / blender / makesdna / DNA_modifier_types.h
1 /**
2  * $Id$ 
3  */
4
5 #ifndef DNA_MODIFIER_TYPES_H
6 #define DNA_MODIFIER_TYPES_H
7
8 #define MODSTACK_DEBUG 1
9
10 /* WARNING ALERT! TYPEDEF VALUES ARE WRITTEN IN FILES! SO DO NOT CHANGE! */
11
12 typedef enum ModifierType {
13         eModifierType_None = 0,
14         eModifierType_Subsurf,
15         eModifierType_Lattice,
16         eModifierType_Curve,
17         eModifierType_Build,
18         eModifierType_Mirror,
19         eModifierType_Decimate,
20         eModifierType_Wave,
21         eModifierType_Armature,
22         eModifierType_Hook,
23         eModifierType_Softbody,
24         eModifierType_Boolean,
25         eModifierType_Array,
26         eModifierType_EdgeSplit,
27         eModifierType_Displace,
28         eModifierType_UVProject,
29         eModifierType_Smooth,
30         eModifierType_Cast,
31         eModifierType_MeshDeform,
32         eModifierType_ParticleSystem,
33         eModifierType_ParticleInstance,
34         eModifierType_Explode,
35         eModifierType_Cloth,
36         eModifierType_Collision,
37         eModifierType_Bevel,
38         eModifierType_Shrinkwrap,
39         NUM_MODIFIER_TYPES
40 } ModifierType;
41
42 typedef enum ModifierMode {
43         eModifierMode_Realtime = (1<<0),
44         eModifierMode_Render = (1<<1),
45         eModifierMode_Editmode = (1<<2),
46         eModifierMode_OnCage = (1<<3),
47         eModifierMode_Expanded = (1<<4),
48         eModifierMode_Virtual = (1<<5),
49         eModifierMode_DisableTemporary = (1 << 31)
50 } ModifierMode;
51
52 typedef struct ModifierData {
53         struct ModifierData *next, *prev;
54
55         int type, mode;
56         char name[32];
57
58         char *error;
59 } ModifierData;
60
61 typedef enum {
62         eSubsurfModifierFlag_Incremental = (1<<0),
63         eSubsurfModifierFlag_DebugIncr = (1<<1),
64         eSubsurfModifierFlag_ControlEdges = (1<<2),
65         eSubsurfModifierFlag_SubsurfUv = (1<<3)
66 } SubsurfModifierFlag;
67
68 typedef struct SubsurfModifierData {
69         ModifierData modifier;
70
71         short subdivType, levels, renderLevels, flags;
72
73         void *emCache, *mCache;
74 } SubsurfModifierData;
75
76 typedef struct LatticeModifierData {
77         ModifierData modifier;
78
79         struct Object *object;
80         char name[32];                  /* optional vertexgroup name */
81 } LatticeModifierData;
82
83 typedef struct CurveModifierData {
84         ModifierData modifier;
85
86         struct Object *object;
87         char name[32];                  /* optional vertexgroup name */
88         short defaxis;                  /* axis along which curve deforms */
89         char pad[6];
90 } CurveModifierData;
91
92 /* CurveModifierData->defaxis */
93 #define MOD_CURVE_POSX  1
94 #define MOD_CURVE_POSY  2
95 #define MOD_CURVE_POSZ  3
96 #define MOD_CURVE_NEGX  4
97 #define MOD_CURVE_NEGY  5
98 #define MOD_CURVE_NEGZ  6
99
100 typedef struct BuildModifierData {
101         ModifierData modifier;
102
103         float start, length;
104         int randomize, seed;
105 } BuildModifierData;
106
107 typedef struct ArrayModifierData {
108         ModifierData modifier;
109
110         /* the object with which to cap the start of the array  */
111         struct Object *start_cap;
112         /* the object with which to cap the end of the array  */
113         struct Object *end_cap;
114         /* the curve object to use for MOD_ARR_FITCURVE */
115         struct Object *curve_ob;
116         /* the object to use for object offset */
117         struct Object *offset_ob;
118         /* a constant duplicate offset;
119            1 means the duplicates are 1 unit apart
120     */
121         float offset[3];
122         /* a scaled factor for duplicate offsets;
123            1 means the duplicates are 1 object-width apart
124     */
125         float scale[3];
126         /* the length over which to distribute the duplicates */
127         float length;
128         /* the limit below which to merge vertices in adjacent duplicates */
129         float merge_dist;
130         /* determines how duplicate count is calculated; one of:
131               MOD_ARR_FIXEDCOUNT -> fixed
132               MOD_ARR_FITLENGTH  -> calculated to fit a set length
133               MOD_ARR_FITCURVE   -> calculated to fit the length of a Curve object
134     */
135         int fit_type;
136         /* flags specifying how total offset is calculated; binary OR of:
137              MOD_ARR_OFF_CONST    -> total offset += offset
138              MOD_ARR_OFF_RELATIVE -> total offset += relative * object width
139              MOD_ARR_OFF_OBJ      -> total offset += offset_ob's matrix
140            total offset is the sum of the individual enabled offsets
141         */
142         int offset_type;
143         /* general flags:
144               MOD_ARR_MERGE -> merge vertices in adjacent duplicates
145         */
146         int flags;
147         /* the number of duplicates to generate for MOD_ARR_FIXEDCOUNT */
148         int count;
149 } ArrayModifierData;
150
151 /* ArrayModifierData->fit_type */
152 #define MOD_ARR_FIXEDCOUNT 0
153 #define MOD_ARR_FITLENGTH  1
154 #define MOD_ARR_FITCURVE   2
155
156 /* ArrayModifierData->offset_type */
157 #define MOD_ARR_OFF_CONST    1<<0
158 #define MOD_ARR_OFF_RELATIVE 1<<1
159 #define MOD_ARR_OFF_OBJ      1<<2
160
161 /* ArrayModifierData->flags */
162 #define MOD_ARR_MERGE      1<<0
163 #define MOD_ARR_MERGEFINAL 1<<1
164
165 typedef struct MirrorModifierData {
166         ModifierData modifier;
167
168         short axis, flag;
169         float tolerance;
170         struct Object *mirror_ob;
171 } MirrorModifierData;
172
173 /* MirrorModifierData->flag */
174 #define MOD_MIR_CLIPPING        1<<0
175 #define MOD_MIR_MIRROR_U        1<<1
176 #define MOD_MIR_MIRROR_V        1<<2
177 #define MOD_MIR_AXIS_X          1<<3
178 #define MOD_MIR_AXIS_Y          1<<4
179 #define MOD_MIR_AXIS_Z          1<<5
180
181 typedef struct EdgeSplitModifierData {
182         ModifierData modifier;
183
184         float split_angle;    /* angle above which edges should be split */
185         int flags;
186 } EdgeSplitModifierData;
187
188 /* EdgeSplitModifierData->flags */
189 #define MOD_EDGESPLIT_FROMANGLE   1<<1
190 #define MOD_EDGESPLIT_FROMFLAG    1<<2
191
192 typedef struct BevelModifierData {
193         ModifierData modifier;
194
195         float value;          /* the "raw" bevel value (distance/amount to bevel) */
196         int res;              /* the resolution (as originally coded, it is the number of recursive bevels) */
197         int pad;
198         short flags;          /* general option flags */
199         short val_flags;      /* flags used to interpret the bevel value */
200         short lim_flags;      /* flags to tell the tool how to limit the bevel */
201         short e_flags;        /* flags to direct how edge weights are applied to verts */
202         float bevel_angle;    /* if the BME_BEVEL_ANGLE is set, this will be how "sharp" an edge must be before it gets beveled */
203         char defgrp_name[32]; /* if the BME_BEVEL_VWEIGHT option is set, this will be the name of the vert group */
204 } BevelModifierData;
205
206 typedef struct BMeshModifierData {
207         ModifierData modifier;
208
209         float pad;
210         int type;
211 } BMeshModifierData;
212
213 typedef struct DisplaceModifierData {
214         ModifierData modifier;
215
216         struct Tex *texture;
217         float strength;
218         int direction;
219         char defgrp_name[32];
220         float midlevel;
221         int texmapping;
222         struct Object *map_object;
223         char uvlayer_name[32];
224         int uvlayer_tmp, pad;
225 } DisplaceModifierData;
226
227 /* DisplaceModifierData->direction */
228 enum {
229         MOD_DISP_DIR_X,
230         MOD_DISP_DIR_Y,
231         MOD_DISP_DIR_Z,
232         MOD_DISP_DIR_NOR,
233         MOD_DISP_DIR_RGB_XYZ,
234 };
235
236 /* DisplaceModifierData->texmapping */
237 enum {
238         MOD_DISP_MAP_LOCAL,
239         MOD_DISP_MAP_GLOBAL,
240         MOD_DISP_MAP_OBJECT,
241         MOD_DISP_MAP_UV,
242 };
243
244 typedef struct UVProjectModifierData {
245         ModifierData modifier;
246
247         /* the objects which do the projecting */
248         struct Object *projectors[10];
249         struct Image *image;      /* the image to project */
250         int flags;
251         int num_projectors;
252         float aspectx, aspecty;
253         char uvlayer_name[32];
254         int uvlayer_tmp, pad;
255 } UVProjectModifierData;
256
257 #define MOD_UVPROJECT_MAXPROJECTORS 10
258
259 /* UVProjectModifierData->flags */
260 #define MOD_UVPROJECT_OVERRIDEIMAGE 1<<0
261
262 typedef struct DecimateModifierData {
263         ModifierData modifier;
264
265         float percent;
266         int faceCount;
267 } DecimateModifierData;
268
269 /* Smooth modifier flags */
270 #define MOD_SMOOTH_X (1<<1)
271 #define MOD_SMOOTH_Y (1<<2)
272 #define MOD_SMOOTH_Z (1<<3)
273
274 typedef struct SmoothModifierData {
275         ModifierData modifier;
276         float fac;
277         char defgrp_name[32];
278         short flag, repeat;
279
280 } SmoothModifierData;
281
282 /* Cast modifier flags */
283 #define MOD_CAST_X (1<<1)
284 #define MOD_CAST_Y (1<<2)
285 #define MOD_CAST_Z (1<<3)
286 #define MOD_CAST_USE_OB_TRANSFORM (1<<4)
287 #define MOD_CAST_SIZE_FROM_RADIUS (1<<5)
288
289 /* Cast modifier projection types */
290 #define MOD_CAST_TYPE_SPHERE 0
291 #define MOD_CAST_TYPE_CYLINDER 1
292 #define MOD_CAST_TYPE_CUBOID 2
293
294 typedef struct CastModifierData {
295         ModifierData modifier;
296
297         struct Object *object;
298         float fac;
299         float radius;
300         float size;
301         char defgrp_name[32];
302         short flag, type;
303 } CastModifierData;
304
305 enum {
306         MOD_WAV_MAP_LOCAL,
307         MOD_WAV_MAP_GLOBAL,
308         MOD_WAV_MAP_OBJECT,
309         MOD_WAV_MAP_UV,
310 };
311
312 /* WaveModifierData.flag */
313 #define MOD_WAVE_X      1<<1
314 #define MOD_WAVE_Y      1<<2
315 #define MOD_WAVE_CYCL   1<<3
316 #define MOD_WAVE_NORM   1<<4
317 #define MOD_WAVE_NORM_X 1<<5
318 #define MOD_WAVE_NORM_Y 1<<6
319 #define MOD_WAVE_NORM_Z 1<<7
320
321 typedef struct WaveModifierData {
322         ModifierData modifier;
323
324         struct Object *objectcenter;
325         char defgrp_name[32];
326         struct Tex *texture;
327         struct Object *map_object;
328
329         short flag, pad;
330
331         float startx, starty, height, width;
332         float narrow, speed, damp;
333
334         int texmapping, uvlayer_tmp;
335
336         char uvlayer_name[32];
337         
338         float timeoffs, lifetime;
339 } WaveModifierData;
340
341 typedef struct ArmatureModifierData {
342         ModifierData modifier;
343
344         short deformflag, multi;                /* deformflag replaces armature->deformflag */
345         int pad2;
346         struct Object *object;
347         float *prevCos;         /* stored input of previous modifier, for vertexgroup blending */
348         char defgrp_name[32];
349 } ArmatureModifierData;
350
351 typedef struct HookModifierData {
352         ModifierData modifier;
353
354         struct Object *object;
355         float parentinv[4][4];  /* matrix making current transform unmodified */
356         float cent[3];                  /* visualization of hook */
357         float falloff;                  /* if not zero, falloff is distance where influence zero */
358         
359         int *indexar;                   /* if NULL, it's using vertexgroup */
360         int totindex;
361         float force;
362         char name[32];                  /* optional vertexgroup name */
363 } HookModifierData;
364
365 typedef struct SoftbodyModifierData {
366         ModifierData modifier;
367 } SoftbodyModifierData;
368
369 typedef struct ClothModifierData {
370    ModifierData         modifier;
371
372    struct Cloth *clothObject; /* The internal data structure for cloth. */
373    struct ClothSimSettings *sim_parms; /* definition is in DNA_cloth_types.h */
374    struct ClothCollSettings *coll_parms; /* definition is in DNA_cloth_types.h */
375    struct PointCache *point_cache;      /* definition is in DNA_object_force.h */
376 } ClothModifierData;
377
378 typedef struct CollisionModifierData {
379         ModifierData    modifier;
380         
381         struct MVert *x; /* position at the beginning of the frame */
382         struct MVert *xnew; /* position at the end of the frame */
383         struct MVert *xold; /* unsued atm, but was discussed during sprint */
384         struct MVert *current_xnew; /* new position at the actual inter-frame step */
385         struct MVert *current_x; /* position at the actual inter-frame step */
386         struct MVert *current_v; /* (xnew - x) at the actual inter-frame step */
387         
388         struct MFace *mfaces; /* object face data */
389         
390         unsigned int numverts;
391         unsigned int numfaces;
392         int pad;
393         float time;             /* cfra time of modifier */
394         struct BVHTree *bvhtree; /* bounding volume hierarchy for this cloth object */
395 } CollisionModifierData;
396
397 typedef enum {
398         eBooleanModifierOp_Intersect,
399         eBooleanModifierOp_Union,
400         eBooleanModifierOp_Difference,
401 } BooleanModifierOp;
402 typedef struct BooleanModifierData {
403         ModifierData modifier;
404
405         struct Object *object;
406         int operation, pad;
407 } BooleanModifierData;
408
409 #define MOD_MDEF_INVERT_VGROUP (1<<0)
410 #define MOD_MDEF_DYNAMIC_BIND  (1<<1)
411
412 typedef struct MDefInfluence {
413         int vertex;
414         float weight;
415 } MDefInfluence;
416
417 typedef struct MDefCell {
418         int offset;
419         int totinfluence;
420 } MDefCell;
421
422 typedef struct MeshDeformModifierData {
423         ModifierData modifier;
424
425         struct Object *object;                  /* mesh object */
426         char defgrp_name[32];                   /* optional vertexgroup name */
427
428         short gridsize, needbind;
429         short flag, pad;
430
431         /* variables filled in when bound */
432         float *bindweights, *bindcos;   /* computed binding weights */
433         int totvert, totcagevert;               /* total vertices in mesh and cage */
434         MDefCell *dyngrid;                              /* grid with dynamic binding cell points */
435         MDefInfluence *dyninfluences;   /* dynamic binding vertex influences */
436         int *dynverts, *pad2;                   /* is this vertex bound or not? */
437         int dyngridsize;                                /* size of the dynamic bind grid */
438         int totinfluence;                               /* total number of vertex influences */
439         float dyncellmin[3];                    /* offset of the dynamic bind grid */
440         float dyncellwidth;                             /* width of dynamic bind cell */
441         float bindmat[4][4];                    /* matrix of cage at binding time */
442 } MeshDeformModifierData;
443
444 typedef enum {
445         eParticleSystemFlag_Loaded =            (1<<0),
446         eParticleSystemFlag_Pars =                      (1<<1),
447         eParticleSystemFlag_FromCurve =         (1<<2),
448         eParticleSystemFlag_DM_changed =        (1<<3),
449         eParticleSystemFlag_Disabled =          (1<<4),
450         eParticleSystemFlag_psys_updated =      (1<<5),
451 } ParticleSystemModifierFlag;
452
453 typedef struct ParticleSystemModifierData {
454         ModifierData modifier;
455         struct ParticleSystem *psys;
456         struct DerivedMesh *dm;
457         int totdmvert, totdmedge, totdmface;
458         short flag, rt;
459 } ParticleSystemModifierData;
460
461 typedef enum {
462         eParticleInstanceFlag_Parents =         (1<<0),
463         eParticleInstanceFlag_Children =        (1<<1),
464         eParticleInstanceFlag_Path =            (1<<2),
465         eParticleInstanceFlag_Unborn =          (1<<3),
466         eParticleInstanceFlag_Alive =           (1<<4),
467         eParticleInstanceFlag_Dead =            (1<<5),
468 } ParticleInstanceModifierFlag;
469
470 typedef struct ParticleInstanceModifierData {
471         ModifierData modifier;
472         struct Object *ob;
473         short psys, flag, rt[2];
474 } ParticleInstanceModifierData;
475
476 typedef enum {
477         eExplodeFlag_CalcFaces =        (1<<0),
478         //eExplodeFlag_PaSize =         (1<<1),
479         eExplodeFlag_EdgeSplit =        (1<<2),
480         eExplodeFlag_Unborn =           (1<<3),
481         eExplodeFlag_Alive =            (1<<4),
482         eExplodeFlag_Dead =                     (1<<5),
483 } ExplodeModifierFlag;
484
485 typedef struct ExplodeModifierData {
486         ModifierData modifier;
487         int *facepa;
488         short flag, vgroup;
489         float protect;
490 } ExplodeModifierData;
491
492 typedef struct ShrinkwrapModifierData {
493         ModifierData modifier;
494
495         struct Object *target;  /* shrink target */
496         char vgroup_name[32];   /* optional vertexgroup name */
497         float keptDist;                 /* distance offset from mesh/projection point */
498         short shrinkType;               /* shrink type projection */
499         short shrinkOpts;               /* shrink options */
500 } ShrinkwrapModifierData;
501
502 /* Shrinkwrap->shrinkType */
503 #define MOD_SHRINKWRAP_NEAREST_SURFACE  0
504 #define MOD_SHRINKWRAP_NORMAL                   1
505 #define MOD_SHRINKWRAP_NEAREST_VERTEX   2
506
507 /* Shrinkwrap->shrinkOpts */
508 #define MOD_SHRINKWRAP_ALLOW_DEFAULT_NORMAL             (1<<0)
509 #define MOD_SHRINKWRAP_ALLOW_INVERTED_NORMAL    (1<<1)
510 #define MOD_SHRINKWRAP_REMOVE_UNPROJECTED_FACES (1<<2)
511
512 #define MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE    (1<<3)
513 #define MOD_SHRINKWRAP_CULL_TARGET_BACKFACE             (1<<4)
514
515 #endif