diff options
Diffstat (limited to 'source/gameengine')
-rw-r--r-- | source/gameengine/Converter/BL_BlenderDataConversion.cpp | 10 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_GameObject.cpp | 13 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_GameObject.h | 11 | ||||
-rw-r--r-- | source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp | 21 |
4 files changed, 53 insertions, 2 deletions
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp index 982988cc088..58ae415e9d3 100644 --- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp +++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp @@ -1587,8 +1587,16 @@ static void BL_CreatePhysicsObjectNew(KX_GameObject* gameobj, //bool bRigidBody = (userigidbody == 0); // object has physics representation? - if (!(blenderobject->gameflag & OB_COLLISION)) + if (!(blenderobject->gameflag & OB_COLLISION)) { + // Respond to all collisions so that Near sensors work on No Collision + // objects. + gameobj->SetUserCollisionGroup(0xff); + gameobj->SetUserCollisionMask(0xff); return; + } + + gameobj->SetUserCollisionGroup(blenderobject->col_group); + gameobj->SetUserCollisionMask(blenderobject->col_mask); // get Root Parent of blenderobject struct Object* parent= blenderobject->parent; diff --git a/source/gameengine/Ketsji/KX_GameObject.cpp b/source/gameengine/Ketsji/KX_GameObject.cpp index 48a45c2d1c2..a669f4346ea 100644 --- a/source/gameengine/Ketsji/KX_GameObject.cpp +++ b/source/gameengine/Ketsji/KX_GameObject.cpp @@ -531,6 +531,19 @@ void KX_GameObject::ActivateGraphicController(bool recurse) } } +void KX_GameObject::SetUserCollisionGroup(short group) +{ + m_userCollisionGroup = group; +} +void KX_GameObject::SetUserCollisionMask(short mask) +{ + m_userCollisionMask = mask; +} + +bool KX_GameObject::CheckCollision(KX_GameObject* other) +{ + return this->m_userCollisionGroup & other->m_userCollisionMask; +} CValue* KX_GameObject::GetReplica() { diff --git a/source/gameengine/Ketsji/KX_GameObject.h b/source/gameengine/Ketsji/KX_GameObject.h index 5ceef2c60c9..d5ae13eb702 100644 --- a/source/gameengine/Ketsji/KX_GameObject.h +++ b/source/gameengine/Ketsji/KX_GameObject.h @@ -98,6 +98,10 @@ protected: bool m_bIsNegativeScaling; MT_Vector4 m_objectColor; + // Bit fields for user control over physics collisions + short m_userCollisionGroup; + short m_userCollisionMask; + // visible = user setting // culled = while rendering, depending on camera bool m_bVisible; @@ -494,6 +498,13 @@ public: */ void ActivateGraphicController(bool recurse); + void SetUserCollisionGroup(short filter); + void SetUserCollisionMask(short mask); + /** + * Extra broadphase check for user controllable collisions + */ + bool CheckCollision(KX_GameObject *other); + /** * \section Coordinate system manipulation functions */ diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp index e43ddb303e9..687fc116234 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp @@ -2208,10 +2208,29 @@ bool CcdOverlapFilterCallBack::needBroadphaseCollision(btBroadphaseProxy* proxy0 { btCollisionObject *colObj0, *colObj1; CcdPhysicsController *sensorCtrl, *objCtrl; + + KX_GameObject *kxObj0 = KX_GameObject::GetClientObject( + (KX_ClientObjectInfo*) + ((CcdPhysicsController*) + (((btCollisionObject*)proxy0->m_clientObject)->getUserPointer())) + ->getNewClientInfo()); + KX_GameObject *kxObj1 = KX_GameObject::GetClientObject( + (KX_ClientObjectInfo*) + ((CcdPhysicsController*) + (((btCollisionObject*)proxy1->m_clientObject)->getUserPointer())) + ->getNewClientInfo()); + + // First check the filters. Note that this is called during scene + // conversion, so we can't assume the KX_GameObject instances exist. This + // may make some objects erroneously collide on the first frame, but the + // alternative is to have them erroneously miss. bool collides; - // first check the filters collides = (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) != 0; collides = collides && (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask); + if (kxObj0 && kxObj1) { + collides = collides && kxObj0->CheckCollision(kxObj1); + collides = collides && kxObj1->CheckCollision(kxObj0); + } if (!collides) return false; |