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