added ability for particle system to perform a 'soft stop' where the birthing is effectively stopped while the rest of the system runs down

This commit is contained in:
Josh Wilson 2006-07-25 01:39:24 +00:00
parent bdfdeb5f2c
commit eef56b66b4
3 changed files with 64 additions and 5 deletions

View File

@ -38,7 +38,7 @@ render() {
INLINE void ParticleSystem::
induce_labor() {
_tics_since_birth = _birth_rate;
_tics_since_birth = _cur_birth_rate;
}
////////////////////////////////////////////////////////////////////
@ -62,6 +62,35 @@ clear_to_initial() {
_tics_since_birth = 0.0f;
}
////////////////////////////////////////////////////////////////////
// Function : soft_start
// Access : Public
// Description : Causes system to use birth rate set by set_birth_rate()
////////////////////////////////////////////////////////////////////
INLINE void ParticleSystem::
soft_start(float br) {
if (br > 0.0)
set_birth_rate(br);
_cur_birth_rate = _birth_rate;
_tics_since_birth = 0.0f;
}
////////////////////////////////////////////////////////////////////
// Function : soft_stop
// Access : Public
// Description : Causes system to use birth rate set by
// set_soft_birth_rate()
////////////////////////////////////////////////////////////////////
INLINE void ParticleSystem::
soft_stop(float br) {
if (br > 0.0)
set_soft_birth_rate(br);
_cur_birth_rate = _soft_birth_rate;
_tics_since_birth = 0.0f;
}
//// ///////////////////////////////////////////////////////
//// SET METHODS ///////////////////////////////////////////////////////
//// ///////////////////////////////////////////////////////
@ -84,9 +113,21 @@ set_pool_size(int size) {
INLINE void ParticleSystem::
set_birth_rate(float new_br) {
_birth_rate = new_br;
_cur_birth_rate = _birth_rate;
if(IS_NEARLY_ZERO(_birth_rate)) _birth_rate = NEARLY_ZERO(float);
}
////////////////////////////////////////////////////////////////////
// Function : set_soft_birth_rate
// Access : Public
////////////////////////////////////////////////////////////////////
INLINE void ParticleSystem::
set_soft_birth_rate(float new_br) {
_soft_birth_rate = new_br;
if(IS_NEARLY_ZERO(_soft_birth_rate)) _soft_birth_rate = NEARLY_ZERO(float);
}
////////////////////////////////////////////////////////////////////
// Function : set_litter_size
// Access : Public
@ -294,6 +335,15 @@ get_birth_rate() const {
return _birth_rate;
}
////////////////////////////////////////////////////////////////////
// Function : get_soft_birth_rate
// Access : Public
////////////////////////////////////////////////////////////////////
INLINE float ParticleSystem::
get_soft_birth_rate() const {
return _soft_birth_rate;
}
////////////////////////////////////////////////////////////////////
// Function : get_litter_size
// Access : Public

View File

@ -46,7 +46,9 @@ ParticleSystem(int pool_size) :
Physical(pool_size, false)
{
_birth_rate = 0.5f;
_tics_since_birth = _birth_rate;
_cur_birth_rate = _birth_rate;
_soft_birth_rate = HUGE_VAL;
_tics_since_birth = 0.0;
_litter_size = 1;
_litter_spread = 0;
_living_particles = 0;
@ -91,6 +93,7 @@ ParticleSystem(const ParticleSystem& copy) :
_template_system_flag(false)
{
_birth_rate = copy._birth_rate;
_cur_birth_rate = copy._cur_birth_rate;
_litter_size = copy._litter_size;
_litter_spread = copy._litter_spread;
_active_system_flag = copy._active_system_flag;
@ -106,7 +109,7 @@ ParticleSystem(const ParticleSystem& copy) :
_render_node = _renderer->get_render_node();
_render_parent->add_child(_render_node);
_tics_since_birth = _birth_rate;
_tics_since_birth = 0.0;
_system_lifespan = copy._system_lifespan;
_living_particles = 0;
@ -534,9 +537,9 @@ update(float dt) {
// generate new particles if necessary.
_tics_since_birth += dt;
while (_tics_since_birth >= _birth_rate) {
while (_tics_since_birth >= _cur_birth_rate) {
birth_litter();
_tics_since_birth -= _birth_rate;
_tics_since_birth -= _cur_birth_rate;
}
#ifdef PARTICLE_SYSTEM_UPDATE_SENTRIES

View File

@ -55,6 +55,7 @@ PUBLISHED:
// access/queries
INLINE void set_pool_size(int size);
INLINE void set_birth_rate(float new_br);
INLINE void set_soft_birth_rate(float new_br);
INLINE void set_litter_size(int new_ls);
INLINE void set_litter_spread(int new_ls);
INLINE void set_local_velocity_flag(bool lv);
@ -75,6 +76,7 @@ PUBLISHED:
INLINE int get_pool_size() const;
INLINE float get_birth_rate() const;
INLINE float get_soft_birth_rate() const;
INLINE int get_litter_size() const;
INLINE int get_litter_spread() const;
INLINE bool get_local_velocity_flag() const;
@ -102,6 +104,8 @@ PUBLISHED:
INLINE void render();
INLINE void induce_labor();
INLINE void clear_to_initial();
INLINE void soft_stop(float br = 0.0);
INLINE void soft_start(float br = 0.0);
void update(float dt);
virtual void output(ostream &out) const;
@ -123,7 +127,9 @@ private:
int _particle_pool_size;
int _living_particles;
float _cur_birth_rate;
float _birth_rate;
float _soft_birth_rate;
float _tics_since_birth;
int _litter_size;
int _litter_spread;