From f4eee214a79634cdd2e6fe576950524170c01fa9 Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Sun, 27 Jan 2013 17:24:16 +0000 Subject: Support for particle ejector timeout value, do not draw destroyed entity models., --- src/render/draw.h | 1 - src/render/particleejector.cc | 79 +++++++++++++++++++++---------------- src/render/particleejector.h | 1 + src/render/particleejectorscript.cc | 2 + src/render/particleejectorscript.h | 15 +++++++ src/render/particlesystemscript.cc | 4 ++ src/render/renderext.cc | 7 ++++ 7 files changed, 74 insertions(+), 35 deletions(-) (limited to 'src/render') diff --git a/src/render/draw.h b/src/render/draw.h index a3b4d30..4b59b63 100644 --- a/src/render/draw.h +++ b/src/render/draw.h @@ -61,4 +61,3 @@ public: } #endif // __INCLUDED_RENDER_DRAW_H__ - diff --git a/src/render/particleejector.cc b/src/render/particleejector.cc index acec84f..29a255d 100644 --- a/src/render/particleejector.cc +++ b/src/render/particleejector.cc @@ -21,6 +21,7 @@ ParticleEjector::ParticleEjector(const ParticleEjectorScript &script) : Particle { ejector_last_eject = 0; ejector_enabled = true; + ejector_timestamp = 0; } ParticleEjector::~ParticleEjector() @@ -53,45 +54,55 @@ void ParticleEjector::frame(const float seconds, const math::Vector3f & ps_locat // add new particles if (ejector_enabled) { - while (ejector_last_eject > interval()) { - math::Vector3f particle_location; - math::Axis particle_axis; - if (!attached()) { - particle_location.assign(ps_location); - particle_axis.assign(ps_axis); - } - particle_axis.change_roll(math::randomf(360.0f)); - if (cone() > 0) { - particle_axis.change_pitch(math::randomf(cone()) - (cone() * 0.5f) ); - } - if (spawn_radius() > 0) { - // FIXME find a faster formula - math::Axis random_axis(ps_axis); - random_axis.change_roll(math::randomf(360.0f)); - random_axis.change_pitch(math::randomf(180.0f)); - particle_location += random_axis.forward() * spawn_radius(); - } - - Particle *particle = new Particle(particle_location, particle_axis, now); - particle->set_radius(radius_vec()[0]); - particle->set_alpha(alpha_vec()[0]); - particle->set_rotation(math::randomf(2.0f * M_PI)); - particle->set_speed(math::randomf(speed_vec()[0], speed_vec()[1])); - particles().push_front(particle); + + if (!ejector_timestamp) { + ejector_timestamp = now; + } + + if (!timeout() || (ejector_timestamp + timeout() > now)) { - if (type() == Streak) { - Particle *tail = new Particle(particle_location, particle_axis, now); - tail->set_radius(radius_vec()[0]); - tail->set_alpha(alpha_vec()[0]); - tail->set_rotation(particle->rotation()); - tail->set_speed(math::randomf(tailspeed_vec()[0], tailspeed_vec()[1])); - particles().push_front(tail); + while (ejector_last_eject > interval()) { + math::Vector3f particle_location; + math::Axis particle_axis; + if (!attached()) { + particle_location.assign(ps_location); + particle_axis.assign(ps_axis); + } + particle_axis.change_roll(math::randomf(360.0f)); + if (cone() > 0) { + particle_axis.change_pitch(math::randomf(cone()) - (cone() * 0.5f) ); + } + if (spawn_radius() > 0) { + // FIXME find a faster formula + math::Axis random_axis(ps_axis); + random_axis.change_roll(math::randomf(360.0f)); + random_axis.change_pitch(math::randomf(180.0f)); + particle_location += random_axis.forward() * spawn_radius(); + } + + Particle *particle = new Particle(particle_location, particle_axis, now); + particle->set_radius(radius_vec()[0]); + particle->set_alpha(alpha_vec()[0]); + particle->set_rotation(math::randomf(2.0f * M_PI)); + particle->set_speed(math::randomf(speed_vec()[0], speed_vec()[1])); + particles().push_front(particle); + + if (type() == Streak) { + Particle *tail = new Particle(particle_location, particle_axis, now); + tail->set_radius(radius_vec()[0]); + tail->set_alpha(alpha_vec()[0]); + tail->set_rotation(particle->rotation()); + tail->set_speed(math::randomf(tailspeed_vec()[0], tailspeed_vec()[1])); + particles().push_front(tail); + } + + ejector_last_eject -= interval(); } - - ejector_last_eject -= interval(); } + } else { ejector_last_eject = 0; + ejector_timestamp = 0; } for (Particles::iterator it = particles().begin(); it != particles().end(); ++it) { diff --git a/src/render/particleejector.h b/src/render/particleejector.h index 743e370..838af12 100644 --- a/src/render/particleejector.h +++ b/src/render/particleejector.h @@ -69,6 +69,7 @@ protected: virtual void draw(const math::Vector3f & ps_location, const math::Axis & ps_axis); private: + unsigned long ejector_timestamp; unsigned long ejector_last_eject; Particles ejector_particles; bool ejector_enabled; diff --git a/src/render/particleejectorscript.cc b/src/render/particleejectorscript.cc index 2b6f8ce..b2c84bc 100644 --- a/src/render/particleejectorscript.cc +++ b/src/render/particleejectorscript.cc @@ -17,6 +17,7 @@ ParticleEjectorScript::ParticleEjectorScript() script_cone = 0.0f; script_offset = 0.5f; script_lifespan = 1000; + script_timeout = 0; script_acceleration = 0.0f; script_entity = false; script_entity_second = false; @@ -37,6 +38,7 @@ ParticleEjectorScript::ParticleEjectorScript(const ParticleEjectorScript &other) script_spawn_radius = other.spawn_radius(); script_offset = other.offset(); script_lifespan = other.lifespan(); + script_timeout = other.timeout(); script_acceleration = other.acceleration(); script_entity = other.entity(); script_entity_second = other.entity_second(); diff --git a/src/render/particleejectorscript.h b/src/render/particleejectorscript.h index 4ba8dea..535458e 100644 --- a/src/render/particleejectorscript.h +++ b/src/render/particleejectorscript.h @@ -51,6 +51,11 @@ public: return script_interval; } + inline const unsigned long timeout() const + { + return script_timeout; + } + /** * @brief angle of the cone through which to randomly spread ejected particles * */ @@ -299,6 +304,14 @@ public: script_interval = interval; } + /** + * @brief set the time after which no more particles are ejected, in milliseconds + * */ + inline void set_timeout(const unsigned long timeout) + { + script_timeout = timeout; + } + /** * @brief set particle lifespan, in milliseconds * */ @@ -415,6 +428,8 @@ private: math::Axis script_axis; /// interval between to ejects, in milliseconds unsigned long script_interval; + /// time after which no more particles are ejected, in milliseconds + unsigned long script_timeout; /// lifespan of a particle, in milliseconds unsigned long script_lifespan; /// ejector cone, in default 360 degrees diff --git a/src/render/particlesystemscript.cc b/src/render/particlesystemscript.cc index 0fad772..f78fa88 100644 --- a/src/render/particlesystemscript.cc +++ b/src/render/particlesystemscript.cc @@ -212,6 +212,10 @@ ParticleSystemScript *ParticleSystemScript::load(const std::string &label) ejector->set_lifespan((unsigned long) l); continue; + } else if (inifile.got_key_long("timeout", l)) { + ejector->set_timeout((unsigned long) l); + continue; + } else if (inifile.got_key_color("color", ejector->get_color())) { continue; diff --git a/src/render/renderext.cc b/src/render/renderext.cc index 6730aba..7ac5702 100644 --- a/src/render/renderext.cc +++ b/src/render/renderext.cc @@ -190,6 +190,13 @@ void RenderExt::frame(float elapsed) // entity within detail range state_visible = true; state_detailvisible = true; + + if ((entity()->type() == core::Entity::Controlable) || (entity()->type() == core::Entity::Dynamic)) { + + if (static_cast(entity())->state() == core::Entity::Destroyed) { + state_visible = false; + } + } } else if (distance() < core::range::maxdistance) { -- cgit v1.2.3