Skip to content

Commit 960e616

Browse files
committed
Add Bullet Physics integration.
1 parent db032bc commit 960e616

File tree

4 files changed

+90
-2
lines changed

4 files changed

+90
-2
lines changed

Makefile

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ NAME = BurntEngine
2323
TARGET = libengine.so.1
2424
SRC = $(sort $(wildcard src/*.cpp))
2525
OBJ = $(SRC:.cpp=.o)
26-
LDFLAGS += -L$(BUILDDIR)/fmt -L$(BUILDDIR)/steam -lGameNetworkingSockets -lassimp -l:libfmt.a -lSDL3 -lvulkan -lfreetype -shared -fno-PIE -Wl,-soname,$(TARGET)
26+
LDFLAGS += -L$(BUILDDIR)/fmt -L$(BUILDDIR)/steam -lGameNetworkingSockets -lassimp -lBulletSoftBody -lBulletDynamics -lBulletCollision -lLinearMath -l:libfmt.a -lSDL3 -lvulkan -lfreetype -shared -fno-PIE -Wl,-soname,$(TARGET)
2727
CXXFLAGS ?= -mtune=generic -march=native
28-
CXXFLAGS += -funroll-all-loops -Iinclude -Iinclude/steam -isystem/usr/include/freetype2 -fPIC -std=c++17 $(VARS)
28+
CXXFLAGS += -funroll-all-loops -Iinclude -Iinclude/steam -I/usr/include/bullet -isystem/usr/include/freetype2 -std=c++17 -fPIC $(VARS)
2929

3030
all: fmt toml gamenetworkingsockets $(TARGET)
3131

compile_flags.txt

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
-Iinclude
22
-Iinclude/steam
3+
-I/usr/include/bullet
34
-isystem/usr/include/freetype2

include/engine.hpp

+24
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
#ifndef ENGINE_HPP
22
#define ENGINE_HPP
33

4+
#include <BulletCollision/BroadphaseCollision/btBroadphaseInterface.h>
5+
#include <BulletCollision/BroadphaseCollision/btDispatcher.h>
6+
#include <BulletCollision/CollisionDispatch/btCollisionConfiguration.h>
7+
#include <BulletDynamics/ConstraintSolver/btConstraintSolver.h>
8+
#include <BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h>
49
#include "camera.hpp"
510
#include "common.hpp"
611
#include "isteamnetworkingsockets.h"
@@ -9,6 +14,9 @@
914
#include "ui/button.hpp"
1015
#include "object.hpp"
1116

17+
#include <LinearMath/btVector3.h>
18+
#include <btBulletDynamicsCommon.h>
19+
1220
#include <future>
1321
#include <mutex>
1422
#include <unordered_map>
@@ -502,6 +510,12 @@ class Engine {
502510

503511
void InitNetworking();
504512

513+
/* Initializes the Bullet Physics engine, Relies on Networking being enabled. */
514+
void InitPhysics();
515+
516+
/* Stops the physics engine. */
517+
void DeinitPhysics();
518+
505519
/* UI::Button listeners will receive events when any button is pressed, along with its ID. */
506520
/* Due to how it works, this function can be called before the renderer is initialized. */
507521
void RegisterUIButtonListener(const std::function<void(std::string)> listener);
@@ -560,6 +574,14 @@ class Engine {
560574
Renderer *m_Renderer = nullptr;
561575
ISteamNetworkingSockets *m_NetworkingSockets;
562576

577+
std::unique_ptr<btCollisionConfiguration> m_CollisionConfig;
578+
std::unique_ptr<btDispatcher> m_Dispatcher;
579+
std::unique_ptr<btBroadphaseInterface> m_Broadphase;
580+
std::unique_ptr<btConstraintSolver> m_Solver;
581+
std::unique_ptr<btDiscreteDynamicsWorld> m_DynamicsWorld;
582+
583+
std::vector<std::shared_ptr<btCollisionShape>> m_CollisionShapes;
584+
563585
/* [0] = client, [1] = server. */
564586
std::array<NetworkingThreadState, 2> m_NetworkingThreadStates;
565587

@@ -600,6 +622,8 @@ class Engine {
600622
m_CallbackInstance->ConnectionStatusChanged(callbackInfo);
601623
}
602624

625+
void PhysicsStep(float deltaTime);
626+
603627
/* Do not set isRecursive to true, This is only there to recursively add objs children BEFORE obj. This is a requirement in the protocol.
604628
* The return is optional (empty if obj is a child and isRecursive == false) but that doesn't mean you have to put it in the statePacket yourself. It's just there incase you want it.
605629
*/

src/engine.cpp

+63
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
#include "engine.hpp"
22

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"
313
#include "camera.hpp"
414
#include "common.hpp"
515
#include "fmt/base.h"
@@ -37,6 +47,7 @@
3747
#include <future>
3848
#include <glm/fwd.hpp>
3949
#include <iterator>
50+
#include <memory>
4051
#include <mutex>
4152
#include <set>
4253
#include <stdexcept>
@@ -2611,6 +2622,8 @@ Engine::~Engine() {
26112622
}
26122623

26132624
GameNetworkingSockets_Kill();
2625+
2626+
DeinitPhysics();
26142627
}
26152628

26162629
void Engine::InitRenderer(Settings &settings, Camera *primaryCamera) {
@@ -2634,6 +2647,48 @@ void Engine::InitNetworking() {
26342647
m_NetworkingSockets = SteamNetworkingSockets();
26352648
}
26362649

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+
26372692
void Engine::RegisterUIButtonListener(const std::function<void(std::string)> listener) {
26382693
m_UIButtonListeners.push_back(listener);
26392694
}
@@ -3671,6 +3726,14 @@ void Engine::DeserializeNetworkingCamera(std::vector<std::byte> &serializedCamer
36713726
Deserialize(serializedCameraPacket, dest.isMainCamera);
36723727
}
36733728

3729+
void Engine::PhysicsStep(float deltaTime) {
3730+
if (!m_DynamicsWorld) {
3731+
return;
3732+
}
3733+
3734+
m_DynamicsWorld->stepSimulation(deltaTime);
3735+
}
3736+
36743737
std::optional<Networking_Object> Engine::AddObjectToStatePacket(Object *object, Networking_StatePacket &statePacket, bool includeChildren, bool isRecursive) {
36753738
if (object->GetParent() != nullptr && !isRecursive) {
36763739
return {};

0 commit comments

Comments
 (0)