Calamity Engine 1.0.0
A cross-platform 2D game engine written in C++ and SDL3.
Loading...
Searching...
No Matches
definitions.hpp
Go to the documentation of this file.
1#pragma once
2#include <cereal/types/polymorphic.hpp>
3
4#include "../../core/definitions.hpp"
5#include "../../utils/logger.hpp"
6#include "../../core/node/components.hpp"
7
8class PhysicsBody;
9
16{
17public:
18 float density = 1.0f;
19 float friction = 0.3f;
20 float restitution = 0.0f;
21 float rollingResistance = 0.0f;
22 float tangentSpeed = 0.0f;
23
24 template <class Archive>
25 void serialize(Archive &ar)
26 {
27 ar(CEREAL_NVP(density), CEREAL_NVP(friction), CEREAL_NVP(restitution), CEREAL_NVP(rollingResistance), CEREAL_NVP(tangentSpeed));
28 }
29};
30
48class Shape
49{
50public:
51 virtual ~Shape() = default;
52 b2ShapeDef shapeDef;
54
55 void applyMaterial(const Material &material);
56
57 Shape *setSensor(bool sensor)
58 {
59 Logger::debug("Setting sensor to {}", sensor);
60 shapeDef.isSensor = sensor;
61 shapeDef.enableSensorEvents = sensor;
62 isSensor = sensor;
63 return this;
64 }
65
66 template <class Archive>
67 void save(Archive &ar) const
68 {
69 ar(CEREAL_NVP(material), CEREAL_NVP(origin), CEREAL_NVP(isSensor));
70 }
71
72 template <class Archive>
73 void load(Archive &ar)
74 {
75 ar(CEREAL_NVP(material), CEREAL_NVP(origin), CEREAL_NVP(isSensor));
76 }
77
78protected:
79 void postLoad()
80 {
81 if (isSensor)
82 {
83 setSensor(true);
84 }
85
86 applyMaterial(material);
87 }
88
89private:
90 bool isSensor = false;
91 Material material;
92};
93
94class BoxShape : public Shape
95{
96public:
97 BoxShape() = default;
98 BoxShape(Vector2 size, Vector2 origin = {0.5f, 0.5f});
100
103
104 template <class Archive>
105 void save(Archive &ar) const
106 {
107 ar(cereal::base_class<Shape>(this), CEREAL_NVP(size), CEREAL_NVP(scaledPolygon), CEREAL_NVP(polygon));
108 }
109
110 template <class Archive>
111 void load(Archive &ar)
112 {
113 ar(cereal::base_class<Shape>(this), CEREAL_NVP(size), CEREAL_NVP(scaledPolygon), CEREAL_NVP(polygon));
114
115 // just reconstruct everything from size and center like the constructor does
116 Vector2 calculatedCenter = (origin - Vector2{0.5f, 0.5f}) * size;
117 b2Rot rotation = {cos(0.0f), sin(0.0f)};
118
119 b2Polygon poly = b2MakeOffsetBox(size.x / 2 * PhysicsConstants::scale, size.y / 2 * PhysicsConstants::scale, (calculatedCenter * PhysicsConstants::scale), rotation);
120 b2Polygon polyUnscaled = b2MakeOffsetBox(size.x / 2, size.y / 2, calculatedCenter, rotation);
121
122 this->polygon = static_cast<Polygon>(polyUnscaled);
123 this->scaledPolygon = static_cast<Polygon>(poly);
124 this->shapeDef = b2DefaultShapeDef();
125
126 postLoad();
127 }
128};
129
130class SegmentShape : public Shape
131{
132public:
133 SegmentShape() = default;
134 SegmentShape(Vector2 point1, Vector2 point2);
135
138
139 template <class Archive>
140 void save(Archive &ar) const
141 {
142 ar(cereal::base_class<Shape>(this), CEREAL_NVP(segment), CEREAL_NVP(scaledSegment));
143 }
144
145 template <class Archive>
146 void load(Archive &ar)
147 {
148 ar(cereal::base_class<Shape>(this), CEREAL_NVP(segment), CEREAL_NVP(scaledSegment));
149 this->shapeDef = b2DefaultShapeDef();
150
151 postLoad();
152 }
153};
154
155class CircleShape : public Shape
156{
157public:
158 CircleShape() = default;
159 CircleShape(float radius, Vector2 center = {0, 0}, Vector2 origin = {0.5f, 0.5f});
160 float radius{};
161
164
165 template <class Archive>
166 void save(Archive &ar) const
167 {
168 ar(cereal::base_class<Shape>(this), CEREAL_NVP(radius), CEREAL_NVP(circle));
169 }
170
171 template <class Archive>
172 void load(Archive &ar)
173 {
174 ar(cereal::base_class<Shape>(this), CEREAL_NVP(radius), CEREAL_NVP(circle));
175 this->shapeDef = b2DefaultShapeDef();
176 postLoad();
177 }
178};
179
180class CapsuleShape : public Shape
181{
182public:
183 CapsuleShape() = default;
184 CapsuleShape(Vector2 center1, Vector2 center2, float radius, Vector2 origin);
185
188
189 template <class Archive>
190 void save(Archive &ar) const
191 {
192 ar(cereal::base_class<Shape>(this), CEREAL_NVP(capsule), CEREAL_NVP(scaledCapsule));
193 }
194
195 template <class Archive>
196 void load(Archive &ar)
197 {
198 ar(cereal::base_class<Shape>(this), CEREAL_NVP(capsule), CEREAL_NVP(scaledCapsule));
199 this->shapeDef = b2DefaultShapeDef();
200 postLoad();
201 }
202};
203
204class PolygonShape : public Shape
205{
206public:
207 PolygonShape() = default;
208 PolygonShape(std::vector<Vector2> points);
209
212
213 template <class Archive>
214 void save(Archive &ar) const
215 {
216 ar(cereal::base_class<Shape>(this), CEREAL_NVP(scaledPolygon), CEREAL_NVP(polygon));
217 }
218
219 template <class Archive>
220 void load(Archive &ar)
221 {
222 ar(cereal::base_class<Shape>(this), CEREAL_NVP(scaledPolygon), CEREAL_NVP(polygon));
223 this->shapeDef = b2DefaultShapeDef();
224 postLoad();
225 }
226};
227
252class ShapeSprite : public Component
253{
254public:
256 explicit ShapeSprite(const std::shared_ptr<Shape> &shape);
257
258 Vector2 origin = {0.5f, 0.5f};
259 std::shared_ptr<Shape> shape;
260 bool visible = true;
261 // int zIndex = 1;
262 bool screenSpace = false;
264
265 void render(std::shared_ptr<Window> window) override;
266
267 template <class Archive>
268 void save(Archive &ar) const
269 {
270 ar(CEREAL_NVP(origin), CEREAL_NVP(shape), CEREAL_NVP(visible), CEREAL_NVP(screenSpace), CEREAL_NVP(modulate));
271 }
272
273 template <class Archive>
274 void load(Archive &ar)
275 {
276 ar(CEREAL_NVP(origin), CEREAL_NVP(shape), CEREAL_NVP(visible), CEREAL_NVP(screenSpace), CEREAL_NVP(modulate));
277 }
278};
279
288{
290
292 Vector2 normal = {0.0f, 0.0f};
293 Vector2 point = {0.0f, 0.0f};
294 float fraction = 0.0f;
295 bool hit = false;
296};
297
316{
317public:
319
321 float maxDistance = 500.0f;
322
324
325 template <class Archive>
326 void serialize(Archive &ar)
327 {
328 ar(CEREAL_NVP(transform));
329 }
330};
331
334
337
340
343
346
Definition definitions.hpp:95
void load(Archive &ar)
Definition definitions.hpp:111
Polygon scaledPolygon
Definition definitions.hpp:101
void save(Archive &ar) const
Definition definitions.hpp:105
Polygon polygon
Definition definitions.hpp:102
Vector2 size
Definition definitions.hpp:99
BoxShape()=default
Definition definitions.hpp:181
CapsuleShape()=default
void save(Archive &ar) const
Definition definitions.hpp:190
void load(Archive &ar)
Definition definitions.hpp:196
Capsule capsule
Definition definitions.hpp:186
Capsule scaledCapsule
Definition definitions.hpp:187
Definition definitions.hpp:156
CircleShape()=default
float radius
Definition definitions.hpp:160
Circle circle
Definition definitions.hpp:162
Circle scaledCircle
Definition definitions.hpp:163
void save(Archive &ar) const
Definition definitions.hpp:166
void load(Archive &ar)
Definition definitions.hpp:172
Definition definitions.hpp:41
static const Color WHITE
Definition definitions.hpp:58
static void debug(fmt::format_string< Args... > fmt, Args &&...args)
Definition logger.hpp:43
Definition definitions.hpp:16
float density
Definition definitions.hpp:18
float tangentSpeed
Definition definitions.hpp:22
float rollingResistance
Definition definitions.hpp:21
float friction
Definition definitions.hpp:19
void serialize(Archive &ar)
Definition definitions.hpp:25
float restitution
Definition definitions.hpp:20
Definition physics.hpp:58
Definition definitions.hpp:205
void load(Archive &ar)
Definition definitions.hpp:220
PolygonShape()=default
Polygon scaledPolygon
Definition definitions.hpp:211
Polygon polygon
Definition definitions.hpp:210
void save(Archive &ar) const
Definition definitions.hpp:214
Definition definitions.hpp:316
void serialize(Archive &ar)
Definition definitions.hpp:326
RaycastResult calculate()
Definition definitions.cpp:121
float maxDistance
Definition definitions.hpp:321
Raycast(float maxDistance=500.0f)
Definition definitions.hpp:318
Transform transform
Definition definitions.hpp:320
Definition definitions.hpp:131
Segment segment
Definition definitions.hpp:136
void save(Archive &ar) const
Definition definitions.hpp:140
Segment scaledSegment
Definition definitions.hpp:137
SegmentShape()=default
void load(Archive &ar)
Definition definitions.hpp:146
Definition definitions.hpp:253
void save(Archive &ar) const
Definition definitions.hpp:268
void load(Archive &ar)
Definition definitions.hpp:274
bool screenSpace
Definition definitions.hpp:262
bool visible
Definition definitions.hpp:260
Vector2 origin
Definition definitions.hpp:258
Color modulate
Definition definitions.hpp:263
void render(std::shared_ptr< Window > window) override
Definition definitions.cpp:102
std::shared_ptr< Shape > shape
Definition definitions.hpp:259
Definition definitions.hpp:49
void save(Archive &ar) const
Definition definitions.hpp:67
void applyMaterial(const Material &material)
Definition physics.cpp:7
Shape * setSensor(bool sensor)
Definition definitions.hpp:57
void load(Archive &ar)
Definition definitions.hpp:73
void postLoad()
Definition definitions.hpp:79
Vector2 origin
Definition definitions.hpp:53
b2ShapeDef shapeDef
Definition definitions.hpp:52
virtual ~Shape()=default
CEREAL_REGISTER_POLYMORPHIC_RELATION(Shape, BoxShape)
CEREAL_REGISTER_TYPE(BoxShape)
Definition definitions.hpp:459
Definition definitions.hpp:438
Definition components.hpp:21
static constexpr float scale
Definition definitions.hpp:21
Definition definitions.hpp:413
Definition definitions.hpp:288
Vector2 normal
Definition definitions.hpp:292
float fraction
Definition definitions.hpp:294
Vector2 point
Definition definitions.hpp:293
RaycastResult()
Definition definitions.hpp:289
bool hit
Definition definitions.hpp:295
PhysicsBody * physicsBody
Definition definitions.hpp:291
Definition definitions.hpp:481
Definition definitions.hpp:259
Definition definitions.hpp:77
float x
Definition definitions.hpp:78
float y
Definition definitions.hpp:79