Monad Engine da02fba2
> Undercity Codex_
Loading...
Searching...
No Matches
PhysicsManager.cpp
Go to the documentation of this file.
1#include "physics/PhysicsManager.h"
2#include "physics/RigidBody.h"
3#include "physics/CollisionObject.h"
4
5#include <btBulletCollisionCommon.h>
6#include <btBulletDynamicsCommon.h>
7
8namespace eng
9{
13
17
19 {
20 m_broadphase = std::make_unique<btDbvtBroadphase>();
21 m_collisionConfig = std::make_unique<btDefaultCollisionConfiguration>();
22 m_dispatcher = std::make_unique<btCollisionDispatcher>(m_collisionConfig.get());
23 m_solver = std::make_unique<btSequentialImpulseConstraintSolver>();
24 m_world = std::make_unique<btDiscreteDynamicsWorld>(
25 m_dispatcher.get(), m_broadphase.get(), m_solver.get(), m_collisionConfig.get()
26 );
27
28 m_world->setGravity(btVector3(0, -9.81f, 0));
29 }
30
31 void PhysicsManager::Update(float deltaTime)
32 {
33 const btScalar fixedTimeStep = 1.0f / 60.0f;
34 const int maxSubsteps = 4;
35 m_world->stepSimulation(deltaTime, maxSubsteps, fixedTimeStep);
36
37 // process collisions
38 auto dispatcher = m_world->getDispatcher();
39 const auto numManifolds = dispatcher->getNumManifolds();
40 for (int i = 0; i < numManifolds; ++i)
41 {
42 auto manifold = dispatcher->getManifoldByIndexInternal(i);
43 if (!manifold)
44 {
45 continue;
46 }
47
48 auto bodyA = reinterpret_cast<CollisionObject*>(manifold->getBody0()->getUserPointer());
49 auto bodyB = reinterpret_cast<CollisionObject*>(manifold->getBody1()->getUserPointer());
50
51 if (!bodyA || !bodyB)
52 {
53 continue;
54 }
55
56 const auto numContacts = manifold->getNumContacts();
57 for (int j = 0; j < numContacts; ++j)
58 {
59 const auto& point = manifold->getContactPoint(j);
60 const glm::vec3 pos(
61 point.m_positionWorldOnB.x(),
62 point.m_positionWorldOnB.y(),
63 point.m_positionWorldOnB.z());
64 const glm::vec3 norm(
65 point.m_normalWorldOnB.x(),
66 point.m_normalWorldOnB.y(),
67 point.m_normalWorldOnB.z());
68
69 bodyA->DispatchContactEvent(bodyB, pos, norm);
70 bodyB->DispatchContactEvent(bodyA, pos, norm);
71 }
72 }
73 }
74
76 {
77 if (!body || !m_world)
78 {
79 return;
80 }
81
82 if (auto rigidBody = body->GetBody())
83 {
84 m_world->addRigidBody(rigidBody, btBroadphaseProxy::StaticFilter,
85 btBroadphaseProxy::AllFilter);
86 body->SetAddedToWorld(true);
87 }
88 }
89
91 {
92 if (!body || !m_world)
93 {
94 return;
95 }
96
97 if (auto rigidBody = body->GetBody())
98 {
99 m_world->removeRigidBody(rigidBody);
100 body->SetAddedToWorld(false);
101 }
102 }
103
104 btDiscreteDynamicsWorld* PhysicsManager::GetWorld()
105 {
106 return m_world.get();
107 }
108}
btDiscreteDynamicsWorld * GetWorld()
void RemoveRigidBody(RigidBody *body)
void Update(float deltaTime)
void AddRigidBody(RigidBody *body)
btRigidBody * GetBody()
Definition RigidBody.cpp:53
void SetAddedToWorld(bool added)
Definition RigidBody.cpp:58