Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2007-11-27 01:09:57 +0300
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2007-11-27 01:09:57 +0300
commit7da56f4a9ba0bdd0cdcd40b8ca6e69d776d26abe (patch)
tree663c13aae5606937571ac1e7a4c77ca2866e75dd /source/blender/makesdna/DNA_particle_types.h
parent121dab1bcd9467bd8e11d0a82e83a1621758fd8e (diff)
parent770291b9ea1ec03d98b6bae4fd2a2d3f0091be41 (diff)
Particles
========= Merge of the famous particle patch by Janne Karhu, a full rewrite of the Blender particle system. This includes: - Emitter, Hair and Reactor particle types. - Newtonian, Keyed and Boids physics. - Various particle visualisation and rendering types. - Vertex group and texture control for various properties. - Interpolated child particles from parents. - Hair editing with combing, growing, cutting, .. . - Explode modifier. - Harmonic, Magnetic fields, and multiple falloff types. .. and lots of other things, some more info is here: http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite http://wiki.blender.org/index.php/BlenderDev/Particles_Rewrite_Doc The new particle system cannot be backwards compatible. Old particle systems are being converted to the new system, but will require tweaking to get them looking the same as before. Point Cache =========== The new system to replace manual baking, based on automatic caching on disk. This is currently used by softbodies and the particle system. See the Cache API section on: http://wiki.blender.org/index.php/BlenderDev/PhysicsSprint Documentation ============= These new features still need good docs for the release logs, help for this is appreciated.
Diffstat (limited to 'source/blender/makesdna/DNA_particle_types.h')
-rw-r--r--source/blender/makesdna/DNA_particle_types.h432
1 files changed, 432 insertions, 0 deletions
diff --git a/source/blender/makesdna/DNA_particle_types.h b/source/blender/makesdna/DNA_particle_types.h
new file mode 100644
index 00000000000..f41a0d63142
--- /dev/null
+++ b/source/blender/makesdna/DNA_particle_types.h
@@ -0,0 +1,432 @@
+/* DNA_particle_types.h
+ *
+ *
+ * $Id: DNA_particle_types.h $
+ *
+ * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version. The Blender
+ * Foundation also sells licenses for use in proprietary software under
+ * the Blender License. See http://www.blender.org/BL/ for information
+ * about this.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * 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.
+ *
+ * The Original Code is Copyright (C) 2007 by Janne Karhu.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ */
+
+#ifndef DNA_PARTICLE_TYPES_H
+#define DNA_PARTICLE_TYPES_H
+
+#include "DNA_ID.h"
+
+typedef struct HairKey {
+ float co[3]; /* location of hair vertex */
+ float time; /* time along hair, default 0-100 */
+ float weight; /* softbody weight */
+ short editflag; /* saved particled edit mode flags */
+ short pad;
+} HairKey;
+
+typedef struct ParticleKey { /* when changed update size of struct to copy_particleKey()!! */
+ float co[3]; /* location */
+ float vel[3]; /* velocity */
+ float rot[4]; /* rotation quaternion */
+ float ave[3]; /* angular velocity */
+ float time; /* when this key happens */
+} ParticleKey;
+
+/* 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];
+} ChildParticle;
+
+/* Everything that's non dynamic for a particle: */
+typedef struct ParticleData {
+ struct Object *stick_ob;/* object that particle sticks to when dead */
+
+ ParticleKey state; /* normally current global coordinates or */
+ /* in sticky object space if dead & sticky */
+
+ HairKey *hair; /* hair vertices */
+
+ ParticleKey *keys; /* keyed states */
+
+ 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];
+
+ float fuv[4], foffset; /* coordinates on face/edge number "num" and depth along*/
+ /* face normal for volume emission */
+
+ 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 */
+
+ short flag;
+ short alive; /* the life state of a particle */
+ short loop; /* how many times particle life has looped */
+ short rt2;
+} ParticleData;
+
+typedef struct ParticleSettings {
+ ID id;
+
+ int flag;
+ short type, from, distr;
+ /* physics modes */
+ short phystype, rotmode, avemode, reactevent;
+ short draw, draw_as, draw_size, childtype;
+ /* number of path segments, power of 2 except */
+ short draw_step, ren_step;
+ short hair_step, keys_step;
+
+ /* adaptive path rendering */
+ short adapt_angle, adapt_pix;
+
+ short disp, omat, interpolation, rotfrom, integrator;
+ short kink, kink_axis, nbetween, boidneighbours;
+
+ /* billboards */
+ short bb_align, bb_uv_split, bb_anim, bb_split_offset;
+ float bb_tilt, bb_rand_tilt, bb_offset[2];
+
+ /* general values */
+ float sta, end, lifetime, randlife;
+ float timetweak, jitfac, keyed_time;
+ int totpart, userjit, grid_res;
+
+ /* initial velocity factors */
+ float normfac, obfac, randfac, partfac, tanfac, tanphase, reactfac;
+ float rotfac, avefac, phasefac;
+ /* physical properties */
+ float mass, size, randsize, reactshape;
+ /* global physical properties */
+ float acc[3], dragfac, brownfac, dampfac;
+ /* length */
+ float length, abslength, randlength;
+ /* children */
+ int child_nbr;
+ float parents, childsize, childrandsize;
+ float childrad, childflat, childspread;
+ /* clumping */
+ float clumpfac, clumppow;
+ /* kink */
+ float kink_amp, kink_freq, kink_shape;
+ /* rough */
+ float rough1, rough1_size;
+ float rough2, rough2_size, rough2_thres;
+ float rough_end, rough_end_shape;
+ /* branching */
+ float branch_thres;
+ /* drawing stuff */
+ float draw_line[2];
+
+ /* boids */
+ float max_vel, max_lat_acc, max_tan_acc;
+ float average_vel, banking, max_bank, groundz;
+ float boidfac[8];
+ char boidrule[8];
+
+ struct Group *dup_group;
+ struct Group *eff_group;
+ struct Object *dup_ob;
+ struct Object *bb_ob;
+ struct Ipo *ipo;
+ struct PartDeflect *pd;
+} ParticleSettings;
+
+typedef struct ParticleSystem{
+ struct ParticleSystem *next, *prev;
+
+ ParticleSettings *part;
+
+ ParticleData *particles;
+
+ ChildParticle *child;
+
+ struct ParticleEdit *edit;
+
+ struct ParticleCacheKey **pathcache;
+ struct ParticleCacheKey **childcache;
+
+ struct SoftBody *soft;
+
+ struct Object *target_ob;
+ struct Object *keyed_ob;
+ struct Object *lattice;
+
+ struct ListBase effectors, reactevents;
+
+ 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;
+
+ char bb_uvname[3][32];
+
+ /* if you change these remember to update array lengths to PSYS_TOT_VG! */
+ short vgroup[11], vg_neg, rt3[2];
+}ParticleSystem;
+
+/* 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 1000 /* child particles/real particles */
+#define MAX_BOIDNEIGHBOURS 10 /* neigbours considered/boid */
+
+/* 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_HAIR 2
+
+/* part->flag */
+#define PART_REACT_STA_END 1
+#define PART_REACT_MULTIPLE 2
+
+#define PART_LOOP 4
+#define PART_LOOP_INSTANT 8
+
+#define PART_HAIR_GEOMETRY 16
+
+#define PART_UNBORN 32 /*show unborn particles*/
+#define PART_DIED 64 /*show died particles*/
+
+#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_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_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_HAIR_BSPLINE 1024
+
+#define PART_GRID_INVERT (1<<26)
+
+#define PART_CHILD_SEAMS (1<<28)
+#define PART_CHILD_RENDER (1<<29)
+#define PART_CHILD_GUIDE (1<<30)
+
+/* part->rotfrom */
+#define PART_ROT_KEYS 0 /* interpolate directly from keys */
+#define PART_ROT_ZINCR 1 /* same as zdir but done incrementally from previous position */
+#define PART_ROT_IINCR 2 /* same as idir but done incrementally from previous position */
+
+/* part->from */
+#define PART_FROM_VERT 0
+#define PART_FROM_FACE 1
+#define PART_FROM_VOLUME 2
+#define PART_FROM_PARTICLE 3
+#define PART_FROM_CHILD 4
+
+/* part->distr */
+#define PART_DISTR_JIT 0
+#define PART_DISTR_RAND 1
+#define PART_DISTR_GRID 2
+
+/* part->phystype */
+#define PART_PHYS_NO 0
+#define PART_PHYS_NEWTON 1
+#define PART_PHYS_KEYED 2
+#define PART_PHYS_BOIDS 3
+
+/* part->kink */
+#define PART_KINK_NO 0
+#define PART_KINK_CURL 1
+#define PART_KINK_RADIAL 2
+#define PART_KINK_WAVE 3
+#define PART_KINK_BRAID 4
+#define PART_KINK_ROT 5
+#define PART_KINK_ROLL 6
+
+/* part->draw */
+#define PART_DRAW_VEL 1
+#define PART_DRAW_ANG 2
+#define PART_DRAW_SIZE 4
+#define PART_DRAW_EMITTER 8 /* render emitter also */
+#define PART_DRAW_KEYS 16
+#define PART_DRAW_ADAPT 32
+#define PART_DRAW_COS 64
+#define PART_DRAW_BB_LOCK 128
+#define PART_DRAW_PARENT 256
+#define PART_DRAW_NUM 512
+#define PART_DRAW_RAND_GR 1024
+#define PART_DRAW_REN_ADAPT 2048
+#define PART_DRAW_VEL_LENGTH (1<<12)
+#define PART_DRAW_MAT_COL (1<<13)
+#define PART_DRAW_WHOLE_GR (1<<14)
+
+/* part->bb_align */
+#define PART_BB_X 0
+#define PART_BB_Y 1
+#define PART_BB_Z 2
+#define PART_BB_VIEW 3
+#define PART_BB_VEL 4
+
+/* part->bb_anim */
+#define PART_BB_ANIM_NONE 0
+#define PART_BB_ANIM_TIME 1
+#define PART_BB_ANIM_ANGLE 2
+#define PART_BB_ANIM_OFF_TIME 3
+#define PART_BB_ANIM_OFF_ANGLE 4
+
+/* part->bb_split_offset */
+#define PART_BB_OFF_NONE 0
+#define PART_BB_OFF_LINEAR 1
+#define PART_BB_OFF_RANDOM 2
+
+/* part->draw as */
+#define PART_DRAW_NOT 0
+#define PART_DRAW_DOT 1
+#define PART_DRAW_CIRC 2
+#define PART_DRAW_CROSS 3
+#define PART_DRAW_AXIS 4
+#define PART_DRAW_LINE 5
+#define PART_DRAW_PATH 6
+#define PART_DRAW_OB 7
+#define PART_DRAW_GR 8
+#define PART_DRAW_BB 9
+
+/* part->integrator */
+#define PART_INT_EULER 0
+#define PART_INT_MIDPOINT 1
+#define PART_INT_RK4 2
+
+/* part->rotmode */
+#define PART_ROT_NOR 1
+#define PART_ROT_VEL 2
+#define PART_ROT_RAND 3
+
+/* part->avemode */
+#define PART_AVE_SPIN 1
+#define PART_AVE_RAND 2
+#define PART_AVE_VEL 3
+
+/* part->reactevent */
+#define PART_EVENT_DEATH 0
+#define PART_EVENT_COLLIDE 1
+#define PART_EVENT_NEAR 2
+
+/* part->childtype */
+#define PART_CHILD_PARTICLES 1
+#define PART_CHILD_FACES 2
+
+/* psys->recalc */
+#define PSYS_INIT 1
+#define PSYS_DISTR 2
+#define PSYS_ALLOC 4
+#define PSYS_TYPE 8
+#define PSYS_RECALC_HAIR 16
+
+/* psys->flag */
+#define PSYS_CURRENT 1
+//#define PSYS_BAKING 2
+//#define PSYS_BAKE_UI 4
+#define PSYS_KEYED_TIME 8
+#define PSYS_ENABLED 16
+#define PSYS_FIRST_KEYED 32
+#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
+
+/* 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
+
+/* pars->alive */
+#define PARS_KILLED 0
+#define PARS_DEAD 1
+#define PARS_UNBORN 2
+#define PARS_ALIVE 3
+
+/* psys->vg */
+#define PSYS_TOT_VG 11
+
+#define PSYS_VG_DENSITY 0
+#define PSYS_VG_VEL 1
+#define PSYS_VG_LENGTH 2
+#define PSYS_VG_CLUMP 3
+#define PSYS_VG_KINK 4
+#define PSYS_VG_ROUGH1 5
+#define PSYS_VG_ROUGH2 6
+#define PSYS_VG_ROUGHE 7
+#define PSYS_VG_SIZE 8
+#define PSYS_VG_TAN 9
+#define PSYS_VG_ROT 10
+
+/* 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
+
+
+//#define PSYS_INTER_CUBIC 0
+//#define PSYS_INTER_LINEAR 1
+//#define PSYS_INTER_CARDINAL 2
+//#define PSYS_INTER_BSPLINE 3
+
+#endif