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