Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/gameengine')
-rw-r--r--source/gameengine/Converter/BL_BlenderDataConversion.cpp10
-rw-r--r--source/gameengine/Ketsji/KX_GameObject.cpp13
-rw-r--r--source/gameengine/Ketsji/KX_GameObject.h11
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp21
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;