own fix r34446, was incorrect, fixed properly now.
[blender.git] / source / blender / makesdna / DNA_particle_types.h
index c793362c2238ea8e15edcc0d5a9b8ae81c9da252..f009f3a9eb001b8c6fe48e536ea51dd83d904c7f 100644 (file)
@@ -17,7 +17,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  *
  * The Original Code is Copyright (C) 2007 by Janne Karhu.
  * All rights reserved.
@@ -33,6 +33,7 @@
 #define DNA_PARTICLE_TYPES_H
 
 #include "DNA_ID.h"
+#include "DNA_boid_types.h"
 
 struct AnimData;
 
@@ -52,64 +53,100 @@ typedef struct ParticleKey {       /* when changed update size of struct to copy_parti
        float time;             /* when this key happens */
 } ParticleKey;
 
+typedef struct BoidParticle {
+       struct Object *ground;
+       struct BoidData data;
+       float gravity[3];
+       float wander[3];
+       float rt;
+} BoidParticle;
+
+typedef struct ParticleSpring {
+       float rest_length;
+       unsigned int particle_index[2], delete_flag;
+}ParticleSpring;
+
 /* Child particles are created around or between parent particles */
 typedef struct ChildParticle {
        int num, parent;        /* num is face index on the final derived mesh */
        int pa[4];                      /* nearest particles to the child, used for the interpolation */
        float w[4];                     /* interpolation weights for the above particles */
        float fuv[4], foffset; /* face vertex weights and offset */
-       float rand[3];
+       float rt;
 } ChildParticle;
 
