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