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