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