svn merge -r 22371:22571 https://svn.blender.org/svnroot/bf-blender/branches/blender2...
[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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, 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
37 struct AnimData;
38
39 typedef struct HairKey {
40         float co[3];    /* location of hair vertex */
41         float time;             /* time along hair, default 0-100 */
42         float weight;   /* softbody weight */
43         short editflag; /* saved particled edit mode flags */
44         short pad;
45 } HairKey;
46
47 typedef struct ParticleKey {    /* when changed update size of struct to copy_particleKey()!! */
48         float co[3];    /* location */
49         float vel[3];   /* velocity */
50         float rot[4];   /* rotation quaternion */
51         float ave[3];   /* angular velocity */
52         float time;             /* when this key happens */
53 } ParticleKey;
54
55 /* Child particles are created around or between parent particles */
56 typedef struct ChildParticle {
57         int num, parent;        /* num is face index on the final derived mesh */
58         int pa[4];                      /* nearest particles to the child, used for the interpolation */
59         float w[4];                     /* interpolation weights for the above particles */
60         float fuv[4], foffset; /* face vertex weights and offset */
61         float rand[3];
62 } ChildParticle;
63
64 typedef struct ParticleTarget {
65         struct ParticleTarget *next, *prev;
66         struct Object *ob;
67         int psys;
68         short flag, mode;
69         float time, duration;
70 } ParticleTarget;
71
72 /* Everything that's non dynamic for a particle:                        */
73 typedef struct ParticleData {
74         struct Object *stick_ob;/* object that particle sticks to when dead */
75
76         ParticleKey state;              /* normally current global coordinates or       */
77                                                         /* in sticky object space if dead & sticky      */
78
79         ParticleKey prev_state; /* previous state */
80
81         HairKey *hair;                  /* hair vertices */
82
83         ParticleKey *keys;              /* keyed states */
84
85         struct BoidData *boid;  /* boids data */
86
87         float r_rot[4];                 /* random values */
88         float r_ave[3],r_ve[3];
89
90         float fuv[4], foffset;  /* coordinates on face/edge number "num" and depth along*/
91                                                         /* face normal for volume emission                                              */
92
93         float time, lifetime;   /* dietime is not nescessarily time+lifetime as */
94         float dietime;                  /* particles can die unnaturally (collision)    */
95
96         float size, sizemul;    /* size and multiplier so that we can update size when ever */
97
98         int num;                                /* index to vert/edge/face */
99         int num_dmcache;                /* index to derived mesh data (face) to avoid slow lookups */
100
101         int totkey;
102         int bpi;                                /* softbody body point start index */
103
104         short flag;
105         short alive;                            /* the life state of a particle */
106         short loop;                             /* how many times particle life has looped */
107         short rt2;
108 } ParticleData;
109
110 typedef struct ParticleSettings {
111         ID id;
112         struct AnimData *adt;
113
114         struct BoidSettings *boids;
115
116         int flag;
117         short type, from, distr;
118         /* physics modes */
119         short phystype, rotmode, avemode, reactevent;
120         short draw, draw_as, draw_size, childtype;
121         short ren_as, rt2;
122         /* number of path segments, power of 2 except */
123         short draw_step, ren_step;
124         short hair_step, keys_step;
125
126         /* adaptive path rendering */
127         short adapt_angle, adapt_pix;
128
129         short disp, omat, interpolation, rotfrom, integrator;
130         short kink, kink_axis;
131
132         /* billboards */
133         short bb_align, bb_uv_split, bb_anim, bb_split_offset;
134         float bb_tilt, bb_rand_tilt, bb_offset[2];
135
136         /* simplification */
137         short simplify_flag, simplify_refsize;
138         float simplify_rate, simplify_transition;
139         float simplify_viewport;
140
141         /* general values */
142         float sta, end, lifetime, randlife;
143         float timetweak, jitfac, eff_hair;
144         int totpart, userjit, grid_res;
145
146         /* initial velocity factors */
147         float normfac, obfac, randfac, partfac, tanfac, tanphase, reactfac;
148         float avefac, phasefac, randrotfac, randphasefac;
149         /* physical properties */
150         float mass, size, randsize, reactshape;
151         /* global physical properties */
152         float acc[3], dragfac, brownfac, dampfac;
153         /* length */
154         float randlength;
155         /* children */
156         int child_nbr, ren_child_nbr;
157         float parents, childsize, childrandsize;
158         float childrad, childflat;
159         /* clumping */
160         float clumpfac, clumppow;
161         /* kink */
162         float kink_amp, kink_freq, kink_shape;
163         /* rough */
164         float rough1, rough1_size;
165         float rough2, rough2_size, rough2_thres;
166         float rough_end, rough_end_shape;
167         /* length */
168         float clength, clength_thres;
169         /* branching */
170         float branch_thres;
171         /* drawing stuff */
172         float draw_line[2];
173         float path_start, path_end;
174         int trail_count;
175         /* keyed particles */
176         int keyed_loops;
177
178         float effector_weight[10];
179
180         struct Group *dup_group;
181         struct Group *eff_group;
182         struct Object *dup_ob;
183         struct Object *bb_ob;
184         struct Ipo *ipo;                                // xxx depreceated... old animation system
185         struct PartDeflect *pd;
186         struct PartDeflect *pd2;
187 } ParticleSettings;
188
189 typedef struct ParticleSystem{                          /* note, make sure all (runtime) are NULL's in copy_particlesystem */
190         struct ParticleSystem *next, *prev;
191
192         ParticleSettings *part;                                 /* particle settings */
193
194         ParticleData *particles;                                /* (parent) particles */
195         ChildParticle *child;                                   /* child particles */
196
197         struct ParticleEdit *edit;                                              /* particle editmode (runtime) */
198         void (*free_edit)(struct ParticleSystem *sys);  /* free callback */
199
200         struct ParticleCacheKey **pathcache;    /* path cache (runtime) */
201         struct ParticleCacheKey **childcache;   /* child cache (runtime) */
202         ListBase pathcachebufs, childcachebufs; /* buffers for the above */
203
204         struct SoftBody *soft;                                  /* hair softbody */
205
206         struct Object *target_ob;
207         struct Object *lattice;
208         struct Object *parent;                                  /* particles from global space -> parent space */
209
210         struct ListBase effectors, reactevents; /* runtime */
211
212         struct ListBase targets;                                /* used for keyed and boid physics */
213
214         char name[32];                                                  /* particle system name */
215         
216         float imat[4][4];       /* used for duplicators */
217         float cfra, tree_frame;
218         int seed;
219         int flag, totpart, totchild, totcached, totchildcache;
220         short recalc, target_psys, totkeyed, softflag, bakespace, rt2;
221
222         char bb_uvname[3][32];                                  /* billboard uv name */
223
224         /* if you change these remember to update array lengths to PSYS_TOT_VG! */
225         short vgroup[12], vg_neg, rt3;                  /* vertex groups */
226
227         /* temporary storage during render */
228         void *renderdata;
229
230         /* point cache */
231         struct PointCache *pointcache;
232         struct ListBase ptcaches;
233
234         struct KDTree *tree;                                    /* used for interactions with self and other systems */
235 }ParticleSystem;
236
237 /* part->type */
238 /* hair is allways baked static in object/geometry space */
239 /* other types (normal particles) are in global space and not static baked */
240 #define PART_EMITTER            0
241 #define PART_REACTOR            1
242 #define PART_HAIR                       2
243 #define PART_FLUID                      3
244
245 /* part->flag */
246 #define PART_REACT_STA_END      1
247 #define PART_REACT_MULTIPLE     2
248
249 #define PART_LOOP                       4
250                 /* for dopesheet */
251 #define PART_DS_EXPAND          8
252
253 #define PART_HAIR_GEOMETRY      16
254
255 #define PART_UNBORN                     32      /*show unborn particles*/
256 #define PART_DIED                       64      /*show died particles*/
257
258 #define PART_TRAND                      128     
259 #define PART_EDISTR                     256     /* particle/face from face areas */
260
261 #define PART_STICKY                     512     /*collided particles can stick to collider*/
262 #define PART_DIE_ON_COL         (1<<12)
263 #define PART_SIZE_DEFL          (1<<13) /* swept sphere deflections */
264 #define PART_ROT_DYN            (1<<14) /* dynamic rotation */
265 #define PART_SIZEMASS           (1<<16)
266
267 //#define PART_KEYED_TIMING     (1<<15)
268
269 //#define PART_ABS_TIME         (1<<17)
270 //#define PART_GLOB_TIME                (1<<18)
271
272 #define PART_BOIDS_2D           (1<<19)
273
274 #define PART_BRANCHING          (1<<20)
275 #define PART_ANIM_BRANCHING     (1<<21)
276 #define PART_SYMM_BRANCHING     (1<<24)
277
278 #define PART_HAIR_BSPLINE       1024
279
280 #define PART_GRID_INVERT        (1<<26)
281
282 #define PART_CHILD_EFFECT       (1<<27)
283 #define PART_CHILD_SEAMS        (1<<28)
284 #define PART_CHILD_RENDER       (1<<29)
285 #define PART_CHILD_GUIDE        (1<<30)
286
287 #define PART_SELF_EFFECT        (1<<22)
288
289 /* part->rotfrom */
290 #define PART_ROT_KEYS           0       /* interpolate directly from keys */
291 #define PART_ROT_ZINCR          1       /* same as zdir but done incrementally from previous position */
292 #define PART_ROT_IINCR          2       /* same as idir but done incrementally from previous position */
293
294 /* part->from */
295 #define PART_FROM_VERT          0
296 #define PART_FROM_FACE          1
297 #define PART_FROM_VOLUME        2
298 #define PART_FROM_PARTICLE      3
299 #define PART_FROM_CHILD         4
300
301 /* part->distr */
302 #define PART_DISTR_JIT          0
303 #define PART_DISTR_RAND         1
304 #define PART_DISTR_GRID         2
305
306 /* part->phystype */
307 #define PART_PHYS_NO            0
308 #define PART_PHYS_NEWTON        1
309 #define PART_PHYS_KEYED         2
310 #define PART_PHYS_BOIDS         3
311
312 /* part->kink */
313 #define PART_KINK_NO            0
314 #define PART_KINK_CURL          1
315 #define PART_KINK_RADIAL        2
316 #define PART_KINK_WAVE          3
317 #define PART_KINK_BRAID         4
318
319 /* part->draw */
320 #define PART_DRAW_VEL           1
321 //#define PART_DRAW_PATH_LEN    2
322 #define PART_DRAW_SIZE          4
323 #define PART_DRAW_EMITTER       8       /* render emitter also */
324 #define PART_DRAW_HEALTH        16
325 #define PART_ABS_PATH_TIME  32
326 //#define PART_DRAW_TRAIL               64
327 #define PART_DRAW_BB_LOCK       128
328 #define PART_DRAW_PARENT        256
329 #define PART_DRAW_NUM           512
330 #define PART_DRAW_RAND_GR       1024
331 #define PART_DRAW_REN_ADAPT     2048
332 #define PART_DRAW_VEL_LENGTH    (1<<12)
333 #define PART_DRAW_MAT_COL               (1<<13)
334 #define PART_DRAW_WHOLE_GR              (1<<14)
335 #define PART_DRAW_REN_STRAND    (1<<15)
336
337 /* part->simplify_flag */
338 #define PART_SIMPLIFY_ENABLE    1
339 #define PART_SIMPLIFY_VIEWPORT  2
340
341 /* part->bb_align */
342 #define PART_BB_X               0
343 #define PART_BB_Y               1
344 #define PART_BB_Z               2
345 #define PART_BB_VIEW    3
346 #define PART_BB_VEL             4
347
348 /* part->bb_anim */
349 #define PART_BB_ANIM_NONE       0
350 #define PART_BB_ANIM_TIME       1
351 #define PART_BB_ANIM_ANGLE      2
352 #define PART_BB_ANIM_OFF_TIME   3
353 #define PART_BB_ANIM_OFF_ANGLE  4
354
355 /* part->bb_split_offset */
356 #define PART_BB_OFF_NONE        0
357 #define PART_BB_OFF_LINEAR      1
358 #define PART_BB_OFF_RANDOM      2
359
360 /* part->draw_as */
361 /* part->ren_as*/
362 #define PART_DRAW_NOT           0
363 #define PART_DRAW_DOT           1
364 #define PART_DRAW_HALO          1
365 #define PART_DRAW_CIRC          2
366 #define PART_DRAW_CROSS         3
367 #define PART_DRAW_AXIS          4
368 #define PART_DRAW_LINE          5
369 #define PART_DRAW_PATH          6
370 #define PART_DRAW_OB            7
371 #define PART_DRAW_GR            8
372 #define PART_DRAW_BB            9
373 #define PART_DRAW_REND          10
374
375 /* part->integrator */
376 #define PART_INT_EULER          0
377 #define PART_INT_MIDPOINT       1
378 #define PART_INT_RK4            2
379
380 /* part->rotmode */
381 #define PART_ROT_NOR            1
382 #define PART_ROT_VEL            2
383 #define PART_ROT_GLOB_X         3
384 #define PART_ROT_GLOB_Y         4
385 #define PART_ROT_GLOB_Z         5
386 #define PART_ROT_OB_X           6
387 #define PART_ROT_OB_Y           7
388 #define PART_ROT_OB_Z           8
389
390 /* part->avemode */
391 #define PART_AVE_SPIN           1
392 #define PART_AVE_RAND           2
393
394 /* part->reactevent */
395 #define PART_EVENT_DEATH        0
396 #define PART_EVENT_COLLIDE      1
397 #define PART_EVENT_NEAR         2
398
399 /* part->childtype */
400 #define PART_CHILD_PARTICLES    1
401 #define PART_CHILD_FACES                2
402
403 /* psys->recalc */
404 #define PSYS_RECALC_REDO        1       /* only do pathcache etc */
405 #define PSYS_RECALC_RESET       2       /* reset everything including pointcache */
406 #define PSYS_RECALC_TYPE        4       /* handle system type change */
407 #define PSYS_RECALC_CHILD       16      /* only child settings changed */
408 #define PSYS_RECALC_PHYS        32      /* physics type changed */
409
410 /* psys->flag */
411 #define PSYS_CURRENT            1
412 //#define PSYS_BAKING                   2
413 //#define PSYS_BAKE_UI          4
414 #define PSYS_KEYED_TIMING       8
415 #define PSYS_ENABLED            16      /* deprecated */
416 //#define PSYS_FIRST_KEYED      32
417 #define PSYS_DRAWING            64
418 //#define PSYS_SOFT_BAKE                128
419 #define PSYS_DELETE                     256     /* remove particlesystem as soon as possible */
420 #define PSYS_HAIR_DONE          512
421 #define PSYS_KEYED                      1024
422 #define PSYS_EDITED                     2048
423 //#define PSYS_PROTECT_CACHE    4096
424 #define PSYS_DISABLED           8192
425
426 /* pars->flag */
427 #define PARS_UNEXIST            1
428 #define PARS_NO_DISP            2
429 #define PARS_STICKY                     4
430 #define PARS_TRANSFORM          8
431 #define PARS_HIDE                       16
432 #define PARS_TAG                        32
433 #define PARS_REKEY                      64
434 #define PARS_EDIT_RECALC        128
435
436 /* pars->alive */
437 #define PARS_KILLED                     0
438 #define PARS_DEAD                       1
439 #define PARS_UNBORN                     2
440 #define PARS_ALIVE                      3
441 #define PARS_DYING                      4
442
443 /* psys->vg */
444 #define PSYS_TOT_VG                     12
445
446 #define PSYS_VG_DENSITY         0
447 #define PSYS_VG_VEL                     1
448 #define PSYS_VG_LENGTH          2
449 #define PSYS_VG_CLUMP           3
450 #define PSYS_VG_KINK            4
451 #define PSYS_VG_ROUGH1          5
452 #define PSYS_VG_ROUGH2          6
453 #define PSYS_VG_ROUGHE          7
454 #define PSYS_VG_SIZE            8
455 #define PSYS_VG_TAN                     9
456 #define PSYS_VG_ROT                     10
457 #define PSYS_VG_EFFECTOR        11
458
459 /* ParticleTarget->flag */
460 #define PTARGET_CURRENT         1
461 #define PTARGET_VALID           2
462
463 /* ParticleTarget->mode */
464 #define PTARGET_MODE_NEUTRAL    0
465 #define PTARGET_MODE_FRIEND             1
466 #define PTARGET_MODE_ENEMY              2
467
468 #endif