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