diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-12-21 17:44:03 -0500 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-12-23 11:42:23 -0500 |
| commit | fa7fc343a0e444da72938fad58d219cf52228976 (patch) | |
| tree | 24630be0c54f9768a13f32c5970558768e343543 /src/physics.cpp | |
| parent | 6fa3b137c74536d2bab77f3309ca5b4c60953fe0 (diff) | |
plugin checkpoint - multiple plugins and collision callbacks
Diffstat (limited to 'src/physics.cpp')
| -rw-r--r-- | src/physics.cpp | 32 |
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() { |
