2.5
[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         eModifierType_Fluidsim,
40         eModifierType_Mask,
41         eModifierType_SimpleDeform,
42         NUM_MODIFIER_TYPES
43 } ModifierType;
44
45 typedef enum ModifierMode {
46         eModifierMode_Realtime = (1<<0),
47         eModifierMode_Render = (1<<1),
48         eModifierMode_Editmode = (1<<2),
49         eModifierMode_OnCage = (1<<3),
50         eModifierMode_Expanded = (1<<4),
51         eModifierMode_Virtual = (1<<5),
52         eModifierMode_DisableTemporary = (1 << 31)
53 } ModifierMode;
54
55 typedef struct ModifierData {
56         struct ModifierData *next, *prev;
57
58         int type, mode;
59         char name[32];
60
61         char *error;
62 } ModifierData;
63
64 typedef enum {
65         eSubsurfModifierFlag_Incremental = (1<<0),
66         eSubsurfModifierFlag_DebugIncr = (1<<1),
67         eSubsurfModifierFlag_ControlEdges = (1<<2),
68         eSubsurfModifierFlag_SubsurfUv = (1<<3)
69 } SubsurfModifierFlag;
70
71 typedef struct SubsurfModifierData {
72         ModifierData modifier;
73
74         short subdivType, levels, renderLevels, flags;
75
76         void *emCache, *mCache;
77 } SubsurfModifierData;
78
79 typedef struct LatticeModifierData {
80         ModifierData modifier;
81
82         struct Object *object;
83         char name[32];                  /* optional vertexgroup name */
84 } LatticeModifierData;
85
86 typedef struct CurveModifierData {
87         ModifierData modifier;
88
89         struct Object *object;
90         char name[32];                  /* optional vertexgroup name */
91         short defaxis;                  /* axis along which curve deforms */
92         char pad[6];
93 } CurveModifierData;
94
95 /* CurveModifierData->defaxis */
96 #define MOD_CURVE_POSX  1
97 #define MOD_CURVE_POSY  2
98 #define MOD_CURVE_POSZ  3
99 #define MOD_CURVE_NEGX  4
100 #define MOD_CURVE_NEGY  5
101 #define MOD_CURVE_NEGZ  6
102
103 typedef struct BuildModifierData {
104         ModifierData modifier;
105
106         float start, length;
107         int randomize, seed;
108 } BuildModifierData;
109
110 /* Mask Modifier */
111 typedef struct MaskModifierData {
112         ModifierData modifier;
113         
114         struct Object *ob_arm;  /* armature to use to in place of hardcoded vgroup */
115         char vgroup[32];                /* name of vertex group to use to mask */
116         
117         int mode;                               /* using armature or hardcoded vgroup */
118         int flag;                               /* flags for various things */
119 } MaskModifierData;
120
121 /* Mask Modifier -> mode */
122 #define MOD_MASK_MODE_VGROUP            0
123 #define MOD_MASK_MODE_ARM                       1
124
125 /* Mask Modifier -> flag */
126 #define MOD_MASK_INV                    (1<<0)
127
128 typedef struct ArrayModifierData {
129         ModifierData modifier;
130
131         /* the object with which to cap the start of the array  */
132         struct Object *start_cap;
133         /* the object with which to cap the end of the array  */
134         struct Object *end_cap;
135         /* the curve object to use for MOD_ARR_FITCURVE */
136         struct Object *curve_ob;
137         /* the object to use for object offset */
138         struct Object *offset_ob;
139         /* a constant duplicate offset;
140            1 means the duplicates are 1 unit apart
141     */
142         float offset[3];
143         /* a scaled factor for duplicate offsets;
144            1 means the duplicates are 1 object-width apart
145     */
146         float scale[3];
147         /* the length over which to distribute the duplicates */
148         float length;
149         /* the limit below which to merge vertices in adjacent duplicates */
150         float merge_dist;
151         /* determines how duplicate count is calculated; one of:
152               MOD_ARR_FIXEDCOUNT -> fixed
153               MOD_ARR_FITLENGTH  -> calculated to fit a set length
154               MOD_ARR_FITCURVE   -> calculated to fit the length of a Curve object
155     */
156         int fit_type;
157         /* flags specifying how total offset is calculated; binary OR of:
158              MOD_ARR_OFF_CONST    -> total offset += offset
159              MOD_ARR_OFF_RELATIVE -> total offset += relative * object width
160              MOD_ARR_OFF_OBJ      -> total offset += offset_ob's matrix
161            total offset is the sum of the individual enabled offsets
162         */
163         int offset_type;
164         /* general flags:
165               MOD_ARR_MERGE -> merge vertices in adjacent duplicates
166         */
167         int flags;
168         /* the number of duplicates to generate for MOD_ARR_FIXEDCOUNT */
169         int count;
170 } ArrayModifierData;
171
172 /* ArrayModifierData->fit_type */
173 #define MOD_ARR_FIXEDCOUNT 0
174 #define MOD_ARR_FITLENGTH  1
175 #define MOD_ARR_FITCURVE   2
176
177 /* ArrayModifierData->offset_type */
178 #define MOD_ARR_OFF_CONST    1<<0
179 #define MOD_ARR_OFF_RELATIVE 1<<1
180 #define MOD_ARR_OFF_OBJ      1<<2
181
182 /* ArrayModifierData->flags */
183 #define MOD_ARR_MERGE      1<<0
184 #define MOD_ARR_MERGEFINAL 1<<1
185
186 typedef struct MirrorModifierData {
187         ModifierData modifier;
188
189         short axis, flag;
190         float tolerance;
191         struct Object *mirror_ob;
192 } MirrorModifierData;
193
194 /* MirrorModifierData->flag */
195 #define MOD_MIR_CLIPPING        1<<0
196 #define MOD_MIR_MIRROR_U        1<<1
197 #define MOD_MIR_MIRROR_V        1<<2
198 #define MOD_MIR_AXIS_X          1<<3
199 #define MOD_MIR_AXIS_Y          1<<4
200 #define MOD_MIR_AXIS_Z          1<<5
201 #define MOD_MIR_VGROUP          1<<6
202
203 typedef struct EdgeSplitModifierData {
204         ModifierData modifier;
205
206         float split_angle;    /* angle above which edges should be split */
207         int flags;
208 } EdgeSplitModifierData;
209
210 /* EdgeSplitModifierData->flags */
211 #define MOD_EDGESPLIT_FROMANGLE   1<<1
212 #define MOD_EDGESPLIT_FROMFLAG    1<<2
213
214 typedef struct BevelModifierData {
215         ModifierData modifier;
216
217         float value;          /* the "raw" bevel value (distance/amount to bevel) */
218         int res;              /* the resolution (as originally coded, it is the number of recursive bevels) */
219         int pad;
220         short flags;          /* general option flags */
221         short val_flags;      /* flags used to interpret the bevel value */
222         short lim_flags;      /* flags to tell the tool how to limit the bevel */
223         short e_flags;        /* flags to direct how edge weights are applied to verts */
224         float bevel_angle;    /* if the BME_BEVEL_ANGLE is set, this will be how "sharp" an edge must be before it gets beveled */
225         char defgrp_name[32]; /* if the BME_BEVEL_VWEIGHT option is set, this will be the name of the vert group */
226 } BevelModifierData;
227
228 typedef struct BMeshModifierData {
229         ModifierData modifier;
230
231         float pad;
232         int type;
233 } BMeshModifierData;
234
235 typedef struct DisplaceModifierData {
236         ModifierData modifier;
237
238         struct Tex *texture;
239         float strength;
240         int direction;
241         char defgrp_name[32];
242         float midlevel;
243         int texmapping;
244         struct Object *map_object;
245         char uvlayer_name[32];
246         int uvlayer_tmp, pad;
247 } DisplaceModifierData;
248
249 /* DisplaceModifierData->direction */
250 enum {
251         MOD_DISP_DIR_X,
252         MOD_DISP_DIR_Y,
253         MOD_DISP_DIR_Z,
254         MOD_DISP_DIR_NOR,
255         MOD_DISP_DIR_RGB_XYZ,
256 };
257
258 /* DisplaceModifierData->texmapping */
259 enum {
260         MOD_DISP_MAP_LOCAL,
261         MOD_DISP_MAP_GLOBAL,
262         MOD_DISP_MAP_OBJECT,
263         MOD_DISP_MAP_UV,
264 };
265
266 typedef struct UVProjectModifierData {
267         ModifierData modifier;
268
269         /* the objects which do the projecting */
270         struct Object *projectors[10];
271         struct Image *image;      /* the image to project */
272         int flags;
273         int num_projectors;
274         float aspectx, aspecty;
275         char uvlayer_name[32];
276         int uvlayer_tmp, pad;
277 } UVProjectModifierData;
278
279 #define MOD_UVPROJECT_MAXPROJECTORS 10
280
281 /* UVProjectModifierData->flags */
282 #define MOD_UVPROJECT_OVERRIDEIMAGE 1<<0
283
284 typedef struct DecimateModifierData {
285         ModifierData modifier;
286
287         float percent;
288         int faceCount;
289 } DecimateModifierData;
290
291 /* Smooth modifier flags */
292 #define MOD_SMOOTH_X (1<<1)
293 #define MOD_SMOOTH_Y (1<<2)
294 #define MOD_SMOOTH_Z (1<<3)
295
296 typedef struct SmoothModifierData {
297         ModifierData modifier;
298         float fac;
299         char defgrp_name[32];
300         short flag, repeat;
301
302 } SmoothModifierData;
303
304 /* Cast modifier flags */
305 #define MOD_CAST_X (1<<1)
306 #define MOD_CAST_Y (1<<2)
307 #define MOD_CAST_Z (1<<3)
308 #define MOD_CAST_USE_OB_TRANSFORM (1<<4)
309 #define MOD_CAST_SIZE_FROM_RADIUS (1<<5)
310
311 /* Cast modifier projection types */
312 #define MOD_CAST_TYPE_SPHERE 0
313 #define MOD_CAST_TYPE_CYLINDER 1
314 #define MOD_CAST_TYPE_CUBOID 2
315
316 typedef struct CastModifierData {
317         ModifierData modifier;
318
319         struct Object *object;
320         float fac;
321         float radius;
322         float size;
323         char defgrp_name[32];
324         short flag, type;
325 } CastModifierData;
326
327 enum {
328         MOD_WAV_MAP_LOCAL,
329         MOD_WAV_MAP_GLOBAL,
330         MOD_WAV_MAP_OBJECT,
331         MOD_WAV_MAP_UV,
332 };
333
334 /* WaveModifierData.flag */
335 #define MOD_WAVE_X      1<<1
336 #define MOD_WAVE_Y      1<<2
337 #define MOD_WAVE_CYCL   1<<3
338 #define MOD_WAVE_NORM   1<<4
339 #define MOD_WAVE_NORM_X 1<<5
340 #define MOD_WAVE_NORM_Y 1<<6
341 #define MOD_WAVE_NORM_Z 1<<7
342
343 typedef struct WaveModifierData {
344         ModifierData modifier;
345
346         struct Object *objectcenter;
347         char defgrp_name[32];
348         struct Tex *texture;
349         struct Object *map_object;
350
351         short flag, pad;
352
353         float startx, starty, height, width;
354         float narrow, speed, damp, falloff;
355
356         int texmapping, uvlayer_tmp;
357
358         char uvlayer_name[32];
359
360         float timeoffs, lifetime;
361         float pad1;
362 } WaveModifierData;
363
364 typedef struct ArmatureModifierData {
365         ModifierData modifier;
366
367         short deformflag, multi;                /* deformflag replaces armature->deformflag */
368         int pad2;
369         struct Object *object;
370         float *prevCos;         /* stored input of previous modifier, for vertexgroup blending */
371         char defgrp_name[32];
372 } ArmatureModifierData;
373
374 typedef struct HookModifierData {
375         ModifierData modifier;
376
377         struct Object *object;
378         float parentinv[4][4];  /* matrix making current transform unmodified */
379         float cent[3];                  /* visualization of hook */
380         float falloff;                  /* if not zero, falloff is distance where influence zero */
381         
382         int *indexar;                   /* if NULL, it's using vertexgroup */
383         int totindex;
384         float force;
385         char name[32];                  /* optional vertexgroup name */
386 } HookModifierData;
387
388 typedef struct SoftbodyModifierData {
389         ModifierData modifier;
390 } SoftbodyModifierData;
391
392 typedef struct ClothModifierData {
393    ModifierData         modifier;
394
395    struct Cloth *clothObject; /* The internal data structure for cloth. */
396    struct ClothSimSettings *sim_parms; /* definition is in DNA_cloth_types.h */
397    struct ClothCollSettings *coll_parms; /* definition is in DNA_cloth_types.h */
398    struct PointCache *point_cache;      /* definition is in DNA_object_force.h */
399 } ClothModifierData;
400
401 typedef struct CollisionModifierData {
402         ModifierData    modifier;
403         
404         struct MVert *x; /* position at the beginning of the frame */
405         struct MVert *xnew; /* position at the end of the frame */
406         struct MVert *xold; /* unsued atm, but was discussed during sprint */
407         struct MVert *current_xnew; /* new position at the actual inter-frame step */
408         struct MVert *current_x; /* position at the actual inter-frame step */
409         struct MVert *current_v; /* (xnew - x) at the actual inter-frame step */
410         
411         struct MFace *mfaces; /* object face data */
412         
413         unsigned int numverts;
414         unsigned int numfaces;
415         short absorption; /* used for forces, in % */
416         short pad;
417         float time;             /* cfra time of modifier */
418         struct BVHTree *bvhtree; /* bounding volume hierarchy for this cloth object */
419 } CollisionModifierData;
420
421 typedef enum {
422         eBooleanModifierOp_Intersect,
423         eBooleanModifierOp_Union,
424         eBooleanModifierOp_Difference,
425 } BooleanModifierOp;
426 typedef struct BooleanModifierData {
427         ModifierData modifier;
428
429         struct Object *object;
430         int operation, pad;
431 } BooleanModifierData;
432
433 #define MOD_MDEF_INVERT_VGROUP (1<<0)
434 #define MOD_MDEF_DYNAMIC_BIND  (1<<1)
435
436 typedef struct MDefInfluence {
437         int vertex;
438         float weight;
439 } MDefInfluence;
440
441 typedef struct MDefCell {
442         int offset;
443         int totinfluence;
444 } MDefCell;
445
446 typedef struct MeshDeformModifierData {
447         ModifierData modifier;
448
449         struct Object *object;                  /* mesh object */
450         char defgrp_name[32];                   /* optional vertexgroup name */
451
452         short gridsize, needbind;
453         short flag, pad;
454
455         /* variables filled in when bound */
456         float *bindweights, *bindcos;   /* computed binding weights */
457         int totvert, totcagevert;               /* total vertices in mesh and cage */
458         MDefCell *dyngrid;                              /* grid with dynamic binding cell points */
459         MDefInfluence *dyninfluences;   /* dynamic binding vertex influences */
460         int *dynverts, *pad2;                   /* is this vertex bound or not? */
461         int dyngridsize;                                /* size of the dynamic bind grid */
462         int totinfluence;                               /* total number of vertex influences */
463         float dyncellmin[3];                    /* offset of the dynamic bind grid */
464         float dyncellwidth;                             /* width of dynamic bind cell */
465         float bindmat[4][4];                    /* matrix of cage at binding time */
466 } MeshDeformModifierData;
467
468 typedef enum {
469         eParticleSystemFlag_Loaded =            (1<<0),
470         eParticleSystemFlag_Pars =                      (1<<1),
471         eParticleSystemFlag_FromCurve =         (1<<2),
472         eParticleSystemFlag_DM_changed =        (1<<3),
473         eParticleSystemFlag_Disabled =          (1<<4),
474         eParticleSystemFlag_psys_updated =      (1<<5),
475 } ParticleSystemModifierFlag;
476
477 typedef struct ParticleSystemModifierData {
478         ModifierData modifier;
479         struct ParticleSystem *psys;
480         struct DerivedMesh *dm;
481         int totdmvert, totdmedge, totdmface;
482         short flag, rt;
483 } ParticleSystemModifierData;
484
485 typedef enum {
486         eParticleInstanceFlag_Parents =         (1<<0),
487         eParticleInstanceFlag_Children =        (1<<1),
488         eParticleInstanceFlag_Path =            (1<<2),
489         eParticleInstanceFlag_Unborn =          (1<<3),
490         eParticleInstanceFlag_Alive =           (1<<4),
491         eParticleInstanceFlag_Dead =            (1<<5),
492 } ParticleInstanceModifierFlag;
493
494 typedef struct ParticleInstanceModifierData {
495         ModifierData modifier;
496         struct Object *ob;
497         short psys, flag, rt[2];
498 } ParticleInstanceModifierData;
499
500 typedef enum {
501         eExplodeFlag_CalcFaces =        (1<<0),
502         //eExplodeFlag_PaSize =         (1<<1),
503         eExplodeFlag_EdgeSplit =        (1<<2),
504         eExplodeFlag_Unborn =           (1<<3),
505         eExplodeFlag_Alive =            (1<<4),
506         eExplodeFlag_Dead =                     (1<<5),
507 } ExplodeModifierFlag;
508
509 typedef struct ExplodeModifierData {
510         ModifierData modifier;
511         int *facepa;
512         short flag, vgroup;
513         float protect;
514 } ExplodeModifierData;
515
516 typedef struct FluidsimModifierData {
517         ModifierData modifier;
518         
519         struct FluidsimSettings *fss; /* definition is is DNA_object_fluidsim.h */
520         struct PointCache *point_cache; /* definition is in DNA_object_force.h */
521 } FluidsimModifierData;
522
523 typedef struct ShrinkwrapModifierData {
524         ModifierData modifier;
525
526         struct Object *target;  /* shrink target */
527         struct Object *auxTarget; /* additional shrink target */
528         char vgroup_name[32];   /* optional vertexgroup name */
529         float keepDist;                 /* distance offset to keep from mesh/projection point */
530         short shrinkType;               /* shrink type projection */
531         short shrinkOpts;               /* shrink options */
532         char projAxis;                  /* axis to project over */
533
534         /*
535          * if using projection over vertex normal this controls the
536          * the level of subsurface that must be done before getting the
537          * vertex coordinates and normal
538          */
539         char subsurfLevels;
540
541         char pad[6];
542
543 } ShrinkwrapModifierData;
544
545 /* Shrinkwrap->shrinkType */
546 #define MOD_SHRINKWRAP_NEAREST_SURFACE  0
547 #define MOD_SHRINKWRAP_PROJECT                  1
548 #define MOD_SHRINKWRAP_NEAREST_VERTEX   2
549
550 /* Shrinkwrap->shrinkOpts */
551 #define MOD_SHRINKWRAP_PROJECT_ALLOW_POS_DIR    (1<<0)  /* allow shrinkwrap to move the vertex in the positive direction of axis */
552 #define MOD_SHRINKWRAP_PROJECT_ALLOW_NEG_DIR    (1<<1)  /* allow shrinkwrap to move the vertex in the negative direction of axis */
553
554 #define MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE    (1<<3)  /* ignore vertex moves if a vertex ends projected on a front face of the target */
555 #define MOD_SHRINKWRAP_CULL_TARGET_BACKFACE             (1<<4)  /* ignore vertex moves if a vertex ends projected on a back face of the target */
556
557 #define MOD_SHRINKWRAP_KEEP_ABOVE_SURFACE               (1<<5)  /* distance is measure to the front face of the target */
558
559 #define MOD_SHRINKWRAP_PROJECT_OVER_X_AXIS              (1<<0)
560 #define MOD_SHRINKWRAP_PROJECT_OVER_Y_AXIS              (1<<1)
561 #define MOD_SHRINKWRAP_PROJECT_OVER_Z_AXIS              (1<<2)
562 #define MOD_SHRINKWRAP_PROJECT_OVER_NORMAL                      0       /* projection over normal is used if no axis is selected */
563
564
565 typedef struct SimpleDeformModifierData {
566         ModifierData modifier;
567
568         struct Object *origin;  /* object to control the origin of modifier space coordinates */
569         char vgroup_name[32];   /* optional vertexgroup name */
570         float factor;                   /* factors to control simple deforms */
571         float limit[2];                 /* lower and upper limit */             
572
573         char mode;                              /* deform function */
574         char axis;                              /* lock axis (for taper and strech) */
575         char originOpts;                /* originOptions */
576         char pad;
577
578 } SimpleDeformModifierData;
579
580 #define MOD_SIMPLEDEFORM_MODE_TWIST             1
581 #define MOD_SIMPLEDEFORM_MODE_BEND              2
582 #define MOD_SIMPLEDEFORM_MODE_TAPER             3
583 #define MOD_SIMPLEDEFORM_MODE_STRETCH   4
584
585 #define MOD_SIMPLEDEFORM_LOCK_AXIS_X                    (1<<0)
586 #define MOD_SIMPLEDEFORM_LOCK_AXIS_Y                    (1<<1)
587
588 /* indicates whether simple deform should use the local
589    coordinates or global coordinates of origin */
590 #define MOD_SIMPLEDEFORM_ORIGIN_LOCAL                   (1<<0)
591
592 #endif