Stowy Physics Engine 0.1.0
Loading...
Searching...
No Matches
Collider.hpp
Go to the documentation of this file.
1
11#pragma once
12
13#include <array>
14
15#include "Manifold.hpp"
16#include "Projection.hpp"
17#include "Transform.hpp"
18
19#include "math/Vector2.hpp"
20
21namespace stw
22{
23class CircleCollider;
24class BoxCollider;
25class AabbCollider;
26
31{
32 public:
33 Collider() = default;
34 Collider(Collider &&col) noexcept = default;
35 virtual ~Collider() = default;
36 Collider &operator=(Collider &&col) = default;
37 Collider &operator=(const Collider &col) = default;
38 Collider(const Collider &col) = default;
39
44
52 virtual Manifold TestCollision(const Transform *transform, const Collider *collider,
53 const Transform *colliderTransform) const = 0;
54
62 virtual Manifold TestCollision(const Transform *transform, const BoxCollider *collider,
63 const Transform *boxTransform) const = 0;
64
72 virtual Manifold TestCollision(const Transform *transform, const CircleCollider *collider,
73 const Transform *circleTransform) const = 0;
74
82 virtual Manifold TestCollision(const Transform *transform, const AabbCollider *collider,
83 const Transform *aabbTransform) const = 0;
84
91 [[nodiscard]] virtual Vector2 FindFurthestPoint(const Transform *transform, const Vector2 &direction) const = 0;
92
97 [[nodiscard]] virtual Vector2 GetBoundingBoxSize() const = 0;
98};
99
103class BoxCollider final : public Collider
104{
105 public:
109 float halfWidth = 0;
113 float halfHeight = 0;
114
115 Manifold TestCollision(const Transform *transform, const Collider *collider,
116 const Transform *colliderTransform) const override;
117
118 Manifold TestCollision(const Transform *transform, const BoxCollider *collider,
119 const Transform *boxTransform) const override;
120
121 Manifold TestCollision(const Transform *transform, const CircleCollider *collider,
122 const Transform *circleTransform) const override;
123
124 Manifold TestCollision(const Transform *transform, const AabbCollider *collider,
125 const Transform *circleTransform) const override;
126
127 [[nodiscard]] Vector2 FindFurthestPoint(const Transform *transform, const Vector2 &direction) const override;
128
134 [[nodiscard]] std::array<Vector2, 4> GetTransformedVertices(const Transform &transform) const;
135
140 [[nodiscard]] std::array<Vector2, 4> GetVertices() const;
141
142 [[nodiscard]] static Projection Project(const Vector2 &axis, const std::array<Vector2, 4> &vertices);
143 [[nodiscard]] static std::array<Vector2, 4> GetAxes(const std::array<Vector2, 4> &vertices);
144
145 [[nodiscard]] Vector2 GetBoundingBoxSize() const override;
146};
147
151class CircleCollider final : public Collider
152{
153 public:
157 float radius = 0;
158
159 CircleCollider() = default;
160 CircleCollider(float radius);
161
162 Manifold TestCollision(const Transform *transform, const Collider *collider,
163 const Transform *colliderTransform) const override;
164
165 Manifold TestCollision(const Transform *transform, const BoxCollider *collider,
166 const Transform *boxTransform) const override;
167
168 Manifold TestCollision(const Transform *transform, const CircleCollider *collider,
169 const Transform *circleTransform) const override;
170
171 Manifold TestCollision(const Transform *transform, const AabbCollider *collider,
172 const Transform *aabbTransform) const override;
173
174 [[nodiscard]] Vector2 FindFurthestPoint(const Transform *transform, const Vector2 &direction) const override;
175 [[nodiscard]] Vector2 GetBoundingBoxSize() const override;
176};
177
181class AabbCollider final : public Collider
182{
183 public:
187 float halfWidth = 0;
191 float halfHeight = 0;
192
193 Manifold TestCollision(const Transform *transform, const Collider *collider,
194 const Transform *colliderTransform) const override;
195 Manifold TestCollision(const Transform *transform, const BoxCollider *collider,
196 const Transform *boxTransform) const override;
197 Manifold TestCollision(const Transform *transform, const CircleCollider *collider,
198 const Transform *circleTransform) const override;
199 Manifold TestCollision(const Transform *transform, const AabbCollider *collider,
200 const Transform *aabbTransform) const override;
201 [[nodiscard]] Vector2 FindFurthestPoint(const Transform *transform, const Vector2 &direction) const override;
202 [[nodiscard]] Vector2 GetBoundingBoxSize() const override;
203};
204} // namespace stw
Contains the Manifold class.
Contains the Projection struct.
Contains the Transform struct.
Contains the Vector2 struct.
An Axis Aligned Bounding Box collider.
Definition Collider.hpp:182
Manifold TestCollision(const Transform *transform, const Collider *collider, const Transform *colliderTransform) const override
Tests the collision against a generic collider.
Definition Collider.cpp:171
float halfHeight
Half of the height of the box.
Definition Collider.hpp:191
Vector2 FindFurthestPoint(const Transform *transform, const Vector2 &direction) const override
Find the furthest point in the specified direction.
Definition Collider.cpp:196
Vector2 GetBoundingBoxSize() const override
Gets the size of the box that surrounds the collider.
Definition Collider.cpp:201
float halfWidth
Half of the width of the box.
Definition Collider.hpp:187
A rotatable box collider.
Definition Collider.hpp:104
Manifold TestCollision(const Transform *transform, const Collider *collider, const Transform *colliderTransform) const override
Tests the collision against a generic collider.
Definition Collider.cpp:14
Vector2 FindFurthestPoint(const Transform *transform, const Vector2 &direction) const override
Find the furthest point in the specified direction.
Definition Collider.cpp:39
float halfHeight
Half of the height of the box.
Definition Collider.hpp:113
float halfWidth
Half of the width of the box.
Definition Collider.hpp:109
std::array< Vector2, 4 > GetTransformedVertices(const Transform &transform) const
Gets the transformed vertices of the box.
Definition Collider.cpp:104
static std::array< Vector2, 4 > GetAxes(const std::array< Vector2, 4 > &vertices)
Definition Collider.cpp:83
std::array< Vector2, 4 > GetVertices() const
Gets the untransformed vertices of the box.
Definition Collider.cpp:57
Vector2 GetBoundingBoxSize() const override
Gets the size of the box that surrounds the collider.
Definition Collider.cpp:99
static Projection Project(const Vector2 &axis, const std::array< Vector2, 4 > &vertices)
Definition Collider.cpp:62
A circle collider.
Definition Collider.hpp:152
Manifold TestCollision(const Transform *transform, const Collider *collider, const Transform *colliderTransform) const override
Tests the collision against a generic collider.
Definition Collider.cpp:135
Vector2 FindFurthestPoint(const Transform *transform, const Vector2 &direction) const override
Find the furthest point in the specified direction.
Definition Collider.cpp:159
CircleCollider()=default
Vector2 GetBoundingBoxSize() const override
Gets the size of the box that surrounds the collider.
Definition Collider.cpp:164
float radius
Radius of the circle.
Definition Collider.hpp:157
A pure virtual struct that represents colliders.
Definition Collider.hpp:31
Collider(Collider &&col) noexcept=default
Collider & operator=(const Collider &col)=default
Collider(const Collider &col)=default
virtual ~Collider()=default
virtual Vector2 FindFurthestPoint(const Transform *transform, const Vector2 &direction) const =0
Find the furthest point in the specified direction.
virtual Vector2 GetBoundingBoxSize() const =0
Gets the size of the box that surrounds the collider.
Collider()=default
virtual Manifold TestCollision(const Transform *transform, const AabbCollider *collider, const Transform *aabbTransform) const =0
Tests the collision against a aabb collider.
virtual Manifold TestCollision(const Transform *transform, const Collider *collider, const Transform *colliderTransform) const =0
Tests the collision against a generic collider.
virtual Manifold TestCollision(const Transform *transform, const BoxCollider *collider, const Transform *boxTransform) const =0
Tests the collision against a box collider.
Vector2 center
The center of the collider.
Definition Collider.hpp:43
Collider & operator=(Collider &&col)=default
virtual Manifold TestCollision(const Transform *transform, const CircleCollider *collider, const Transform *circleTransform) const =0
Tests the collision against a circle collider.
Definition BroadPhaseGrid.hpp:18
Definition Manifold.hpp:20
Definition Projection.hpp:16
A transform of an object. Contains position, scale and rotation.
Definition Transform.hpp:22
A struct representing a 2D Vector.
Definition Vector2.hpp:21