Merge branch 'blender2.7'
[blender.git] / source / blender / makesdna / DNA_particle_types.h
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2007 by Janne Karhu.
17  * All rights reserved.
18  */
19
20 /** \file \ingroup DNA
21  */
22
23 #ifndef __DNA_PARTICLE_TYPES_H__
24 #define __DNA_PARTICLE_TYPES_H__
25
26 #include "DNA_defs.h"
27 #include "DNA_ID.h"
28 #include "DNA_boid_types.h"
29
30 struct AnimData;
31
32 typedef struct HairKey {
33         /** Location of hair vertex. */
34         float co[3];
35         /** Time along hair, default 0-100. */
36         float time;
37         /** Softbody weight. */
38         float weight;
39         /** Saved particled edit mode flags. */
40         short editflag;
41         short pad;
42         float world_co[3];
43 } HairKey;
44
45 typedef struct ParticleKey {    /* when changed update size of struct to copy_particleKey()!! */
46         /** Location. */
47         float co[3];
48         /** Velocity. */
49         float vel[3];
50         /** Rotation quaternion. */
51         float rot[4];
52         /** Angular velocity. */
53         float ave[3];
54         /** When this key happens. */
55         float time;
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         /** Num is face index on the final derived mesh. */
74         int num, parent;
75         /** Nearest particles to the child, used for the interpolation. */
76         int pa[4];
77         /** Interpolation weights for the above particles. */
78         float w[4];
79         /** Face vertex weights and offset. */
80         float fuv[4], foffset;
81         float rt;
82 } ChildParticle;
83
84 typedef struct ParticleTarget {
85         struct ParticleTarget *next, *prev;
86         struct Object *ob;
87         int psys;
88         short flag, mode;
89         float time, duration;
90 } ParticleTarget;
91
92 typedef struct ParticleDupliWeight {
93         struct ParticleDupliWeight *next, *prev;
94         struct Object *ob;
95         short count;
96         short flag;
97         /** Only updated on file save and used on file load. */
98         short index, rt;
99 } ParticleDupliWeight;
100
101 typedef struct ParticleData {
102         /** Current global coordinates. */
103         ParticleKey state;
104
105         /** Previous state. */
106         ParticleKey prev_state;
107
108         /** Hair vertices. */
109         HairKey *hair;
110
111         /** Keyed keys. */
112         ParticleKey *keys;
113
114         /** Boids data. */
115         BoidParticle *boid;
116
117         /** Amount of hair or keyed key.s*/
118         int totkey;
119
120         /** Dietime is not necessarily time+lifetime as. */
121         float time, lifetime;
122         /** Particles can die unnaturally (collision). */
123         float dietime;
124
125         /**
126          * WARNING! Those two indices,
127          * when not affected to vertices, are for !!! TESSELLATED FACES !!!, not POLYGONS!
128          */
129         /** Index to vert/edge/face. */
130         int num;
131         /** Index to derived mesh data (face) to avoid slow lookups. */
132         int num_dmcache;
133
134         /** Coordinates on face/edge number "num" and depth alon.g*/
135         float fuv[4], foffset;
136                                                         /* face normal for volume emission. */
137
138         /** Size and multiplier so that we can update size when ever. */
139         float size;
140
141         /** Density of sph particle. */
142         float sphdensity;
143         int pad;
144
145         int hair_index;
146         short flag;
147         /** The life state of a particle. */
148         short alive;
149 } ParticleData;
150
151 typedef struct SPHFluidSettings {
152         /*Particle Fluid*/
153         float radius, spring_k, rest_length;
154         float plasticity_constant, yield_ratio;
155         float plasticity_balance, yield_balance;
156         float viscosity_omega, viscosity_beta;
157         float stiffness_k, stiffness_knear, rest_density;
158         float buoyancy;
159         int flag, spring_frames;
160         short solver;
161         short pad[3];
162 } SPHFluidSettings;
163
164 /* fluid->flag */
165 #define SPH_VISCOELASTIC_SPRINGS        1
166 #define SPH_CURRENT_REST_LENGTH         2
167 #define SPH_FAC_REPULSION                       4
168 #define SPH_FAC_DENSITY                         8
169 #define SPH_FAC_RADIUS                          16
170 #define SPH_FAC_VISCOSITY                       32
171 #define SPH_FAC_REST_LENGTH                     64
172
173 /* fluid->solver (numerical ID field, not bitfield) */
174 #define SPH_SOLVER_DDR                                  0
175 #define SPH_SOLVER_CLASSICAL                    1
176
177 typedef struct ParticleSettings {
178         ID id;
179         struct AnimData *adt;
180
181         struct BoidSettings *boids;
182         struct SPHFluidSettings *fluid;
183
184         struct EffectorWeights *effector_weights;
185         struct Collection *collision_group;
186
187         int flag, rt;
188         short type, from, distr, texact;
189         /* physics modes */
190         short phystype, rotmode, avemode, reactevent;
191         int draw;
192         float draw_size;
193         short draw_as, pad1, childtype, pad2;
194         short ren_as, subframes, draw_col;
195         /* number of path segments, power of 2 except */
196         short draw_step, ren_step;
197         short hair_step, keys_step;
198
199         /* adaptive path rendering */
200         short adapt_angle, adapt_pix;
201
202         short disp, omat, interpolation, integrator;
203         short rotfrom DNA_DEPRECATED;
204         short kink, kink_axis;
205
206         /* billboards */
207         short bb_align, bb_uv_split, bb_anim, bb_split_offset;
208         float bb_tilt, bb_rand_tilt, bb_offset[2], bb_size[2], bb_vel_head, bb_vel_tail;
209
210         /* draw color */
211         float color_vec_max;
212
213         /* time and emission */
214         float sta, end, lifetime, randlife;
215         float timetweak, courant_target;
216         float jitfac, eff_hair, grid_rand, ps_offset[1];
217         int totpart, userjit, grid_res, effector_amount;
218         short time_flag, time_pad[3];
219
220         /* initial velocity factors */
221         float normfac, obfac, randfac, partfac, tanfac, tanphase, reactfac;
222         float ob_vel[3];
223         float avefac, phasefac, randrotfac, randphasefac;
224         /* physical properties */
225         float mass, size, randsize;
226         /* global physical properties */
227         float acc[3], dragfac, brownfac, dampfac;
228         /* length */
229         float randlength;
230         /* children */
231         int child_flag;
232         int pad3;
233         int child_nbr, ren_child_nbr;
234         float parents, childsize, childrandsize;
235         float childrad, childflat;
236         /* clumping */
237         float clumpfac, clumppow;
238         /* kink */
239         float kink_amp, kink_freq, kink_shape, kink_flat;
240         float kink_amp_clump;
241         int kink_extra_steps, pad4;
242         float kink_axis_random, kink_amp_random;
243         /* rough */
244         float rough1, rough1_size;
245         float rough2, rough2_size, rough2_thres;
246         float rough_end, rough_end_shape;
247         /* length */
248         float clength, clength_thres;
249         /* parting */
250         float parting_fac;
251         float parting_min, parting_max;
252         /* branching */
253         float branch_thres;
254         /* drawing stuff */
255         float draw_line[2];
256         float path_start, path_end;
257         int trail_count;
258         /* keyed particles */
259         int keyed_loops;
260         struct CurveMapping *clumpcurve;
261         struct CurveMapping *roughcurve;
262         float clump_noise_size;
263
264         /* hair dynamics */
265         float bending_random;
266
267         /** MAX_MTEX. */
268         struct MTex *mtex[18];
269
270         struct Collection *dup_group;
271         struct ListBase dupliweights;
272         struct Collection *eff_group  DNA_DEPRECATED;           // deprecated
273         struct Object *dup_ob;
274         struct Object *bb_ob;
275         /** Old animation system, deprecated for 2.5. */
276         struct Ipo *ipo  DNA_DEPRECATED;
277         struct PartDeflect *pd;
278         struct PartDeflect *pd2;
279
280         /* modified dm support */
281         short use_modifier_stack;
282         short pad5;
283
284         /* hair shape */
285         short shape_flag;
286         short pad6;
287
288         float twist, pad8;
289
290         /* hair thickness shape */
291         float shape;
292         float rad_root, rad_tip, rad_scale;
293
294         struct CurveMapping *twistcurve;
295         void *pad7;
296 } ParticleSettings;
297
298 typedef struct ParticleSystem {
299         /* note1: make sure all (runtime) are NULL's in 'copy_particlesystem' XXX,
300          * this function is no more! - need to invstigate */
301
302         /* note2: make sure any uses of this struct in DNA are
303          * accounted for in 'BKE_object_copy_particlesystems' */
304
305         struct ParticleSystem *next, *prev;
306
307         /** Particle settings. */
308         ParticleSettings *part;
309
310         /** (parent) particles. */
311         ParticleData *particles;
312         /** Child particles. */
313         ChildParticle *child;
314
315         /** Particle editmode (runtime). */
316         struct PTCacheEdit *edit;
317         /** Free callback. */
318         void (*free_edit)(struct PTCacheEdit *edit);
319
320         /** Path cache (runtime). */
321         struct ParticleCacheKey **pathcache;
322         /** Child cache (runtime). */
323         struct ParticleCacheKey **childcache;
324         /** Buffers for the above. */
325         ListBase pathcachebufs, childcachebufs;
326
327         /** Cloth simulation for hair. */
328         struct ClothModifierData *clmd;
329         /** Input/output for cloth simulation. */
330         struct Mesh *hair_in_mesh, *hair_out_mesh;
331
332         struct Object *target_ob;
333
334         /** Run-time only lattice deformation data. */
335         struct LatticeDeformData *lattice_deform_data;
336
337         /** Particles from global space -> parent space. */
338         struct Object *parent;
339
340         /** Used for keyed and boid physics. */
341         struct ListBase targets;
342
343         /** Particle system name, MAX_NAME. */
344         char name[64];
345
346         /** Used for duplicators. */
347         float imat[4][4];
348         float cfra, tree_frame, bvhtree_frame;
349         int seed, child_seed;
350         int flag, totpart, totunexist, totchild, totcached, totchildcache;
351         /* NOTE: Recalc is one of ID_RECALC_PSYS_ALL flags.
352          *
353          * TODO(sergey): Use part->id.recalc instead of this duplicated flag
354          * somehow. */
355         int recalc;
356         int pad1;
357         short target_psys, totkeyed, bakespace;
358         short pad2;
359
360         /** Billboard uv name, MAX_CUSTOMDATA_LAYER_NAME. */
361         char bb_uvname[3][64];
362
363         /* if you change these remember to update array lengths to PSYS_TOT_VG! */
364         /** Vertex groups, 0==disable, 1==starting index. */
365         short vgroup[13], vg_neg, rt3;
366         char pad[6];
367
368         /* point cache */
369         struct PointCache *pointcache;
370         struct ListBase ptcaches;
371
372         struct ListBase *effectors;
373
374         ParticleSpring *fluid_springs;
375         int tot_fluidsprings, alloc_fluidsprings;
376
377         /** Used for interactions with self and other systems. */
378         struct KDTree *tree;
379         /** Used for interactions with self and other systems. */
380         struct BVHTree *bvhtree;
381
382         struct ParticleDrawData *pdd;
383
384         /** Current time step, as a fraction of a frame. */
385         float dt_frac;
386         /** Influence of the lattice modifier. */
387         float lattice_strength;
388
389         void *batch_cache;
390
391         /* Set by dependency graph's copy-on-write, allows to quickly go
392          * from evaluated particle system to original one.
393          *
394          * Original system will have this set to NULL.
395          *
396          * Use psys_orig_get() function to access,
397          */
398         struct ParticleSystem *orig_psys;
399 } ParticleSystem;
400
401 typedef enum eParticleDrawFlag {
402         PART_DRAW_VEL           = (1 << 0),
403         PART_DRAW_GLOBAL_OB         = (1 << 1),
404         PART_DRAW_SIZE          = (1 << 2),
405 #ifdef DNA_DEPRECATED
406         PART_DRAW_EMITTER       = (1 << 3),  /* render emitter also */ /* DEPRECATED */
407 #endif
408         PART_DRAW_HEALTH        = (1 << 4),
409         PART_ABS_PATH_TIME      = (1 << 5),
410         PART_DRAW_COUNT_GR      = (1 << 6),
411         PART_DRAW_BB_LOCK       = (1 << 7), /* used with billboards */
412         PART_DRAW_ROTATE_OB     = (1 << 7), /* used with dupliobjects/groups */
413         PART_DRAW_PARENT        = (1 << 8),
414         PART_DRAW_NUM           = (1 << 9),
415         PART_DRAW_RAND_GR       = (1 << 10),
416         PART_DRAW_REN_ADAPT     = (1 << 11),
417         PART_DRAW_VEL_LENGTH    = (1 << 12),
418         PART_DRAW_MAT_COL       = (1 << 13), /* deprecated, but used in do_versions */
419         PART_DRAW_WHOLE_GR      = (1 << 14),
420         PART_DRAW_REN_STRAND    = (1 << 15),
421         PART_DRAW_NO_SCALE_OB   = (1 << 16), /* used with dupliobjects/groups */
422         PART_DRAW_GUIDE_HAIRS   = (1 << 17),
423         PART_DRAW_HAIR_GRID     = (1 << 18),
424 } eParticleDrawFlag;
425
426 /* part->type */
427 /* hair is always baked static in object/geometry space */
428 /* other types (normal particles) are in global space and not static baked */
429 #define PART_EMITTER            0
430 //#define PART_REACTOR          1
431 #define PART_HAIR                       2
432 #define PART_FLUID                      3
433
434 /* part->flag */
435 #define PART_REACT_STA_END      1
436 #define PART_REACT_MULTIPLE     2
437
438 //#define PART_LOOP                     4       /* not used anymore */
439                 /* for dopesheet */
440 #define PART_DS_EXPAND          8
441
442 #define PART_HAIR_REGROW        16      /* regrow hair for each frame */
443
444 #define PART_UNBORN                     32      /*show unborn particles*/
445 #define PART_DIED                       64      /*show died particles*/
446
447 #define PART_TRAND                      128
448 #define PART_EDISTR                     256     /* particle/face from face areas */
449
450 #define PART_ROTATIONS          512     /* calculate particle rotations (and store them in pointcache) */
451 #define PART_DIE_ON_COL         (1<<12)
452 #define PART_SIZE_DEFL          (1<<13) /* swept sphere deflections */
453 #define PART_ROT_DYN            (1<<14) /* dynamic rotation */
454 #define PART_SIZEMASS           (1<<16)
455
456 #define PART_HIDE_ADVANCED_HAIR (1<<15)
457
458 //#define PART_ABS_TIME         (1<<17)
459 //#define PART_GLOB_TIME                (1<<18)
460
461 #define PART_BOIDS_2D           (1<<19)
462
463 //#define PART_BRANCHING                (1<<20)
464 //#define PART_ANIM_BRANCHING   (1<<21)
465
466 #define PART_HAIR_BSPLINE       1024
467
468 #define PART_GRID_HEXAGONAL     (1<<24)
469 #define PART_GRID_INVERT        (1<<26)
470
471 #define PART_CHILD_EFFECT               (1<<27)
472 #define PART_CHILD_LONG_HAIR    (1<<28)
473 /* #define PART_CHILD_RENDER            (1<<29) */ /*UNUSED*/
474 #define PART_CHILD_GUIDE                (1<<30)
475
476 #define PART_SELF_EFFECT        (1<<22)
477
478 /* part->from */
479 #define PART_FROM_VERT          0
480 #define PART_FROM_FACE          1
481 #define PART_FROM_VOLUME        2
482 /* #define PART_FROM_PARTICLE   3  deprecated! */
483 #define PART_FROM_CHILD         4
484
485 /* part->distr */
486 #define PART_DISTR_JIT          0
487 #define PART_DISTR_RAND         1
488 #define PART_DISTR_GRID         2
489
490 /* part->phystype */
491 #define PART_PHYS_NO            0
492 #define PART_PHYS_NEWTON        1
493 #define PART_PHYS_KEYED         2
494 #define PART_PHYS_BOIDS         3
495 #define PART_PHYS_FLUID         4
496
497 /* part->kink */
498 typedef enum eParticleKink {
499         PART_KINK_NO            = 0,
500         PART_KINK_CURL          = 1,
501         PART_KINK_RADIAL        = 2,
502         PART_KINK_WAVE          = 3,
503         PART_KINK_BRAID         = 4,
504         PART_KINK_SPIRAL        = 5,
505 } eParticleKink;
506
507 /* part->child_flag */
508 typedef enum eParticleChildFlag {
509         PART_CHILD_USE_CLUMP_NOISE  = (1<<0),
510         PART_CHILD_USE_CLUMP_CURVE  = (1<<1),
511         PART_CHILD_USE_ROUGH_CURVE  = (1<<2),
512         PART_CHILD_USE_TWIST_CURVE  = (1<<3),
513 } eParticleChildFlag;
514
515 /* part->shape_flag */
516 typedef enum eParticleShapeFlag {
517         PART_SHAPE_CLOSE_TIP     = (1<<0),
518 } eParticleShapeFlag;
519
520 /* part->draw_col */
521 #define PART_DRAW_COL_NONE              0
522 #define PART_DRAW_COL_MAT               1
523 #define PART_DRAW_COL_VEL               2
524 #define PART_DRAW_COL_ACC               3
525
526 /* part->time_flag */
527 #define PART_TIME_AUTOSF        1 /* Automatic subframes */
528
529 /* part->bb_align */
530 #define PART_BB_X               0
531 #define PART_BB_Y               1
532 #define PART_BB_Z               2
533 #define PART_BB_VIEW    3
534 #define PART_BB_VEL             4
535
536 /* part->bb_anim */
537 #define PART_BB_ANIM_NONE       0
538 #define PART_BB_ANIM_AGE        1
539 #define PART_BB_ANIM_ANGLE      2
540 #define PART_BB_ANIM_FRAME      3
541
542 /* part->bb_split_offset */
543 #define PART_BB_OFF_NONE        0
544 #define PART_BB_OFF_LINEAR      1
545 #define PART_BB_OFF_RANDOM      2
546
547 /* part->draw_as */
548 /* part->ren_as*/
549 #define PART_DRAW_NOT           0
550 #define PART_DRAW_DOT           1
551 #define PART_DRAW_HALO          1
552 #define PART_DRAW_CIRC          2
553 #define PART_DRAW_CROSS         3
554 #define PART_DRAW_AXIS          4
555 #define PART_DRAW_LINE          5
556 #define PART_DRAW_PATH          6
557 #define PART_DRAW_OB            7
558 #define PART_DRAW_GR            8
559 #define PART_DRAW_BB            9
560 #define PART_DRAW_REND          10
561
562 /* part->integrator */
563 #define PART_INT_EULER          0
564 #define PART_INT_MIDPOINT       1
565 #define PART_INT_RK4            2
566 #define PART_INT_VERLET         3
567
568 /* part->rotmode */
569 #define PART_ROT_NOR            1
570 #define PART_ROT_VEL            2
571 #define PART_ROT_GLOB_X         3
572 #define PART_ROT_GLOB_Y         4
573 #define PART_ROT_GLOB_Z         5
574 #define PART_ROT_OB_X           6
575 #define PART_ROT_OB_Y           7
576 #define PART_ROT_OB_Z           8
577 #define PART_ROT_NOR_TAN        9
578
579 /* part->avemode */
580 #define PART_AVE_VELOCITY       1
581 #define PART_AVE_RAND           2
582 #define PART_AVE_HORIZONTAL     3
583 #define PART_AVE_VERTICAL       4
584 #define PART_AVE_GLOBAL_X       5
585 #define PART_AVE_GLOBAL_Y       6
586 #define PART_AVE_GLOBAL_Z       7
587
588 /* part->reactevent */
589 #define PART_EVENT_DEATH        0
590 #define PART_EVENT_COLLIDE      1
591 #define PART_EVENT_NEAR         2
592
593 /* part->childtype */
594 #define PART_CHILD_PARTICLES    1
595 #define PART_CHILD_FACES                2
596
597 /* psys->flag */
598 #define PSYS_CURRENT            1
599 #define PSYS_GLOBAL_HAIR        2
600 #define PSYS_HAIR_DYNAMICS      4
601 #define PSYS_KEYED_TIMING       8
602 //#define PSYS_ENABLED          16      /* deprecated */
603 #define PSYS_HAIR_UPDATED       32  /* signal for updating hair particle mode */
604 /* #define PSYS_DRAWING         64 */ /* deprecated */
605 /* #define PSYS_USE_IMAT                128 */ /* deprecated */
606 #define PSYS_DELETE                     256     /* remove particlesystem as soon as possible */
607 #define PSYS_HAIR_DONE          512
608 #define PSYS_KEYED                      1024
609 #define PSYS_EDITED                     2048
610 //#define PSYS_PROTECT_CACHE    4096 /* deprecated */
611 #define PSYS_DISABLED                   8192
612 #define PSYS_OB_ANIM_RESTORE    16384 /* runtime flag */
613 #define PSYS_SHARED_CACHES              32768
614
615 /* pars->flag */
616 #define PARS_UNEXIST            1
617 #define PARS_NO_DISP            2
618 //#define PARS_STICKY                   4 /* deprecated */
619 #define PARS_REKEY                      8
620
621 /* pars->alive */
622 //#define PARS_KILLED                   0 /* deprecated */
623 #define PARS_DEAD                       1
624 #define PARS_UNBORN                     2
625 #define PARS_ALIVE                      3
626 #define PARS_DYING                      4
627
628 /* ParticleDupliWeight->flag */
629 #define PART_DUPLIW_CURRENT     1
630
631 /* psys->vg */
632 #define PSYS_TOT_VG                     13
633
634 #define PSYS_VG_DENSITY         0
635 #define PSYS_VG_VEL                     1
636 #define PSYS_VG_LENGTH          2
637 #define PSYS_VG_CLUMP           3
638 #define PSYS_VG_KINK            4
639 #define PSYS_VG_ROUGH1          5
640 #define PSYS_VG_ROUGH2          6
641 #define PSYS_VG_ROUGHE          7
642 #define PSYS_VG_SIZE            8
643 #define PSYS_VG_TAN                     9
644 #define PSYS_VG_ROT                     10
645 #define PSYS_VG_EFFECTOR        11
646 #define PSYS_VG_TWIST   12
647
648 /* ParticleTarget->flag */
649 #define PTARGET_CURRENT         1
650 #define PTARGET_VALID           2
651
652 /* ParticleTarget->mode */
653 #define PTARGET_MODE_NEUTRAL    0
654 #define PTARGET_MODE_FRIEND             1
655 #define PTARGET_MODE_ENEMY              2
656
657 /* mapto */
658 typedef enum eParticleTextureInfluence {
659         /* init */
660         PAMAP_TIME              = (1<<0),       /* emission time */
661         PAMAP_LIFE              = (1<<1),       /* life time */
662         PAMAP_DENS              = (1<<2),       /* density */
663         PAMAP_SIZE              = (1<<3),       /* physical size */
664         PAMAP_INIT              = (PAMAP_TIME | PAMAP_LIFE | PAMAP_DENS | PAMAP_SIZE),
665         /* reset */
666         PAMAP_IVEL              = (1<<5),       /* initial velocity */
667         /* physics */
668         PAMAP_FIELD             = (1<<6),       /* force fields */
669         PAMAP_GRAVITY   = (1<<10),
670         PAMAP_DAMP              = (1<<11),
671         PAMAP_PHYSICS   = (PAMAP_FIELD | PAMAP_GRAVITY | PAMAP_DAMP),
672         /* children */
673         PAMAP_CLUMP             = (1<<7),
674         PAMAP_KINK_FREQ = (1<<8),
675         PAMAP_KINK_AMP  = (1<<12),
676         PAMAP_ROUGH             = (1<<9),
677         PAMAP_LENGTH    = (1<<4),
678         PAMAP_TWIST     = (1<<13),
679         PAMAP_CHILD             = (PAMAP_CLUMP | PAMAP_KINK_FREQ | PAMAP_KINK_AMP | PAMAP_ROUGH | PAMAP_LENGTH | PAMAP_TWIST),
680 } eParticleTextureInfluence;
681
682 #endif