Ensure KinematicBodies only interact with other Bodies with matching mask.
This commit is contained in:
parent
dfc1ec7fb9
commit
b8fe576355
11 changed files with 34 additions and 41 deletions
|
|
@ -47,17 +47,12 @@ bool godotContactAddedCallback(btManifoldPoint &cp, const btCollisionObjectWrapp
|
|||
return true;
|
||||
}
|
||||
|
||||
bool GodotFilterCallback::test_collision_filters(uint32_t body0_collision_layer, uint32_t body0_collision_mask, uint32_t body1_collision_layer, uint32_t body1_collision_mask) {
|
||||
return body0_collision_layer & body1_collision_mask || body1_collision_layer & body0_collision_mask;
|
||||
}
|
||||
|
||||
bool GodotFilterCallback::needBroadphaseCollision(btBroadphaseProxy *proxy0, btBroadphaseProxy *proxy1) const {
|
||||
return GodotFilterCallback::test_collision_filters(proxy0->m_collisionFilterGroup, proxy0->m_collisionFilterMask, proxy1->m_collisionFilterGroup, proxy1->m_collisionFilterMask);
|
||||
return (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) || (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask);
|
||||
}
|
||||
|
||||
bool GodotClosestRayResultCallback::needsCollision(btBroadphaseProxy *proxy0) const {
|
||||
const bool needs = GodotFilterCallback::test_collision_filters(m_collisionFilterGroup, m_collisionFilterMask, proxy0->m_collisionFilterGroup, proxy0->m_collisionFilterMask);
|
||||
if (needs) {
|
||||
if (m_collisionFilterGroup & proxy0->m_collisionFilterMask) {
|
||||
btCollisionObject *btObj = static_cast<btCollisionObject *>(proxy0->m_clientObject);
|
||||
CollisionObjectBullet *gObj = static_cast<CollisionObjectBullet *>(btObj->getUserPointer());
|
||||
|
||||
|
|
@ -90,8 +85,7 @@ bool GodotAllConvexResultCallback::needsCollision(btBroadphaseProxy *proxy0) con
|
|||
return false;
|
||||
}
|
||||
|
||||
const bool needs = GodotFilterCallback::test_collision_filters(m_collisionFilterGroup, m_collisionFilterMask, proxy0->m_collisionFilterGroup, proxy0->m_collisionFilterMask);
|
||||
if (needs) {
|
||||
if (m_collisionFilterGroup & proxy0->m_collisionFilterMask) {
|
||||
btCollisionObject *btObj = static_cast<btCollisionObject *>(proxy0->m_clientObject);
|
||||
CollisionObjectBullet *gObj = static_cast<CollisionObjectBullet *>(btObj->getUserPointer());
|
||||
if (m_exclude->has(gObj->get_self())) {
|
||||
|
|
@ -123,8 +117,7 @@ btScalar GodotAllConvexResultCallback::addSingleResult(btCollisionWorld::LocalCo
|
|||
}
|
||||
|
||||
bool GodotKinClosestConvexResultCallback::needsCollision(btBroadphaseProxy *proxy0) const {
|
||||
const bool needs = GodotFilterCallback::test_collision_filters(m_collisionFilterGroup, m_collisionFilterMask, proxy0->m_collisionFilterGroup, proxy0->m_collisionFilterMask);
|
||||
if (needs) {
|
||||
if (m_collisionFilterGroup & proxy0->m_collisionFilterMask) {
|
||||
btCollisionObject *btObj = static_cast<btCollisionObject *>(proxy0->m_clientObject);
|
||||
CollisionObjectBullet *gObj = static_cast<CollisionObjectBullet *>(btObj->getUserPointer());
|
||||
if (gObj == m_self_object) {
|
||||
|
|
@ -150,8 +143,7 @@ bool GodotKinClosestConvexResultCallback::needsCollision(btBroadphaseProxy *prox
|
|||
}
|
||||
|
||||
bool GodotClosestConvexResultCallback::needsCollision(btBroadphaseProxy *proxy0) const {
|
||||
const bool needs = GodotFilterCallback::test_collision_filters(m_collisionFilterGroup, m_collisionFilterMask, proxy0->m_collisionFilterGroup, proxy0->m_collisionFilterMask);
|
||||
if (needs) {
|
||||
if (m_collisionFilterGroup & proxy0->m_collisionFilterMask) {
|
||||
btCollisionObject *btObj = static_cast<btCollisionObject *>(proxy0->m_clientObject);
|
||||
CollisionObjectBullet *gObj = static_cast<CollisionObjectBullet *>(btObj->getUserPointer());
|
||||
|
||||
|
|
@ -188,8 +180,7 @@ bool GodotAllContactResultCallback::needsCollision(btBroadphaseProxy *proxy0) co
|
|||
return false;
|
||||
}
|
||||
|
||||
const bool needs = GodotFilterCallback::test_collision_filters(m_collisionFilterGroup, m_collisionFilterMask, proxy0->m_collisionFilterGroup, proxy0->m_collisionFilterMask);
|
||||
if (needs) {
|
||||
if (m_collisionFilterGroup & proxy0->m_collisionFilterMask) {
|
||||
btCollisionObject *btObj = static_cast<btCollisionObject *>(proxy0->m_clientObject);
|
||||
CollisionObjectBullet *gObj = static_cast<CollisionObjectBullet *>(btObj->getUserPointer());
|
||||
|
||||
|
|
@ -244,8 +235,7 @@ bool GodotContactPairContactResultCallback::needsCollision(btBroadphaseProxy *pr
|
|||
return false;
|
||||
}
|
||||
|
||||
const bool needs = GodotFilterCallback::test_collision_filters(m_collisionFilterGroup, m_collisionFilterMask, proxy0->m_collisionFilterGroup, proxy0->m_collisionFilterMask);
|
||||
if (needs) {
|
||||
if (m_collisionFilterGroup & proxy0->m_collisionFilterMask) {
|
||||
btCollisionObject *btObj = static_cast<btCollisionObject *>(proxy0->m_clientObject);
|
||||
CollisionObjectBullet *gObj = static_cast<CollisionObjectBullet *>(btObj->getUserPointer());
|
||||
|
||||
|
|
@ -287,8 +277,7 @@ btScalar GodotContactPairContactResultCallback::addSingleResult(btManifoldPoint
|
|||
}
|
||||
|
||||
bool GodotRestInfoContactResultCallback::needsCollision(btBroadphaseProxy *proxy0) const {
|
||||
const bool needs = GodotFilterCallback::test_collision_filters(m_collisionFilterGroup, m_collisionFilterMask, proxy0->m_collisionFilterGroup, proxy0->m_collisionFilterMask);
|
||||
if (needs) {
|
||||
if (m_collisionFilterGroup & proxy0->m_collisionFilterMask) {
|
||||
btCollisionObject *btObj = static_cast<btCollisionObject *>(proxy0->m_clientObject);
|
||||
CollisionObjectBullet *gObj = static_cast<CollisionObjectBullet *>(btObj->getUserPointer());
|
||||
|
||||
|
|
|
|||
|
|
@ -47,8 +47,6 @@ bool godotContactAddedCallback(btManifoldPoint &cp, const btCollisionObjectWrapp
|
|||
|
||||
/// This class is required to implement custom collision behaviour in the broadphase
|
||||
struct GodotFilterCallback : public btOverlapFilterCallback {
|
||||
static bool test_collision_filters(uint32_t body0_collision_layer, uint32_t body0_collision_mask, uint32_t body1_collision_layer, uint32_t body1_collision_mask);
|
||||
|
||||
// return true when pairs need collision
|
||||
virtual bool needBroadphaseCollision(btBroadphaseProxy *proxy0, btBroadphaseProxy *proxy1) const;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1093,7 +1093,6 @@ private:
|
|||
|
||||
const btCollisionObject *self_collision_object;
|
||||
uint32_t collision_layer = 0;
|
||||
uint32_t collision_mask = 0;
|
||||
|
||||
struct CompoundLeafCallback : btDbvt::ICollide {
|
||||
private:
|
||||
|
|
@ -1123,10 +1122,9 @@ public:
|
|||
Vector<BroadphaseResult> results;
|
||||
|
||||
public:
|
||||
RecoverPenetrationBroadPhaseCallback(const btCollisionObject *p_self_collision_object, uint32_t p_collision_layer, uint32_t p_collision_mask, btVector3 p_aabb_min, btVector3 p_aabb_max) :
|
||||
RecoverPenetrationBroadPhaseCallback(const btCollisionObject *p_self_collision_object, uint32_t p_collision_layer, btVector3 p_aabb_min, btVector3 p_aabb_max) :
|
||||
self_collision_object(p_self_collision_object),
|
||||
collision_layer(p_collision_layer),
|
||||
collision_mask(p_collision_mask) {
|
||||
collision_layer(p_collision_layer) {
|
||||
bounds = btDbvtVolume::FromMM(p_aabb_min, p_aabb_max);
|
||||
}
|
||||
|
||||
|
|
@ -1135,7 +1133,7 @@ public:
|
|||
virtual bool process(const btBroadphaseProxy *proxy) {
|
||||
btCollisionObject *co = static_cast<btCollisionObject *>(proxy->m_clientObject);
|
||||
if (co->getInternalType() <= btCollisionObject::CO_RIGID_BODY) {
|
||||
if (self_collision_object != proxy->m_clientObject && GodotFilterCallback::test_collision_filters(collision_layer, collision_mask, proxy->m_collisionFilterGroup, proxy->m_collisionFilterMask)) {
|
||||
if (self_collision_object != proxy->m_clientObject && (collision_layer & proxy->m_collisionFilterMask)) {
|
||||
if (co->getCollisionShape()->isCompound()) {
|
||||
const btCompoundShape *cs = static_cast<btCompoundShape *>(co->getCollisionShape());
|
||||
|
||||
|
|
@ -1218,7 +1216,7 @@ bool SpaceBullet::recover_from_penetration(RigidBodyBullet *p_body, const btTran
|
|||
}
|
||||
|
||||
// Perform broadphase test
|
||||
RecoverPenetrationBroadPhaseCallback recover_broad_result(p_body->get_bt_collision_object(), p_body->get_collision_layer(), p_body->get_collision_mask(), aabb_min, aabb_max);
|
||||
RecoverPenetrationBroadPhaseCallback recover_broad_result(p_body->get_bt_collision_object(), p_body->get_collision_layer(), aabb_min, aabb_max);
|
||||
dynamicsWorld->getBroadphase()->aabbTest(aabb_min, aabb_max, recover_broad_result);
|
||||
|
||||
bool penetration = false;
|
||||
|
|
@ -1409,7 +1407,7 @@ int SpaceBullet::recover_from_penetration_ray(RigidBodyBullet *p_body, const btT
|
|||
}
|
||||
|
||||
// Perform broadphase test
|
||||
RecoverPenetrationBroadPhaseCallback recover_broad_result(p_body->get_bt_collision_object(), p_body->get_collision_layer(), p_body->get_collision_mask(), aabb_min, aabb_max);
|
||||
RecoverPenetrationBroadPhaseCallback recover_broad_result(p_body->get_bt_collision_object(), p_body->get_collision_layer(), aabb_min, aabb_max);
|
||||
dynamicsWorld->getBroadphase()->aabbTest(aabb_min, aabb_max, recover_broad_result);
|
||||
|
||||
int ray_count = 0;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue