#pragma once #include "defines.h" #include "colour.h" #include #include BEGIN_NAMESPACE struct particle; struct particle_emitter; struct particle_modifier; using particle_list = std::vector; using particle_emitter_list = std::vector; using particle_modifier_list = std::vector; struct particle { glm::vec3 position; glm::vec3 old_pos; glm::vec3 velocity; colour color; float life; float size; }; struct particle_emitter { particle_emitter(); virtual ~particle_emitter() = default; particle *new_particle(); void update(float elapsed_ms); virtual void spawn(particle *p) = 0; particle_list particles; particle_list dead_particles; glm::vec3 position{}; float emission_rate{}; // particles per second float to_spawn; float life_decay{}; colour start_colour{}; colour end_colour{}; float start_size; float end_size; }; struct particle_modifier { virtual void affect_particle(particle *p, float elapsed_ms) = 0; }; struct particle_system { void update(float elapsed_ms); void render(); particle_list particles; particle_emitter_list emitters; particle_modifier_list modifiers; }; struct dot_particle_emitter : particle_emitter { dot_particle_emitter(); void spawn(particle *p) override; }; struct particle_attractor : particle_modifier { void init(glm::vec3& center, float strength_); void affect_particle(particle *p, float elapsed_ms) override; glm::vec3 attractor_center; float strength; }; END_NAMESPACE