tornavis/source/blender/makesdna/DNA_particle_types.h

698 lines
18 KiB
C

/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2007 by Janne Karhu. All rights reserved. */
/** \file
* \ingroup DNA
*/
#pragma once
#include "DNA_ID.h"
#include "DNA_boid_types.h"
#include "DNA_defs.h"
#ifdef __cplusplus
extern "C" {
#endif
struct AnimData;
typedef struct HairKey {
/** Location of hair vertex. */
float co[3];
/** Time along hair, default 0-100. */
float time;
/** Softbody weight. */
float weight;
/** Saved particled edit mode flags. */
short editflag;
char _pad[2];
float world_co[3];
} HairKey;
typedef struct ParticleKey { /* when changed update size of struct to copy_particleKey()!! */
/** Location. */
float co[3];
/** Velocity. */
float vel[3];
/** Rotation quaternion. */
float rot[4];
/** Angular velocity. */
float ave[3];
/** When this key happens. */
float time;
} ParticleKey;
typedef struct BoidParticle {
struct Object *ground;
struct BoidData data;
float gravity[3];
float wander[3];
char _pad0[4];
} 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 {
/** Face index on the final derived mesh. */
int num;
int parent;
/** Nearest particles to the child, used for the interpolation. */
int pa[4];
/** Interpolation weights for the above particles. */
float w[4];
/** Face vertex weights and offset. */
float fuv[4], foffset;
char _pad0[4];
} 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;
/** Only updated on file save and used on file load. */
short index;
char _pad0[2];
} ParticleDupliWeight;
typedef struct ParticleData {
/** Current global coordinates. */
ParticleKey state;
/** Previous state. */
ParticleKey prev_state;
/** Hair vertices. */
HairKey *hair;
/** Keyed keys. */
ParticleKey *keys;
/** Boids data. */
BoidParticle *boid;
/** Amount of hair or keyed keys. */
int totkey;
/** Die-time is not necessarily time+lifetime as. */
float time, lifetime;
/**
* Particles can die unnaturally (collision).
*
* \note Particles die on this frame, be sure to add 1 when clamping the lifetime of particles
* to inclusive ranges such as the scenes end frame. See: #68290.
*/
float dietime;
/**
* WARNING! Those two indices,
* when not affected to vertices, are for !!! TESSELLATED FACES !!!, not POLYGONS!
*/
/** Index to vert/edge/face. */
int num;
/**
* Index to derived mesh data (face) to avoid slow lookups. It can also have negative
* values DMCACHE_NOTFOUND and DMCACHE_ISCHILD.
*/
int num_dmcache;
/** Coordinates on face/edge number "num" and depth along. */
float fuv[4], foffset;
/* face normal for volume emission. */
/** Size and multiplier so that we can update size when ever. */
float size;
/** Density of sph particle. */
float sphdensity;
char _pad[4];
int hair_index;
short flag;
/** The life state of a particle. */
short alive;
} 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;
char _pad[6];
} SPHFluidSettings;
/** #SPHFluidSettings.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
/** #SPHFluidSettings.solver (numerical ID field, not bit-field). */
#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;
char _pad1[4];
short type, from, distr, texact;
/* physics modes */
short phystype, rotmode, avemode, reactevent;
int draw;
float draw_size;
short draw_as, childtype;
char _pad2[4];
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 DNA_DEPRECATED;
float bb_tilt, bb_rand_tilt, bb_offset[2], bb_size[2], bb_vel_head, bb_vel_tail DNA_DEPRECATED;
/* 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;
char _pad0[6];
/* 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;
char _pad3[4];
int child_percent, child_render_percent;
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;
char _pad4[4];
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;
/** MAX_MTEX. */
struct MTex *mtex[18];
struct Collection *instance_collection;
struct ListBase instance_weights;
struct Collection *force_group DNA_DEPRECATED; /* deprecated */
struct Object *instance_object;
struct Object *bb_ob;
/** Old animation system, deprecated for 2.5. */
struct Ipo *ipo DNA_DEPRECATED;
struct PartDeflect *pd;
struct PartDeflect *pd2;
/* Evaluated mesh support. */
short use_modifier_stack;
char _pad5[2];
/* hair shape */
short shape_flag;
char _pad6[2];
float twist;
char _pad8[4];
/* 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 (run-time) are NULL's in 'copy_particlesystem' XXX,
* this function is no more! - need to investigate. */
/* note2: make sure any uses of this struct in DNA are
* accounted for in 'BKE_object_copy_particlesystems'. */
struct ParticleSystem *next, *prev;
/** Particle settings. */
ParticleSettings *part;
/** (parent) particles. */
ParticleData *particles;
/** Child particles. */
ChildParticle *child;
/** Particle editmode (runtime). */
struct PTCacheEdit *edit;
/** Free callback. */
void (*free_edit)(struct PTCacheEdit *edit);
/** Path cache (runtime). */
struct ParticleCacheKey **pathcache;
/** Child cache (runtime). */
struct ParticleCacheKey **childcache;
/** Buffers for the above. */
ListBase pathcachebufs, childcachebufs;
/** Cloth simulation for hair. */
struct ClothModifierData *clmd;
/** Input/output for cloth simulation. */
struct Mesh *hair_in_mesh, *hair_out_mesh;
struct Object *target_ob;
/** Run-time only lattice deformation data. */
struct LatticeDeformData *lattice_deform_data;
/** Particles from global space -> parent space. */
struct Object *parent;
/** Used for keyed and boid physics. */
struct ListBase targets;
/** Particle system name, MAX_NAME. */
char name[64];
/** Used for instancing. */
float imat[4][4];
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 #ParticleSettings.id.recalc instead of this duplicated flag somehow. */
int recalc;
short target_psys, totkeyed, bakespace;
char _pad1[6];
/** Billboard uv name, MAX_CUSTOMDATA_LAYER_NAME. */
char bb_uvname[3][68] DNA_DEPRECATED;
char _pad2[4];
/* if you change these remember to update array lengths to PSYS_TOT_VG! */
/** Vertex groups, 0==disable, 1==starting index. */
short vgroup[13], vg_neg, rt3;
char _pad3[6];
/* point cache */
struct PointCache *pointcache;
struct ListBase ptcaches;
struct ListBase *effectors;
ParticleSpring *fluid_springs;
int tot_fluidsprings, alloc_fluidsprings;
/** Used for interactions with self and other systems. */
struct KDTree_3d *tree;
/** Used for interactions with self and other systems. */
struct BVHTree *bvhtree;
struct ParticleDrawData *pdd;
/** Current time step, as a fraction of a frame. */
float dt_frac;
/** Influence of the lattice modifier. */
float lattice_strength;
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_ALLOW
/** Render emitter as well. */
PART_DRAW_EMITTER = (1 << 3), /* 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), */ /* DEPRECATED */
/* used with billboards */ /* DEPRECATED */
PART_DRAW_ROTATE_OB = (1 << 7), /* used with instance object/collection */
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 instance object/collection */
PART_DRAW_GUIDE_HAIRS = (1 << 17),
PART_DRAW_HAIR_GRID = (1 << 18),
} eParticleDrawFlag;
/**
* #ParticleSettings.type
* Hair is always baked static in object/geometry space.
* Other types (normal particles) are in global space and not static baked.
*/
enum {
PART_EMITTER = 0,
/* REACTOR type currently unused */
/* PART_REACTOR = 1, */
PART_HAIR = 2,
PART_FLUID = 3, /* deprecated (belonged to elbeem) */
PART_FLUID_FLIP = 4,
PART_FLUID_SPRAY = 5,
PART_FLUID_BUBBLE = 6,
PART_FLUID_FOAM = 7,
PART_FLUID_TRACER = 8,
PART_FLUID_SPRAYFOAM = 9,
PART_FLUID_SPRAYBUBBLE = 10,
PART_FLUID_FOAMBUBBLE = 11,
PART_FLUID_SPRAYFOAMBUBBLE = 12,
};
/** Mirroring Mantaflow particle types from particle.h (Mantaflow header). */
enum {
/* PARTICLE_TYPE_NONE = (0 << 0), */ /* UNUSED */
/* PARTICLE_TYPE_NEW = (1 << 0), */ /* UNUSED */
PARTICLE_TYPE_SPRAY = (1 << 1),
PARTICLE_TYPE_BUBBLE = (1 << 2),
PARTICLE_TYPE_FOAM = (1 << 3),
PARTICLE_TYPE_TRACER = (1 << 4),
PARTICLE_TYPE_DELETE = (1 << 10),
/* PARTICLE_TYPE_INVALID = (1 << 30), */ /* UNUSED */
};
/** #ParticleSettings.flag */
#define PART_REACT_STA_END 1
#define PART_REACT_MULTIPLE 2
//#define PART_LOOP 4 /* not used anymore */
/* For dope-sheet. */
#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)
/** #ParticleSettings.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
/** #ParticleSettings.distr */
#define PART_DISTR_JIT 0
#define PART_DISTR_RAND 1
#define PART_DISTR_GRID 2
/** #ParticleSettings.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
/** #ParticleSettings.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;
/** #ParticleSettings.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;
/** #ParticleSettings.shape_flag */
typedef enum eParticleShapeFlag {
PART_SHAPE_CLOSE_TIP = (1 << 0),
} eParticleShapeFlag;
/* #ParticleSettings.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
/* #ParticleSettings.time_flag */
#define PART_TIME_AUTOSF 1 /* Automatic subframes */
/* #ParticleSettings.draw_as */
/* #ParticleSettings.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 /* deprecated */
#define PART_DRAW_REND 10
/* #ParticleSettings.integrator */
#define PART_INT_EULER 0
#define PART_INT_MIDPOINT 1
#define PART_INT_RK4 2
#define PART_INT_VERLET 3
/* #ParticleSettings.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
/* #ParticleSettings.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
/* #ParticleSettings.reactevent */
#define PART_EVENT_DEATH 0
#define PART_EVENT_COLLIDE 1
#define PART_EVENT_NEAR 2
/* #ParticleSettings.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 */ /* deprecated */
/* #define PSYS_USE_IMAT 128 */ /* deprecated */
#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
/** #MTex.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;
#ifdef __cplusplus
}
#endif