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