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