own fix r34446, was incorrect, fixed properly now.
[blender.git] / source / blender / makesdna / DNA_particle_types.h
1 /* DNA_particle_types.h
2  *
3  *
4  * $Id$
5  *
6  * ***** BEGIN GPL LICENSE BLOCK *****
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License
10  * as published by the Free Software Foundation; either version 2
11  * of the License, or (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software Foundation,
20  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21  *
22  * The Original Code is Copyright (C) 2007 by Janne Karhu.
23  * All rights reserved.
24  *
25  * The Original Code is: all of this file.
26  *
27  * Contributor(s): none yet.
28  *
29  * ***** END GPL LICENSE BLOCK *****
30  */
31
32 #ifndef DNA_PARTICLE_TYPES_H
33 #define DNA_PARTICLE_TYPES_H
34
35 #include "DNA_ID.h"
36 #include "DNA_boid_types.h"
37
38 struct AnimData;
39
40 typedef struct HairKey {
41         float co[3];    /* location of hair vertex */
42         float time;             /* time along hair, default 0-100 */
43         float weight;   /* softbody weight */
44         short editflag; /* saved particled edit mode flags */
45         short pad;
46 } HairKey;
47
48 typedef struct ParticleKey {    /* when changed update size of struct to copy_particleKey()!! */
49         float co[3];    /* location */
50         float vel[3];   /* velocity */
51         float rot[4];   /* rotation quaternion */
52         float ave[3];   /* angular velocity */
53         float time;             /* when this key happens */
54 } ParticleKey;
55
56 typedef struct BoidParticle {
57         struct Object *ground;
58         struct BoidData data;
59         float gravity[3];
60         float wander[3];
61         float rt;
62 } BoidParticle;
63
64 typedef struct ParticleSpring {
65         float rest_length;
66         unsigned int particle_index[2], delete_flag;
67 }ParticleSpring;
68
69 /* Child particles are created around or between parent particles */
70 typedef struct ChildParticle {
71         int num, parent;        /* num is face index on the final derived mesh */
72         int pa[4];                      /* nearest particles to the child, used for the interpolation */
73         float w[4];                     /* interpolation weights for the above particles */
74         float fuv[4], foffset; /* face vertex weights and offset */
75         float rt;
76 } ChildParticle;
77
78 typedef struct ParticleTarget {
79         struct ParticleTarget *next, *prev;
80         struct Object *ob;
81         int psys;
82         short flag, mode;
83         float time, duration;
84 } ParticleTarget;
85
86 typedef struct ParticleDupliWeight {
87         struct ParticleDupliWeight *next, *prev;
88         struct Object *ob;
89         short count;
90         short flag, rt[2];
91 } ParticleDupliWeight;
92
93 typedef struct ParticleData {
94         ParticleKey state;              /* current global coordinates */
95
96         ParticleKey prev_state; /* previous state */
97         
98         HairKey *hair;                  /* hair vertices */
99
100         ParticleKey *keys;              /* keyed keys */
101
102         BoidParticle *boid;             /* boids data */
103
104         int totkey;                             /* amount of hair or keyed keys*/
105
106         float time, lifetime;   /* dietime is not nescessarily time+lifetime as */
107         float dietime;                  /* particles can die unnaturally (collision)    */
108
109         int num;                                /* index to vert/edge/face */
110         int num_dmcache;                /* index to derived mesh data (face) to avoid slow lookups */
111
112         float fuv[4], foffset;  /* coordinates on face/edge number "num" and depth along*/
113                                                         /* face normal for volume emission                                              */
114
115         float size;                             /* size and multiplier so that we can update size when ever */
116
117         int hair_index;
118         short flag;
119         short alive;                    /* the life state of a particle */
120 } ParticleData;
121
122 typedef struct SPHFluidSettings {
123         /*Particle Fluid*/
124         float spring_k, radius, rest_length, plasticity_constant, yield_ratio;
125         float viscosity_omega, viscosity_beta;
126         float stiffness_k, stiffness_knear, rest_density;
127         float buoyancy;
128         int flag, pad;
129 } SPHFluidSettings;
130
131 /* fluid->flag */
132 #define SPH_VISCOELASTIC_SPRINGS        1
133 #define SPH_CURRENT_REST_LENGTH         2
134
135 typedef struct ParticleSettings {
136         ID id;
137         struct AnimData *adt;
138
139         struct BoidSettings *boids;
140         struct SPHFluidSettings *fluid;
141
142         struct EffectorWeights *effector_weights;
143
144         int flag;
145         short type, from, distr;
146         /* physics modes */
147         short phystype, rotmode, avemode, reactevent;
148         short draw, draw_as, draw_size, childtype;
149         short ren_as, subframes;
150         /* number of path segments, power of 2 except */
151         short draw_step, ren_step;
152         short hair_step, keys_step;
153
154         /* adaptive path rendering */
155         short adapt_angle, adapt_pix;
156
157         short disp, omat, interpolation, rotfrom, integrator;
158         short kink, kink_axis;
159
160         /* billboards */
161         short bb_align, bb_uv_split, bb_anim, bb_split_offset;
162         float bb_tilt, bb_rand_tilt, bb_offset[2];
163
164         /* simplification */
165         short simplify_flag, simplify_refsize;
166         float simplify_rate, simplify_transition;
167         float simplify_viewport;
168
169         /* general values */
170         float sta, end, lifetime, randlife;
171         float timetweak, jitfac, eff_hair;
172         int totpart, userjit, grid_res;
173
174         /* initial velocity factors */
175         float normfac, obfac, randfac, partfac, tanfac, tanphase, reactfac;
176         float ob_vel[3];
177         float avefac, phasefac, randrotfac, randphasefac;
178         /* physical properties */
179         float mass, size, randsize, reactshape;
180         /* global physical properties */
181         float acc[3], dragfac, brownfac, dampfac;
182         /* length */
183         float randlength;
184         /* children */
185         int child_nbr, ren_child_nbr;
186         float parents, childsize, childrandsize;
187         float childrad, childflat;
188         /* clumping */
189         float clumpfac, clumppow;
190         /* kink */
191         float kink_amp, kink_freq, kink_shape, kink_flat;
192         float kink_amp_clump;
193         /* rough */
194         float rough1, rough1_size;
195         float rough2, rough2_size, rough2_thres;
196         float rough_end, rough_end_shape;
197         /* length */
198         float clength, clength_thres;
199         /* parting */
200         float parting_fac;
201         float parting_min, parting_max;
202         /* branching */
203         float branch_thres;
204         /* drawing stuff */
205         float draw_line[2];
206         float path_start, path_end;
207         int trail_count;
208         /* keyed particles */
209         int keyed_loops;
210
211         struct Group *dup_group;
212         struct ListBase dupliweights;
213         struct Group *eff_group;                // deprecated
214         struct Object *dup_ob;
215         struct Object *bb_ob;
216         struct Ipo *ipo;                                // xxx depreceated... old animation system
217         struct PartDeflect *pd;
218         struct PartDeflect *pd2;
219 } ParticleSettings;
220
221 typedef struct ParticleSystem{                          /* note, make sure all (runtime) are NULL's in copy_particlesystem */
222         struct ParticleSystem *next, *prev;
223
224         ParticleSettings *part;                                 /* particle settings */
225
226         ParticleData *particles;                                /* (parent) particles */
227         ChildParticle *child;                                   /* child particles */
228
229         struct PTCacheEdit *edit;                                               /* particle editmode (runtime) */
230         void (*free_edit)(struct PTCacheEdit *edit);    /* free callback */
231
232         struct ParticleCacheKey **pathcache;    /* path cache (runtime) */
233         struct ParticleCacheKey **childcache;   /* child cache (runtime) */
234         ListBase pathcachebufs, childcachebufs; /* buffers for the above */
235
236         struct ClothModifierData *clmd;                                 /* cloth simulation for hair */
237         struct DerivedMesh *hair_in_dm, *hair_out_dm;   /* input/output for cloth simulation */
238
239         struct Object *target_ob;
240         struct Object *lattice;
241         struct Object *parent;                                  /* particles from global space -> parent space */
242
243         struct ListBase targets;                                /* used for keyed and boid physics */
244
245         char name[32];                                                  /* particle system name */
246         
247         float imat[4][4];       /* used for duplicators */
248         float cfra, tree_frame;
249         int seed, child_seed;
250         int flag, totpart, totchild, totcached, totchildcache;
251         short recalc, target_psys, totkeyed, bakespace;
252
253         char bb_uvname[3][32];                                  /* billboard uv name */
254
255         /* if you change these remember to update array lengths to PSYS_TOT_VG! */
256         short vgroup[12], vg_neg, rt3;                  /* vertex groups, 0==disable, 1==starting index */
257
258         /* temporary storage during render */
259         void *renderdata;
260
261         /* point cache */
262         struct PointCache *pointcache;
263         struct ListBase ptcaches;
264
265         struct ListBase *effectors;
266
267         ParticleSpring *fluid_springs;
268         int tot_fluidsprings, alloc_fluidsprings;
269
270         struct KDTree *tree;                                    /* used for interactions with self and other systems */
271
272         struct ParticleDrawData *pdd;
273
274         float *frand;                                                   /* array of 1024 random floats for fast lookups */
275 }ParticleSystem;
276
277 /* part->type */
278 /* hair is allways baked static in object/geometry space */
279 /* other types (normal particles) are in global space and not static baked */
280 #define PART_EMITTER            0
281 //#define PART_REACTOR          1
282 #define PART_HAIR                       2
283 #define PART_FLUID                      3
284
285 /* part->flag */
286 #define PART_REACT_STA_END      1
287 #define PART_REACT_MULTIPLE     2
288
289 //#define PART_LOOP                     4       /* not used anymore */
290                 /* for dopesheet */
291 #define PART_DS_EXPAND          8
292
293 #define PART_HAIR_REGROW        16      /* regrow hair for each frame */
294
295 #define PART_UNBORN                     32      /*show unborn particles*/
296 #define PART_DIED                       64      /*show died particles*/
297
298 #define PART_TRAND                      128     
299 #define PART_EDISTR                     256     /* particle/face from face areas */
300
301 //#define PART_STICKY                   512     /*collided particles can stick to collider*/
302 #define PART_DIE_ON_COL         (1<<12)
303 #define PART_SIZE_DEFL          (1<<13) /* swept sphere deflections */
304 #define PART_ROT_DYN            (1<<14) /* dynamic rotation */
305 #define PART_SIZEMASS           (1<<16)
306
307 //#define PART_HAIR_GRAVITY     (1<<15)
308
309 //#define PART_ABS_TIME         (1<<17)
310 //#define PART_GLOB_TIME                (1<<18)
311
312 #define PART_BOIDS_2D           (1<<19)
313
314 //#define PART_BRANCHING                (1<<20)
315 //#define PART_ANIM_BRANCHING   (1<<21)
316 //#define PART_SYMM_BRANCHING   (1<<24)
317
318 #define PART_HAIR_BSPLINE       1024
319
320 #define PART_GRID_INVERT        (1<<26)
321
322 #define PART_CHILD_EFFECT               (1<<27)
323 #define PART_CHILD_LONG_HAIR    (1<<28)
324 /* #define PART_CHILD_RENDER            (1<<29) */ /*UNUSED*/
325 #define PART_CHILD_GUIDE                (1<<30)
326
327 #define PART_SELF_EFFECT        (1<<22)
328
329 /* part->rotfrom */
330 #define PART_ROT_KEYS           0       /* interpolate directly from keys */
331 #define PART_ROT_ZINCR          1       /* same as zdir but done incrementally from previous position */
332 #define PART_ROT_IINCR          2       /* same as idir but done incrementally from previous position */
333
334 /* part->from */
335 #define PART_FROM_VERT          0
336 #define PART_FROM_FACE          1
337 #define PART_FROM_VOLUME        2
338 #define PART_FROM_PARTICLE      3
339 #define PART_FROM_CHILD         4
340
341 /* part->distr */
342 #define PART_DISTR_JIT          0
343 #define PART_DISTR_RAND         1
344 #define PART_DISTR_GRID         2
345
346 /* part->phystype */
347 #define PART_PHYS_NO            0
348 #define PART_PHYS_NEWTON        1
349 #define PART_PHYS_KEYED         2
350 #define PART_PHYS_BOIDS         3
351 #define PART_PHYS_FLUID         4
352
353 /* part->kink */
354 #define PART_KINK_NO            0
355 #define PART_KINK_CURL          1
356 #define PART_KINK_RADIAL        2
357 #define PART_KINK_WAVE          3
358 #define PART_KINK_BRAID         4
359
360 /* part->draw */
361 #define PART_DRAW_VEL           1
362 #define PART_DRAW_GLOBAL_OB     2
363 #define PART_DRAW_SIZE          4
364 #define PART_DRAW_EMITTER       8       /* render emitter also */
365 #define PART_DRAW_HEALTH        16
366 #define PART_ABS_PATH_TIME  32
367 #define PART_DRAW_COUNT_GR      64
368 #define PART_DRAW_BB_LOCK       128
369 #define PART_DRAW_PARENT        256
370 #define PART_DRAW_NUM           512
371 #define PART_DRAW_RAND_GR       1024
372 #define PART_DRAW_REN_ADAPT     2048
373 #define PART_DRAW_VEL_LENGTH    (1<<12)
374 #define PART_DRAW_MAT_COL               (1<<13)
375 #define PART_DRAW_WHOLE_GR              (1<<14)
376 #define PART_DRAW_REN_STRAND    (1<<15)
377
378 /* part->simplify_flag */
379 #define PART_SIMPLIFY_ENABLE    1
380 #define PART_SIMPLIFY_VIEWPORT  2
381
382 /* part->bb_align */
383 #define PART_BB_X               0
384 #define PART_BB_Y               1
385 #define PART_BB_Z               2
386 #define PART_BB_VIEW    3
387 #define PART_BB_VEL             4
388
389 /* part->bb_anim */
390 #define PART_BB_ANIM_NONE       0
391 #define PART_BB_ANIM_TIME       1
392 #define PART_BB_ANIM_ANGLE      2
393 #define PART_BB_ANIM_OFF_TIME   3
394 #define PART_BB_ANIM_OFF_ANGLE  4
395
396 /* part->bb_split_offset */
397 #define PART_BB_OFF_NONE        0
398 #define PART_BB_OFF_LINEAR      1
399 #define PART_BB_OFF_RANDOM      2
400
401 /* part->draw_as */
402 /* part->ren_as*/
403 #define PART_DRAW_NOT           0
404 #define PART_DRAW_DOT           1
405 #define PART_DRAW_HALO          1
406 #define PART_DRAW_CIRC          2
407 #define PART_DRAW_CROSS         3
408 #define PART_DRAW_AXIS          4
409 #define PART_DRAW_LINE          5
410 #define PART_DRAW_PATH          6
411 #define PART_DRAW_OB            7
412 #define PART_DRAW_GR            8
413 #define PART_DRAW_BB            9
414 #define PART_DRAW_REND          10
415
416 /* part->integrator */
417 #define PART_INT_EULER          0
418 #define PART_INT_MIDPOINT       1
419 #define PART_INT_RK4            2
420 #define PART_INT_VERLET         3
421
422 /* part->rotmode */
423 #define PART_ROT_NOR            1
424 #define PART_ROT_VEL            2
425 #define PART_ROT_GLOB_X         3
426 #define PART_ROT_GLOB_Y         4
427 #define PART_ROT_GLOB_Z         5
428 #define PART_ROT_OB_X           6
429 #define PART_ROT_OB_Y           7
430 #define PART_ROT_OB_Z           8
431
432 /* part->avemode */
433 #define PART_AVE_SPIN           1
434 #define PART_AVE_RAND           2
435
436 /* part->reactevent */
437 #define PART_EVENT_DEATH        0
438 #define PART_EVENT_COLLIDE      1
439 #define PART_EVENT_NEAR         2
440
441 /* part->childtype */
442 #define PART_CHILD_PARTICLES    1
443 #define PART_CHILD_FACES                2
444
445 /* psys->recalc */
446 /* starts from 8 so that the first bits can be ob->recalc */
447 #define PSYS_RECALC_REDO        8       /* only do pathcache etc */
448 #define PSYS_RECALC_RESET       16      /* reset everything including pointcache */
449 #define PSYS_RECALC_TYPE        32      /* handle system type change */
450 #define PSYS_RECALC_CHILD       64      /* only child settings changed */
451 #define PSYS_RECALC_PHYS        128     /* physics type changed */
452 #define PSYS_RECALC                     248
453
454 /* psys->flag */
455 #define PSYS_CURRENT            1
456 #define PSYS_GLOBAL_HAIR        2
457 #define PSYS_HAIR_DYNAMICS      4
458 #define PSYS_KEYED_TIMING       8
459 #define PSYS_ENABLED            16      /* deprecated */
460 #define PSYS_HAIR_UPDATED       32  /* signal for updating hair particle mode */
461 #define PSYS_DRAWING            64
462 //#define PSYS_SOFT_BAKE                128
463 #define PSYS_DELETE                     256     /* remove particlesystem as soon as possible */
464 #define PSYS_HAIR_DONE          512
465 #define PSYS_KEYED                      1024
466 #define PSYS_EDITED                     2048
467 //#define PSYS_PROTECT_CACHE    4096 /* deprecated */
468 #define PSYS_DISABLED           8192
469
470 /* pars->flag */
471 #define PARS_UNEXIST            1
472 #define PARS_NO_DISP            2
473 //#define PARS_STICKY                   4 /* deprecated */
474 #define PARS_REKEY                      8
475
476 /* pars->alive */
477 //#define PARS_KILLED                   0 /* deprecated */
478 #define PARS_DEAD                       1
479 #define PARS_UNBORN                     2
480 #define PARS_ALIVE                      3
481 #define PARS_DYING                      4
482
483 /* ParticleDupliWeight->flag */
484 #define PART_DUPLIW_CURRENT     1
485
486 /* psys->vg */
487 #define PSYS_TOT_VG                     12
488
489 #define PSYS_VG_DENSITY         0
490 #define PSYS_VG_VEL                     1
491 #define PSYS_VG_LENGTH          2
492 #define PSYS_VG_CLUMP           3
493 #define PSYS_VG_KINK            4
494 #define PSYS_VG_ROUGH1          5
495 #define PSYS_VG_ROUGH2          6
496 #define PSYS_VG_ROUGHE          7
497 #define PSYS_VG_SIZE            8
498 #define PSYS_VG_TAN                     9
499 #define PSYS_VG_ROT                     10
500 #define PSYS_VG_EFFECTOR        11
501
502 /* ParticleTarget->flag */
503 #define PTARGET_CURRENT         1
504 #define PTARGET_VALID           2
505
506 /* ParticleTarget->mode */
507 #define PTARGET_MODE_NEUTRAL    0
508 #define PTARGET_MODE_FRIEND             1
509 #define PTARGET_MODE_ENEMY              2
510
511 #endif