tornavis/source/blender/makesdna/DNA_particle_types.h

640 lines
18 KiB
C

/*
* ***** BEGIN GPL 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.
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 LICENSE BLOCK *****
*/
/** \file DNA_particle_types.h
* \ingroup DNA
*/
#ifndef __DNA_PARTICLE_TYPES_H__
#define __DNA_PARTICLE_TYPES_H__
#include "DNA_defs.h"
#include "DNA_ID.h"
#include "DNA_boid_types.h"
struct AnimData;
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;
float world_co[3];
} 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;
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 rt;
} ChildParticle;
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;
short index, rt; /* only updated on file save and used on file load */
} ParticleDupliWeight;
typedef struct ParticleData {
ParticleKey state; /* current global coordinates */
ParticleKey prev_state; /* previous state */
HairKey *hair; /* hair vertices */
ParticleKey *keys; /* keyed keys */
BoidParticle *boid; /* boids data */
int totkey; /* amount of hair or keyed keys*/
float time, lifetime; /* dietime is not necessarily time+lifetime as */
float dietime; /* particles can die unnaturally (collision). */
/* WARNING! Those two indices, when not affected to vertices, are for !!! TESSELLATED FACES !!!, not POLYGONS! */
int num; /* index to vert/edge/face */
int num_dmcache; /* index to derived mesh data (face) to avoid slow lookups */
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 */
float sphdensity; /* density of sph particle */
int pad;
int hair_index;
short flag;
short alive; /* the life state of a particle */
} ParticleData;
typedef struct SPHFluidSettings {
/*Particle Fluid*/
float radius, spring_k, rest_length;
float plasticity_constant, yield_ratio;
float plasticity_balance, yield_balance;
float viscosity_omega, viscosity_beta;
float stiffness_k, stiffness_knear, rest_density;
float buoyancy;
int flag, spring_frames;
short solver;
short pad[3];
} SPHFluidSettings;
/* fluid->flag */
#define SPH_VISCOELASTIC_SPRINGS 1
#define SPH_CURRENT_REST_LENGTH 2
#define SPH_FAC_REPULSION 4
#define SPH_FAC_DENSITY 8
#define SPH_FAC_RADIUS 16
#define SPH_FAC_VISCOSITY 32
#define SPH_FAC_REST_LENGTH 64
/* fluid->solver (numerical ID field, not bitfield) */
#define SPH_SOLVER_DDR 0
#define SPH_SOLVER_CLASSICAL 1
typedef struct ParticleSettings {
ID id;
struct AnimData *adt;
struct BoidSettings *boids;
struct SPHFluidSettings *fluid;
struct EffectorWeights *effector_weights;
struct Collection *collision_group;
int flag, rt;
short type, from, distr, texact;
/* physics modes */
short phystype, rotmode, avemode, reactevent;
int draw;
float draw_size;
short draw_as, pad1, childtype, pad2;
short ren_as, subframes, draw_col;
/* 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, integrator;
short rotfrom DNA_DEPRECATED;
short kink, kink_axis;
/* billboards */
short bb_align, bb_uv_split, bb_anim, bb_split_offset;
float bb_tilt, bb_rand_tilt, bb_offset[2], bb_size[2], bb_vel_head, bb_vel_tail;
/* draw color */
float color_vec_max;
/* time and emission */
float sta, end, lifetime, randlife;
float timetweak, courant_target;
float jitfac, eff_hair, grid_rand, ps_offset[1];
int totpart, userjit, grid_res, effector_amount;
short time_flag, time_pad[3];
/* 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;
/* global physical properties */
float acc[3], dragfac, brownfac, dampfac;
/* length */
float randlength;
/* children */
int child_flag;
int pad3;
int child_nbr, ren_child_nbr;
float parents, childsize, childrandsize;
float childrad, childflat;
/* clumping */
float clumpfac, clumppow;
/* kink */
float kink_amp, kink_freq, kink_shape, kink_flat;
float kink_amp_clump;
int kink_extra_steps, pad4;
float kink_axis_random, kink_amp_random;
/* 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;
/* keyed particles */
int keyed_loops;
struct CurveMapping *clumpcurve;
struct CurveMapping *roughcurve;
float clump_noise_size;
/* hair dynamics */
float bending_random;
struct MTex *mtex[18]; /* MAX_MTEX */
struct Collection *dup_group;
struct ListBase dupliweights;
struct Collection *eff_group DNA_DEPRECATED; // deprecated
struct Object *dup_ob;
struct Object *bb_ob;
struct Ipo *ipo DNA_DEPRECATED; /* old animation system, deprecated for 2.5 */
struct PartDeflect *pd;
struct PartDeflect *pd2;
/* modified dm support */
short use_modifier_stack;
short pad5;
/* hair shape */
short shape_flag;
short pad6;
float twist, pad8;
/* hair thickness shape */
float shape;
float rad_root, rad_tip, rad_scale;
struct CurveMapping *twistcurve;
void *pad7;
} ParticleSettings;
typedef struct ParticleSystem {
/* note1: make sure all (runtime) are NULL's in 'copy_particlesystem' XXX, this function is no more! - need to invstigate */
/* note2: make sure any uses of this struct in DNA are accounted for in 'BKE_object_copy_particlesystems' */
struct ParticleSystem *next, *prev;
ParticleSettings *part; /* particle settings */
ParticleData *particles; /* (parent) particles */
ChildParticle *child; /* child particles */
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 ClothModifierData *clmd; /* cloth simulation for hair */
struct Mesh *hair_in_mesh, *hair_out_mesh; /* input/output for cloth simulation */
struct Object *target_ob;
struct LatticeDeformData *lattice_deform_data; /* run-time only lattice deformation data */
struct Object *parent; /* particles from global space -> parent space */
struct ListBase targets; /* used for keyed and boid physics */
char name[64]; /* particle system name, MAX_NAME */
float imat[4][4]; /* used for duplicators */
float cfra, tree_frame, bvhtree_frame;
int seed, child_seed;
int flag, totpart, totunexist, totchild, totcached, totchildcache;
/* NOTE: Recalc is one of ID_RECALC_PSYS_ALL flags.
*
* TODO(sergey): Use part->id.recalc instead of this duplicated flag
* somehow. */
int recalc;
int pad1;
short target_psys, totkeyed, bakespace;
short pad2;
char bb_uvname[3][64]; /* billboard uv name, MAX_CUSTOMDATA_LAYER_NAME */
/* if you change these remember to update array lengths to PSYS_TOT_VG! */
short vgroup[13], vg_neg, rt3; /* vertex groups, 0==disable, 1==starting index */
char pad[6];
/* point cache */
struct PointCache *pointcache;
struct ListBase ptcaches;
struct ListBase *effectors;
ParticleSpring *fluid_springs;
int tot_fluidsprings, alloc_fluidsprings;
struct KDTree *tree; /* used for interactions with self and other systems */
struct BVHTree *bvhtree; /* used for interactions with self and other systems */
struct ParticleDrawData *pdd;
float dt_frac; /* current time step, as a fraction of a frame */
float lattice_strength; /* influence of the lattice modifier */
void *batch_cache;
/* Set by dependency graph's copy-on-write, allows to quickly go
* from evaluated particle system to original one.
*
* Original system will have this set to NULL.
*
* Use psys_orig_get() function to access,
*/
struct ParticleSystem *orig_psys;
} ParticleSystem;
typedef enum eParticleDrawFlag {
PART_DRAW_VEL = (1 << 0),
PART_DRAW_GLOBAL_OB = (1 << 1),
PART_DRAW_SIZE = (1 << 2),
#ifdef DNA_DEPRECATED
PART_DRAW_EMITTER = (1 << 3), /* render emitter also */ /* DEPRECATED */
#endif
PART_DRAW_HEALTH = (1 << 4),
PART_ABS_PATH_TIME = (1 << 5),
PART_DRAW_COUNT_GR = (1 << 6),
PART_DRAW_BB_LOCK = (1 << 7), /* used with billboards */
PART_DRAW_ROTATE_OB = (1 << 7), /* used with dupliobjects/groups */
PART_DRAW_PARENT = (1 << 8),
PART_DRAW_NUM = (1 << 9),
PART_DRAW_RAND_GR = (1 << 10),
PART_DRAW_REN_ADAPT = (1 << 11),
PART_DRAW_VEL_LENGTH = (1 << 12),
PART_DRAW_MAT_COL = (1 << 13), /* deprecated, but used in do_versions */
PART_DRAW_WHOLE_GR = (1 << 14),
PART_DRAW_REN_STRAND = (1 << 15),
PART_DRAW_NO_SCALE_OB = (1 << 16), /* used with dupliobjects/groups */
PART_DRAW_GUIDE_HAIRS = (1 << 17),
PART_DRAW_HAIR_GRID = (1 << 18),
} eParticleDrawFlag;
/* part->type */
/* hair is always 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
#define PART_FLUID 3
/* part->flag */
#define PART_REACT_STA_END 1
#define PART_REACT_MULTIPLE 2
//#define PART_LOOP 4 /* not used anymore */
/* for dopesheet */
#define PART_DS_EXPAND 8
#define PART_HAIR_REGROW 16 /* regrow hair for each frame */
#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_ROTATIONS 512 /* calculate particle rotations (and store them in pointcache) */
#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_HIDE_ADVANCED_HAIR (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_HAIR_BSPLINE 1024
#define PART_GRID_HEXAGONAL (1<<24)
#define PART_GRID_INVERT (1<<26)
#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)
/* part->from */
#define PART_FROM_VERT 0
#define PART_FROM_FACE 1
#define PART_FROM_VOLUME 2
/* #define PART_FROM_PARTICLE 3 deprecated! */
#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
#define PART_PHYS_FLUID 4
/* part->kink */
typedef enum eParticleKink {
PART_KINK_NO = 0,
PART_KINK_CURL = 1,
PART_KINK_RADIAL = 2,
PART_KINK_WAVE = 3,
PART_KINK_BRAID = 4,
PART_KINK_SPIRAL = 5,
} eParticleKink;
/* part->child_flag */
typedef enum eParticleChildFlag {
PART_CHILD_USE_CLUMP_NOISE = (1<<0),
PART_CHILD_USE_CLUMP_CURVE = (1<<1),
PART_CHILD_USE_ROUGH_CURVE = (1<<2),
PART_CHILD_USE_TWIST_CURVE = (1<<3),
} eParticleChildFlag;
/* part->shape_flag */
typedef enum eParticleShapeFlag {
PART_SHAPE_CLOSE_TIP = (1<<0),
} eParticleShapeFlag;
/* part->draw_col */
#define PART_DRAW_COL_NONE 0
#define PART_DRAW_COL_MAT 1
#define PART_DRAW_COL_VEL 2
#define PART_DRAW_COL_ACC 3
/* part->simplify_flag */
#define PART_SIMPLIFY_ENABLE 1
#define PART_SIMPLIFY_VIEWPORT 2
/* part->time_flag */
#define PART_TIME_AUTOSF 1 /* Automatic subframes */
/* 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_AGE 1
#define PART_BB_ANIM_ANGLE 2
#define PART_BB_ANIM_FRAME 3
/* 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 */
/* part->ren_as*/
#define PART_DRAW_NOT 0
#define PART_DRAW_DOT 1
#define PART_DRAW_HALO 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
#define PART_DRAW_REND 10
/* part->integrator */
#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
#define PART_ROT_VEL 2
#define PART_ROT_GLOB_X 3
#define PART_ROT_GLOB_Y 4
#define PART_ROT_GLOB_Z 5
#define PART_ROT_OB_X 6
#define PART_ROT_OB_Y 7
#define PART_ROT_OB_Z 8
#define PART_ROT_NOR_TAN 9
/* part->avemode */
#define PART_AVE_VELOCITY 1
#define PART_AVE_RAND 2
#define PART_AVE_HORIZONTAL 3
#define PART_AVE_VERTICAL 4
#define PART_AVE_GLOBAL_X 5
#define PART_AVE_GLOBAL_Y 6
#define PART_AVE_GLOBAL_Z 7
/* 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->flag */
#define PSYS_CURRENT 1
#define PSYS_GLOBAL_HAIR 2
#define PSYS_HAIR_DYNAMICS 4
#define PSYS_KEYED_TIMING 8
//#define PSYS_ENABLED 16 /* deprecated */
#define PSYS_HAIR_UPDATED 32 /* signal for updating hair particle mode */
#define PSYS_DRAWING 64
#define PSYS_USE_IMAT 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 /* deprecated */
#define PSYS_DISABLED 8192
#define PSYS_OB_ANIM_RESTORE 16384 /* runtime flag */
#define PSYS_SHARED_CACHES 32768
/* pars->flag */
#define PARS_UNEXIST 1
#define PARS_NO_DISP 2
//#define PARS_STICKY 4 /* deprecated */
#define PARS_REKEY 8
/* pars->alive */
//#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 13
#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
#define PSYS_VG_EFFECTOR 11
#define PSYS_VG_TWIST 12
/* ParticleTarget->flag */
#define PTARGET_CURRENT 1
#define PTARGET_VALID 2
/* ParticleTarget->mode */
#define PTARGET_MODE_NEUTRAL 0
#define PTARGET_MODE_FRIEND 1
#define PTARGET_MODE_ENEMY 2
/* mapto */
typedef enum eParticleTextureInfluence {
/* init */
PAMAP_TIME = (1<<0), /* emission time */
PAMAP_LIFE = (1<<1), /* life time */
PAMAP_DENS = (1<<2), /* density */
PAMAP_SIZE = (1<<3), /* physical size */
PAMAP_INIT = (PAMAP_TIME | PAMAP_LIFE | PAMAP_DENS | PAMAP_SIZE),
/* reset */
PAMAP_IVEL = (1<<5), /* initial velocity */
/* physics */
PAMAP_FIELD = (1<<6), /* force fields */
PAMAP_GRAVITY = (1<<10),
PAMAP_DAMP = (1<<11),
PAMAP_PHYSICS = (PAMAP_FIELD | PAMAP_GRAVITY | PAMAP_DAMP),
/* children */
PAMAP_CLUMP = (1<<7),
PAMAP_KINK_FREQ = (1<<8),
PAMAP_KINK_AMP = (1<<12),
PAMAP_ROUGH = (1<<9),
PAMAP_LENGTH = (1<<4),
PAMAP_TWIST = (1<<13),
PAMAP_CHILD = (PAMAP_CLUMP | PAMAP_KINK_FREQ | PAMAP_KINK_AMP | PAMAP_ROUGH | PAMAP_LENGTH | PAMAP_TWIST),
} eParticleTextureInfluence;
#endif