-/* Everything that's non dynamic for a particle:                       */
-typedef struct ParticleData {
-       struct Object *stick_ob;/* object that particle sticks to when dead */
+typedef struct ParticleTarget {
+       struct ParticleTarget *next, *prev;
+       struct Object *ob;
+       int psys;
+       short flag, mode;
+       float time, duration;
+} ParticleTarget;
+
+typedef struct ParticleDupliWeight {
+       struct ParticleDupliWeight *next, *prev;
+       struct Object *ob;
+       short count;
+       short flag, rt[2];
+} ParticleDupliWeight;
 
-       ParticleKey state;              /* normally current global coordinates or       */
-                                                       /* in sticky object space if dead & sticky      */
+typedef struct ParticleData {
+       ParticleKey state;              /* current global coordinates */
 
        ParticleKey prev_state; /* previous state */
-
+       
        HairKey *hair;                  /* hair vertices */
 
-       ParticleKey *keys;              /* keyed states */
+       ParticleKey *keys;              /* keyed keys */
 
-       float i_rot[4],r_rot[4];/* initial & random values (i_rot should be removed as it's not used anymore)*/
-       float r_ave[3],r_ve[3];
+       BoidParticle *boid;             /* boids data */
 
-       float fuv[4], foffset;  /* coordinates on face/edge number "num" and depth along*/
-                                                       /* face normal for volume emission                                              */
+       int totkey;                             /* amount of hair or keyed keys*/
 
        float time, lifetime;   /* dietime is not nescessarily time+lifetime as */
        float dietime;                  /* particles can die unnaturally (collision)    */
 
-       float bank;                             /* banking angle for boids */
-
-       float size, sizemul;    /* size and multiplier so that we can update size when ever */
-
        int num;                                /* index to vert/edge/face */
        int num_dmcache;                /* index to derived mesh data (face) to avoid slow lookups */
-       int pad;
 
-       int totkey;
-       int bpi;                                /* softbody body point start index */
+       float fuv[4], foffset;  /* coordinates on face/edge number "num" and depth along*/
+                                                       /* face normal for volume emission                                              */
 
+       float size;                             /* size and multiplier so that we can update size when ever */
+
+       int hair_index;
        short flag;
-       short alive;                            /* the life state of a particle */
-       short loop;                             /* how many times particle life has looped */
-       short rt2;
+       short alive;                    /* the life state of a particle */
 } ParticleData;
 
+typedef struct SPHFluidSettings {
+       /*Particle Fluid*/
+       float spring_k, radius, rest_length, plasticity_constant, yield_ratio;
+       float viscosity_omega, viscosity_beta;
+       float stiffness_k, stiffness_knear, rest_density;
+       float buoyancy;
+       int flag, pad;
+} SPHFluidSettings;
+
+/* fluid->flag */
+#define SPH_VISCOELASTIC_SPRINGS       1
+#define SPH_CURRENT_REST_LENGTH                2
+
 typedef struct ParticleSettings {
        ID id;
        struct AnimData *adt;
 
+       struct BoidSettings *boids;
+       struct SPHFluidSettings *fluid;
+
+       struct EffectorWeights *effector_weights;
+
        int flag;
        short type, from, distr;
        /* physics modes */
        short phystype, rotmode, avemode, reactevent;
        short draw, draw_as, draw_size, childtype;
-       short ren_as, rt2[3];
+       short ren_as, subframes;
        /* number of path segments, power of 2 except */
        short draw_step, ren_step;
        short hair_step, keys_step;
@@ -118,7 +155,7 @@ typedef struct ParticleSettings {
        short adapt_angle, adapt_pix;
 
        short disp, omat, interpolation, rotfrom, integrator;
-       short kink, kink_axis, nbetween, boidneighbours;
+       short kink, kink_axis;
 
        /* billboards */
        short bb_align, bb_uv_split, bb_anim, bb_split_offset;
@@ -131,45 +168,49 @@ typedef struct ParticleSettings {
 
        /* general values */
        float sta, end, lifetime, randlife;
-       float timetweak, jitfac, keyed_time, eff_hair;
+       float timetweak, jitfac, eff_hair;
        int totpart, userjit, grid_res;
 
        /* initial velocity factors */
        float normfac, obfac, randfac, partfac, tanfac, tanphase, reactfac;
+       float ob_vel[3];
        float avefac, phasefac, randrotfac, randphasefac;
        /* physical properties */
        float mass, size, randsize, reactshape;
        /* global physical properties */
        float acc[3], dragfac, brownfac, dampfac;
        /* length */
-       float length, abslength, randlength;
+       float randlength;
        /* children */
        int child_nbr, ren_child_nbr;
        float parents, childsize, childrandsize;
-       float childrad, childflat, childspread;
+       float childrad, childflat;
        /* clumping */
        float clumpfac, clumppow;
        /* kink */
-       float kink_amp, kink_freq, kink_shape;
+       float kink_amp, kink_freq, kink_shape, kink_flat;
+       float kink_amp_clump;
        /* rough */
        float rough1, rough1_size;
        float rough2, rough2_size, rough2_thres;
        float rough_end, rough_end_shape;
+       /* length */
+       float clength, clength_thres;
+       /* parting */
+       float parting_fac;
+       float parting_min, parting_max;
        /* branching */
        float branch_thres;
        /* drawing stuff */
        float draw_line[2];
        float path_start, path_end;
        int trail_count;
-
-       /* boids */
-       float max_vel, max_lat_acc, max_tan_acc;
-       float average_vel, banking, max_bank, groundz;
-       float boidfac[8];
-       char boidrule[8];
+       /* keyed particles */
+       int keyed_loops;
 
        struct Group *dup_group;
-       struct Group *eff_group;
+       struct ListBase dupliweights;
+       struct Group *eff_group;                // deprecated
        struct Object *dup_ob;
        struct Object *bb_ob;
        struct Ipo *ipo;                                // xxx depreceated... old animation system
@@ -185,52 +226,59 @@ typedef struct ParticleSystem{                            /* note, make sure all (runtime) are NULL's in
        ParticleData *particles;                                /* (parent) particles */
        ChildParticle *child;                                   /* child particles */
 
-       struct ParticleEdit *edit;                                              /* particle editmode (runtime) */
-       void (*free_edit)(struct ParticleSystem *sys);  /* free callback */
+       struct PTCacheEdit *edit;                                               /* particle editmode (runtime) */
+       void (*free_edit)(struct PTCacheEdit *edit);    /* free callback */
 
        struct ParticleCacheKey **pathcache;    /* path cache (runtime) */
        struct ParticleCacheKey **childcache;   /* child cache (runtime) */
        ListBase pathcachebufs, childcachebufs; /* buffers for the above */
 
-       struct SoftBody *soft;                                  /* hair softbody */
+       struct ClothModifierData *clmd;                                 /* cloth simulation for hair */
+       struct DerivedMesh *hair_in_dm, *hair_out_dm;   /* input/output for cloth simulation */
 
        struct Object *target_ob;
-       struct Object *keyed_ob;
        struct Object *lattice;
        struct Object *parent;                                  /* particles from global space -> parent space */
 
-       struct ListBase effectors, reactevents; /* runtime */
+       struct ListBase targets;                                /* used for keyed and boid physics */
+
+       char name[32];                                                  /* particle system name */
        
        float imat[4][4];       /* used for duplicators */
-       float cfra;
-       int seed;
-       int flag, totpart, totchild, totcached, totchildcache, rt;
-       short recalc, target_psys, keyed_psys, totkeyed, softflag, bakespace;
+       float cfra, tree_frame;
+       int seed, child_seed;
+       int flag, totpart, totchild, totcached, totchildcache;
+       short recalc, target_psys, totkeyed, bakespace;
 
        char bb_uvname[3][32];                                  /* billboard uv name */
 
        /* if you change these remember to update array lengths to PSYS_TOT_VG! */
-       short vgroup[12], vg_neg, rt3;                  /* vertex groups */
+       short vgroup[12], vg_neg, rt3;                  /* vertex groups, 0==disable, 1==starting index */
 
        /* temporary storage during render */
        void *renderdata;
 
        /* point cache */
        struct PointCache *pointcache;
-}ParticleSystem;
+       struct ListBase ptcaches;
+
+       struct ListBase *effectors;
 
-/* general particle maximums */
-/* no special why's, just seem reasonable */
-/* changing these (atleast upwards) should not cause any major problems */
-#define MAX_PARTS                      100000  /* real particles/system */
-#define MAX_PART_CHILDREN      10000   /* child particles/real particles */
-#define MAX_BOIDNEIGHBOURS     10              /* neigbours considered/boid */
+       ParticleSpring *fluid_springs;
+       int tot_fluidsprings, alloc_fluidsprings;
+
+       struct KDTree *tree;                                    /* used for interactions with self and other systems */
+
+       struct ParticleDrawData *pdd;
+
+       float *frand;                                                   /* array of 1024 random floats for fast lookups */
+}ParticleSystem;
 
 /* part->type */
 /* hair is allways baked static in object/geometry space */
 /* other types (normal particles) are in global space and not static baked */
 #define PART_EMITTER           0
-#define PART_REACTOR           1
+//#define PART_REACTOR         1
 #define PART_HAIR                      2
 #define PART_FLUID                     3
 
@@ -238,10 +286,11 @@ typedef struct ParticleSystem{                            /* note, make sure all (runtime) are NULL's in
 #define PART_REACT_STA_END     1
 #define PART_REACT_MULTIPLE    2
 
-#define PART_LOOP                      4
-//#define PART_LOOP_INSTANT    8
+//#define PART_LOOP                    4       /* not used anymore */
+               /* for dopesheet */
+#define PART_DS_EXPAND         8
 
-#define PART_HAIR_GEOMETRY     16
+#define PART_HAIR_REGROW       16      /* regrow hair for each frame */
 
 #define PART_UNBORN                    32      /*show unborn particles*/
 #define PART_DIED                      64      /*show died particles*/
@@ -249,31 +298,31 @@ typedef struct ParticleSystem{                            /* note, make sure all (runtime) are NULL's in
 #define PART_TRAND                     128     
 #define PART_EDISTR                    256     /* particle/face from face areas */
 
-#define PART_STICKY                    512     /*collided particles can stick to collider*/
+//#define PART_STICKY                  512     /*collided particles can stick to collider*/
 #define PART_DIE_ON_COL                (1<<12)
 #define PART_SIZE_DEFL         (1<<13) /* swept sphere deflections */
 #define PART_ROT_DYN           (1<<14) /* dynamic rotation */
 #define PART_SIZEMASS          (1<<16)
 
-#define PART_ABS_LENGTH                (1<<15)
+//#define PART_HAIR_GRAVITY    (1<<15)
 
-#define PART_ABS_TIME          (1<<17)
-#define PART_GLOB_TIME         (1<<18)
+//#define PART_ABS_TIME                (1<<17)
+//#define PART_GLOB_TIME               (1<<18)
 
 #define PART_BOIDS_2D          (1<<19)
 
-#define PART_BRANCHING         (1<<20)
-#define PART_ANIM_BRANCHING    (1<<21)
-#define PART_SYMM_BRANCHING    (1<<24)
+//#define PART_BRANCHING               (1<<20)
+//#define PART_ANIM_BRANCHING  (1<<21)
+//#define PART_SYMM_BRANCHING  (1<<24)
 
 #define PART_HAIR_BSPLINE      1024
 
 #define PART_GRID_INVERT       (1<<26)
 
-#define PART_CHILD_EFFECT      (1<<27)
-#define PART_CHILD_SEAMS       (1<<28)
-#define PART_CHILD_RENDER      (1<<29)
-#define PART_CHILD_GUIDE       (1<<30)
+#define PART_CHILD_EFFECT              (1<<27)
+#define PART_CHILD_LONG_HAIR   (1<<28)
+/* #define PART_CHILD_RENDER           (1<<29) */ /*UNUSED*/
+#define PART_CHILD_GUIDE               (1<<30)
 
 #define PART_SELF_EFFECT       (1<<22)
 
@@ -299,6 +348,7 @@ typedef struct ParticleSystem{                              /* note, make sure all (runtime) are NULL's in
 #define PART_PHYS_NEWTON       1
 #define PART_PHYS_KEYED                2
 #define PART_PHYS_BOIDS                3
+#define PART_PHYS_FLUID                4
 
 /* part->kink */
 #define PART_KINK_NO           0
@@ -309,12 +359,12 @@ typedef struct ParticleSystem{                            /* note, make sure all (runtime) are NULL's in
 
 /* part->draw */
 #define PART_DRAW_VEL          1
-//#define PART_DRAW_PATH_LEN   2
+#define PART_DRAW_GLOBAL_OB    2
 #define PART_DRAW_SIZE         4
 #define PART_DRAW_EMITTER      8       /* render emitter also */
-//#define PART_DRAW_HEALTH     16
+#define PART_DRAW_HEALTH       16
 #define PART_ABS_PATH_TIME  32
-//#define PART_DRAW_TRAIL              64
+#define PART_DRAW_COUNT_GR     64
 #define PART_DRAW_BB_LOCK      128
 #define PART_DRAW_PARENT       256
 #define PART_DRAW_NUM          512
@@ -367,6 +417,7 @@ typedef struct ParticleSystem{                              /* note, make sure all (runtime) are NULL's in
 #define PART_INT_EULER         0
 #define PART_INT_MIDPOINT      1
 #define PART_INT_RK4           2
+#define PART_INT_VERLET                3
 
 /* part->rotmode */
 #define PART_ROT_NOR           1
@@ -392,44 +443,46 @@ typedef struct ParticleSystem{                            /* note, make sure all (runtime) are NULL's in
 #define PART_CHILD_FACES               2
 
 /* psys->recalc */
-#define PSYS_RECALC_REDO       1       /* only do pathcache etc */
-#define PSYS_RECALC_RESET      2       /* reset everything including pointcache */
-#define PSYS_RECALC_TYPE       4       /* handle system type change */
-#define PSYS_RECALC_CHILD      16      /* only child settings changed */
+/* starts from 8 so that the first bits can be ob->recalc */
+#define PSYS_RECALC_REDO       8       /* only do pathcache etc */
+#define PSYS_RECALC_RESET      16      /* reset everything including pointcache */
+#define PSYS_RECALC_TYPE       32      /* handle system type change */
+#define PSYS_RECALC_CHILD      64      /* only child settings changed */
+#define PSYS_RECALC_PHYS       128     /* physics type changed */
+#define PSYS_RECALC                    248
 
 /* psys->flag */
 #define PSYS_CURRENT           1
-//#define PSYS_BAKING                  2
-//#define PSYS_BAKE_UI         4
-#define        PSYS_KEYED_TIME         8
+#define PSYS_GLOBAL_HAIR       2
+#define PSYS_HAIR_DYNAMICS     4
+#define        PSYS_KEYED_TIMING       8
 #define PSYS_ENABLED           16      /* deprecated */
-#define PSYS_FIRST_KEYED       32
+#define PSYS_HAIR_UPDATED      32  /* signal for updating hair particle mode */
 #define PSYS_DRAWING           64
 //#define PSYS_SOFT_BAKE               128
 #define PSYS_DELETE                    256     /* remove particlesystem as soon as possible */
 #define PSYS_HAIR_DONE         512
 #define PSYS_KEYED                     1024
 #define PSYS_EDITED                    2048
-//#define PSYS_PROTECT_CACHE   4096
+//#define PSYS_PROTECT_CACHE   4096 /* deprecated */
 #define PSYS_DISABLED          8192
 
 /* pars->flag */
 #define PARS_UNEXIST           1
 #define PARS_NO_DISP           2
-#define PARS_STICKY                    4
-#define PARS_TRANSFORM         8
-#define PARS_HIDE                      16
-#define PARS_TAG                       32
-#define PARS_REKEY                     64
-#define PARS_EDIT_RECALC       128
+//#define PARS_STICKY                  4 /* deprecated */
+#define PARS_REKEY                     8
 
 /* pars->alive */
-#define PARS_KILLED                    0
+//#define PARS_KILLED                  0 /* deprecated */
 #define PARS_DEAD                      1
 #define PARS_UNBORN                    2
 #define PARS_ALIVE                     3
 #define PARS_DYING                     4
 
+/* ParticleDupliWeight->flag */
+#define PART_DUPLIW_CURRENT    1
+
 /* psys->vg */
 #define PSYS_TOT_VG                    12
 
@@ -446,22 +499,13 @@ typedef struct ParticleSystem{                            /* note, make sure all (runtime) are NULL's in
 #define PSYS_VG_ROT                    10
 #define PSYS_VG_EFFECTOR       11
 
-/* part->boidrules */
-#define BOID_TOT_RULES         8
-
-#define BOID_COLLIDE           0
-#define BOID_AVOID                     1
-#define BOID_CROWD                     2
-#define BOID_CENTER                    3
-#define BOID_AV_VEL                    4
-#define BOID_VEL_MATCH         5
-#define BOID_GOAL                      6
-#define BOID_LEVEL                     7
-
+/* ParticleTarget->flag */
+#define PTARGET_CURRENT                1
+#define PTARGET_VALID          2
 
-//#define PSYS_INTER_CUBIC     0
-//#define PSYS_INTER_LINEAR    1
-//#define PSYS_INTER_CARDINAL  2
-//#define PSYS_INTER_BSPLINE   3
+/* ParticleTarget->mode */
+#define PTARGET_MODE_NEUTRAL   0
+#define PTARGET_MODE_FRIEND            1
+#define PTARGET_MODE_ENEMY             2
 
 #endif