diff options
Diffstat (limited to 'src/crepe/api/ParticleEmitter.h')
-rw-r--r-- | src/crepe/api/ParticleEmitter.h | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/src/crepe/api/ParticleEmitter.h b/src/crepe/api/ParticleEmitter.h new file mode 100644 index 0000000..1edd2b5 --- /dev/null +++ b/src/crepe/api/ParticleEmitter.h @@ -0,0 +1,104 @@ +#pragma once + +#include <cmath> +#include <vector> + +#include "system/ParticleSystem.h" +#include "system/RenderSystem.h" + +#include "Component.h" +#include "Particle.h" +#include "types.h" + +namespace crepe { + +class Sprite; + +/** + * \brief Data holder for particle emission parameters. + * + * The ParticleEmitter class stores configuration data for particle properties, defining the + * characteristics and boundaries of particle emissions. + */ +class ParticleEmitter : public Component { +public: + /** + * \brief Defines the boundary within which particles are constrained. + * + * This structure specifies the boundary's size and offset, as well as the behavior of + * particles upon reaching the boundary limits. + */ + struct Boundary { + //! boundary width (midpoint is emitter location) + float width = INFINITY; + //! boundary height (midpoint is emitter location) + float height = INFINITY; + //! boundary offset from particle emitter location + vec2 offset; + //! reset on exit or stop velocity and set max postion + bool reset_on_exit = false; + }; + + //! sprite reference of displayed sprite + const Sprite & sprite; + + /** + * \brief Holds parameters that control particle emission. + * + * Contains settings for the emitter’s position, particle speed, angle, lifespan, boundary, + * and the sprite used for rendering particles. + */ + struct Data { + //! offset of the emitter relative to transform + vec2 offset; + //! maximum number of particles + const unsigned int max_particles = 256; + //! rate of particle emission per second + float emission_rate = 50; + //! min speed of the particles + float min_speed = 100; + //! min speed of the particles + float max_speed = 100; + //! min angle of particle emission + float min_angle = 0; + //! max angle of particle emission + float max_angle = 0; + //! begin Lifespan of particle in seconds (only visual) + float begin_lifespan = 0.0; + //! end Lifespan of particle in seconds + float end_lifespan = 10.0; + //! force over time (physics) + vec2 force_over_time; + //! particle boundary + Boundary boundary; + }; + +public: + /** + * \param game_object_id Identifier for the game object using this emitter. + * \param data Configuration data defining particle properties. + */ + ParticleEmitter(game_object_id_t game_object_id, const Sprite & sprite, const Data & data); + +public: + //! Configuration data for particle emission settings. + Data data; + +protected: + virtual std::unique_ptr<Component> save() const; + ParticleEmitter(const ParticleEmitter &) = default; + virtual void restore(const Component & snapshot); + virtual ParticleEmitter & operator=(const ParticleEmitter &); + +private: + //! Only ParticleSystem can move and read particles + friend ParticleSystem; + //! Only RenderSystem can read particles + friend RenderSystem; + //! Saves time left over from last update event. + float spawn_accumulator = 0; + //! collection of particles + std::vector<Particle> particles; +}; + +} // namespace crepe |