small feature request from zanqdo, merging in the mirror modifier is now optional...
[blender.git] / source / blender / makesdna / DNA_modifier_types.h
1 /**
2  *
3  * $Id$ 
4  *
5  * ***** BEGIN GPL LICENSE BLOCK *****
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20  *
21  * ***** END GPL LICENSE BLOCK *****
22  */
23
24 #include "DNA_listBase.h"
25
26 #ifndef DNA_MODIFIER_TYPES_H
27 #define DNA_MODIFIER_TYPES_H
28
29 #define MODSTACK_DEBUG 1
30
31 /* WARNING ALERT! TYPEDEF VALUES ARE WRITTEN IN FILES! SO DO NOT CHANGE! */
32
33 typedef enum ModifierType {
34         eModifierType_None = 0,
35         eModifierType_Subsurf,
36         eModifierType_Lattice,
37         eModifierType_Curve,
38         eModifierType_Build,
39         eModifierType_Mirror,
40         eModifierType_Decimate,
41         eModifierType_Wave,
42         eModifierType_Armature,
43         eModifierType_Hook,
44         eModifierType_Softbody,
45         eModifierType_Boolean,
46         eModifierType_Array,
47         eModifierType_EdgeSplit,
48         eModifierType_Displace,
49         eModifierType_UVProject,
50         eModifierType_Smooth,
51         eModifierType_Cast,
52         eModifierType_MeshDeform,
53         eModifierType_ParticleSystem,
54         eModifierType_ParticleInstance,
55         eModifierType_Explode,
56         eModifierType_Cloth,
57         eModifierType_Collision,
58         eModifierType_Bevel,
59         eModifierType_Shrinkwrap,
60         eModifierType_Fluidsim,
61         eModifierType_Mask,
62         eModifierType_SimpleDeform,
63         eModifierType_Multires,
64         eModifierType_Surface,
65         eModifierType_Smoke,
66         eModifierType_ShapeKey,
67         eModifierType_Solidify,
68         eModifierType_Screw,
69         /* placeholder, keep this so durian files load in
70          * trunk with the correct modifier once its merged */
71         eModifierType_Warp,
72         NUM_MODIFIER_TYPES
73 } ModifierType;
74
75 typedef enum ModifierMode {
76         eModifierMode_Realtime = (1<<0),
77         eModifierMode_Render = (1<<1),
78         eModifierMode_Editmode = (1<<2),
79         eModifierMode_OnCage = (1<<3),
80         eModifierMode_Expanded = (1<<4),
81         eModifierMode_Virtual = (1<<5),
82         eModifierMode_ApplyOnSpline = (1<<6),
83         eModifierMode_DisableTemporary = (1 << 31)
84 } ModifierMode;
85
86 typedef struct ModifierData {
87         struct ModifierData *next, *prev;
88
89         int type, mode;
90         int stackindex, pad;
91         char name[32];
92         
93         /* XXX for timing info set by caller... solve later? (ton) */
94         struct Scene *scene;
95         
96         char *error;
97 } ModifierData;
98
99 typedef enum {
100         eSubsurfModifierFlag_Incremental = (1<<0),
101         eSubsurfModifierFlag_DebugIncr = (1<<1),
102         eSubsurfModifierFlag_ControlEdges = (1<<2),
103         eSubsurfModifierFlag_SubsurfUv = (1<<3)
104 } SubsurfModifierFlag;
105
106 typedef struct SubsurfModifierData {
107         ModifierData modifier;
108
109         short subdivType, levels, renderLevels, flags;
110
111         void *emCache, *mCache;
112 } SubsurfModifierData;
113
114 typedef struct LatticeModifierData {
115         ModifierData modifier;
116
117         struct Object *object;
118         char name[32];                  /* optional vertexgroup name */
119 } LatticeModifierData;
120
121 typedef struct CurveModifierData {
122         ModifierData modifier;
123
124         struct Object *object;
125         char name[32];                  /* optional vertexgroup name */
126         short defaxis;                  /* axis along which curve deforms */
127         char pad[6];
128 } CurveModifierData;
129
130 /* CurveModifierData->defaxis */
131 #define MOD_CURVE_POSX  1
132 #define MOD_CURVE_POSY  2
133 #define MOD_CURVE_POSZ  3
134 #define MOD_CURVE_NEGX  4
135 #define MOD_CURVE_NEGY  5
136 #define MOD_CURVE_NEGZ  6
137
138 typedef struct BuildModifierData {
139         ModifierData modifier;
140
141         float start, length;
142         int randomize, seed;
143 } BuildModifierData;
144
145 /* Mask Modifier */
146 typedef struct MaskModifierData {
147         ModifierData modifier;
148         
149         struct Object *ob_arm;  /* armature to use to in place of hardcoded vgroup */
150         char vgroup[32];                /* name of vertex group to use to mask */
151         
152         int mode;                               /* using armature or hardcoded vgroup */
153         int flag;                               /* flags for various things */
154 } MaskModifierData;
155
156 /* Mask Modifier -> mode */
157 #define MOD_MASK_MODE_VGROUP            0
158 #define MOD_MASK_MODE_ARM                       1
159
160 /* Mask Modifier -> flag */
161 #define MOD_MASK_INV                    (1<<0)
162
163 typedef struct ArrayModifierData {
164         ModifierData modifier;
165
166         /* the object with which to cap the start of the array  */
167         struct Object *start_cap;
168         /* the object with which to cap the end of the array  */
169         struct Object *end_cap;
170         /* the curve object to use for MOD_ARR_FITCURVE */
171         struct Object *curve_ob;
172         /* the object to use for object offset */
173         struct Object *offset_ob;
174         /* a constant duplicate offset;
175            1 means the duplicates are 1 unit apart
176         */
177         float offset[3];
178         /* a scaled factor for duplicate offsets;
179            1 means the duplicates are 1 object-width apart
180         */
181         float scale[3];
182         /* the length over which to distribute the duplicates */
183         float length;
184         /* the limit below which to merge vertices in adjacent duplicates */
185         float merge_dist;
186         /* determines how duplicate count is calculated; one of:
187                   MOD_ARR_FIXEDCOUNT -> fixed
188                   MOD_ARR_FITLENGTH  -> calculated to fit a set length
189                   MOD_ARR_FITCURVE   -> calculated to fit the length of a Curve object
190         */
191         int fit_type;
192         /* flags specifying how total offset is calculated; binary OR of:
193                  MOD_ARR_OFF_CONST    -> total offset += offset
194                  MOD_ARR_OFF_RELATIVE -> total offset += relative * object width
195                  MOD_ARR_OFF_OBJ      -> total offset += offset_ob's matrix
196            total offset is the sum of the individual enabled offsets
197         */
198         int offset_type;
199         /* general flags:
200                   MOD_ARR_MERGE -> merge vertices in adjacent duplicates
201         */
202         int flags;
203         /* the number of duplicates to generate for MOD_ARR_FIXEDCOUNT */
204         int count;
205 } ArrayModifierData;
206
207 /* ArrayModifierData->fit_type */
208 #define MOD_ARR_FIXEDCOUNT 0
209 #define MOD_ARR_FITLENGTH  1
210 #define MOD_ARR_FITCURVE   2
211
212 /* ArrayModifierData->offset_type */
213 #define MOD_ARR_OFF_CONST    (1<<0)
214 #define MOD_ARR_OFF_RELATIVE (1<<1)
215 #define MOD_ARR_OFF_OBJ      (1<<2)
216
217 /* ArrayModifierData->flags */
218 #define MOD_ARR_MERGE      (1<<0)
219 #define MOD_ARR_MERGEFINAL (1<<1)
220
221 typedef struct MirrorModifierData {
222         ModifierData modifier;
223
224         short axis; /* deprecated, use flag instead */
225         short flag;
226         float tolerance;
227         struct Object *mirror_ob;
228 } MirrorModifierData;
229
230 /* MirrorModifierData->flag */
231 #define MOD_MIR_CLIPPING        (1<<0)
232 #define MOD_MIR_MIRROR_U        (1<<1)
233 #define MOD_MIR_MIRROR_V        (1<<2)
234 #define MOD_MIR_AXIS_X          (1<<3)
235 #define MOD_MIR_AXIS_Y          (1<<4)
236 #define MOD_MIR_AXIS_Z          (1<<5)
237 #define MOD_MIR_VGROUP          (1<<6)
238 #define MOD_MIR_MERGE           (1<<7)
239
240 typedef struct EdgeSplitModifierData {
241         ModifierData modifier;
242
243         float split_angle;    /* angle above which edges should be split */
244         int flags;
245 } EdgeSplitModifierData;
246
247 /* EdgeSplitModifierData->flags */
248 #define MOD_EDGESPLIT_FROMANGLE   (1<<1)
249 #define MOD_EDGESPLIT_FROMFLAG    (1<<2)
250
251 typedef struct BevelModifierData {
252         ModifierData modifier;
253
254         float value;          /* the "raw" bevel value (distance/amount to bevel) */
255         int res;              /* the resolution (as originally coded, it is the number of recursive bevels) */
256         int pad;
257         short flags;          /* general option flags */
258         short val_flags;      /* flags used to interpret the bevel value */
259         short lim_flags;      /* flags to tell the tool how to limit the bevel */
260         short e_flags;        /* flags to direct how edge weights are applied to verts */
261         float bevel_angle;    /* if the BME_BEVEL_ANGLE is set, this will be how "sharp" an edge must be before it gets beveled */
262         char defgrp_name[32]; /* if the BME_BEVEL_VWEIGHT option is set, this will be the name of the vert group */
263 } BevelModifierData;
264
265 typedef struct BMeshModifierData {
266         ModifierData modifier;
267
268         float pad;
269         int type;
270 } BMeshModifierData;
271
272
273 /* Smoke modifier flags */
274 #define MOD_SMOKE_TYPE_DOMAIN (1 << 0)
275 #define MOD_SMOKE_TYPE_FLOW (1 << 1)
276 #define MOD_SMOKE_TYPE_COLL (1 << 2)
277
278 typedef struct SmokeModifierData {
279         ModifierData modifier;
280
281         struct SmokeDomainSettings *domain;
282         struct SmokeFlowSettings *flow; /* inflow, outflow, smoke objects */
283         struct SmokeCollSettings *coll; /* collision objects */
284         float time;
285         int type;  /* domain, inflow, outflow, ... */
286 } SmokeModifierData;
287
288 typedef struct DisplaceModifierData {
289         ModifierData modifier;
290
291         struct Tex *texture;
292         float strength;
293         int direction;
294         char defgrp_name[32];
295         float midlevel;
296         int texmapping;
297         struct Object *map_object;
298         char uvlayer_name[32];
299         int uvlayer_tmp, pad;
300 } DisplaceModifierData;
301
302 /* DisplaceModifierData->direction */
303 enum {
304         MOD_DISP_DIR_X,
305         MOD_DISP_DIR_Y,
306         MOD_DISP_DIR_Z,
307         MOD_DISP_DIR_NOR,
308         MOD_DISP_DIR_RGB_XYZ,
309 };
310
311 /* DisplaceModifierData->texmapping */
312 enum {
313         MOD_DISP_MAP_LOCAL,
314         MOD_DISP_MAP_GLOBAL,
315         MOD_DISP_MAP_OBJECT,
316         MOD_DISP_MAP_UV,
317 };
318
319 typedef struct UVProjectModifierData {
320         ModifierData modifier;
321
322         /* the objects which do the projecting */
323         struct Object *projectors[10]; /* MOD_UVPROJECT_MAX */
324         struct Image *image;      /* the image to project */
325         int flags;
326         int num_projectors;
327         float aspectx, aspecty;
328         float scalex, scaley;                                                                                           
329         char uvlayer_name[32];
330         int uvlayer_tmp, pad;
331 } UVProjectModifierData;
332
333 #define MOD_UVPROJECT_MAXPROJECTORS 10
334
335 /* UVProjectModifierData->flags */
336 #define MOD_UVPROJECT_OVERRIDEIMAGE (1<<0)
337
338 typedef struct DecimateModifierData {
339         ModifierData modifier;
340
341         float percent;
342         int faceCount;
343 } DecimateModifierData;
344
345 /* Smooth modifier flags */
346 #define MOD_SMOOTH_X (1<<1)
347 #define MOD_SMOOTH_Y (1<<2)
348 #define MOD_SMOOTH_Z (1<<3)
349
350 typedef struct SmoothModifierData {
351         ModifierData modifier;
352         float fac;
353         char defgrp_name[32];
354         short flag, repeat;
355
356 } SmoothModifierData;
357
358 /* Cast modifier flags */
359 #define MOD_CAST_X (1<<1)
360 #define MOD_CAST_Y (1<<2)
361 #define MOD_CAST_Z (1<<3)
362 #define MOD_CAST_USE_OB_TRANSFORM (1<<4)
363 #define MOD_CAST_SIZE_FROM_RADIUS (1<<5)
364
365 /* Cast modifier projection types */
366 #define MOD_CAST_TYPE_SPHERE 0
367 #define MOD_CAST_TYPE_CYLINDER 1
368 #define MOD_CAST_TYPE_CUBOID 2
369
370 typedef struct CastModifierData {
371         ModifierData modifier;
372
373         struct Object *object;
374         float fac;
375         float radius;
376         float size;
377         char defgrp_name[32];
378         short flag, type;
379 } CastModifierData;
380
381 enum {
382         MOD_WAV_MAP_LOCAL,
383         MOD_WAV_MAP_GLOBAL,
384         MOD_WAV_MAP_OBJECT,
385         MOD_WAV_MAP_UV,
386 };
387
388 /* WaveModifierData.flag */
389 #define MOD_WAVE_X      (1<<1)
390 #define MOD_WAVE_Y      (1<<2)
391 #define MOD_WAVE_CYCL   (1<<3)
392 #define MOD_WAVE_NORM   (1<<4)
393 #define MOD_WAVE_NORM_X (1<<5)
394 #define MOD_WAVE_NORM_Y (1<<6)
395 #define MOD_WAVE_NORM_Z (1<<7)
396
397 typedef struct WaveModifierData {
398         ModifierData modifier;
399
400         struct Object *objectcenter;
401         char defgrp_name[32];
402         struct Tex *texture;
403         struct Object *map_object;
404
405         short flag, pad;
406
407         float startx, starty, height, width;
408         float narrow, speed, damp, falloff;
409
410         int texmapping, uvlayer_tmp;
411
412         char uvlayer_name[32];
413
414         float timeoffs, lifetime;
415         float pad1;
416 } WaveModifierData;
417
418 typedef struct ArmatureModifierData {
419         ModifierData modifier;
420
421         short deformflag, multi;                /* deformflag replaces armature->deformflag */
422         int pad2;
423         struct Object *object;
424         float *prevCos;         /* stored input of previous modifier, for vertexgroup blending */
425         char defgrp_name[32];
426 } ArmatureModifierData;
427
428 typedef struct HookModifierData {
429         ModifierData modifier;
430
431         struct Object *object;
432         char subtarget[32];             /* optional name of bone target */
433         
434         float parentinv[4][4];  /* matrix making current transform unmodified */
435         float cent[3];                  /* visualization of hook */
436         float falloff;                  /* if not zero, falloff is distance where influence zero */
437         
438         int *indexar;                   /* if NULL, it's using vertexgroup */
439         int totindex;
440         float force;
441         char name[32];                  /* optional vertexgroup name */
442 } HookModifierData;
443
444 typedef struct SoftbodyModifierData {
445         ModifierData modifier;
446 } SoftbodyModifierData;
447
448 typedef struct ClothModifierData {
449         ModifierData            modifier;
450
451         struct Scene *scene;                    /* the context, time etc is here */
452         struct Cloth *clothObject;              /* The internal data structure for cloth. */
453         struct ClothSimSettings *sim_parms; /* definition is in DNA_cloth_types.h */
454         struct ClothCollSettings *coll_parms; /* definition is in DNA_cloth_types.h */
455         struct PointCache *point_cache; /* definition is in DNA_object_force.h */
456         struct ListBase ptcaches;
457 } ClothModifierData;
458
459 typedef struct CollisionModifierData {
460         ModifierData    modifier;
461         
462         struct MVert *x; /* position at the beginning of the frame */
463         struct MVert *xnew; /* position at the end of the frame */
464         struct MVert *xold; /* unsued atm, but was discussed during sprint */
465         struct MVert *current_xnew; /* new position at the actual inter-frame step */
466         struct MVert *current_x; /* position at the actual inter-frame step */
467         struct MVert *current_v; /* (xnew - x) at the actual inter-frame step */
468         
469         struct MFace *mfaces; /* object face data */
470         
471         unsigned int numverts;
472         unsigned int numfaces;
473         float time, pad;                /* cfra time of modifier */
474         struct BVHTree *bvhtree; /* bounding volume hierarchy for this cloth object */
475 } CollisionModifierData;
476
477 typedef struct SurfaceModifierData {
478         ModifierData    modifier;
479
480         struct MVert *x; /* old position */
481         struct MVert *v; /* velocity */
482
483         struct DerivedMesh *dm;
484
485         struct BVHTreeFromMesh *bvhtree; /* bounding volume hierarchy of the mesh faces */
486
487         int cfra, numverts;
488 } SurfaceModifierData;
489
490 typedef enum {
491         eBooleanModifierOp_Intersect,
492         eBooleanModifierOp_Union,
493         eBooleanModifierOp_Difference,
494 } BooleanModifierOp;
495 typedef struct BooleanModifierData {
496         ModifierData modifier;
497
498         struct Object *object;
499         int operation, pad;
500 } BooleanModifierData;
501
502 #define MOD_MDEF_INVERT_VGROUP  (1<<0)
503 #define MOD_MDEF_DYNAMIC_BIND   (1<<1)
504
505 #define MOD_MDEF_VOLUME                 0
506 #define MOD_MDEF_SURFACE                1
507
508 typedef struct MDefInfluence {
509         int vertex;
510         float weight;
511 } MDefInfluence;
512
513 typedef struct MDefCell {
514         int offset;
515         int totinfluence;
516 } MDefCell;
517
518 typedef struct MeshDeformModifierData {
519         ModifierData modifier;
520
521         struct Object *object;                  /* mesh object */
522         char defgrp_name[32];                   /* optional vertexgroup name */
523
524         short gridsize, flag, mode, pad;
525
526         /* result of static binding */
527         MDefInfluence *bindinfluences;  /* influences */
528         int *bindoffsets;                               /* offsets into influences array */
529         float *bindcagecos;                             /* coordinates that cage was bound with */
530         int totvert, totcagevert;               /* total vertices in mesh and cage */
531
532         /* result of dynamic binding */
533         MDefCell *dyngrid;                              /* grid with dynamic binding cell points */
534         MDefInfluence *dyninfluences;   /* dynamic binding vertex influences */
535         int *dynverts, *pad2;                   /* is this vertex bound or not? */
536         int dyngridsize;                                /* size of the dynamic bind grid */
537         int totinfluence;                               /* total number of vertex influences */
538         float dyncellmin[3];                    /* offset of the dynamic bind grid */
539         float dyncellwidth;                             /* width of dynamic bind cell */
540         float bindmat[4][4];                    /* matrix of cage at binding time */
541
542         /* deprecated storage */
543         float *bindweights;                             /* deprecated inefficient storage */
544         float *bindcos;                                 /* deprecated storage of cage coords */
545
546         /* runtime */
547         void (*bindfunc)(struct Scene *scene,
548                 struct MeshDeformModifierData *mmd,
549                 float *vertexcos, int totvert, float cagemat[][4]);
550 } MeshDeformModifierData;
551
552 typedef enum {
553         eParticleSystemFlag_Pars =                      (1<<0),
554         eParticleSystemFlag_psys_updated =      (1<<1),
555         eParticleSystemFlag_file_loaded =       (1<<2),
556 } ParticleSystemModifierFlag;
557
558 typedef struct ParticleSystemModifierData {
559         ModifierData modifier;
560         struct ParticleSystem *psys;
561         struct DerivedMesh *dm;
562         int totdmvert, totdmedge, totdmface;
563         short flag, rt;
564 } ParticleSystemModifierData;
565
566 typedef enum {
567         eParticleInstanceFlag_Parents =         (1<<0),
568         eParticleInstanceFlag_Children =        (1<<1),
569         eParticleInstanceFlag_Path =            (1<<2),
570         eParticleInstanceFlag_Unborn =          (1<<3),
571         eParticleInstanceFlag_Alive =           (1<<4),
572         eParticleInstanceFlag_Dead =            (1<<5),
573         eParticleInstanceFlag_KeepShape =       (1<<6),
574         eParticleInstanceFlag_UseSize =         (1<<7),
575 } ParticleInstanceModifierFlag;
576
577 typedef struct ParticleInstanceModifierData {
578         ModifierData modifier;
579         struct Object *ob;
580         short psys, flag, axis, rt;
581         float position, random_position;
582 } ParticleInstanceModifierData;
583
584 typedef enum {
585         eExplodeFlag_CalcFaces =        (1<<0),
586         eExplodeFlag_PaSize =           (1<<1),
587         eExplodeFlag_EdgeSplit =        (1<<2),
588         eExplodeFlag_Unborn =           (1<<3),
589         eExplodeFlag_Alive =            (1<<4),
590         eExplodeFlag_Dead =                     (1<<5),
591 } ExplodeModifierFlag;
592
593 typedef struct ExplodeModifierData {
594         ModifierData modifier;
595         int *facepa;
596         short flag, vgroup;
597         float protect;
598 } ExplodeModifierData;
599
600 typedef struct MultiresModifierData {
601         ModifierData modifier;
602
603         char lvl, sculptlvl, renderlvl, totlvl;
604         char simple, flags, pad[2];
605 } MultiresModifierData;
606
607 typedef enum {
608         eMultiresModifierFlag_ControlEdges = (1<<0),
609 } MultiresModifierFlag;
610
611 typedef struct FluidsimModifierData {
612         ModifierData modifier;
613         
614         struct FluidsimSettings *fss; /* definition is in DNA_object_fluidsim.h */
615         struct PointCache *point_cache; /* definition is in DNA_object_force.h */
616 } FluidsimModifierData;
617
618 typedef struct ShrinkwrapModifierData {
619         ModifierData modifier;
620
621         struct Object *target;  /* shrink target */
622         struct Object *auxTarget; /* additional shrink target */
623         char vgroup_name[32];   /* optional vertexgroup name */
624         float keepDist;                 /* distance offset to keep from mesh/projection point */
625         short shrinkType;               /* shrink type projection */
626         short shrinkOpts;               /* shrink options */
627         char projAxis;                  /* axis to project over */
628
629         /*
630          * if using projection over vertex normal this controls the
631          * the level of subsurface that must be done before getting the
632          * vertex coordinates and normal
633          */
634         char subsurfLevels;
635
636         char pad[6];
637
638 } ShrinkwrapModifierData;
639
640 /* Shrinkwrap->shrinkType */
641 #define MOD_SHRINKWRAP_NEAREST_SURFACE  0
642 #define MOD_SHRINKWRAP_PROJECT                  1
643 #define MOD_SHRINKWRAP_NEAREST_VERTEX   2
644
645 /* Shrinkwrap->shrinkOpts */
646 #define MOD_SHRINKWRAP_PROJECT_ALLOW_POS_DIR    (1<<0)  /* allow shrinkwrap to move the vertex in the positive direction of axis */
647 #define MOD_SHRINKWRAP_PROJECT_ALLOW_NEG_DIR    (1<<1)  /* allow shrinkwrap to move the vertex in the negative direction of axis */
648
649 #define MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE    (1<<3)  /* ignore vertex moves if a vertex ends projected on a front face of the target */
650 #define MOD_SHRINKWRAP_CULL_TARGET_BACKFACE             (1<<4)  /* ignore vertex moves if a vertex ends projected on a back face of the target */
651
652 #define MOD_SHRINKWRAP_KEEP_ABOVE_SURFACE               (1<<5)  /* distance is measure to the front face of the target */
653
654 #define MOD_SHRINKWRAP_PROJECT_OVER_X_AXIS              (1<<0)
655 #define MOD_SHRINKWRAP_PROJECT_OVER_Y_AXIS              (1<<1)
656 #define MOD_SHRINKWRAP_PROJECT_OVER_Z_AXIS              (1<<2)
657 #define MOD_SHRINKWRAP_PROJECT_OVER_NORMAL                      0       /* projection over normal is used if no axis is selected */
658
659
660 typedef struct SimpleDeformModifierData {
661         ModifierData modifier;
662
663         struct Object *origin;  /* object to control the origin of modifier space coordinates */
664         char vgroup_name[32];   /* optional vertexgroup name */
665         float factor;                   /* factors to control simple deforms */
666         float limit[2];                 /* lower and upper limit */             
667
668         char mode;                              /* deform function */
669         char axis;                              /* lock axis (for taper and strech) */
670         char originOpts;                /* originOptions */
671         char pad;
672
673 } SimpleDeformModifierData;
674
675 #define MOD_SIMPLEDEFORM_MODE_TWIST             1
676 #define MOD_SIMPLEDEFORM_MODE_BEND              2
677 #define MOD_SIMPLEDEFORM_MODE_TAPER             3
678 #define MOD_SIMPLEDEFORM_MODE_STRETCH   4
679
680 #define MOD_SIMPLEDEFORM_LOCK_AXIS_X                    (1<<0)
681 #define MOD_SIMPLEDEFORM_LOCK_AXIS_Y                    (1<<1)
682
683 /* indicates whether simple deform should use the local
684    coordinates or global coordinates of origin */
685 #define MOD_SIMPLEDEFORM_ORIGIN_LOCAL                   (1<<0)
686
687 #define MOD_UVPROJECT_MAX                               10
688
689 typedef struct ShapeKeyModifierData {
690         ModifierData modifier;
691 } ShapeKeyModifierData;
692
693 typedef struct SolidifyModifierData {
694         ModifierData modifier;
695
696         char defgrp_name[32];           /* name of vertex group to use */
697         float offset;                   /* new surface offset level*/
698         float offset_fac;               /* midpoint of the offset  */
699         float crease_inner;
700         float crease_outer;
701         float crease_rim;
702         int flag;
703 } SolidifyModifierData;
704
705 #define MOD_SOLIDIFY_RIM                        (1<<0)
706 #define MOD_SOLIDIFY_EVEN                       (1<<1)
707 #define MOD_SOLIDIFY_NORMAL_CALC        (1<<2)
708 #define MOD_SOLIDIFY_VGROUP_INV         (1<<3)
709 #define MOD_SOLIDIFY_RIM_MATERIAL       (1<<4)
710
711 typedef struct ScrewModifierData {
712         ModifierData modifier;
713         struct Object *ob_axis;
714         int             steps;
715         int             render_steps;
716         int             iter;
717         float   screw_ofs;
718         float   angle;
719         short   axis;
720         short   flag;
721 } ScrewModifierData;
722
723 #define MOD_SCREW_NORMAL_FLIP   (1<<0)
724 #define MOD_SCREW_NORMAL_CALC   (1<<1)
725 #define MOD_SCREW_OBJECT_OFFSET (1<<2)
726 // #define MOD_SCREW_OBJECT_ANGLE       (1<<4)
727
728
729 #endif