Calamity Engine 1.0.0
A cross-platform 2D game engine written in C++ and SDL3.
Loading...
Searching...
No Matches
physics.hpp
Go to the documentation of this file.
1#pragma once
2#include "definitions.hpp"
3#include "../../core/definitions.hpp"
4#include "../../core/node/components.hpp"
5
6#include <box2d/base.h>
7#include <box2d/box2d.h>
8#include <box2d/collision.h>
9#include <box2d/id.h>
10#include <box2d/types.h>
11
12#include <functional>
13
14template <>
15struct std::hash<b2ShapeId>
16{
17 std::size_t operator()(const b2ShapeId &id) const noexcept
18 {
19 // b2ShapeId has index1, world0, and revision fields
20 std::size_t h = std::hash<uint32_t>{}(id.index1);
21 h ^= std::hash<uint16_t>{}(id.world0) + 0x9e3779b9 + (h << 6) + (h >> 2);
22 h ^= std::hash<uint16_t>{}(id.generation) + 0x9e3779b9 + (h << 6) + (h >> 2);
23 return h;
24 }
25};
26
27inline bool operator==(const b2ShapeId &a, const b2ShapeId &b) noexcept
28{
29 return a.index1 == b.index1 && a.world0 == b.world0 && a.generation == b.generation;
30}
31
57class PhysicsBody : public Component
58{
59public:
60 void exit() override;
61 virtual void physicsUpdate() = 0;
62 void initialize() override;
63 virtual void initCompute();
64
70 std::shared_ptr<Shape> shape;
71
72 template <class Archive>
73 void save(Archive &ar) const
74 {
75 ar(CEREAL_NVP(shape), CEREAL_NVP(storedTransform), CEREAL_NVP(sensor));
76 }
77
78 template <class Archive>
79 void load(Archive &ar)
80 {
81 ar(CEREAL_NVP(shape), CEREAL_NVP(storedTransform), CEREAL_NVP(sensor));
83
84 const float angle = storedTransform.getAngleRadians();
85 b2Body_SetTransform(bodyId, storedTransform.position, {cos(angle), sin(angle)});
86 }
87
88 b2BodyId getBodyId() { return bodyId; };
89 b2ShapeId getShapeId() { return shapeId; };
90
91protected:
92 bool sensor;
93 b2BodyDef bodyDef;
94 b2BodyId bodyId;
95 b2ShapeId shapeId;
96
98};
99
108{
109public:
110 Physics(Vector2 gravity = {0.0f, 9.81f});
111 void exit();
112
113 friend bool b2callback(b2ShapeId shapeId, void *ctx);
114 void physicsUpdate(float timeStep);
115 int subSteps = 4;
116
117 void registerBody(PhysicsBody *body);
118 void deRegisterBody(PhysicsBody *body);
119
120 Vector2 gravity = {0.0f, 9.81f};
121 b2WorldDef worldDef;
122 b2WorldId worldId;
123
124 PhysicsBody* findBodyFromShape(b2ShapeId id);
125private:
126 std::unordered_map<b2ShapeId, PhysicsBody *> bodyMap;
127
128 std::vector<b2ShapeId> currentHovered;
129 std::vector<b2ShapeId> lastHovered;
130};
131
155{
156public:
157 StaticBody();
158 StaticBody(const std::shared_ptr<Shape> &shape);
159
160 void physicsUpdate() override;
161 void initCompute() override;
162
163 void setPosition(Vector2 pos) const;
164 void setAngle(float angle) const;
165
166 template <class Archive>
167 void save(Archive &ar) const
168 {
169 ar(cereal::base_class<PhysicsBody>(this));
170 }
171
172 template <class Archive>
173 void load(Archive &ar)
174 {
175 ar(cereal::base_class<PhysicsBody>(this));
176 }
177};
178
230class RigidBody : public PhysicsBody
231{
232public:
233 RigidBody();
234 explicit RigidBody(const std::shared_ptr<Shape> &shape);
235
236 void physicsUpdate() override;
237 void initCompute() override;
238
239 void setPosition(Vector2 pos) const;
240 void setAngle(float angle) const;
241
242 void setLinearVelocity(Vector2 vel) const;
243 void applyForce(Vector2 force) const;
244 void applyImpulse(Vector2 impulse) const;
245
246 bool isOnGround();
247 void lockRotation(bool value);
249
250 template <class Archive>
251 void save(Archive &ar) const
252 {
253 ar(cereal::base_class<PhysicsBody>(this), CEREAL_NVP(rotationLocked));
254 }
255
256 template <class Archive>
257 void load(Archive &ar)
258 {
259 ar(cereal::base_class<PhysicsBody>(this), CEREAL_NVP(rotationLocked));
260 }
261
262private:
263 bool rotationLocked = false;
264};
265
289{
290public:
292 explicit KinematicBody(const std::shared_ptr<Shape> &shape);
293
294 void physicsUpdate() override;
295 void initCompute() override;
296
297 void setLinearVelocity(Vector2 vel) const;
298 void applyForce(Vector2 force) const;
299 void applyImpulse(Vector2 impulse) const;
300
302
303 template <class Archive>
304 void save(Archive &ar) const
305 {
306 ar(cereal::base_class<PhysicsBody>(this));
307 }
308
309 template <class Archive>
310 void load(Archive &ar)
311 {
312 ar(cereal::base_class<PhysicsBody>(this));
313 }
314};
315
Definition physics.hpp:289
KinematicBody()
Definition physics.cpp:327
void initCompute() override
Definition physics.cpp:317
void load(Archive &ar)
Definition physics.hpp:310
void physicsUpdate() override
Definition physics.cpp:334
void setLinearVelocity(Vector2 vel) const
Definition physics.cpp:358
void applyImpulse(Vector2 impulse) const
Definition physics.cpp:369
void applyForce(Vector2 force) const
Definition physics.cpp:363
Vector2 getLinearVelocity() const
Definition physics.cpp:374
void save(Archive &ar) const
Definition physics.hpp:304
Definition physics.hpp:58
void save(Archive &ar) const
Definition physics.hpp:73
b2BodyDef bodyDef
Definition physics.hpp:93
std::shared_ptr< Shape > shape
Definition physics.hpp:70
void exit() override
Definition physics.cpp:127
bool sensor
Definition physics.hpp:92
Signal< PhysicsBody * > collisionExit
Definition physics.hpp:66
Signal mouseExited
Definition physics.hpp:69
void initialize() override
Definition physics.cpp:134
Signal< PhysicsBody * > collisionEnter
Definition physics.hpp:65
virtual void initCompute()
Definition physics.cpp:142
b2ShapeId shapeId
Definition physics.hpp:95
virtual void physicsUpdate()=0
Signal mouseEntered
Definition physics.hpp:68
b2ShapeId getShapeId()
Definition physics.hpp:89
b2BodyId getBodyId()
Definition physics.hpp:88
Signal< PhysicsBody * > collisionHit
Definition physics.hpp:67
b2BodyId bodyId
Definition physics.hpp:94
void load(Archive &ar)
Definition physics.hpp:79
Transform storedTransform
Definition physics.hpp:97
Definition physics.hpp:108
PhysicsBody * findBodyFromShape(b2ShapeId id)
Definition physics.cpp:43
friend bool b2callback(b2ShapeId shapeId, void *ctx)
Definition physics.cpp:34
int subSteps
Definition physics.hpp:115
void deRegisterBody(PhysicsBody *body)
Definition physics.cpp:29
Vector2 gravity
Definition physics.hpp:120
void physicsUpdate(float timeStep)
Definition physics.cpp:47
void exit()
Definition physics.cpp:120
b2WorldDef worldDef
Definition physics.hpp:121
void registerBody(PhysicsBody *body)
Definition physics.cpp:24
b2WorldId worldId
Definition physics.hpp:122
Definition physics.hpp:231
Vector2 getLinearVelocity() const
Definition physics.cpp:240
RigidBody()
Definition physics.cpp:181
void lockRotation(bool value)
Definition physics.cpp:260
void initCompute() override
Definition physics.cpp:171
void save(Archive &ar) const
Definition physics.hpp:251
void applyForce(Vector2 force) const
Definition physics.cpp:229
void setPosition(Vector2 pos) const
Definition physics.cpp:212
void physicsUpdate() override
Definition physics.cpp:188
void setAngle(float angle) const
Definition physics.cpp:218
void load(Archive &ar)
Definition physics.hpp:257
void applyImpulse(Vector2 impulse) const
Definition physics.cpp:235
bool isOnGround()
Definition physics.cpp:245
void setLinearVelocity(Vector2 vel) const
Definition physics.cpp:224
Definition signal.hpp:53
Definition physics.hpp:155
void load(Archive &ar)
Definition physics.hpp:173
void physicsUpdate() override
Definition physics.cpp:295
void initCompute() override
Definition physics.cpp:278
void save(Archive &ar) const
Definition physics.hpp:167
void setPosition(Vector2 pos) const
Definition physics.cpp:301
void setAngle(float angle) const
Definition physics.cpp:307
StaticBody()
Definition physics.cpp:288
CEREAL_REGISTER_TYPE(RigidBody)
CEREAL_REGISTER_POLYMORPHIC_RELATION(Component, RigidBody)
bool operator==(const b2ShapeId &a, const b2ShapeId &b) noexcept
Definition physics.hpp:27
Definition components.hpp:21
Definition definitions.hpp:259
Vector2 position
Definition definitions.hpp:260
float getAngleRadians() const
Definition definitions.cpp:142
Definition definitions.hpp:77
std::size_t operator()(const b2ShapeId &id) const noexcept
Definition physics.hpp:17