diff options
| -rw-r--r-- | src/render/particleejector.cc | 69 | ||||
| -rw-r--r-- | src/render/particleejector.h | 6 | ||||
| -rw-r--r-- | src/render/particleejectorscript.cc | 6 | ||||
| -rw-r--r-- | src/render/particleejectorscript.h | 67 | ||||
| -rw-r--r-- | src/render/particlesystem.cc | 39 | ||||
| -rw-r--r-- | src/render/particlesystemscript.cc | 8 | 
6 files changed, 138 insertions, 57 deletions
| diff --git a/src/render/particleejector.cc b/src/render/particleejector.cc index 5b26d59..091743d 100644 --- a/src/render/particleejector.cc +++ b/src/render/particleejector.cc @@ -48,29 +48,36 @@ void ParticleEjector::frame(const float seconds, const math::Vector3f & ps_locat  	}  	// add new particles -	if ( (ejector_enabled) && (ejector_last_eject + interval() <= now) ) -	{ -		math::Vector3f 	particle_location(ps_location); -		math::Axis 	particle_axis(ps_axis * axis()); -				 -		if (cone() > 0) { -			particle_axis.change_roll(math::randomf(360.0f)); -			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(); +	if (ejector_enabled) { +		if (ejector_last_eject + interval() <= now) { +			math::Vector3f 	particle_location; +			math::Axis 	particle_axis; +			if (!attached()) { +				particle_location.assign(ps_location); +				particle_axis.assign(ps_axis); +			} +					 +			if (cone() > 0) { +				particle_axis.change_roll(math::randomf(360.0f)); +				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.forward() * speed(), now); +			particle->set_radius(radius_vec()[0]); +			particle->set_alpha(alpha_vec()[0]); +			 +			particles().push_front(particle); +			ejector_last_eject = now;  		} -		 -		Particle *particle = new Particle(particle_location, particle_axis.forward() * speed(), now); -		particle->set_radius(radius_vec()[0]); -		particle->set_alpha(alpha_vec()[0]); -		 -		particles().push_front(particle); -		ejector_last_eject = now; +	} else { +		ejector_last_eject = 0;  	}  	for (Particles::iterator it = particles().begin(); it != particles().end(); ++it) { @@ -115,11 +122,11 @@ void ParticleEjector::frame(const float seconds, const math::Vector3f & ps_locat  	}  	if (particles().size()) { -		draw(ps_location); +		draw(ps_location, ps_axis);  	}  } -void ParticleEjector::draw(const math::Vector3f & ps_location) +void ParticleEjector::draw(const math::Vector3f & ps_location, const math::Axis & ps_axis)  {  } @@ -136,7 +143,7 @@ ParticleEjectorSpray::~ParticleEjectorSpray()  } -void ParticleEjectorSpray::draw(const math::Vector3f & ps_location) +void ParticleEjectorSpray::draw(const math::Vector3f & ps_location, const math::Axis & ps_axis)  {  	math::Vector3f quad[4];  	Textures::bind(texture()); @@ -152,19 +159,20 @@ void ParticleEjectorSpray::draw(const math::Vector3f & ps_location)  	for (Particles::iterator it = particles().begin(); it != particles().end(); it++) {  		Particle *particle = (*it); +		math::Vector3f l(attached() ? ps_location + ps_axis * particle->location() : particle->location());  		const float r = particle->radius();  		c.a = particle->alpha();  		gl::color(c);  		glTexCoord2f(0, 1); -		gl::vertex(particle->location() + quad[0] * r); +		gl::vertex(l + quad[0] * r);  		glTexCoord2f(0, 0); -		gl::vertex(particle->location() + quad[1] * r); +		gl::vertex(l + quad[1] * r);  		glTexCoord2f(1, 0); -		gl::vertex(particle->location() + quad[2] * r); +		gl::vertex(l + quad[2] * r);  		glTexCoord2f(1, 1); -		gl::vertex(particle->location() + quad[3] * r); +		gl::vertex(l + quad[3] * r);  		Stats::quads++;  	}  	gl::end();	 @@ -182,7 +190,7 @@ ParticleEjectorTrail::~ParticleEjectorTrail()  } -void ParticleEjectorTrail::draw(const math::Vector3f & ps_location) +void ParticleEjectorTrail::draw(const math::Vector3f & ps_location, const math::Axis & ps_axis)  {  	if (!particles().size()) {  		return; @@ -201,6 +209,7 @@ void ParticleEjectorTrail::draw(const math::Vector3f & ps_location)  	c.a = (*first)->alpha();  	gl::color(c); +	//math::Vector3f first_location(attached() ? ps_location + ps_axis * (*first)->location() : (*first)->location());  	math::Vector3f first_normal(math::crossproduct(((*first)->location() -  ps_location), ((*first)->location() - Camera::eye())));  	first_normal.normalize(); diff --git a/src/render/particleejector.h b/src/render/particleejector.h index f626f26..9e090d9 100644 --- a/src/render/particleejector.h +++ b/src/render/particleejector.h @@ -66,7 +66,7 @@ protected:  		return ejector_particles;  	} -	virtual void draw(const math::Vector3f & ps_location); +	virtual void draw(const math::Vector3f & ps_location, const math::Axis & ps_axis);  private:  	unsigned long	ejector_last_eject; @@ -83,7 +83,7 @@ public:  	virtual ~ParticleEjectorSpray();  protected: -	virtual void draw(const math::Vector3f & ps_location); +	virtual void draw(const math::Vector3f & ps_location, const math::Axis & ps_axis);  };  /** @@ -95,7 +95,7 @@ public:  	virtual ~ParticleEjectorTrail();  protected: -	virtual void draw(const math::Vector3f & ps_location); +	virtual void draw(const math::Vector3f & ps_location, const math::Axis & ps_axis);  };  } // namespace render diff --git a/src/render/particleejectorscript.cc b/src/render/particleejectorscript.cc index 4c9b6c9..3609b9e 100644 --- a/src/render/particleejectorscript.cc +++ b/src/render/particleejectorscript.cc @@ -21,9 +21,11 @@ ParticleEjectorScript::ParticleEjectorScript()  	script_entity = false;  	script_entity_second = false;  	script_engine = false; +	script_impulse = false;  	script_thrust = false;  	script_cull = model::CullNone;  	script_spawn_radius = 0.0f; +	script_attached = false;	  }  ParticleEjectorScript::ParticleEjectorScript(const ParticleEjectorScript &other) @@ -31,15 +33,17 @@ ParticleEjectorScript::ParticleEjectorScript(const ParticleEjectorScript &other)  	script_type = other.type();  	script_interval = other.interval();  	script_cone = other.cone(); +	script_spawn_radius = other.spawn_radius();  	script_offset = other.offset();  	script_lifespan = other.lifespan();  	script_speed = other.speed();  	script_entity = other.entity();  	script_entity_second = other.entity_second();  	script_engine = other.engine(); +	script_impulse = other.impulse();  	script_thrust = other.thrust();  	script_cull = other.cull(); -	script_spawn_radius = other.spawn_radius(); +	script_attached = other.attached();  	script_texture.assign(other.texture());  	script_axis.assign(other.axis()); diff --git a/src/render/particleejectorscript.h b/src/render/particleejectorscript.h index a538bb5..5a79cc8 100644 --- a/src/render/particleejectorscript.h +++ b/src/render/particleejectorscript.h @@ -45,13 +45,6 @@ public:  		return script_axis;  	} -	/** -	 * @brief true of the ejector reacts on thrust -	 * */ -	inline bool thrust() const { -		return script_thrust; -	} -	  	inline const unsigned int interval() const  	{  		return script_interval; @@ -68,39 +61,63 @@ public:  	/**  	 * @brief offset defines the interpolation midpoint for alpha and radius ranges, default 0.5f  	 * */ -	inline float offset() const { +	inline const float offset() const {  		return script_offset;  	}  	/**  	 * @brief lifespan of ejected particles, in milliseconds  	 * */ -	inline unsigned long lifespan() const { +	inline const unsigned long lifespan() const {  		return script_lifespan;  	}  	/**  	 * @brief true if engine color is to be applied to ejected particles  	 * */ -	inline bool engine() const { +	inline const bool engine() const {  		return script_engine;  	}  	/**  	 * @brief true if entity primary color is to be applied to ejected particles  	 * */ -	inline bool entity() const +	inline const bool entity() const  	{  		return script_entity;  	}  	/** +	 * @brief true for a thrust activated ejector +	 * */ +	inline const bool thrust() const +	{ +		return script_thrust; +	} + +	/** +	 * @brief true for a thrust impulse ejector +	 * */ +	inline const bool impulse() const +	{ +		return script_impulse; +	} +	 +	/**  	 * @brief true if entity secondary color is to be applied to ejected particles  	 * */ -	inline bool entity_second() const +	inline const bool entity_second() const  	{  		return script_entity_second;  	} +	 +	/** +	 * @brief true if particles are drawn in model coordinates +	 * */ +	inline const bool attached() const +	{ +		return script_attached; +	}  	/**  	 * @brief name of the texture used to render ejected particles @@ -305,13 +322,29 @@ public:  	}  	/** -	 * @brief make ejector react on thruster setting +	 * @brief enable or disable thrust activated ejector  	 * */  	inline void set_thrust(const bool use_thrust)  	{  		script_thrust = use_thrust;  	} +	/** +	 * @brief enable or disable impulse activated ejector +	 * */ +	inline void set_impulse(const bool use_impulse) +	{ +		script_impulse = use_impulse; +	} +	 +	/** +	 * @brief ejector particles are drawn in entity coordinates +	 * */ +	inline void set_attached(const bool attached) +	{ +		script_attached = attached; +	} +	  	/**   	 * @brief set the particle color   	 * */ @@ -353,9 +386,13 @@ private:  	bool		script_entity_second;  	/// particles jave engine color  	bool		script_engine; -	/// ejector reacts on engine thrust +	/// thrust activated ejector  	bool		script_thrust; -		 +	/// impulse activated ejector +	bool		script_impulse; +	/// ejector is attached to entity coordinates +	bool		script_attached; +	  	/// texture to render particles with  	std::string	script_texture;  	/// texture cull  diff --git a/src/render/particlesystem.cc b/src/render/particlesystem.cc index ff9c720..920d77c 100644 --- a/src/render/particlesystem.cc +++ b/src/render/particlesystem.cc @@ -4,6 +4,7 @@     the terms of the GNU General Public License version 2  */ +#include "render/gl.h"  #include "render/particlesystem.h"  namespace render { @@ -121,23 +122,45 @@ void ParticleSystem::draw(const float seconds)  	math::Axis current_axis(entity() ? entity()->axis() * axis() : axis());  	for (Ejectors::iterator it = ejectors().begin(); it != ejectors().end(); ++it) { -				 +		 +		ParticleEjector *ejector = (*it); +		  		if (entity()) {  			bool ejector_active = true; +			  			if (entity()->type() == core::Entity::Controlable) { +				const core::EntityControlable *controlable = static_cast<const core::EntityControlable *>(entity()); -				if ((*it)->thrust()) { -					// thrust activated				 -					const core::EntityControlable *controlable = static_cast<const core::EntityControlable *>(entity()); -					if ( controlable->thrust() == 0.0f ) { -						ejector_active = false; +				if (ejector->impulse() || ejector->thrust()) { +					ejector_active = false; +				 +					switch (controlable->state()) { +						case core::Entity::Impulse: +						case core::Entity::ImpulseInitiate: +							if (ejector->impulse() || ejector->thrust()) { +								ejector_active = true; +							} +							break; +							 +						case core::Entity::Normal: +							if (ejector->thrust()) { +								if (controlable->thrust() > 0.0f) { +									ejector_active = true; +								} +							} +							break; +							 +						default: +							ejector_active = false; +							break;  					} -					(*it)->enable(ejector_active); +					ejector->enable(ejector_active);  				}  			}  		} -		(*it)->frame(seconds, current_location, current_axis); +		(*it)->frame(seconds, current_location, current_axis  * ejector->axis()); +  	}  } diff --git a/src/render/particlesystemscript.cc b/src/render/particlesystemscript.cc index 98c0a2d..866fce1 100644 --- a/src/render/particlesystemscript.cc +++ b/src/render/particlesystemscript.cc @@ -199,6 +199,10 @@ ParticleSystemScript *ParticleSystemScript::load(const std::string &label)  					ejector->set_thrust(b);  					continue; +				} else if (inifile.got_key_bool("impulse", b)) { +					ejector->set_impulse(b); +					continue; +					  				} else if (inifile.got_key_bool("entity", b)) {  					ejector->set_entity(b);  					continue; @@ -214,6 +218,10 @@ ParticleSystemScript *ParticleSystemScript::load(const std::string &label)  					}  					continue; +				} else if (inifile.got_key_bool("attached", b)) { +					ejector->set_attached(b); +					continue; +					  				} else if (inifile.got_key_float("angle", yaw)) {  					if (yaw == model::ANGLEUP) { | 
