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