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