5 #ifndef DNA_MODIFIER_TYPES_H
6 #define DNA_MODIFIER_TYPES_H
8 #define MODSTACK_DEBUG 1
10 /* WARNING ALERT! TYPEDEF VALUES ARE WRITTEN IN FILES! SO DO NOT CHANGE! */
12 typedef enum ModifierType {
13 eModifierType_None = 0,
14 eModifierType_Subsurf,
15 eModifierType_Lattice,
19 eModifierType_Decimate,
21 eModifierType_Armature,
23 eModifierType_Softbody,
24 eModifierType_Boolean,
26 eModifierType_EdgeSplit,
27 eModifierType_Displace,
28 eModifierType_UVProject,
31 eModifierType_MeshDeform,
32 eModifierType_ParticleSystem,
33 eModifierType_ParticleInstance,
34 eModifierType_Explode,
38 typedef enum ModifierMode {
39 eModifierMode_Realtime = (1<<0),
40 eModifierMode_Render = (1<<1),
41 eModifierMode_Editmode = (1<<2),
42 eModifierMode_OnCage = (1<<3),
43 eModifierMode_Expanded = (1<<4),
44 eModifierMode_Virtual = (1<<5),
45 eModifierMode_DisableTemporary = (1 << 31)
48 typedef struct ModifierData {
49 struct ModifierData *next, *prev;
58 eSubsurfModifierFlag_Incremental = (1<<0),
59 eSubsurfModifierFlag_DebugIncr = (1<<1),
60 eSubsurfModifierFlag_ControlEdges = (1<<2),
61 eSubsurfModifierFlag_SubsurfUv = (1<<3)
62 } SubsurfModifierFlag;
64 typedef struct SubsurfModifierData {
65 ModifierData modifier;
67 short subdivType, levels, renderLevels, flags;
69 void *emCache, *mCache;
70 } SubsurfModifierData;
72 typedef struct LatticeModifierData {
73 ModifierData modifier;
75 struct Object *object;
76 char name[32]; /* optional vertexgroup name */
77 } LatticeModifierData;
79 typedef struct CurveModifierData {
80 ModifierData modifier;
82 struct Object *object;
83 char name[32]; /* optional vertexgroup name */
84 short defaxis; /* axis along which curve deforms */
88 /* CurveModifierData->defaxis */
89 #define MOD_CURVE_POSX 1
90 #define MOD_CURVE_POSY 2
91 #define MOD_CURVE_POSZ 3
92 #define MOD_CURVE_NEGX 4
93 #define MOD_CURVE_NEGY 5
94 #define MOD_CURVE_NEGZ 6
96 typedef struct BuildModifierData {
97 ModifierData modifier;
103 typedef struct ArrayModifierData {
104 ModifierData modifier;
106 /* the object with which to cap the start of the array */
107 struct Object *start_cap;
108 /* the object with which to cap the end of the array */
109 struct Object *end_cap;
110 /* the curve object to use for MOD_ARR_FITCURVE */
111 struct Object *curve_ob;
112 /* the object to use for object offset */
113 struct Object *offset_ob;
114 /* a constant duplicate offset;
115 1 means the duplicates are 1 unit apart
118 /* a scaled factor for duplicate offsets;
119 1 means the duplicates are 1 object-width apart
122 /* the length over which to distribute the duplicates */
124 /* the limit below which to merge vertices in adjacent duplicates */
126 /* determines how duplicate count is calculated; one of:
127 MOD_ARR_FIXEDCOUNT -> fixed
128 MOD_ARR_FITLENGTH -> calculated to fit a set length
129 MOD_ARR_FITCURVE -> calculated to fit the length of a Curve object
132 /* flags specifying how total offset is calculated; binary OR of:
133 MOD_ARR_OFF_CONST -> total offset += offset
134 MOD_ARR_OFF_RELATIVE -> total offset += relative * object width
135 MOD_ARR_OFF_OBJ -> total offset += offset_ob's matrix
136 total offset is the sum of the individual enabled offsets
140 MOD_ARR_MERGE -> merge vertices in adjacent duplicates
143 /* the number of duplicates to generate for MOD_ARR_FIXEDCOUNT */
147 /* ArrayModifierData->fit_type */
148 #define MOD_ARR_FIXEDCOUNT 0
149 #define MOD_ARR_FITLENGTH 1
150 #define MOD_ARR_FITCURVE 2
152 /* ArrayModifierData->offset_type */
153 #define MOD_ARR_OFF_CONST 1<<0
154 #define MOD_ARR_OFF_RELATIVE 1<<1
155 #define MOD_ARR_OFF_OBJ 1<<2
157 /* ArrayModifierData->flags */
158 #define MOD_ARR_MERGE 1<<0
159 #define MOD_ARR_MERGEFINAL 1<<1
161 typedef struct MirrorModifierData {
162 ModifierData modifier;
166 struct Object *mirror_ob;
167 } MirrorModifierData;
169 /* MirrorModifierData->flag */
170 #define MOD_MIR_CLIPPING 1<<0
171 #define MOD_MIR_MIRROR_U 1<<1
172 #define MOD_MIR_MIRROR_V 1<<2
173 #define MOD_MIR_AXIS_X 1<<3
174 #define MOD_MIR_AXIS_Y 1<<4
175 #define MOD_MIR_AXIS_Z 1<<5
177 typedef struct EdgeSplitModifierData {
178 ModifierData modifier;
180 float split_angle; /* angle above which edges should be split */
182 } EdgeSplitModifierData;
184 /* EdgeSplitModifierData->flags */
185 #define MOD_EDGESPLIT_FROMANGLE 1<<1
186 #define MOD_EDGESPLIT_FROMFLAG 1<<2
188 typedef struct DisplaceModifierData {
189 ModifierData modifier;
194 char defgrp_name[32];
197 struct Object *map_object;
198 char uvlayer_name[32];
199 int uvlayer_tmp, pad;
200 } DisplaceModifierData;
202 /* DisplaceModifierData->direction */
208 MOD_DISP_DIR_RGB_XYZ,
211 /* DisplaceModifierData->texmapping */
219 typedef struct UVProjectModifierData {
220 ModifierData modifier;
222 /* the objects which do the projecting */
223 struct Object *projectors[10];
224 struct Image *image; /* the image to project */
227 float aspectx, aspecty;
228 char uvlayer_name[32];
229 int uvlayer_tmp, pad;
230 } UVProjectModifierData;
232 #define MOD_UVPROJECT_MAXPROJECTORS 10
234 /* UVProjectModifierData->flags */
235 #define MOD_UVPROJECT_OVERRIDEIMAGE 1<<0
237 typedef struct DecimateModifierData {
238 ModifierData modifier;
242 } DecimateModifierData;
244 /* Smooth modifier flags */
245 #define MOD_SMOOTH_X (1<<1)
246 #define MOD_SMOOTH_Y (1<<2)
247 #define MOD_SMOOTH_Z (1<<3)
249 typedef struct SmoothModifierData {
250 ModifierData modifier;
252 char defgrp_name[32];
255 } SmoothModifierData;
257 /* Cast modifier flags */
258 #define MOD_CAST_X (1<<1)
259 #define MOD_CAST_Y (1<<2)
260 #define MOD_CAST_Z (1<<3)
261 #define MOD_CAST_USE_OB_TRANSFORM (1<<4)
262 #define MOD_CAST_SIZE_FROM_RADIUS (1<<5)
264 /* Cast modifier projection types */
265 #define MOD_CAST_TYPE_SPHERE 0
266 #define MOD_CAST_TYPE_CYLINDER 1
267 #define MOD_CAST_TYPE_CUBOID 2
269 typedef struct CastModifierData {
270 ModifierData modifier;
272 struct Object *object;
276 char defgrp_name[32];
287 /* WaveModifierData.flag */
288 #define MOD_WAVE_X 1<<1
289 #define MOD_WAVE_Y 1<<2
290 #define MOD_WAVE_CYCL 1<<3
291 #define MOD_WAVE_NORM 1<<4
292 #define MOD_WAVE_NORM_X 1<<5
293 #define MOD_WAVE_NORM_Y 1<<6
294 #define MOD_WAVE_NORM_Z 1<<7
296 typedef struct WaveModifierData {
297 ModifierData modifier;
299 struct Object *objectcenter;
300 char defgrp_name[32];
302 struct Object *map_object;
306 float startx, starty, height, width;
307 float narrow, speed, damp;
309 int texmapping, uvlayer_tmp;
311 char uvlayer_name[32];
313 float timeoffs, lifetime;
316 typedef struct ArmatureModifierData {
317 ModifierData modifier;
319 short deformflag, multi; /* deformflag replaces armature->deformflag */
321 struct Object *object;
322 float *prevCos; /* stored input of previous modifier, for vertexgroup blending */
323 char defgrp_name[32];
324 } ArmatureModifierData;
326 typedef struct HookModifierData {
327 ModifierData modifier;
329 struct Object *object;
330 float parentinv[4][4]; /* matrix making current transform unmodified */
331 float cent[3]; /* visualization of hook */
332 float falloff; /* if not zero, falloff is distance where influence zero */
334 int *indexar; /* if NULL, it's using vertexgroup */
337 char name[32]; /* optional vertexgroup name */
340 typedef struct SoftbodyModifierData {
341 ModifierData modifier;
342 } SoftbodyModifierData;
345 eBooleanModifierOp_Intersect,
346 eBooleanModifierOp_Union,
347 eBooleanModifierOp_Difference,
349 typedef struct BooleanModifierData {
350 ModifierData modifier;
352 struct Object *object;
354 } BooleanModifierData;
356 #define MOD_MDEF_INVERT_VGROUP (1<<0)
357 #define MOD_MDEF_DYNAMIC_BIND (1<<1)
359 typedef struct MDefInfluence {
364 typedef struct MDefCell {
369 typedef struct MeshDeformModifierData {
370 ModifierData modifier;
372 struct Object *object; /* mesh object */
373 char defgrp_name[32]; /* optional vertexgroup name */
375 short gridsize, needbind;
378 /* variables filled in when bound */
379 float *bindweights, *bindcos; /* computed binding weights */
380 int totvert, totcagevert; /* total vertices in mesh and cage */
381 MDefCell *dyngrid; /* grid with dynamic binding cell points */
382 MDefInfluence *dyninfluences; /* dynamic binding vertex influences */
383 int *dynverts, *pad2; /* is this vertex bound or not? */
384 int dyngridsize; /* size of the dynamic bind grid */
385 int totinfluence; /* total number of vertex influences */
386 float dyncellmin[3]; /* offset of the dynamic bind grid */
387 float dyncellwidth; /* width of dynamic bind cell */
388 float bindmat[4][4]; /* matrix of cage at binding time */
389 } MeshDeformModifierData;
392 eParticleSystemFlag_Loaded = (1<<0),
393 eParticleSystemFlag_Pars = (1<<1),
394 eParticleSystemFlag_FromCurve = (1<<2),
395 eParticleSystemFlag_DM_changed = (1<<3),
396 eParticleSystemFlag_Disabled = (1<<4),
397 eParticleSystemFlag_psys_updated = (1<<5),
398 } ParticleSystemModifierFlag;
400 typedef struct ParticleSystemModifierData {
401 ModifierData modifier;
402 struct ParticleSystem *psys;
403 struct DerivedMesh *dm;
405 } ParticleSystemModifierData;
408 eParticleInstanceFlag_Parents = (1<<0),
409 eParticleInstanceFlag_Children = (1<<1),
410 eParticleInstanceFlag_Path = (1<<2),
411 eParticleInstanceFlag_Unborn = (1<<3),
412 eParticleInstanceFlag_Alive = (1<<4),
413 eParticleInstanceFlag_Dead = (1<<5),
414 } ParticleInstanceModifierFlag;
416 typedef struct ParticleInstanceModifierData {
417 ModifierData modifier;
419 short psys, flag, rt[2];
420 } ParticleInstanceModifierData;
423 eExplodeFlag_CalcFaces = (1<<0),
424 //eExplodeFlag_PaSize = (1<<1),
425 eExplodeFlag_EdgeSplit = (1<<2),
426 eExplodeFlag_Unborn = (1<<3),
427 eExplodeFlag_Alive = (1<<4),
428 eExplodeFlag_Dead = (1<<5),
429 } ExplodeModifierFlag;
431 typedef struct ExplodeModifierData {
432 ModifierData modifier;
436 } ExplodeModifierData;