diff options
Diffstat (limited to 'source/blender/blenkernel/BKE_effect.h')
-rw-r--r-- | source/blender/blenkernel/BKE_effect.h | 109 |
1 files changed, 86 insertions, 23 deletions
diff --git a/source/blender/blenkernel/BKE_effect.h b/source/blender/blenkernel/BKE_effect.h index e21e83bf5cf..83ec7c13946 100644 --- a/source/blender/blenkernel/BKE_effect.h +++ b/source/blender/blenkernel/BKE_effect.h @@ -32,6 +32,7 @@ #define BKE_EFFECT_H #include "DNA_object_types.h" +#include "DNA_modifier_types.h" struct Object; struct Scene; @@ -40,20 +41,72 @@ struct ListBase; struct Particle; struct Group; struct RNG; +struct ParticleSimulationData; +struct ParticleData; +struct ParticleKey; -struct PartDeflect *object_add_collision_fields(void); +struct EffectorWeights *BKE_add_effector_weights(struct Group *group); +struct PartDeflect *object_add_collision_fields(int type); -typedef struct pEffectorCache { - struct pEffectorCache *next, *prev; - Object *ob; - - /* precalculated variables */ - float oldloc[3], oldspeed[3]; - float scale, time_scale; - float guide_dist; +/* Input to effector code */ +typedef struct EffectedPoint { + float *loc; + float *vel; + float *ave; /* angular velocity for particles with dynamic rotation */ + float *rot; /* rotation quaternion for particles with dynamic rotation */ + float vel_to_frame; + float vel_to_sec; + + /* only for particles */ + float size, charge; + + unsigned int flag; + int index; + + struct ParticleSystem *psys; /* particle system the point belongs to */ +} EffectedPoint; + +typedef struct GuideEffectorData { + float vec_to_point[3]; + float strength; +} GuideEffectorData; + +typedef struct EffectorData { + /* Effector point */ + float loc[3]; + float nor[3]; + float vel[3]; + + float vec_to_point[3]; + float distance, falloff; + + /* only for effector particles */ + float size, charge; + + /* only for vortex effector with surface falloff */ + float nor2[3], vec_to_point2[3]; + + int *index; /* point index */ +} EffectorData; + +/* used for calculating the effector force */ +typedef struct EffectorCache { + struct EffectorCache *next, *prev; + + struct Scene *scene; + struct Object *ob; + struct ParticleSystem *psys; + struct SurfaceModifierData *surmd; - Object obcopy; /* for restoring transformation data */ -} pEffectorCache; + struct PartDeflect *pd; + + /* precalculated for guides */ + struct GuideEffectorData *guide_data; + float guide_loc[4], guide_dir[3], guide_radius; + + float frame; + int flag; +} EffectorCache; void free_effect(struct Effect *eff); void free_effects(struct ListBase *lb); @@ -61,23 +114,33 @@ struct Effect *copy_effect(struct Effect *eff); void copy_effects(struct ListBase *lbn, struct ListBase *lb); void deselectall_eff(struct Object *ob); -/* particle deflector */ -#define PE_WIND_AS_SPEED 0x00000001 - struct PartEff *give_parteff(struct Object *ob); -struct ListBase *pdInitEffectors(struct Scene *scene, struct Object *obsrc, struct Group *group); -void pdEndEffectors(struct ListBase *lb); -void pdDoEffectors(struct Scene *scene, struct ListBase *lb, float *opco, float *force, - float *speed, float cur_time, float loc_time, unsigned int flags); + + +void free_partdeflect(struct PartDeflect *pd); +struct ListBase *pdInitEffectors(struct Scene *scene, struct Object *ob_src, struct ParticleSystem *psys_src, struct EffectorWeights *weights); +void pdEndEffectors(struct ListBase **effectors); +void pdDoEffectors(struct ListBase *effectors, struct ListBase *colliders, struct EffectorWeights *weights, struct EffectedPoint *point, float *force, float *impulse); + +void pd_point_from_particle(struct ParticleSimulationData *sim, struct ParticleData *pa, struct ParticleKey *state, struct EffectedPoint *point); +void pd_point_from_loc(struct Scene *scene, float *loc, float *vel, int index, struct EffectedPoint *point); +void pd_point_from_soft(struct Scene *scene, float *loc, float *vel, int index, struct EffectedPoint *point); + +/* needed for boids */ +float effector_falloff(struct EffectorCache *eff, struct EffectorData *efd, struct EffectedPoint *point, struct EffectorWeights *weights); +int closest_point_on_surface(struct SurfaceModifierData *surmd, float *co, float *surface_co, float *surface_nor, float *surface_vel); +int get_effector_data(struct EffectorCache *eff, struct EffectorData *efd, struct EffectedPoint *point, int real_velocity); /* required for particle_system.c */ -void do_physical_effector(struct Scene *scene, struct Object *ob, float *opco, short type, float force_val, float distance, - float falloff, float size, float damp, float *eff_velocity, float *vec_to_part, - float *velocity, float *field, int planar, struct RNG *rng, float noise_factor, - float charge, float pa_size); -float effector_falloff(struct PartDeflect *pd, float *eff_velocity, float *vec_to_part); +//void do_physical_effector(struct EffectorData *eff, struct EffectorPoint *point, float *total_force); +//float effector_falloff(struct EffectorData *eff, struct EffectorPoint *point, struct EffectorWeights *weights); +/* EffectedPoint->flag */ +#define PE_WIND_AS_SPEED 1 +#define PE_DYNAMIC_ROTATION 2 +/* EffectorData->flag */ +#define PE_VELOCITY_TO_IMPULSE 1 #endif |