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.h106
1 files changed, 81 insertions, 25 deletions
diff --git a/src/crepe/api/ParticleEmitter.h b/src/crepe/api/ParticleEmitter.h
index 2e2e95b..8ac2e72 100644
--- a/src/crepe/api/ParticleEmitter.h
+++ b/src/crepe/api/ParticleEmitter.h
@@ -1,40 +1,96 @@
#pragma once
-#include <cstdint>
+#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:
- ParticleEmitter(uint32_t game_object_id, uint32_t max_particles,
- uint32_t emission_rate, uint32_t speed,
- uint32_t speed_offset, uint32_t angle, uint32_t angleOffset,
- float begin_lifespan, float end_lifespan);
- ~ParticleEmitter();
-
- //! position of the emitter
- Position position;
- //! maximum number of particles
- uint32_t max_particles;
- //! rate of particle emission
- uint32_t emission_rate;
- //! base speed of the particles
- uint32_t speed;
- //! offset for random speed variation
- uint32_t speed_offset;
- //! min angle of particle emission
- uint32_t min_angle;
- //! max angle of particle emission
- uint32_t max_angle;
- //! begin Lifespan of particle (only visual)
- float begin_lifespan;
- //! begin Lifespan of particle
- float end_lifespan;
+ /**
+ * \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;
+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;
};