/* render/particleejector.h This file is part of the Osirion project and is distributed under the terms of the GNU General Public License version 2 */ #ifndef __INCLUDED_RENDER_PARTICLEEJECTOR_H__ #define __INCLUDED_RENDER_PARTICLEEJECTOR_H__ #include #include "render/camera.h" #include "render/particleejectorscript.h" #include "render/particle.h" namespace render { class ParticleEjector : public ParticleEjectorScript { public: typedef std::deque Particles; /** * @brief initialize an ejector from a ParticleEjectorScript * */ ParticleEjector(const ParticleEjectorScript &script); virtual ~ParticleEjector(); /** * @brief if false, no new particles are created * */ inline const bool enabled() { return ejector_enabled; } /* ---- mutators ------------------------------------------- */ /** * @brief enable or disable particle ejection * */ inline void enable(const bool enabled = true) { ejector_enabled = enabled; } /** * @brief disable or enable particle ejection * */ inline void disable(const bool disabled = true) { ejector_enabled = !disabled; } /** * @brief updated the particles attached to the ejector, and drawn them * */ void frame(const float seconds, const Camera &camera, const math::Vector3f & ps_location, const math::Axis & ps_axis, const float thrust_factor); /** * @brief remove all particles * */ void clear(); protected: inline Particles &particles() { return ejector_particles; } virtual void draw(const Camera &camera, 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; }; /** * @brief Sprite particles * Sprites are rendered facing the camera * */ class ParticleEjectorSprite : public ParticleEjector { public: ParticleEjectorSprite(const ParticleEjectorScript &script); virtual ~ParticleEjectorSprite(); protected: virtual void draw(const Camera &camera, const math::Vector3f & ps_location, const math::Axis & ps_axis); }; /** * @brief Flare particles * Flare are rendered along the particle axis * */ class ParticleEjectorFlare : public ParticleEjector { public: ParticleEjectorFlare(const ParticleEjectorScript &script); virtual ~ParticleEjectorFlare(); protected: virtual void draw(const Camera &camera, const math::Vector3f & ps_location, const math::Axis & ps_axis); }; /** * @brief Trail particles * */ class ParticleEjectorTrail : public ParticleEjector { public: ParticleEjectorTrail(const ParticleEjectorScript &script); virtual ~ParticleEjectorTrail(); protected: virtual void draw(const Camera &camera, const math::Vector3f & ps_location, const math::Axis & ps_axis); }; /** * @brief Streak particles * */ class ParticleEjectorStreak : public ParticleEjector { public: ParticleEjectorStreak(const ParticleEjectorScript &script); virtual ~ParticleEjectorStreak(); protected: virtual void draw(const Camera &camera, const math::Vector3f & ps_location, const math::Axis & ps_axis); }; } // namespace render #endif // __INCLUDED_RENDER_PARTICLEEJECTOR_H__