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