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
21  * \ingroup DNA
22  */
23 
24 #pragma once
25 
26 #include "DNA_ID.h"
27 #include "DNA_boid_types.h"
28 #include "DNA_defs.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   char _pad[2];
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 along. */
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   char _pad[4];
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   char _pad[6];
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, childtype;
194   char _pad2[4];
195   short ren_as, subframes, draw_col;
196   /* number of path segments, power of 2 except */
197   short draw_step, ren_step;
198   short hair_step, keys_step;
199 
200   /* adaptive path rendering */
201   short adapt_angle, adapt_pix;
202 
203   short disp, omat, interpolation, integrator;
204   short rotfrom DNA_DEPRECATED;
205   short kink, kink_axis;
206 
207   /* billboards */
208   short bb_align, bb_uv_split, bb_anim, bb_split_offset DNA_DEPRECATED;
209   float bb_tilt, bb_rand_tilt, bb_offset[2], bb_size[2], bb_vel_head, bb_vel_tail DNA_DEPRECATED;
210 
211   /* draw color */
212   float color_vec_max;
213 
214   /* time and emission */
215   float sta, end, lifetime, randlife;
216   float timetweak, courant_target;
217   float jitfac, eff_hair, grid_rand, ps_offset[1];
218   int totpart, userjit, grid_res, effector_amount;
219   short time_flag;
220   char _pad0[6];
221 
222   /* initial velocity factors */
223   float normfac, obfac, randfac, partfac, tanfac, tanphase, reactfac;
224   float ob_vel[3];
225   float avefac, phasefac, randrotfac, randphasefac;
226   /* physical properties */
227   float mass, size, randsize;
228   /* global physical properties */
229   float acc[3], dragfac, brownfac, dampfac;
230   /* length */
231   float randlength;
232   /* children */
233   int child_flag;
234   char _pad3[4];
235   int child_nbr, ren_child_nbr;
236   float parents, childsize, childrandsize;
237   float childrad, childflat;
238   /* clumping */
239   float clumpfac, clumppow;
240   /* kink */
241   float kink_amp, kink_freq, kink_shape, kink_flat;
242   float kink_amp_clump;
243   int kink_extra_steps;
244   char _pad4[4];
245   float kink_axis_random, kink_amp_random;
246   /* rough */
247   float rough1, rough1_size;
248   float rough2, rough2_size, rough2_thres;
249   float rough_end, rough_end_shape;
250   /* length */
251   float clength, clength_thres;
252   /* parting */
253   float parting_fac;
254   float parting_min, parting_max;
255   /* branching */
256   float branch_thres;
257   /* drawing stuff */
258   float draw_line[2];
259   float path_start, path_end;
260   int trail_count;
261   /* keyed particles */
262   int keyed_loops;
263   struct CurveMapping *clumpcurve;
264   struct CurveMapping *roughcurve;
265   float clump_noise_size;
266 
267   /* hair dynamics */
268   float bending_random;
269 
270   /** MAX_MTEX. */
271   struct MTex *mtex[18];
272 
273   struct Collection *instance_collection;
274   struct ListBase instance_weights;
275   struct Collection *force_group DNA_DEPRECATED; /* deprecated */
276   struct Object *instance_object;
277   struct Object *bb_ob;
278   /** Old animation system, deprecated for 2.5. */
279   struct Ipo *ipo DNA_DEPRECATED;
280   struct PartDeflect *pd;
281   struct PartDeflect *pd2;
282 
283   /* modified dm support */
284   short use_modifier_stack;
285   char _pad5[2];
286 
287   /* hair shape */
288   short shape_flag;
289   char _pad6[2];
290 
291   float twist;
292   char _pad8[4];
293 
294   /* hair thickness shape */
295   float shape;
296   float rad_root, rad_tip, rad_scale;
297 
298   struct CurveMapping *twistcurve;
299   void *_pad7;
300 } ParticleSettings;
301 
302 typedef struct ParticleSystem {
303   /* note1: make sure all (run-time) are NULL's in 'copy_particlesystem' XXX,
304    * this function is no more! - need to investigate. */
305 
306   /* note2: make sure any uses of this struct in DNA are
307    * accounted for in 'BKE_object_copy_particlesystems'. */
308 
309   struct ParticleSystem *next, *prev;
310 
311   /** Particle settings. */
312   ParticleSettings *part;
313 
314   /** (parent) particles. */
315   ParticleData *particles;
316   /** Child particles. */
317   ChildParticle *child;
318 
319   /** Particle editmode (runtime). */
320   struct PTCacheEdit *edit;
321   /** Free callback. */
322   void (*free_edit)(struct PTCacheEdit *edit);
323 
324   /** Path cache (runtime). */
325   struct ParticleCacheKey **pathcache;
326   /** Child cache (runtime). */
327   struct ParticleCacheKey **childcache;
328   /** Buffers for the above. */
329   ListBase pathcachebufs, childcachebufs;
330 
331   /** Cloth simulation for hair. */
332   struct ClothModifierData *clmd;
333   /** Input/output for cloth simulation. */
334   struct Mesh *hair_in_mesh, *hair_out_mesh;
335 
336   struct Object *target_ob;
337 
338   /** Run-time only lattice deformation data. */
339   struct LatticeDeformData *lattice_deform_data;
340 
341   /** Particles from global space -> parent space. */
342   struct Object *parent;
343 
344   /** Used for keyed and boid physics. */
345   struct ListBase targets;
346 
347   /** Particle system name, MAX_NAME. */
348   char name[64];
349 
350   /** Used for instancing. */
351   float imat[4][4];
352   float cfra, tree_frame, bvhtree_frame;
353   int seed, child_seed;
354   int flag, totpart, totunexist, totchild, totcached, totchildcache;
355   /* NOTE: Recalc is one of ID_RECALC_PSYS_ALL flags.
356    *
357    * TODO(sergey): Use part->id.recalc instead of this duplicated flag
358    * somehow. */
359   int recalc;
360   short target_psys, totkeyed, bakespace;
361   char _pad1[6];
362 
363   /** Billboard uv name, MAX_CUSTOMDATA_LAYER_NAME. */
364   char bb_uvname[3][64] DNA_DEPRECATED;
365 
366   /* if you change these remember to update array lengths to PSYS_TOT_VG! */
367   /** Vertex groups, 0==disable, 1==starting index. */
368   short vgroup[13], vg_neg, rt3;
369   char _pad[6];
370 
371   /* point cache */
372   struct PointCache *pointcache;
373   struct ListBase ptcaches;
374 
375   struct ListBase *effectors;
376 
377   ParticleSpring *fluid_springs;
378   int tot_fluidsprings, alloc_fluidsprings;
379 
380   /** Used for interactions with self and other systems. */
381   struct KDTree_3d *tree;
382   /** Used for interactions with self and other systems. */
383   struct BVHTree *bvhtree;
384 
385   struct ParticleDrawData *pdd;
386 
387   /** Current time step, as a fraction of a frame. */
388   float dt_frac;
389   /** Influence of the lattice modifier. */
390   float lattice_strength;
391 
392   void *batch_cache;
393 
394   /* Set by dependency graph's copy-on-write, allows to quickly go
395    * from evaluated particle system to original one.
396    *
397    * Original system will have this set to NULL.
398    *
399    * Use psys_orig_get() function to access,
400    */
401   struct ParticleSystem *orig_psys;
402 } ParticleSystem;
403 
404 typedef enum eParticleDrawFlag {
405   PART_DRAW_VEL = (1 << 0),
406   PART_DRAW_GLOBAL_OB = (1 << 1),
407   PART_DRAW_SIZE = (1 << 2),
408 #ifdef DNA_DEPRECATED_ALLOW
409   /** Render emitter as well. */
410   PART_DRAW_EMITTER = (1 << 3), /* DEPRECATED */
411 #endif
412   PART_DRAW_HEALTH = (1 << 4),
413   PART_ABS_PATH_TIME = (1 << 5),
414   PART_DRAW_COUNT_GR = (1 << 6),
415   /* PART_DRAW_BB_LOCK = (1 << 7), */ /* DEPRECATED */
416   /* used with billboards */          /* DEPRECATED */
417   PART_DRAW_ROTATE_OB = (1 << 7),     /* used with instance object/collection */
418   PART_DRAW_PARENT = (1 << 8),
419   PART_DRAW_NUM = (1 << 9),
420   PART_DRAW_RAND_GR = (1 << 10),
421   PART_DRAW_REN_ADAPT = (1 << 11),
422   PART_DRAW_VEL_LENGTH = (1 << 12),
423   PART_DRAW_MAT_COL = (1 << 13), /* deprecated, but used in do_versions */
424   PART_DRAW_WHOLE_GR = (1 << 14),
425   PART_DRAW_REN_STRAND = (1 << 15),
426   PART_DRAW_NO_SCALE_OB = (1 << 16), /* used with instance object/collection */
427   PART_DRAW_GUIDE_HAIRS = (1 << 17),
428   PART_DRAW_HAIR_GRID = (1 << 18),
429 } eParticleDrawFlag;
430 
431 /* part->type
432  * Hair is always baked static in object/geometry space.
433  * Other types (normal particles) are in global space and not static baked. */
434 enum {
435   PART_EMITTER = 0,
436   /* REACTOR type currently unused */
437   /* PART_REACTOR = 1, */
438   PART_HAIR = 2,
439   PART_FLUID = 3, /* deprecated (belonged to elbeem) */
440   PART_FLUID_FLIP = 4,
441   PART_FLUID_SPRAY = 5,
442   PART_FLUID_BUBBLE = 6,
443   PART_FLUID_FOAM = 7,
444   PART_FLUID_TRACER = 8,
445   PART_FLUID_SPRAYFOAM = 9,
446   PART_FLUID_SPRAYBUBBLE = 10,
447   PART_FLUID_FOAMBUBBLE = 11,
448   PART_FLUID_SPRAYFOAMBUBBLE = 12,
449 };
450 
451 /* Mirroring Mantaflow particle types from particle.h (Mantaflow header). */
452 enum {
453   /* PARTICLE_TYPE_NONE = (0 << 0), */ /* UNUSED */
454   /* PARTICLE_TYPE_NEW = (1 << 0), */  /* UNUSED */
455   PARTICLE_TYPE_SPRAY = (1 << 1),
456   PARTICLE_TYPE_BUBBLE = (1 << 2),
457   PARTICLE_TYPE_FOAM = (1 << 3),
458   PARTICLE_TYPE_TRACER = (1 << 4),
459   PARTICLE_TYPE_DELETE = (1 << 10),
460   /* PARTICLE_TYPE_INVALID = (1 << 30), */ /* UNUSED */
461 };
462 
463 /* part->flag */
464 #define PART_REACT_STA_END 1
465 #define PART_REACT_MULTIPLE 2
466 
467 //#define PART_LOOP         4   /* not used anymore */
468 /* for dopesheet */
469 #define PART_DS_EXPAND 8
470 
471 #define PART_HAIR_REGROW 16 /* regrow hair for each frame */
472 
473 #define PART_UNBORN 32 /*show unborn particles*/
474 #define PART_DIED 64   /*show died particles*/
475 
476 #define PART_TRAND 128
477 #define PART_EDISTR 256 /* particle/face from face areas */
478 
479 #define PART_ROTATIONS 512 /* calculate particle rotations (and store them in pointcache) */
480 #define PART_DIE_ON_COL (1 << 12)
481 #define PART_SIZE_DEFL (1 << 13) /* swept sphere deflections */
482 #define PART_ROT_DYN (1 << 14)   /* dynamic rotation */
483 #define PART_SIZEMASS (1 << 16)
484 
485 #define PART_HIDE_ADVANCED_HAIR (1 << 15)
486 
487 //#define PART_ABS_TIME     (1 << 17)
488 //#define PART_GLOB_TIME        (1 << 18)
489 
490 #define PART_BOIDS_2D (1 << 19)
491 
492 //#define PART_BRANCHING        (1 << 20)
493 //#define PART_ANIM_BRANCHING   (1 << 21)
494 
495 #define PART_HAIR_BSPLINE 1024
496 
497 #define PART_GRID_HEXAGONAL (1 << 24)
498 #define PART_GRID_INVERT (1 << 26)
499 
500 #define PART_CHILD_EFFECT (1 << 27)
501 #define PART_CHILD_LONG_HAIR (1 << 28)
502 /* #define PART_CHILD_RENDER        (1 << 29) */ /*UNUSED*/
503 #define PART_CHILD_GUIDE (1 << 30)
504 
505 #define PART_SELF_EFFECT (1 << 22)
506 
507 /* part->from */
508 #define PART_FROM_VERT 0
509 #define PART_FROM_FACE 1
510 #define PART_FROM_VOLUME 2
511 /* #define PART_FROM_PARTICLE   3  deprecated! */
512 #define PART_FROM_CHILD 4
513 
514 /* part->distr */
515 #define PART_DISTR_JIT 0
516 #define PART_DISTR_RAND 1
517 #define PART_DISTR_GRID 2
518 
519 /* part->phystype */
520 #define PART_PHYS_NO 0
521 #define PART_PHYS_NEWTON 1
522 #define PART_PHYS_KEYED 2
523 #define PART_PHYS_BOIDS 3
524 #define PART_PHYS_FLUID 4
525 
526 /* part->kink */
527 typedef enum eParticleKink {
528   PART_KINK_NO = 0,
529   PART_KINK_CURL = 1,
530   PART_KINK_RADIAL = 2,
531   PART_KINK_WAVE = 3,
532   PART_KINK_BRAID = 4,
533   PART_KINK_SPIRAL = 5,
534 } eParticleKink;
535 
536 /* part->child_flag */
537 typedef enum eParticleChildFlag {
538   PART_CHILD_USE_CLUMP_NOISE = (1 << 0),
539   PART_CHILD_USE_CLUMP_CURVE = (1 << 1),
540   PART_CHILD_USE_ROUGH_CURVE = (1 << 2),
541   PART_CHILD_USE_TWIST_CURVE = (1 << 3),
542 } eParticleChildFlag;
543 
544 /* part->shape_flag */
545 typedef enum eParticleShapeFlag {
546   PART_SHAPE_CLOSE_TIP = (1 << 0),
547 } eParticleShapeFlag;
548 
549 /* part->draw_col */
550 #define PART_DRAW_COL_NONE 0
551 #define PART_DRAW_COL_MAT 1
552 #define PART_DRAW_COL_VEL 2
553 #define PART_DRAW_COL_ACC 3
554 
555 /* part->time_flag */
556 #define PART_TIME_AUTOSF 1 /* Automatic subframes */
557 
558 /* part->draw_as */
559 /* part->ren_as*/
560 #define PART_DRAW_NOT 0
561 #define PART_DRAW_DOT 1
562 #define PART_DRAW_HALO 1
563 #define PART_DRAW_CIRC 2
564 #define PART_DRAW_CROSS 3
565 #define PART_DRAW_AXIS 4
566 #define PART_DRAW_LINE 5
567 #define PART_DRAW_PATH 6
568 #define PART_DRAW_OB 7
569 #define PART_DRAW_GR 8
570 #define PART_DRAW_BB 9 /* deprecated */
571 #define PART_DRAW_REND 10
572 
573 /* part->integrator */
574 #define PART_INT_EULER 0
575 #define PART_INT_MIDPOINT 1
576 #define PART_INT_RK4 2
577 #define PART_INT_VERLET 3
578 
579 /* part->rotmode */
580 #define PART_ROT_NOR 1
581 #define PART_ROT_VEL 2
582 #define PART_ROT_GLOB_X 3
583 #define PART_ROT_GLOB_Y 4
584 #define PART_ROT_GLOB_Z 5
585 #define PART_ROT_OB_X 6
586 #define PART_ROT_OB_Y 7
587 #define PART_ROT_OB_Z 8
588 #define PART_ROT_NOR_TAN 9
589 
590 /* part->avemode */
591 #define PART_AVE_VELOCITY 1
592 #define PART_AVE_RAND 2
593 #define PART_AVE_HORIZONTAL 3
594 #define PART_AVE_VERTICAL 4
595 #define PART_AVE_GLOBAL_X 5
596 #define PART_AVE_GLOBAL_Y 6
597 #define PART_AVE_GLOBAL_Z 7
598 
599 /* part->reactevent */
600 #define PART_EVENT_DEATH 0
601 #define PART_EVENT_COLLIDE 1
602 #define PART_EVENT_NEAR 2
603 
604 /* part->childtype */
605 #define PART_CHILD_PARTICLES 1
606 #define PART_CHILD_FACES 2
607 
608 /* psys->flag */
609 #define PSYS_CURRENT 1
610 #define PSYS_GLOBAL_HAIR 2
611 #define PSYS_HAIR_DYNAMICS 4
612 #define PSYS_KEYED_TIMING 8
613 //#define PSYS_ENABLED      16  /* deprecated */
614 #define PSYS_HAIR_UPDATED 32           /* signal for updating hair particle mode */
615 /* #define PSYS_DRAWING     64 */      /* deprecated */
616 /* #define PSYS_USE_IMAT        128 */ /* deprecated */
617 #define PSYS_DELETE 256                /* remove particlesystem as soon as possible */
618 #define PSYS_HAIR_DONE 512
619 #define PSYS_KEYED 1024
620 #define PSYS_EDITED 2048
621 //#define PSYS_PROTECT_CACHE    4096 /* deprecated */
622 #define PSYS_DISABLED 8192
623 #define PSYS_OB_ANIM_RESTORE 16384 /* runtime flag */
624 #define PSYS_SHARED_CACHES 32768
625 
626 /* pars->flag */
627 #define PARS_UNEXIST 1
628 #define PARS_NO_DISP 2
629 //#define PARS_STICKY           4 /* deprecated */
630 #define PARS_REKEY 8
631 
632 /* pars->alive */
633 //#define PARS_KILLED           0 /* deprecated */
634 #define PARS_DEAD 1
635 #define PARS_UNBORN 2
636 #define PARS_ALIVE 3
637 #define PARS_DYING 4
638 
639 /* ParticleDupliWeight->flag */
640 #define PART_DUPLIW_CURRENT 1
641 
642 /* psys->vg */
643 #define PSYS_TOT_VG 13
644 
645 #define PSYS_VG_DENSITY 0
646 #define PSYS_VG_VEL 1
647 #define PSYS_VG_LENGTH 2
648 #define PSYS_VG_CLUMP 3
649 #define PSYS_VG_KINK 4
650 #define PSYS_VG_ROUGH1 5
651 #define PSYS_VG_ROUGH2 6
652 #define PSYS_VG_ROUGHE 7
653 #define PSYS_VG_SIZE 8
654 #define PSYS_VG_TAN 9
655 #define PSYS_VG_ROT 10
656 #define PSYS_VG_EFFECTOR 11
657 #define PSYS_VG_TWIST 12
658 
659 /* ParticleTarget->flag */
660 #define PTARGET_CURRENT 1
661 #define PTARGET_VALID 2
662 
663 /* ParticleTarget->mode */
664 #define PTARGET_MODE_NEUTRAL 0
665 #define PTARGET_MODE_FRIEND 1
666 #define PTARGET_MODE_ENEMY 2
667 
668 /* mapto */
669 typedef enum eParticleTextureInfluence {
670   /* init */
671   PAMAP_TIME = (1 << 0), /* emission time */
672   PAMAP_LIFE = (1 << 1), /* life time */
673   PAMAP_DENS = (1 << 2), /* density */
674   PAMAP_SIZE = (1 << 3), /* physical size */
675   PAMAP_INIT = (PAMAP_TIME | PAMAP_LIFE | PAMAP_DENS | PAMAP_SIZE),
676   /* reset */
677   PAMAP_IVEL = (1 << 5), /* initial velocity */
678   /* physics */
679   PAMAP_FIELD = (1 << 6), /* force fields */
680   PAMAP_GRAVITY = (1 << 10),
681   PAMAP_DAMP = (1 << 11),
682   PAMAP_PHYSICS = (PAMAP_FIELD | PAMAP_GRAVITY | PAMAP_DAMP),
683   /* children */
684   PAMAP_CLUMP = (1 << 7),
685   PAMAP_KINK_FREQ = (1 << 8),
686   PAMAP_KINK_AMP = (1 << 12),
687   PAMAP_ROUGH = (1 << 9),
688   PAMAP_LENGTH = (1 << 4),
689   PAMAP_TWIST = (1 << 13),
690   PAMAP_CHILD = (PAMAP_CLUMP | PAMAP_KINK_FREQ | PAMAP_KINK_AMP | PAMAP_ROUGH | PAMAP_LENGTH |
691                  PAMAP_TWIST),
692 } eParticleTextureInfluence;
693