Files
demo/src/particles.h
T

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