77 lines
1.6 KiB
C++
77 lines
1.6 KiB
C++
|
|
#pragma once
|
||
|
|
|
||
|
|
#include "defines.h"
|
||
|
|
#include "colour.h"
|
||
|
|
#include <glm/glm.hpp>
|
||
|
|
#include <vector>
|
||
|
|
|
||
|
|
BEGIN_NAMESPACE
|
||
|
|
|
||
|
|
struct particle;
|
||
|
|
struct particle_emitter;
|
||
|
|
struct particle_modifier;
|
||
|
|
|
||
|
|
using particle_list = std::vector<particle *>;
|
||
|
|
using particle_emitter_list = std::vector<particle_emitter *>;
|
||
|
|
using particle_modifier_list = std::vector<particle_modifier *>;
|
||
|
|
|
||
|
|
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
|