Hymn to Beauty
C++ 3D Engine
PhysicsManager.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <functional>
4#include <glm/glm.hpp>
5#include <memory>
6#include <Utility/LockBox.hpp>
7#include <vector>
8#include "../Entity/ComponentContainer.hpp"
9
10namespace Component {
11class RigidBody;
12class Shape;
13} // namespace Component
14
15namespace Physics {
16class Shape;
17class Trigger;
18} // namespace Physics
19
20class btBroadphaseInterface;
21class btDefaultCollisionConfiguration;
22class btCollisionDispatcher;
23class btSequentialImpulseConstraintSolver;
24class btDiscreteDynamicsWorld;
25class Entity;
26
29 friend class Hub;
30
31 public:
33
36 void Update(float deltaTime);
37
41
43
48 void OnTriggerEnter(Utility::LockBox<Physics::Trigger> trigger, Component::RigidBody* object, std::function<void()> callback);
49
51
56
58
63 void OnTriggerRetain(Utility::LockBox<Physics::Trigger> trigger, Component::RigidBody* object, std::function<void()> callback);
64
66
71
73
78 void OnTriggerLeave(Utility::LockBox<Physics::Trigger> trigger, Component::RigidBody* object, std::function<void()> callback);
79
81
86
88
93
95
100
103
107 Utility::LockBox<Physics::Trigger> CreateTrigger(std::shared_ptr<Physics::Shape> shape);
108
111
115
117
121 void SetPosition(Utility::LockBox<Physics::Trigger> trigger, const glm::vec3& position);
122
124
128 void SetShape(Component::Shape* comp, std::shared_ptr<::Physics::Shape> shape);
129
131
135 float GetMass(Component::RigidBody* comp);
136
138
142 void SetShape(Utility::LockBox<Physics::Trigger> trigger, std::shared_ptr<Physics::Shape> shape);
143
145
149 void SetMass(Component::RigidBody* comp, float mass);
150
152
156 void SetFriction(Component::RigidBody* comp, float friction);
157
160
164 void SetRollingFriction(Component::RigidBody* comp, float friction);
165
168
172 void SetSpinningFriction(Component::RigidBody* comp, float friction);
173
175
179 void SetRestitution(Component::RigidBody* comp, float cor);
180
182
186 void SetLinearDamping(Component::RigidBody* comp, float damping);
187
189
193 void SetAngularDamping(Component::RigidBody* comp, float damping);
194
197
201
203
207
209
215 void SetGhost(Component::RigidBody* comp, bool ghost);
216
219
223
225
229
231
234 const std::vector<Component::Shape*>& GetShapeComponents() const;
235
238
240
243 btDiscreteDynamicsWorld* GetDynamicsWorld();
244
245 private:
248 PhysicsManager(PhysicsManager const&) = delete;
249 void operator=(PhysicsManager const&) = delete;
250
251 glm::vec3 gravity = glm::vec3(0.f, -9.82f, 0.f);
252
255
256 btBroadphaseInterface* broadphase = nullptr;
257 btDefaultCollisionConfiguration* collisionConfiguration = nullptr;
258 btCollisionDispatcher* dispatcher = nullptr;
259 btSequentialImpulseConstraintSolver* solver = nullptr;
260 btDiscreteDynamicsWorld* dynamicsWorld = nullptr;
261
262 std::shared_ptr<Utility::LockBox<Physics::Trigger>::Key> triggerLockBoxKey;
263 std::vector<::Physics::Trigger*> triggers;
264};
Component that allows interacting with other physics components.
Definition: RigidBody.hpp:19
Definition: Shape.hpp:15
Stores components.
Definition: ComponentContainer.hpp:7
Entity containing various components.
Definition: Entity.hpp:16
Singleton class that holds all subsystems.
Definition: Managers.hpp:16
Updates the physics of the world.
Definition: PhysicsManager.hpp:28
Utility::LockBox< Physics::Trigger > CreateTrigger(std::shared_ptr< Physics::Shape > shape)
Definition: PhysicsManager.cpp:171
void ForgetTriggerLeave(Utility::LockBox< Physics::Trigger > trigger, Component::RigidBody *object)
Stop listening for when |object| has left |trigger|.
Definition: PhysicsManager.cpp:131
void SetRollingFriction(Component::RigidBody *comp, float friction)
Definition: PhysicsManager.cpp:225
void Update(float deltaTime)
Moves entities and updates the physics component.
Definition: PhysicsManager.cpp:50
void SetGhost(Component::RigidBody *comp, bool ghost)
Enables/disables ghost functionality on a rigid body.
Definition: PhysicsManager.cpp:268
void SetRestitution(Component::RigidBody *comp, float cor)
Set the restitution (bounciness) of a Component::RigidBody component.
Definition: PhysicsManager.cpp:233
void OnTriggerRetain(Utility::LockBox< Physics::Trigger > trigger, Component::RigidBody *object, std::function< void()> callback)
Set up listener for when |object| is intersecting |trigger|.
Definition: PhysicsManager.cpp:117
void ForgetTriggerRetain(Utility::LockBox< Physics::Trigger > trigger, Component::RigidBody *object)
Stop listening for when |object| is intersecting |trigger|.
Definition: PhysicsManager.cpp:122
void ClearKilledComponents()
Remove all killed components.
Definition: PhysicsManager.cpp:292
Component::RigidBody * CreateRigidBody(Entity *owner)
Create rigid body component.
Definition: PhysicsManager.cpp:135
void ForgetTriggerEnter(Utility::LockBox< Physics::Trigger > trigger, Component::RigidBody *object)
Stop listening for when |object| has entered |trigger|.
Definition: PhysicsManager.cpp:113
void MakeKinematic(Component::RigidBody *comp)
Definition: PhysicsManager.cpp:245
void SetFriction(Component::RigidBody *comp, float friction)
Set the friction coefficient of a Component::RigidBody component.
Definition: PhysicsManager.cpp:221
void SetMass(Component::RigidBody *comp, float mass)
Set the mass of a Component::RigidBody component.
Definition: PhysicsManager.cpp:214
const std::vector< Component::Shape * > & GetShapeComponents() const
Get all shape components.
Definition: PhysicsManager.cpp:288
btDiscreteDynamicsWorld * GetDynamicsWorld()
Get the Bullet dynamics world.
Definition: PhysicsManager.cpp:302
void UpdateEntityTransforms()
Definition: PhysicsManager.cpp:94
void SetAngularDamping(Component::RigidBody *comp, float damping)
Set the angular damping factor of a Component::RigidBody component.
Definition: PhysicsManager.cpp:241
void ReleaseTriggerVolume(Utility::LockBox< Physics::Trigger > &&trigger)
Definition: PhysicsManager.cpp:179
void ForceTransformSync(Component::RigidBody *comp)
Definition: PhysicsManager.cpp:280
void OnTriggerEnter(Utility::LockBox< Physics::Trigger > trigger, Component::RigidBody *object, std::function< void()> callback)
Set up listener for when |object| has entered |trigger|.
Definition: PhysicsManager.cpp:108
Component::Shape * CreateShape(Entity *owner)
Create a component that represents a physical shape.
Definition: PhysicsManager.cpp:151
void SetLinearDamping(Component::RigidBody *comp, float damping)
Set the linear damping factor of a Component::RigidBody component.
Definition: PhysicsManager.cpp:237
void SetSpinningFriction(Component::RigidBody *comp, float friction)
Definition: PhysicsManager.cpp:229
void HaltMovement(Component::RigidBody *comp)
Halts movement of a kinematic rigid body.
Definition: PhysicsManager.cpp:284
void MakeDynamic(Component::RigidBody *comp)
Turn a rigid body into a dynamic object.
Definition: PhysicsManager.cpp:257
void SetShape(Component::Shape *comp, std::shared_ptr<::Physics::Shape > shape)
Set the shape of a given Component::Shape component.
Definition: PhysicsManager.cpp:198
void SetPosition(Utility::LockBox< Physics::Trigger > trigger, const glm::vec3 &position)
Set the position of a trigger volume.
Definition: PhysicsManager.cpp:194
float GetMass(Component::RigidBody *comp)
Get the mass of a rigid body component.
Definition: PhysicsManager.cpp:206
void OnTriggerLeave(Utility::LockBox< Physics::Trigger > trigger, Component::RigidBody *object, std::function< void()> callback)
Set up listener for when |object| has left |trigger|.
Definition: PhysicsManager.cpp:126
Definition: LockBox.hpp:16
Definition: BoxShapeEditor.hpp:5
Definition: IShapeEditor.hpp:7