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