diff options
Diffstat (limited to 'src/engine/physics.hpp')
| -rw-r--r-- | src/engine/physics.hpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/engine/physics.hpp b/src/engine/physics.hpp new file mode 100644 index 0000000..6a8abda --- /dev/null +++ b/src/engine/physics.hpp @@ -0,0 +1,41 @@ +#pragma once + +#include <box2d/box2d.h> +#include <vector> + +// Box2D rigid-body world. The building structure runs on the custom Verlet +// solver (see build_graph / verlet); this exists as the foundation for M4 +// projectiles and any terrain collision they need. +struct PhysicsBody { + b2BodyId id; + b2Vec2 size; // half-width, half-height for box shapes + float red, green, blue, alpha; + bool is_static; +}; + +class PhysicsWorld { +public: + PhysicsWorld(); + ~PhysicsWorld(); + + PhysicsWorld(const PhysicsWorld&) = delete; + PhysicsWorld& operator=(const PhysicsWorld&) = delete; + + void step(float dt); + + // Create a static box (terrain, walls). + PhysicsBody* add_static_box(b2Vec2 center, float half_w, float half_h, + float r = 0.3f, float g = 0.3f, float b = 0.3f); + + // Create a dynamic box (projectiles, debris). + PhysicsBody* add_dynamic_box(b2Vec2 center, float half_w, float half_h, + float r = 0.8f, float g = 0.6f, float b = 0.2f); + + const std::vector<PhysicsBody>& bodies() const { return bodies_; } + + b2WorldId world_id() const { return world_id_; } + +private: + b2WorldId world_id_; + std::vector<PhysicsBody> bodies_; +}; |
