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