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