aboutsummaryrefslogtreecommitdiff
path: root/src/crepe/api/ParticleEmitter.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/crepe/api/ParticleEmitter.h')
-rw-r--r--src/crepe/api/ParticleEmitter.h104
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