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