Reserved modifier enum for Dynamic Paint to not break save files again.
[blender.git] / source / blender / makesdna / DNA_modifier_types.h
1 /*
2  * $Id$ 
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 #ifndef DNA_MODIFIER_TYPES_H
24 #define DNA_MODIFIER_TYPES_H
25
26 /** \file DNA_modifier_types.h
27  *  \ingroup DNA
28  */
29
30 #include "DNA_listBase.h"
31
32
33 #define MODSTACK_DEBUG 1
34
35 /* WARNING ALERT! TYPEDEF VALUES ARE WRITTEN IN FILES! SO DO NOT CHANGE! */
36
37 typedef enum ModifierType {
38         eModifierType_None = 0,
39         eModifierType_Subsurf,
40         eModifierType_Lattice,
41         eModifierType_Curve,
42         eModifierType_Build,
43         eModifierType_Mirror,
44         eModifierType_Decimate,
45         eModifierType_Wave,
46         eModifierType_Armature,
47         eModifierType_Hook,
48         eModifierType_Softbody,
49         eModifierType_Boolean,
50         eModifierType_Array,
51         eModifierType_EdgeSplit,
52         eModifierType_Displace,
53         eModifierType_UVProject,
54         eModifierType_Smooth,
55         eModifierType_Cast,
56         eModifierType_MeshDeform,
57         eModifierType_ParticleSystem,
58         eModifierType_ParticleInstance,
59         eModifierType_Explode,
60         eModifierType_Cloth,
61         eModifierType_Collision,
62         eModifierType_Bevel,
63         eModifierType_Shrinkwrap,
64         eModifierType_Fluidsim,
65         eModifierType_Mask,
66         eModifierType_SimpleDeform,
67         eModifierType_Multires,
68         eModifierType_Surface,
69         eModifierType_Smoke,
70         eModifierType_ShapeKey,
71         eModifierType_Solidify,
72         eModifierType_Screw,
73         eModifierType_Warp,
74         eModifierType_WeightVGEdit,
75         eModifierType_WeightVGMix,
76         eModifierType_WeightVGProximity,
77         eModifierType_NavMesh,
78         eModifierType_DynamicPaint, /* reserve slot */
79         NUM_MODIFIER_TYPES
80 } ModifierType;
81
82 typedef enum ModifierMode {
83         eModifierMode_Realtime = (1<<0),
84         eModifierMode_Render = (1<<1),
85         eModifierMode_Editmode = (1<<2),
86         eModifierMode_OnCage = (1<<3),
87         eModifierMode_Expanded = (1<<4),
88         eModifierMode_Virtual = (1<<5),
89         eModifierMode_ApplyOnSpline = (1<<6),
90         eModifierMode_DisableTemporary = (1 << 31)
91 } ModifierMode;
92
93 typedef struct ModifierData {
94         struct ModifierData *next, *prev;
95
96         int type, mode;
97         int stackindex, pad;
98         char name[32];
99         
100         /* XXX for timing info set by caller... solve later? (ton) */
101         struct Scene *scene;
102         
103         char *error;
104 } ModifierData;
105
106 typedef enum {
107         eSubsurfModifierFlag_Incremental = (1<<0),
108         eSubsurfModifierFlag_DebugIncr = (1<<1),
109         eSubsurfModifierFlag_ControlEdges = (1<<2),
110         eSubsurfModifierFlag_SubsurfUv = (1<<3)
111 } SubsurfModifierFlag;
112
113 /* not a real modifier */
114 typedef struct MappingInfoModifierData {
115         ModifierData modifier;
116
117         struct Tex *texture;
118         struct Object *map_object;
119         char uvlayer_name[32];
120         int uvlayer_tmp;
121         int texmapping;
122 } MappingInfoModifierData;
123
124 typedef struct SubsurfModifierData {
125         ModifierData modifier;
126
127         short subdivType, levels, renderLevels, flags;
128
129         void *emCache, *mCache;
130 } SubsurfModifierData;
131
132 typedef struct LatticeModifierData {
133         ModifierData modifier;
134
135         struct Object *object;
136         char name[32];                  /* optional vertexgroup name */
137 } LatticeModifierData;
138
139 typedef struct CurveModifierData {
140         ModifierData modifier;
141
142         struct Object *object;
143         char name[32];                  /* optional vertexgroup name */
144         short defaxis;                  /* axis along which curve deforms */
145         char pad[6];
146 } CurveModifierData;
147
148 /* CurveModifierData->defaxis */
149 #define MOD_CURVE_POSX  1
150 #define MOD_CURVE_POSY  2
151 #define MOD_CURVE_POSZ  3
152 #define MOD_CURVE_NEGX  4
153 #define MOD_CURVE_NEGY  5
154 #define MOD_CURVE_NEGZ  6
155
156 typedef struct BuildModifierData {
157         ModifierData modifier;
158
159         float start, length;
160         int randomize, seed;
161 } BuildModifierData;
162
163 /* Mask Modifier */
164 typedef struct MaskModifierData {
165         ModifierData modifier;
166         
167         struct Object *ob_arm;  /* armature to use to in place of hardcoded vgroup */
168         char vgroup[32];                /* name of vertex group to use to mask */
169         
170         int mode;                               /* using armature or hardcoded vgroup */
171         int flag;                               /* flags for various things */
172 } MaskModifierData;
173
174 /* Mask Modifier -> mode */
175 #define MOD_MASK_MODE_VGROUP            0
176 #define MOD_MASK_MODE_ARM                       1
177
178 /* Mask Modifier -> flag */
179 #define MOD_MASK_INV                    (1<<0)
180
181 typedef struct ArrayModifierData {
182         ModifierData modifier;
183
184         /* the object with which to cap the start of the array  */
185         struct Object *start_cap;
186         /* the object with which to cap the end of the array  */
187         struct Object *end_cap;
188         /* the curve object to use for MOD_ARR_FITCURVE */
189         struct Object *curve_ob;
190         /* the object to use for object offset */
191         struct Object *offset_ob;
192         /* a constant duplicate offset;
193            1 means the duplicates are 1 unit apart
194         */
195         float offset[3];
196         /* a scaled factor for duplicate offsets;
197            1 means the duplicates are 1 object-width apart
198         */
199         float scale[3];
200         /* the length over which to distribute the duplicates */
201         float length;
202         /* the limit below which to merge vertices in adjacent duplicates */
203         float merge_dist;
204         /* determines how duplicate count is calculated; one of:
205                   MOD_ARR_FIXEDCOUNT -> fixed
206                   MOD_ARR_FITLENGTH  -> calculated to fit a set length
207                   MOD_ARR_FITCURVE   -> calculated to fit the length of a Curve object
208         */
209         int fit_type;
210         /* flags specifying how total offset is calculated; binary OR of:
211                  MOD_ARR_OFF_CONST    -> total offset += offset
212                  MOD_ARR_OFF_RELATIVE -> total offset += relative * object width
213                  MOD_ARR_OFF_OBJ      -> total offset += offset_ob's matrix
214            total offset is the sum of the individual enabled offsets
215         */
216         int offset_type;
217         /* general flags:
218                   MOD_ARR_MERGE -> merge vertices in adjacent duplicates
219         */
220         int flags;
221         /* the number of duplicates to generate for MOD_ARR_FIXEDCOUNT */
222         int count;
223 } ArrayModifierData;
224
225 /* ArrayModifierData->fit_type */
226 #define MOD_ARR_FIXEDCOUNT 0
227 #define MOD_ARR_FITLENGTH  1
228 #define MOD_ARR_FITCURVE   2
229
230 /* ArrayModifierData->offset_type */
231 #define MOD_ARR_OFF_CONST    (1<<0)
232 #define MOD_ARR_OFF_RELATIVE (1<<1)
233 #define MOD_ARR_OFF_OBJ      (1<<2)
234
235 /* ArrayModifierData->flags */
236 #define MOD_ARR_MERGE      (1<<0)
237 #define MOD_ARR_MERGEFINAL (1<<1)
238
239 typedef struct MirrorModifierData {
240         ModifierData modifier;
241
242         short axis; /* deprecated, use flag instead */
243         short flag;
244         float tolerance;
245         struct Object *mirror_ob;
246 } MirrorModifierData;
247
248 /* MirrorModifierData->flag */
249 #define MOD_MIR_CLIPPING        (1<<0)
250 #define MOD_MIR_MIRROR_U        (1<<1)
251 #define MOD_MIR_MIRROR_V        (1<<2)
252 #define MOD_MIR_AXIS_X          (1<<3)
253 #define MOD_MIR_AXIS_Y          (1<<4)
254 #define MOD_MIR_AXIS_Z          (1<<5)
255 #define MOD_MIR_VGROUP          (1<<6)
256 #define MOD_MIR_NO_MERGE        (1<<7)
257
258 typedef struct EdgeSplitModifierData {
259         ModifierData modifier;
260
261         float split_angle;    /* angle above which edges should be split */
262         int flags;
263 } EdgeSplitModifierData;
264
265 /* EdgeSplitModifierData->flags */
266 #define MOD_EDGESPLIT_FROMANGLE   (1<<1)
267 #define MOD_EDGESPLIT_FROMFLAG    (1<<2)
268
269 typedef struct BevelModifierData {
270         ModifierData modifier;
271
272         float value;          /* the "raw" bevel value (distance/amount to bevel) */
273         int res;              /* the resolution (as originally coded, it is the number of recursive bevels) */
274         int pad;
275         short flags;          /* general option flags */
276         short val_flags;      /* flags used to interpret the bevel value */
277         short lim_flags;      /* flags to tell the tool how to limit the bevel */
278         short e_flags;        /* flags to direct how edge weights are applied to verts */
279         float bevel_angle;    /* if the BME_BEVEL_ANGLE is set, this will be how "sharp" an edge must be before it gets beveled */
280         char defgrp_name[32]; /* if the BME_BEVEL_VWEIGHT option is set, this will be the name of the vert group */
281 } BevelModifierData;
282
283 typedef struct BMeshModifierData {
284         ModifierData modifier;
285
286         float pad;
287         int type;
288 } BMeshModifierData;
289
290
291 /* Smoke modifier flags */
292 #define MOD_SMOKE_TYPE_DOMAIN (1 << 0)
293 #define MOD_SMOKE_TYPE_FLOW (1 << 1)
294 #define MOD_SMOKE_TYPE_COLL (1 << 2)
295
296 typedef struct SmokeModifierData {
297         ModifierData modifier;
298
299         struct SmokeDomainSettings *domain;
300         struct SmokeFlowSettings *flow; /* inflow, outflow, smoke objects */
301         struct SmokeCollSettings *coll; /* collision objects */
302         float time;
303         int type;  /* domain, inflow, outflow, ... */
304 } SmokeModifierData;
305
306 typedef struct DisplaceModifierData {
307         ModifierData modifier;
308
309         /* keep in sync with MappingInfoModifierData */
310         struct Tex *texture;
311         struct Object *map_object;
312         char uvlayer_name[32];
313         int uvlayer_tmp;
314         int texmapping;
315         int pad10;
316         /* end MappingInfoModifierData */
317
318         float strength;
319         int direction;
320         char defgrp_name[32];
321         float midlevel;
322 } DisplaceModifierData;
323
324 /* DisplaceModifierData->direction */
325 enum {
326         MOD_DISP_DIR_X,
327         MOD_DISP_DIR_Y,
328         MOD_DISP_DIR_Z,
329         MOD_DISP_DIR_NOR,
330         MOD_DISP_DIR_RGB_XYZ,
331 };
332
333 /* DisplaceModifierData->texmapping */
334 enum {
335         MOD_DISP_MAP_LOCAL,
336         MOD_DISP_MAP_GLOBAL,
337         MOD_DISP_MAP_OBJECT,
338         MOD_DISP_MAP_UV,
339 };
340
341 typedef struct UVProjectModifierData {
342         ModifierData modifier;
343
344         /* the objects which do the projecting */
345         struct Object *projectors[10]; /* MOD_UVPROJECT_MAX */
346         struct Image *image;      /* the image to project */
347         int flags;
348         int num_projectors;
349         float aspectx, aspecty;
350         float scalex, scaley;                                                                                           
351         char uvlayer_name[32];
352         int uvlayer_tmp, pad;
353 } UVProjectModifierData;
354
355 #define MOD_UVPROJECT_MAXPROJECTORS 10
356
357 /* UVProjectModifierData->flags */
358 #define MOD_UVPROJECT_OVERRIDEIMAGE (1<<0)
359
360 typedef struct DecimateModifierData {
361         ModifierData modifier;
362
363         float percent;
364         int faceCount;
365 } DecimateModifierData;
366
367 /* Smooth modifier flags */
368 #define MOD_SMOOTH_X (1<<1)
369 #define MOD_SMOOTH_Y (1<<2)
370 #define MOD_SMOOTH_Z (1<<3)
371
372 typedef struct SmoothModifierData {
373         ModifierData modifier;
374         float fac;
375         char defgrp_name[32];
376         short flag, repeat;
377
378 } SmoothModifierData;
379
380 /* Cast modifier flags */
381 #define MOD_CAST_X (1<<1)
382 #define MOD_CAST_Y (1<<2)
383 #define MOD_CAST_Z (1<<3)
384 #define MOD_CAST_USE_OB_TRANSFORM (1<<4)
385 #define MOD_CAST_SIZE_FROM_RADIUS (1<<5)
386
387 /* Cast modifier projection types */
388 #define MOD_CAST_TYPE_SPHERE 0
389 #define MOD_CAST_TYPE_CYLINDER 1
390 #define MOD_CAST_TYPE_CUBOID 2
391
392 typedef struct CastModifierData {
393         ModifierData modifier;
394
395         struct Object *object;
396         float fac;
397         float radius;
398         float size;
399         char defgrp_name[32];
400         short flag, type;
401 } CastModifierData;
402
403 enum {
404         MOD_WAV_MAP_LOCAL,
405         MOD_WAV_MAP_GLOBAL,
406         MOD_WAV_MAP_OBJECT,
407         MOD_WAV_MAP_UV,
408 };
409
410 /* WaveModifierData.flag */
411 #define MOD_WAVE_X      (1<<1)
412 #define MOD_WAVE_Y      (1<<2)
413 #define MOD_WAVE_CYCL   (1<<3)
414 #define MOD_WAVE_NORM   (1<<4)
415 #define MOD_WAVE_NORM_X (1<<5)
416 #define MOD_WAVE_NORM_Y (1<<6)
417 #define MOD_WAVE_NORM_Z (1<<7)
418
419 typedef struct WaveModifierData {
420         ModifierData modifier;
421
422         struct Object *objectcenter;
423         char defgrp_name[32];
424         struct Tex *texture;
425         struct Object *map_object;
426
427         short flag, pad;
428
429         float startx, starty, height, width;
430         float narrow, speed, damp, falloff;
431
432         int texmapping, uvlayer_tmp;
433
434         char uvlayer_name[32];
435
436         float timeoffs, lifetime;
437         float pad1;
438 } WaveModifierData;
439
440 typedef struct ArmatureModifierData {
441         ModifierData modifier;
442
443         short deformflag, multi;                /* deformflag replaces armature->deformflag */
444         int pad2;
445         struct Object *object;
446         float *prevCos;         /* stored input of previous modifier, for vertexgroup blending */
447         char defgrp_name[32];
448 } ArmatureModifierData;
449
450 typedef struct HookModifierData {
451         ModifierData modifier;
452
453         struct Object *object;
454         char subtarget[32];             /* optional name of bone target */
455         
456         float parentinv[4][4];  /* matrix making current transform unmodified */
457         float cent[3];                  /* visualization of hook */
458         float falloff;                  /* if not zero, falloff is distance where influence zero */
459         
460         int *indexar;                   /* if NULL, it's using vertexgroup */
461         int totindex;
462         float force;
463         char name[32];                  /* optional vertexgroup name */
464 } HookModifierData;
465
466 typedef struct SoftbodyModifierData {
467         ModifierData modifier;
468 } SoftbodyModifierData;
469
470 typedef struct ClothModifierData {
471         ModifierData            modifier;
472
473         struct Scene *scene;                    /* the context, time etc is here */
474         struct Cloth *clothObject;              /* The internal data structure for cloth. */
475         struct ClothSimSettings *sim_parms; /* definition is in DNA_cloth_types.h */
476         struct ClothCollSettings *coll_parms; /* definition is in DNA_cloth_types.h */
477         struct PointCache *point_cache; /* definition is in DNA_object_force.h */
478         struct ListBase ptcaches;
479 } ClothModifierData;
480
481 typedef struct CollisionModifierData {
482         ModifierData    modifier;
483         
484         struct MVert *x; /* position at the beginning of the frame */
485         struct MVert *xnew; /* position at the end of the frame */
486         struct MVert *xold; /* unsued atm, but was discussed during sprint */
487         struct MVert *current_xnew; /* new position at the actual inter-frame step */
488         struct MVert *current_x; /* position at the actual inter-frame step */
489         struct MVert *current_v; /* (xnew - x) at the actual inter-frame step */
490         
491         struct MFace *mfaces; /* object face data */
492         
493         unsigned int numverts;
494         unsigned int numfaces;
495         float time_x, time_xnew;                /* cfra time of modifier */
496         struct BVHTree *bvhtree; /* bounding volume hierarchy for this cloth object */
497 } CollisionModifierData;
498
499 typedef struct SurfaceModifierData {
500         ModifierData    modifier;
501
502         struct MVert *x; /* old position */
503         struct MVert *v; /* velocity */
504
505         struct DerivedMesh *dm;
506
507         struct BVHTreeFromMesh *bvhtree; /* bounding volume hierarchy of the mesh faces */
508
509         int cfra, numverts;
510 } SurfaceModifierData;
511
512 typedef enum {
513         eBooleanModifierOp_Intersect,
514         eBooleanModifierOp_Union,
515         eBooleanModifierOp_Difference,
516 } BooleanModifierOp;
517 typedef struct BooleanModifierData {
518         ModifierData modifier;
519
520         struct Object *object;
521         int operation, pad;
522 } BooleanModifierData;
523
524 #define MOD_MDEF_INVERT_VGROUP  (1<<0)
525 #define MOD_MDEF_DYNAMIC_BIND   (1<<1)
526
527 #define MOD_MDEF_VOLUME                 0
528 #define MOD_MDEF_SURFACE                1
529
530 typedef struct MDefInfluence {
531         int vertex;
532         float weight;
533 } MDefInfluence;
534
535 typedef struct MDefCell {
536         int offset;
537         int totinfluence;
538 } MDefCell;
539
540 typedef struct MeshDeformModifierData {
541         ModifierData modifier;
542
543         struct Object *object;                  /* mesh object */
544         char defgrp_name[32];                   /* optional vertexgroup name */
545
546         short gridsize, flag, mode, pad;
547
548         /* result of static binding */
549         MDefInfluence *bindinfluences;  /* influences */
550         int *bindoffsets;                               /* offsets into influences array */
551         float *bindcagecos;                             /* coordinates that cage was bound with */
552         int totvert, totcagevert;               /* total vertices in mesh and cage */
553
554         /* result of dynamic binding */
555         MDefCell *dyngrid;                              /* grid with dynamic binding cell points */
556         MDefInfluence *dyninfluences;   /* dynamic binding vertex influences */
557         int *dynverts, *pad2;                   /* is this vertex bound or not? */
558         int dyngridsize;                                /* size of the dynamic bind grid */
559         int totinfluence;                               /* total number of vertex influences */
560         float dyncellmin[3];                    /* offset of the dynamic bind grid */
561         float dyncellwidth;                             /* width of dynamic bind cell */
562         float bindmat[4][4];                    /* matrix of cage at binding time */
563
564         /* deprecated storage */
565         float *bindweights;                             /* deprecated inefficient storage */
566         float *bindcos;                                 /* deprecated storage of cage coords */
567
568         /* runtime */
569         void (*bindfunc)(struct Scene *scene,
570                 struct MeshDeformModifierData *mmd,
571                 float *vertexcos, int totvert, float cagemat[][4]);
572 } MeshDeformModifierData;
573
574 typedef enum {
575         eParticleSystemFlag_Pars =                      (1<<0),
576         eParticleSystemFlag_psys_updated =      (1<<1),
577         eParticleSystemFlag_file_loaded =       (1<<2),
578 } ParticleSystemModifierFlag;
579
580 typedef struct ParticleSystemModifierData {
581         ModifierData modifier;
582         struct ParticleSystem *psys;
583         struct DerivedMesh *dm;
584         int totdmvert, totdmedge, totdmface;
585         short flag, rt;
586 } ParticleSystemModifierData;
587
588 typedef enum {
589         eParticleInstanceFlag_Parents =         (1<<0),
590         eParticleInstanceFlag_Children =        (1<<1),
591         eParticleInstanceFlag_Path =            (1<<2),
592         eParticleInstanceFlag_Unborn =          (1<<3),
593         eParticleInstanceFlag_Alive =           (1<<4),
594         eParticleInstanceFlag_Dead =            (1<<5),
595         eParticleInstanceFlag_KeepShape =       (1<<6),
596         eParticleInstanceFlag_UseSize =         (1<<7),
597 } ParticleInstanceModifierFlag;
598
599 typedef struct ParticleInstanceModifierData {
600         ModifierData modifier;
601         struct Object *ob;
602         short psys, flag, axis, rt;
603         float position, random_position;
604 } ParticleInstanceModifierData;
605
606 typedef enum {
607         eExplodeFlag_CalcFaces =        (1<<0),
608         eExplodeFlag_PaSize =           (1<<1),
609         eExplodeFlag_EdgeCut =          (1<<2),
610         eExplodeFlag_Unborn =           (1<<3),
611         eExplodeFlag_Alive =            (1<<4),
612         eExplodeFlag_Dead =                     (1<<5),
613 } ExplodeModifierFlag;
614
615 typedef struct ExplodeModifierData {
616         ModifierData modifier;
617         int *facepa;
618         short flag, vgroup;
619         float protect;
620         char uvname[32];
621 } ExplodeModifierData;
622
623 typedef struct MultiresModifierData {
624         ModifierData modifier;
625
626         char lvl, sculptlvl, renderlvl, totlvl;
627         char simple, flags, pad[2];
628 } MultiresModifierData;
629
630 typedef enum {
631         eMultiresModifierFlag_ControlEdges = (1<<0),
632         eMultiresModifierFlag_PlainUv = (1<<1),
633 } MultiresModifierFlag;
634
635 typedef struct FluidsimModifierData {
636         ModifierData modifier;
637         
638         struct FluidsimSettings *fss; /* definition is in DNA_object_fluidsim.h */
639         struct PointCache *point_cache; /* definition is in DNA_object_force.h */
640 } FluidsimModifierData;
641
642 typedef struct ShrinkwrapModifierData {
643         ModifierData modifier;
644
645         struct Object *target;  /* shrink target */
646         struct Object *auxTarget; /* additional shrink target */
647         char vgroup_name[32];   /* optional vertexgroup name */
648         float keepDist;                 /* distance offset to keep from mesh/projection point */
649         short shrinkType;               /* shrink type projection */
650         short shrinkOpts;               /* shrink options */
651         char projAxis;                  /* axis to project over */
652
653         /*
654          * if using projection over vertex normal this controls the
655          * the level of subsurface that must be done before getting the
656          * vertex coordinates and normal
657          */
658         char subsurfLevels;
659
660         char pad[6];
661
662 } ShrinkwrapModifierData;
663
664 /* Shrinkwrap->shrinkType */
665 #define MOD_SHRINKWRAP_NEAREST_SURFACE  0
666 #define MOD_SHRINKWRAP_PROJECT                  1
667 #define MOD_SHRINKWRAP_NEAREST_VERTEX   2
668
669 /* Shrinkwrap->shrinkOpts */
670 #define MOD_SHRINKWRAP_PROJECT_ALLOW_POS_DIR    (1<<0)  /* allow shrinkwrap to move the vertex in the positive direction of axis */
671 #define MOD_SHRINKWRAP_PROJECT_ALLOW_NEG_DIR    (1<<1)  /* allow shrinkwrap to move the vertex in the negative direction of axis */
672
673 #define MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE    (1<<3)  /* ignore vertex moves if a vertex ends projected on a front face of the target */
674 #define MOD_SHRINKWRAP_CULL_TARGET_BACKFACE             (1<<4)  /* ignore vertex moves if a vertex ends projected on a back face of the target */
675
676 #define MOD_SHRINKWRAP_KEEP_ABOVE_SURFACE               (1<<5)  /* distance is measure to the front face of the target */
677
678 #define MOD_SHRINKWRAP_PROJECT_OVER_X_AXIS              (1<<0)
679 #define MOD_SHRINKWRAP_PROJECT_OVER_Y_AXIS              (1<<1)
680 #define MOD_SHRINKWRAP_PROJECT_OVER_Z_AXIS              (1<<2)
681 #define MOD_SHRINKWRAP_PROJECT_OVER_NORMAL                      0       /* projection over normal is used if no axis is selected */
682
683 typedef struct SimpleDeformModifierData {
684         ModifierData modifier;
685
686         struct Object *origin;  /* object to control the origin of modifier space coordinates */
687         char vgroup_name[32];   /* optional vertexgroup name */
688         float factor;                   /* factors to control simple deforms */
689         float limit[2];                 /* lower and upper limit */             
690
691         char mode;                              /* deform function */
692         char axis;                              /* lock axis (for taper and strech) */
693         char originOpts;                /* originOptions */
694         char pad;
695
696 } SimpleDeformModifierData;
697
698 #define MOD_SIMPLEDEFORM_MODE_TWIST             1
699 #define MOD_SIMPLEDEFORM_MODE_BEND              2
700 #define MOD_SIMPLEDEFORM_MODE_TAPER             3
701 #define MOD_SIMPLEDEFORM_MODE_STRETCH   4
702
703 #define MOD_SIMPLEDEFORM_LOCK_AXIS_X                    (1<<0)
704 #define MOD_SIMPLEDEFORM_LOCK_AXIS_Y                    (1<<1)
705
706 /* indicates whether simple deform should use the local
707    coordinates or global coordinates of origin */
708 #define MOD_SIMPLEDEFORM_ORIGIN_LOCAL                   (1<<0)
709
710 #define MOD_UVPROJECT_MAX                               10
711
712 typedef struct ShapeKeyModifierData {
713         ModifierData modifier;
714 } ShapeKeyModifierData;
715
716 typedef struct SolidifyModifierData {
717         ModifierData modifier;
718
719         char defgrp_name[32];   /* name of vertex group to use */
720         float offset;                   /* new surface offset level*/
721         float offset_fac;               /* midpoint of the offset  */
722         float offset_fac_vg;    /* factor for the minimum weight to use when vgroups are used, avoids 0.0 weights giving duplicate geometry */
723         float crease_inner;
724         float crease_outer;
725         float crease_rim;
726         int flag;
727         short mat_ofs;
728         short mat_ofs_rim;
729 } SolidifyModifierData;
730
731 #define MOD_SOLIDIFY_RIM                        (1<<0)
732 #define MOD_SOLIDIFY_EVEN                       (1<<1)
733 #define MOD_SOLIDIFY_NORMAL_CALC        (1<<2)
734 #define MOD_SOLIDIFY_VGROUP_INV         (1<<3)
735 #define MOD_SOLIDIFY_RIM_MATERIAL       (1<<4) /* deprecated, used in do_versions */
736
737 typedef struct ScrewModifierData {
738         ModifierData modifier;
739         struct Object *ob_axis;
740         int             steps;
741         int             render_steps;
742         int             iter;
743         float   screw_ofs;
744         float   angle;
745         short   axis;
746         short   flag;
747 } ScrewModifierData;
748
749 #define MOD_SCREW_NORMAL_FLIP   (1<<0)
750 #define MOD_SCREW_NORMAL_CALC   (1<<1)
751 #define MOD_SCREW_OBJECT_OFFSET (1<<2)
752 // #define MOD_SCREW_OBJECT_ANGLE       (1<<4)
753
754 typedef struct NavMeshModifierData {
755         ModifierData modifier;
756 } NavMeshModifierData;
757
758 typedef struct WarpModifierData {
759         ModifierData modifier;
760
761         /* keep in sync with MappingInfoModifierData */
762         struct Tex *texture;
763         struct Object *map_object;
764         char uvlayer_name[32];
765         int uvlayer_tmp;
766         int texmapping;
767         int pad10;
768         /* end MappingInfoModifierData */
769
770         float strength;
771
772         struct Object *object_from;
773         struct Object *object_to;
774         struct CurveMapping *curfalloff;
775         char defgrp_name[32];                   /* optional vertexgroup name */
776         float falloff_radius;
777         char flag; /* not used yet */
778         char falloff_type;
779         char pad[2];
780 } WarpModifierData;
781
782 #define MOD_WARP_VOLUME_PRESERVE 1
783
784 typedef enum {
785         eWarp_Falloff_None =            0,
786         eWarp_Falloff_Curve =           1,
787         eWarp_Falloff_Sharp =           2, /* PROP_SHARP */
788         eWarp_Falloff_Smooth =          3, /* PROP_SMOOTH */
789         eWarp_Falloff_Root =            4, /* PROP_ROOT */
790         eWarp_Falloff_Linear =          5, /* PROP_LIN */
791         eWarp_Falloff_Const =           6, /* PROP_CONST */
792         eWarp_Falloff_Sphere =          7, /* PROP_SPHERE */
793         /* PROP_RANDOM not used */
794 } WarpModifierFalloff;
795
796 typedef struct WeightVGEditModifierData {
797         ModifierData modifier;
798
799         /* Note: I tried to keep everything logically ordered - provided the
800          * alignment constraints... */
801
802         char    defgrp_name[32];      /* Name of vertex group to edit. */
803
804         short   edit_flags;     /* Using MOD_WVG_EDIT_* flags. */
805         short   falloff_type;   /* Using MOD_WVG_MAPPING_* defines. */
806         float   default_weight; /* Weight for vertices not in vgroup. */
807
808         /* Mapping stuff. */
809         struct CurveMapping *cmap_curve;  /* The custom mapping curve! */
810
811         /* The add/remove vertices weight thresholds. */
812         float   add_threshold, rem_threshold;
813
814         /* Masking options. */
815         float   mask_constant; /* The global "influence", if no vgroup nor tex is used as mask. */
816         /* Name of mask vertex group from which to get weight factors. */
817         char    mask_defgrp_name[32];
818
819         /* Texture masking. */
820         int             mask_tex_use_channel;      /* Which channel to use as weightf. */
821         struct Tex *mask_texture;          /* The texture. */
822         struct Object *mask_tex_map_obj;   /* Name of the map object. */
823         /* How to map the texture (using MOD_DISP_MAP_* constants). */
824         int             mask_tex_mapping;
825         char    mask_tex_uvlayer_name[32]; /* Name of the UV layer. */
826
827         /* Padding... */
828         int pad_i1;
829 } WeightVGEditModifierData;
830
831 /* WeightVGEdit flags. */
832 /* Use parametric mapping. */
833 //#define MOD_WVG_EDIT_MAP                                      (1 << 0)
834 /* Use curve mapping. */
835 //#define MOD_WVG_EDIT_CMAP                                     (1 << 1)
836 /* Reverse weights (in the [0.0, 1.0] standard range). */
837 //#define MOD_WVG_EDIT_REVERSE_WEIGHTS          (1 << 2)
838 /* Add vertices with higher weight than threshold to vgroup. */
839 #define MOD_WVG_EDIT_ADD2VG                                     (1 << 3)
840 /* Remove vertices with lower weight than threshold from vgroup. */
841 #define MOD_WVG_EDIT_REMFVG                                     (1 << 4)
842 /* Clamp weights. */
843 //#define MOD_WVG_EDIT_CLAMP                                    (1 << 5)
844
845 typedef struct WeightVGMixModifierData {
846         ModifierData modifier;
847
848         /* XXX Note: I tried to keep everything logically ordered – provided the
849          *           alignment constraints... */
850
851         char    defgrp_name_a[32];      /* Name of vertex group to modify/weight. */
852         char    defgrp_name_b[32];     /* Name of other vertex group to mix in. */
853         float   default_weight_a;       /* Default weight value for first vgroup. */
854         float   default_weight_b;      /* Default weight value to mix in. */
855         char    mix_mode;             /* How second vgroups weights affect first ones */
856         char    mix_set;              /* What vertices to affect. */
857
858         char    pad_c1[6];
859
860         /* Masking options. */
861         float   mask_constant; /* The global "influence", if no vgroup nor tex is used as mask. */
862         /* Name of mask vertex group from which to get weight factors. */
863         char    mask_defgrp_name[32];
864
865         /* Texture masking. */
866         int             mask_tex_use_channel;      /* Which channel to use as weightf. */
867         struct Tex *mask_texture;          /* The texture. */
868         struct Object *mask_tex_map_obj;   /* Name of the map object. */
869         int             mask_tex_mapping;          /* How to map the texture! */
870         char    mask_tex_uvlayer_name[32]; /* Name of the UV layer. */
871
872         /* Padding... */
873         int pad_i1;
874 } WeightVGMixModifierData;
875
876 /* How second vgroup's weights affect first ones. */
877 #define MOD_WVG_MIX_SET                 1 /* Second weights replace weights. */
878 #define MOD_WVG_MIX_ADD                 2 /* Second weights are added to weights. */
879 #define MOD_WVG_MIX_SUB                 3 /* Second weights are subtracted from weights. */
880 #define MOD_WVG_MIX_MUL                 4 /* Second weights are multiplied with weights. */
881 #define MOD_WVG_MIX_DIV                 5 /* Second weights divide weights. */
882 #define MOD_WVG_MIX_DIF                 6 /* Difference between second weights and weights. */
883 #define MOD_WVG_MIX_AVG                 7 /* Average of both weights. */
884
885 /* What vertices to affect. */
886 #define MOD_WVG_SET_ALL                 1 /* Affect all vertices. */
887 #define MOD_WVG_SET_A                   2 /* Affect only vertices in first vgroup. */
888 #define MOD_WVG_SET_B                   3 /* Affect only vertices in second vgroup. */
889 #define MOD_WVG_SET_OR                  4 /* Affect only vertices in one vgroup or the other. */
890 #define MOD_WVG_SET_AND                 5 /* Affect only vertices in both vgroups. */
891
892 typedef struct WeightVGProximityModifierData {
893         ModifierData modifier;
894
895         /* Note: I tried to keep everything logically ordered - provided the
896          * alignment constraints... */
897
898         char    defgrp_name[32];      /* Name of vertex group to modify/weight. */
899
900         /* Proximity modes. */
901         int             proximity_mode;
902         int             proximity_flags;
903
904         /* Target object from which to calculate vertices distances. */
905         struct Object *proximity_ob_target;
906
907         /* Masking options. */
908         float   mask_constant; /* The global "influence", if no vgroup nor tex is used as mask. */
909         /* Name of mask vertex group from which to get weight factors. */
910         char    mask_defgrp_name[32];
911
912         /* Texture masking. */
913         int             mask_tex_use_channel;      /* Which channel to use as weightf. */
914         struct Tex *mask_texture;          /* The texture. */
915         struct Object *mask_tex_map_obj;   /* Name of the map object. */
916         int             mask_tex_mapping;          /* How to map the texture! */
917         char    mask_tex_uvlayer_name[32]; /* Name of the UV layer. */
918
919         float   min_dist, max_dist;        /* Distances mapping to 0.0/1.0 weights. */
920
921         /* Put here to avoid breaking existing struct... */
922         short   falloff_type;              /* Using MOD_WVG_MAPPING_* defines. */
923
924         /* Padding... */
925         short pad_s1;
926 } WeightVGProximityModifierData;
927
928 /* Modes of proximity weighting. */
929 /* Dist from target object to affected object. */
930 #define MOD_WVG_PROXIMITY_OBJECT                        1 /* source vertex to other location */
931 /* Dist from target object to vertex. */
932 #define MOD_WVG_PROXIMITY_GEOMETRY                      2 /* source vertex to other geometry */
933
934 /* Flags options for proximity weighting. */
935 /* Use nearest vertices of target obj, in MOD_WVG_PROXIMITY_GEOMETRY mode. */
936 #define MOD_WVG_PROXIMITY_GEOM_VERTS            (1 << 0)
937 /* Use nearest edges of target obj, in MOD_WVG_PROXIMITY_GEOMETRY mode. */
938 #define MOD_WVG_PROXIMITY_GEOM_EDGES            (1 << 1)
939 /* Use nearest faces of target obj, in MOD_WVG_PROXIMITY_GEOMETRY mode. */
940 #define MOD_WVG_PROXIMITY_GEOM_FACES            (1 << 2)
941
942 /* Defines common to all WeightVG modifiers. */
943 /* Mapping modes. */
944 #define MOD_WVG_MAPPING_NONE                            0
945 #define MOD_WVG_MAPPING_CURVE                           1
946 #define MOD_WVG_MAPPING_SHARP                           2 /* PROP_SHARP */
947 #define MOD_WVG_MAPPING_SMOOTH                          3 /* PROP_SMOOTH */
948 #define MOD_WVG_MAPPING_ROOT                            4 /* PROP_ROOT */
949 /* PROP_LIN not used (same as NONE, here...). */
950 /* PROP_CONST not used. */
951 #define MOD_WVG_MAPPING_SPHERE                          7 /* PROP_SPHERE */
952 #define MOD_WVG_MAPPING_RANDOM                          8 /* PROP_RANDOM */
953 #define MOD_WVG_MAPPING_STEP                            9 /* Median Step. */
954
955 /* Tex channel to be used as mask. */
956 #define MOD_WVG_MASK_TEX_USE_INT                        1
957 #define MOD_WVG_MASK_TEX_USE_RED                        2
958 #define MOD_WVG_MASK_TEX_USE_GREEN                      3
959 #define MOD_WVG_MASK_TEX_USE_BLUE                       4
960 #define MOD_WVG_MASK_TEX_USE_HUE                        5
961 #define MOD_WVG_MASK_TEX_USE_SAT                        6
962 #define MOD_WVG_MASK_TEX_USE_VAL                        7
963 #define MOD_WVG_MASK_TEX_USE_ALPHA                      8
964
965 #endif