a simple particle physics sandbox in C++
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

146 lines
3.0 KiB

#ifndef PARTICLES_H
#define PARTICLES_H
#include <SDL2/SDL_events.h>
#include <SDL2/SDL_pixels.h>
#include <SDL2/SDL_render.h>
#include <SDL2/SDL_surface.h>
#include <memory>
#include <string>
#include <vector>
namespace pengine {
enum class ParticleID {
BASIC = 0,
SAND = 1,
WATER = 2,
STEAM = 3,
LAVA = 4,
ROCK = 5
};
class PixelColour {
public:
union {
struct {
Uint8 b;
Uint8 g;
Uint8 r;
Uint8 a;
};
Uint32 pixel;
};
Uint32 get_pixelcol();
SDL_Color get_sdlcol();
PixelColour(short r, short g, short b, short a);
PixelColour(short r, short g, short b);
PixelColour(const Uint8[3]);
PixelColour(SDL_Color c);
PixelColour(Uint32 c);
};
enum class State { SOLID, LIQUID, GAS };
struct particle_data {
double density;
bool liquid;
double temperature;
double boiling_point;
double melting_point;
double freezing_point;
ParticleID gas_state;
ParticleID liquid_state;
ParticleID solid_state;
};
class Particle;
class Grid {
public:
Particle **grid;
Uint32 *pixels;
int xsize;
int ysize;
Grid(int xs, int ys);
virtual ~Grid();
Grid &operator=(Grid o);
void update();
void clear();
void update_texture();
void add_particle_at(int x, int y, ParticleID p);
void erase_particle_at(int x, int y);
bool move_particle(int xa, int ya, int xb, int yb);
int swap_particle(int xa, int ya, int xb, int yb);
bool inside_grid(int x, int y);
Particle *get_particle(int x, int y);
void replace_particle(int x, int y, Particle *new_particle);
// std::vector<Particle *> get_particles_near(int x, int y);
};
class Particle {
public:
struct particle_data data;
bool updated = false;
enum ParticleID id;
virtual void update(Grid *const, int x, int y) = 0;
virtual PixelColour get_colour() = 0;
Particle(ParticleID id) : id{id} {};
virtual std::string get_name() = 0;
virtual ~Particle() = default;
};
class BasicParticle : public Particle {
protected:
bool update_temperature(Grid *const g, int x, int y);
State get_state();
public:
BasicParticle();
BasicParticle(ParticleID id);
struct particle_data default_data(ParticleID id);
void update(Grid *const, int x, int y) override;
PixelColour get_colour() override;
std::string get_name() override;
};
class Sand : public BasicParticle {
public:
void update(Grid *const, int x, int y) override;
Sand() : BasicParticle(ParticleID::SAND){};
Sand(ParticleID id) : BasicParticle(id){};
};
class Water : public BasicParticle {
public:
void update(Grid *const, int x, int y) override;
Water() : BasicParticle(ParticleID::WATER){};
Water(ParticleID id) : BasicParticle(id){};
};
class Steam : public BasicParticle {
public:
void update(Grid *const, int x, int y) override;
Steam() : BasicParticle(ParticleID::STEAM){};
};
class Lava : public Water {
public:
void update(Grid *const, int x, int y) override;
Lava();
};
class Rock : public Sand {
public:
void update(Grid *const, int x, int y) override;
Rock();
};
} // namespace pengine
#endif