Mesh Deform Modifier
[blender.git] / source / blender / makesdna / DNA_modifier_types.h
1 /**
2  * $Id$ 
3  */
4
5 #ifndef DNA_MODIFIER_TYPES_H
6 #define DNA_MODIFIER_TYPES_H
7
8 #define MODSTACK_DEBUG 1
9
10 /* WARNING ALERT! TYPEDEF VALUES ARE WRITTEN IN FILES! SO DO NOT CHANGE! */
11
12 typedef enum ModifierType {
13         eModifierType_None = 0,
14         eModifierType_Subsurf,
15         eModifierType_Lattice,
16         eModifierType_Curve,
17         eModifierType_Build,
18         eModifierType_Mirror,
19         eModifierType_Decimate,
20         eModifierType_Wave,
21         eModifierType_Armature,
22         eModifierType_Hook,
23         eModifierType_Softbody,
24         eModifierType_Boolean,
25         eModifierType_Array,
26         eModifierType_EdgeSplit,
27         eModifierType_Displace,
28         eModifierType_UVProject,
29         eModifierType_Smooth,
30         eModifierType_Cast,
31         eModifierType_MeshDeform,
32         NUM_MODIFIER_TYPES
33 } ModifierType;
34
35 typedef enum ModifierMode {
36         eModifierMode_Realtime = (1<<0),
37         eModifierMode_Render = (1<<1),
38         eModifierMode_Editmode = (1<<2),
39         eModifierMode_OnCage = (1<<3),
40         eModifierMode_Expanded = (1<<4),
41         eModifierMode_Virtual = (1<<5),
42         eModifierMode_DisableTemporary = (1 << 31)
43 } ModifierMode;
44
45 typedef struct ModifierData {
46         struct ModifierData *next, *prev;
47
48         int type, mode;
49         char name[32];
50
51         char *error;
52 } ModifierData;
53
54 typedef enum {
55         eSubsurfModifierFlag_Incremental = (1<<0),
56         eSubsurfModifierFlag_DebugIncr = (1<<1),
57         eSubsurfModifierFlag_ControlEdges = (1<<2),
58         eSubsurfModifierFlag_SubsurfUv = (1<<3)
59 } SubsurfModifierFlag;
60
61 typedef struct SubsurfModifierData {
62         ModifierData modifier;
63
64         short subdivType, levels, renderLevels, flags;
65
66         void *emCache, *mCache;
67 } SubsurfModifierData;
68
69 typedef struct LatticeModifierData {
70         ModifierData modifier;
71
72         struct Object *object;
73         char name[32];                  /* optional vertexgroup name */
74 } LatticeModifierData;
75
76 typedef struct CurveModifierData {
77         ModifierData modifier;
78
79         struct Object *object;
80         char name[32];                  /* optional vertexgroup name */
81         short defaxis;                  /* axis along which curve deforms */
82         char pad[6];
83 } CurveModifierData;
84
85 /* CurveModifierData->defaxis */
86 #define MOD_CURVE_POSX  1
87 #define MOD_CURVE_POSY  2
88 #define MOD_CURVE_POSZ  3
89 #define MOD_CURVE_NEGX  4
90 #define MOD_CURVE_NEGY  5
91 #define MOD_CURVE_NEGZ  6
92
93 typedef struct BuildModifierData {
94         ModifierData modifier;
95
96         float start, length;
97         int randomize, seed;
98 } BuildModifierData;
99
100 typedef struct ArrayModifierData {
101         ModifierData modifier;
102
103         /* the object with which to cap the start of the array  */
104         struct Object *start_cap;
105         /* the object with which to cap the end of the array  */
106         struct Object *end_cap;
107         /* the curve object to use for MOD_ARR_FITCURVE */
108         struct Object *curve_ob;
109         /* the object to use for object offset */
110         struct Object *offset_ob;
111         /* a constant duplicate offset;
112            1 means the duplicates are 1 unit apart
113     */
114         float offset[3];
115         /* a scaled factor for duplicate offsets;
116            1 means the duplicates are 1 object-width apart
117     */
118         float scale[3];
119         /* the length over which to distribute the duplicates */
120         float length;
121         /* the limit below which to merge vertices in adjacent duplicates */
122         float merge_dist;
123         /* determines how duplicate count is calculated; one of:
124               MOD_ARR_FIXEDCOUNT -> fixed
125               MOD_ARR_FITLENGTH  -> calculated to fit a set length
126               MOD_ARR_FITCURVE   -> calculated to fit the length of a Curve object
127     */
128         int fit_type;
129         /* flags specifying how total offset is calculated; binary OR of:
130              MOD_ARR_OFF_CONST    -> total offset += offset
131              MOD_ARR_OFF_RELATIVE -> total offset += relative * object width
132              MOD_ARR_OFF_OBJ      -> total offset += offset_ob's matrix
133            total offset is the sum of the individual enabled offsets
134         */
135         int offset_type;
136         /* general flags:
137               MOD_ARR_MERGE -> merge vertices in adjacent duplicates
138         */
139         int flags;
140         /* the number of duplicates to generate for MOD_ARR_FIXEDCOUNT */
141         int count;
142 } ArrayModifierData;
143
144 /* ArrayModifierData->fit_type */
145 #define MOD_ARR_FIXEDCOUNT 0
146 #define MOD_ARR_FITLENGTH  1
147 #define MOD_ARR_FITCURVE   2
148
149 /* ArrayModifierData->offset_type */
150 #define MOD_ARR_OFF_CONST    1<<0
151 #define MOD_ARR_OFF_RELATIVE 1<<1
152 #define MOD_ARR_OFF_OBJ      1<<2
153
154 /* ArrayModifierData->flags */
155 #define MOD_ARR_MERGE      1<<0
156 #define MOD_ARR_MERGEFINAL 1<<1
157
158 typedef struct MirrorModifierData {
159         ModifierData modifier;
160
161         short axis, flag;
162         float tolerance;
163 } MirrorModifierData;
164
165 /* MirrorModifierData->flag */
166 #define MOD_MIR_CLIPPING        1<<0
167 #define MOD_MIR_MIRROR_U        1<<1
168 #define MOD_MIR_MIRROR_V        1<<2
169 #define MOD_MIR_AXIS_X          1<<3
170 #define MOD_MIR_AXIS_Y          1<<4
171 #define MOD_MIR_AXIS_Z          1<<5
172
173 typedef struct EdgeSplitModifierData {
174         ModifierData modifier;
175
176         float split_angle;    /* angle above which edges should be split */
177         int flags;
178 } EdgeSplitModifierData;
179
180 /* EdgeSplitModifierData->flags */
181 #define MOD_EDGESPLIT_FROMANGLE   1<<1
182 #define MOD_EDGESPLIT_FROMFLAG    1<<2
183
184 typedef struct DisplaceModifierData {
185         ModifierData modifier;
186
187         struct Tex *texture;
188         float strength;
189         int direction;
190         char defgrp_name[32];
191         float midlevel;
192         int texmapping;
193         struct Object *map_object;
194         char uvlayer_name[32];
195         int uvlayer_tmp, pad;
196 } DisplaceModifierData;
197
198 /* DisplaceModifierData->direction */
199 enum {
200         MOD_DISP_DIR_X,
201         MOD_DISP_DIR_Y,
202         MOD_DISP_DIR_Z,
203         MOD_DISP_DIR_NOR,
204         MOD_DISP_DIR_RGB_XYZ,
205 };
206
207 /* DisplaceModifierData->texmapping */
208 enum {
209         MOD_DISP_MAP_LOCAL,
210         MOD_DISP_MAP_GLOBAL,
211         MOD_DISP_MAP_OBJECT,
212         MOD_DISP_MAP_UV,
213 };
214
215 typedef struct UVProjectModifierData {
216         ModifierData modifier;
217
218         /* the objects which do the projecting */
219         struct Object *projectors[10];
220         struct Image *image;      /* the image to project */
221         int flags;
222         int num_projectors;
223         float aspectx, aspecty;
224         char uvlayer_name[32];
225         int uvlayer_tmp, pad;
226 } UVProjectModifierData;
227
228 #define MOD_UVPROJECT_MAXPROJECTORS 10
229
230 /* UVProjectModifierData->flags */
231 #define MOD_UVPROJECT_OVERRIDEIMAGE 1<<0
232
233 typedef struct DecimateModifierData {
234         ModifierData modifier;
235
236         float percent;
237         int faceCount;
238 } DecimateModifierData;
239
240 /* Smooth modifier flags */
241 #define MOD_SMOOTH_X (1<<1)
242 #define MOD_SMOOTH_Y (1<<2)
243 #define MOD_SMOOTH_Z (1<<3)
244
245 typedef struct SmoothModifierData {
246         ModifierData modifier;
247         float fac;
248         char defgrp_name[32];
249         short flag, repeat;
250
251 } SmoothModifierData;
252
253 /* Cast modifier flags */
254 #define MOD_CAST_X (1<<1)
255 #define MOD_CAST_Y (1<<2)
256 #define MOD_CAST_Z (1<<3)
257 #define MOD_CAST_USE_OB_TRANSFORM (1<<4)
258 #define MOD_CAST_SIZE_FROM_RADIUS (1<<5)
259
260 /* Cast modifier projection types */
261 #define MOD_CAST_TYPE_SPHERE 0
262 #define MOD_CAST_TYPE_CYLINDER 1
263 #define MOD_CAST_TYPE_CUBOID 2
264
265 typedef struct CastModifierData {
266         ModifierData modifier;
267
268         struct Object *object;
269         float fac;
270         float radius;
271         float size;
272         char defgrp_name[32];
273         short flag, type;
274 } CastModifierData;
275
276 enum {
277         MOD_WAV_MAP_LOCAL,
278         MOD_WAV_MAP_GLOBAL,
279         MOD_WAV_MAP_OBJECT,
280         MOD_WAV_MAP_UV,
281 };
282
283 /* WaveModifierData.flag */
284 #define MOD_WAVE_X      1<<1
285 #define MOD_WAVE_Y      1<<2
286 #define MOD_WAVE_CYCL   1<<3
287 #define MOD_WAVE_NORM   1<<4
288 #define MOD_WAVE_NORM_X 1<<5
289 #define MOD_WAVE_NORM_Y 1<<6
290 #define MOD_WAVE_NORM_Z 1<<7
291
292 typedef struct WaveModifierData {
293         ModifierData modifier;
294
295         struct Object *objectcenter;
296         char defgrp_name[32];
297         struct Tex *texture;
298         struct Object *map_object;
299
300         short flag, pad;
301
302         float startx, starty, height, width;
303         float narrow, speed, damp;
304
305         int texmapping, uvlayer_tmp;
306
307         char uvlayer_name[32];
308         
309         float timeoffs, lifetime;
310 } WaveModifierData;
311
312 typedef struct ArmatureModifierData {
313         ModifierData modifier;
314
315         short deformflag, pad1;         /* deformflag replaces armature->deformflag */
316         int pad2;
317         struct Object *object;
318         char defgrp_name[32];
319 } ArmatureModifierData;
320
321 typedef struct HookModifierData {
322         ModifierData modifier;
323
324         struct Object *object;
325         float parentinv[4][4];  /* matrix making current transform unmodified */
326         float cent[3];                  /* visualization of hook */
327         float falloff;                  /* if not zero, falloff is distance where influence zero */
328         
329         int *indexar;                   /* if NULL, it's using vertexgroup */
330         int totindex;
331         float force;
332         char name[32];                  /* optional vertexgroup name */
333 } HookModifierData;
334
335 typedef struct SoftbodyModifierData {
336         ModifierData modifier;
337 } SoftbodyModifierData;
338
339 typedef enum {
340         eBooleanModifierOp_Intersect,
341         eBooleanModifierOp_Union,
342         eBooleanModifierOp_Difference,
343 } BooleanModifierOp;
344 typedef struct BooleanModifierData {
345         ModifierData modifier;
346
347         struct Object *object;
348         int operation, pad;
349 } BooleanModifierData;
350
351 typedef struct MeshDeformModifierData {
352         ModifierData modifier;
353
354         struct Object *object;                  /* mesh object */
355         char defgrp_name[32];                   /* optional vertexgroup name */
356
357         float *bindweights, *bindcos;   /* computed binding weights */
358         short gridsize, needbind;
359         int pad;
360
361         int totvert, totcagevert;
362 } MeshDeformModifierData;
363
364 #endif