1
1
#include " engine.hpp"
2
2
3
+ #include " BulletCollision/BroadphaseCollision/btDbvtBroadphase.h"
4
+ #include " BulletCollision/BroadphaseCollision/btDispatcher.h"
5
+ #include " BulletCollision/CollisionDispatch/btCollisionConfiguration.h"
6
+ #include " BulletCollision/CollisionDispatch/btCollisionObject.h"
7
+ #include " BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h"
8
+ #include " BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h"
9
+ #include " BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h"
10
+ #include " BulletDynamics/Dynamics/btDynamicsWorld.h"
11
+ #include " BulletDynamics/Dynamics/btRigidBody.h"
12
+ #include " LinearMath/btVector3.h"
3
13
#include " camera.hpp"
4
14
#include " common.hpp"
5
15
#include " fmt/base.h"
37
47
#include < future>
38
48
#include < glm/fwd.hpp>
39
49
#include < iterator>
50
+ #include < memory>
40
51
#include < mutex>
41
52
#include < set>
42
53
#include < stdexcept>
@@ -2611,6 +2622,8 @@ Engine::~Engine() {
2611
2622
}
2612
2623
2613
2624
GameNetworkingSockets_Kill ();
2625
+
2626
+ DeinitPhysics ();
2614
2627
}
2615
2628
2616
2629
void Engine::InitRenderer (Settings &settings, Camera *primaryCamera) {
@@ -2634,6 +2647,48 @@ void Engine::InitNetworking() {
2634
2647
m_NetworkingSockets = SteamNetworkingSockets ();
2635
2648
}
2636
2649
2650
+ void Engine::InitPhysics () {
2651
+ m_CollisionConfig = std::make_unique<btDefaultCollisionConfiguration>();
2652
+ m_Dispatcher = std::make_unique<btCollisionDispatcher>(m_CollisionConfig.get ());
2653
+ m_Broadphase = std::make_unique<btDbvtBroadphase>();
2654
+ m_Solver = std::make_unique<btSequentialImpulseConstraintSolver>();
2655
+
2656
+ m_DynamicsWorld = std::make_unique<btDiscreteDynamicsWorld>(m_Dispatcher.get (), m_Broadphase.get (), m_Solver.get (), m_CollisionConfig.get ());
2657
+
2658
+ m_DynamicsWorld->setGravity (btVector3 (0 , -10 , 0 ));
2659
+ }
2660
+
2661
+ void Engine::DeinitPhysics () {
2662
+ if (m_DynamicsWorld) {
2663
+ while (m_DynamicsWorld->getNumConstraints () > 0 ) {
2664
+ m_DynamicsWorld->removeConstraint (m_DynamicsWorld->getConstraint (0 ));
2665
+ }
2666
+
2667
+ btCollisionObjectArray &array = m_DynamicsWorld->getCollisionObjectArray ();
2668
+
2669
+ while (array.size () > 0 ) {
2670
+ btCollisionObject *obj = array[0 ];
2671
+ btRigidBody *rigidBody = btRigidBody::upcast (obj);
2672
+
2673
+ if (rigidBody && rigidBody->getMotionState ()) {
2674
+ delete rigidBody->getMotionState ();
2675
+ }
2676
+
2677
+ m_DynamicsWorld->removeCollisionObject (obj);
2678
+ delete obj;
2679
+ }
2680
+ }
2681
+
2682
+ /* I love smart pointers :D */
2683
+ m_CollisionShapes.clear ();
2684
+
2685
+ m_DynamicsWorld.reset ();
2686
+ m_Solver.reset ();
2687
+ m_Broadphase.reset ();
2688
+ m_Dispatcher.reset ();
2689
+ m_CollisionConfig.reset ();
2690
+ }
2691
+
2637
2692
void Engine::RegisterUIButtonListener (const std::function<void (std::string)> listener) {
2638
2693
m_UIButtonListeners.push_back (listener);
2639
2694
}
@@ -3671,6 +3726,14 @@ void Engine::DeserializeNetworkingCamera(std::vector<std::byte> &serializedCamer
3671
3726
Deserialize (serializedCameraPacket, dest.isMainCamera );
3672
3727
}
3673
3728
3729
+ void Engine::PhysicsStep (float deltaTime) {
3730
+ if (!m_DynamicsWorld) {
3731
+ return ;
3732
+ }
3733
+
3734
+ m_DynamicsWorld->stepSimulation (deltaTime);
3735
+ }
3736
+
3674
3737
std::optional<Networking_Object> Engine::AddObjectToStatePacket (Object *object, Networking_StatePacket &statePacket, bool includeChildren, bool isRecursive) {
3675
3738
if (object->GetParent () != nullptr && !isRecursive) {
3676
3739
return {};
0 commit comments