From f4eee214a79634cdd2e6fe576950524170c01fa9 Mon Sep 17 00:00:00 2001
From: Stijn Buys <ingar@osirion.org>
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<core::EntityDynamic *>(entity())->state() == core::Entity::Destroyed) {
+					state_visible = false;
+				}
+			}
 
 		} else if (distance() < core::range::maxdistance) {
 
-- 
cgit v1.2.3