diff options
| author | Jonathan Bradley <jcb@pikum.xyz> | 2023-11-03 14:58:28 -0400 |
|---|---|---|
| committer | Jonathan Bradley <jcb@pikum.xyz> | 2023-11-15 13:16:32 -0500 |
| commit | 0de2135165afb034a17d3307d2f4e263bcaae0f8 (patch) | |
| tree | 1d3a32a4a00368e9c954c34134091bdcb85cd5fe /src/physics.cpp | |
| parent | 96e522ecf4e369bfc533db3914c0b06c2512bedd (diff) | |
buggy - add custom btOverlapFilterCallback
Diffstat (limited to 'src/physics.cpp')
| -rw-r--r-- | src/physics.cpp | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/src/physics.cpp b/src/physics.cpp index b8d093d..f0d8b8e 100644 --- a/src/physics.cpp +++ b/src/physics.cpp @@ -1,11 +1,16 @@ #include "physics.hpp" +#include "components.hpp" #include "dynamic-array.hpp" #include "game-settings.hpp" -#include <btBulletDynamicsCommon.h> #include <LinearMath/btAlignedAllocator.h> +#include <btBulletDynamicsCommon.h> +#include <BulletCollision/BroadphaseCollision/btOverlappingPairCache.h> +#include <BulletDynamics/Dynamics/btRigidBody.h> + +TypeSafeInt_B(PhysicsCollision); MemBucket *MemBkt_Bullet = nullptr; btDiscreteDynamicsWorld *BtDynamicsWorld = nullptr; @@ -60,6 +65,14 @@ void pke_btFreeFunc(void *memBlock) { bulletAllocs->Remove(index); } +struct CollisionHandlerStruct : public btOverlapFilterCallback { + ~CollisionHandlerStruct() override {} + bool needBroadphaseCollision(btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1) const override { + return (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) || + (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask); + } +} collisionHandlerStruct; + void Physics_Init() { MemBkt_Bullet = Pke_BeginTransientBucket(); bulletAllocs = Pke_New<DynArray<AllocedData>>(MemBkt_Bullet); @@ -71,8 +84,13 @@ void Physics_Init() { btConfiguration = Pke_New<btDefaultCollisionConfiguration>(MemBkt_Bullet); btDispatcher = Pke_New<btCollisionDispatcher>(MemBkt_Bullet); new (btDispatcher) btCollisionDispatcher(btConfiguration); + + btHashedOverlappingPairCache *overlappingPairCache = Pke_New<btHashedOverlappingPairCache>(MemBkt_Bullet); + overlappingPairCache->setOverlapFilterCallback(&collisionHandlerStruct); btBroadphase = Pke_New<btDbvtBroadphase>(MemBkt_Bullet); + new (btBroadphase) btDbvtBroadphase(overlappingPairCache); btSolver = Pke_New<btSequentialImpulseConstraintSolver>(MemBkt_Bullet); + BtDynamicsWorld = Pke_New<btDiscreteDynamicsWorld>(MemBkt_Bullet); new (BtDynamicsWorld) btDiscreteDynamicsWorld(btDispatcher, btBroadphase, btSolver, btConfiguration); auto grav = BtDynamicsWorld->getGravity(); |
