SleakEngine
0.1.0
C++23 multi-backend game engine
Toggle main menu visibility
Loading...
Searching...
No Matches
PhysicsWorld.hpp
Go to the documentation of this file.
1
#ifndef _PHYSICS_WORLD_HPP_
2
#define _PHYSICS_WORLD_HPP_
3
4
#include <
Physics/Colliders.hpp
>
5
#include <
Physics/CollisionDetection.hpp
>
6
#include <
Physics/DynamicAABBTree.hpp
>
7
#include <vector>
8
#include <cstdint>
9
10
namespace
Sleak
{
11
12
class
ColliderComponent
;
13
14
namespace
Physics
{
15
16
/// Two overlapping colliders and the manifold describing how they overlap.
17
/// @ingroup physics
18
struct
CollisionPair
{
19
ColliderComponent
*
a
=
nullptr
;
20
ColliderComponent
*
b
=
nullptr
;
21
CollisionManifold
manifold
;
22
};
23
24
/// Result of a single Raycast call.
25
/// @ingroup physics
26
struct
RayHit
{
27
bool
hit
=
false
;
28
ColliderComponent
*
collider
=
nullptr
;
29
Vector3D
point
;
30
Vector3D
normal
;
31
float
distance
= 0.0f;
32
};
33
34
/// Result of sweeping a moving shape (e.g. SphereSweep) against the world.
35
/// @ingroup physics
36
struct
SweepResult
{
37
bool
hit
=
false
;
38
ColliderComponent
*
collider
=
nullptr
;
39
Vector3D
point
;
40
Vector3D
normal
;
41
float
distance
= 0.0f;
42
};
43
44
/// Owns the broadphase tree and every registered collider; drives collision detection and resolution each step.
45
///
46
/// Each Scene creates one PhysicsWorld and steps it from its
47
/// update, so you normally reach it with
48
/// SceneBase::GetPhysicsWorld() rather than constructing one. You
49
/// also rarely call RegisterCollider() by hand: adding a
50
/// GameObject that carries a ColliderComponent registers it (and
51
/// its children) automatically.
52
///
53
/// Step() integrates every dynamic RigidbodyComponent using that
54
/// body's own gravity setting, refreshes the DynamicAABBTree
55
/// broadphase, then finds and resolves overlapping pairs.
56
///
57
/// The part you will use directly is the query API. Raycast(),
58
/// SphereSweep(), OverlapSphere(), and OverlapAABB() all take an
59
/// optional `layerMask` that is matched against
60
/// ColliderComponent::GetLayer(), so you can aim a query at exactly
61
/// the kind of object you care about.
62
///
63
/// @code{.cpp}
64
/// auto* world = GetPhysicsWorld();
65
/// if (!world) return;
66
///
67
/// // What is the player looking at, within 5 meters?
68
/// Sleak::Physics::RayHit hit = world->Raycast(
69
/// camera->GetPosition(), camera->GetDirection(), 5.0f);
70
/// if (hit.hit) {
71
/// SLEAK_INFO("Hit {} at {}m",
72
/// hit.collider->GetOwner()->GetName(), hit.distance);
73
/// }
74
///
75
/// // Everything inside a blast radius
76
/// auto caught = world->OverlapSphere(
77
/// Sleak::Math::Vector3D(0.0f, 1.0f, 0.0f), 4.0f);
78
/// for (const auto& pair : caught) {
79
/// ApplyDamage(pair.b->GetOwner());
80
/// }
81
/// @endcode
82
///
83
/// @see ColliderComponent, RigidbodyComponent, DynamicAABBTree,
84
/// RayHit, SweepResult, CollisionPair
85
/// @ingroup physics
86
class
PhysicsWorld
{
87
public
:
88
PhysicsWorld
() =
default
;
89
~PhysicsWorld
() =
default
;
90
91
/// Advances the simulation by dt: integrates each dynamic rigidbody's
92
/// velocity, including its own gravity setting, into position, then
93
/// updates the broadphase and resolves collisions.
94
void
Step
(
float
dt);
95
96
void
RegisterCollider
(
ColliderComponent
* collider);
97
void
UnregisterCollider
(
ColliderComponent
* collider);
98
99
/// Query API: colliders overlapping a sphere, filtered by layerMask.
100
std::vector<CollisionPair>
OverlapSphere
(
const
Vector3D
& center,
float
radius, uint32_t layerMask = 0xFFFFFFFF)
const
;
101
/// Colliders overlapping an AABB, filtered by layerMask.
102
std::vector<CollisionPair>
OverlapAABB
(
const
AABB
& aabb, uint32_t layerMask = 0xFFFFFFFF)
const
;
103
/// Sweeps a sphere from start along direction and returns the first collider it hits within maxDist.
104
SweepResult
SphereSweep
(
const
Vector3D
& start,
const
Vector3D
& direction,
105
float
radius,
float
maxDist, uint32_t layerMask = 0xFFFFFFFF)
const
;
106
/// Casts a ray and returns the closest collider hit within maxDist.
107
RayHit
Raycast
(
const
Vector3D
& origin,
const
Vector3D
& direction,
108
float
maxDist, uint32_t layerMask = 0xFFFFFFFF)
const
;
109
110
private
:
111
void
UpdateBroadphase();
112
void
FindPairsAndResolve();
113
114
DynamicAABBTree
m_tree;
115
std::vector<ColliderComponent*> m_colliders;
116
};
117
118
}
// namespace Physics
119
}
// namespace Sleak
120
121
#endif
// _PHYSICS_WORLD_HPP_
Colliders.hpp
CollisionDetection.hpp
DynamicAABBTree.hpp
Sleak::ColliderComponent
Definition
ColliderComponent.hpp:57
Sleak::Math::Vector3D
Definition
Vector.hpp:354
Sleak::Physics::DynamicAABBTree
Definition
DynamicAABBTree.hpp:29
Sleak::Physics::PhysicsWorld::PhysicsWorld
PhysicsWorld()=default
Sleak::Physics::PhysicsWorld::Step
void Step(float dt)
Definition
PhysicsWorld.cpp:41
Sleak::Physics::PhysicsWorld::OverlapSphere
std::vector< CollisionPair > OverlapSphere(const Vector3D ¢er, float radius, uint32_t layerMask=0xFFFFFFFF) const
Query API: colliders overlapping a sphere, filtered by layerMask.
Definition
PhysicsWorld.cpp:176
Sleak::Physics::PhysicsWorld::RegisterCollider
void RegisterCollider(ColliderComponent *collider)
Definition
PhysicsWorld.cpp:13
Sleak::Physics::PhysicsWorld::UnregisterCollider
void UnregisterCollider(ColliderComponent *collider)
Definition
PhysicsWorld.cpp:27
Sleak::Physics::PhysicsWorld::SphereSweep
SweepResult SphereSweep(const Vector3D &start, const Vector3D &direction, float radius, float maxDist, uint32_t layerMask=0xFFFFFFFF) const
Sweeps a sphere from start along direction and returns the first collider it hits within maxDist.
Definition
PhysicsWorld.cpp:210
Sleak::Physics::PhysicsWorld::Raycast
RayHit Raycast(const Vector3D &origin, const Vector3D &direction, float maxDist, uint32_t layerMask=0xFFFFFFFF) const
Casts a ray and returns the closest collider hit within maxDist.
Definition
PhysicsWorld.cpp:297
Sleak::Physics::PhysicsWorld::OverlapAABB
std::vector< CollisionPair > OverlapAABB(const AABB &aabb, uint32_t layerMask=0xFFFFFFFF) const
Colliders overlapping an AABB, filtered by layerMask.
Definition
PhysicsWorld.cpp:194
Sleak::Physics::PhysicsWorld::~PhysicsWorld
~PhysicsWorld()=default
Sleak::Physics
Collision shapes, the broadphase tree, and the world that steps them.
Definition
SceneBase.hpp:29
Sleak
Root namespace for everything the engine exposes.
Definition
Camera.hpp:10
Sleak::Physics::AABB
Definition
Colliders.hpp:20
Sleak::Physics::CollisionManifold
Definition
CollisionDetection.hpp:19
Sleak::Physics::CollisionPair
Definition
PhysicsWorld.hpp:18
Sleak::Physics::CollisionPair::a
ColliderComponent * a
Definition
PhysicsWorld.hpp:19
Sleak::Physics::CollisionPair::b
ColliderComponent * b
Definition
PhysicsWorld.hpp:20
Sleak::Physics::CollisionPair::manifold
CollisionManifold manifold
Definition
PhysicsWorld.hpp:21
Sleak::Physics::RayHit
Definition
PhysicsWorld.hpp:26
Sleak::Physics::RayHit::hit
bool hit
Definition
PhysicsWorld.hpp:27
Sleak::Physics::RayHit::normal
Vector3D normal
Definition
PhysicsWorld.hpp:30
Sleak::Physics::RayHit::collider
ColliderComponent * collider
Definition
PhysicsWorld.hpp:28
Sleak::Physics::RayHit::distance
float distance
Definition
PhysicsWorld.hpp:31
Sleak::Physics::RayHit::point
Vector3D point
Definition
PhysicsWorld.hpp:29
Sleak::Physics::SweepResult
Definition
PhysicsWorld.hpp:36
Sleak::Physics::SweepResult::collider
ColliderComponent * collider
Definition
PhysicsWorld.hpp:38
Sleak::Physics::SweepResult::normal
Vector3D normal
Definition
PhysicsWorld.hpp:40
Sleak::Physics::SweepResult::distance
float distance
Definition
PhysicsWorld.hpp:41
Sleak::Physics::SweepResult::point
Vector3D point
Definition
PhysicsWorld.hpp:39
Sleak::Physics::SweepResult::hit
bool hit
Definition
PhysicsWorld.hpp:37
include
public
Physics
PhysicsWorld.hpp
Generated on
for SleakEngine by
1.18.0