summaryrefslogtreecommitdiff
path: root/src/physics.cpp
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-11-03 14:58:28 -0400
committerJonathan Bradley <jcb@pikum.xyz>2023-11-15 13:16:32 -0500
commit0de2135165afb034a17d3307d2f4e263bcaae0f8 (patch)
tree1d3a32a4a00368e9c954c34134091bdcb85cd5fe /src/physics.cpp
parent96e522ecf4e369bfc533db3914c0b06c2512bedd (diff)
buggy - add custom btOverlapFilterCallback
Diffstat (limited to 'src/physics.cpp')
-rw-r--r--src/physics.cpp20
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();