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