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