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