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