summaryrefslogtreecommitdiff
path: root/src/physics.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-12-21 17:44:03 -0500
committerJonathan Bradley <jcb@pikum.xyz>2023-12-23 11:42:23 -0500
commitfa7fc343a0e444da72938fad58d219cf52228976 (patch)
tree24630be0c54f9768a13f32c5970558768e343543 /src/physics.cpp
parent6fa3b137c74536d2bab77f3309ca5b4c60953fe0 (diff)
plugin checkpoint - multiple plugins and collision callbacks
Diffstat (limited to 'src/physics.cpp')
-rw-r--r--src/physics.cpp32
1 files changed, 30 insertions, 2 deletions
diff --git a/src/physics.cpp b/src/physics.cpp
index e960059..4825955 100644
--- a/src/physics.cpp
+++ b/src/physics.cpp
@@ -3,6 +3,7 @@
#include "components.hpp"
#include "dynamic-array.hpp"
+#include "ecs.hpp"
#include "game-settings.hpp"
#include <LinearMath/btAlignedAllocator.h>
@@ -26,6 +27,11 @@ btCollisionDispatcher *btDispatcher = nullptr;
btBroadphaseInterface *btBroadphase = nullptr;
btConstraintSolver *btSolver = nullptr;
+struct EntityCollision {
+ EntityHandle a, b;
+};
+PkeArray<EntityCollision> collisionsThisTick{};
+
void *pke_btAlignedAllocFunc(size_t size, int alignment) {
void *ptr = Pke_New(size, alignment, MemBkt_Bullet);
bulletAllocs->Push({ptr, size});
@@ -68,8 +74,25 @@ void pke_btFreeFunc(void *memBlock) {
struct CollisionHandlerStruct : public btOverlapFilterCallback {
~CollisionHandlerStruct() override {}
bool needBroadphaseCollision(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1) const override {
- return (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) ||
+ auto collided = (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) |
(proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask);
+ if (collided) {
+ const auto *col0 = static_cast<btCollisionObject *>(proxy0->m_clientObject);
+ const auto *col1 = static_cast<btCollisionObject *>(proxy1->m_clientObject);
+ if (col0 && col1) {
+ EntityHandle ent0{};
+ ent0.hash = reinterpret_cast<uint64_t>(col0->getUserPointer());
+ EntityHandle ent1{};
+ ent1.hash = reinterpret_cast<uint64_t>(col1->getUserPointer());
+ if (ent0 != EntityHandle_MAX && ent1 != EntityHandle_MAX) {
+ PkeArray_Add<EntityCollision>(&collisionsThisTick, {
+ .a = ent0,
+ .b = ent1,
+ });
+ }
+ }
+ }
+ return collided;
}
} collisionHandlerStruct;
@@ -102,7 +125,12 @@ void Physics_Init() {
int32_t Physics_Tick(double delta) {
if (pkeSettings.isSimulationPaused == true)
return 0;
- return BtDynamicsWorld->stepSimulation(delta, 1);
+ PkeArray_SoftReset(&collisionsThisTick);
+ auto tickCount = BtDynamicsWorld->stepSimulation(delta, 1);
+ for (long i = 0; i < collisionsThisTick.next; ++i) {
+ ECS_HandleCollision(collisionsThisTick.data[i].a, collisionsThisTick.data[i].b);
+ }
+ return tickCount;
}
void Physics_Teardown() {