Revision: 15640
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15640
Author:   ben2610
Date:     2008-07-19 12:27:52 +0200 (Sat, 19 Jul 2008)

Log Message:
-----------
BGE bug fix (good for 2.47): remove static-static collision messages on the 
console since previous SetParent fix. The physical object is set to 
static+ghost while the object is parented. This behavior will be made optional 
in a future release. The DisableDynamics actuator will also make the object 
static except that the ghost/non-ghost flag is preserved.

Modified Paths:
--------------
    trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
    trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.h
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
    trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h

Modified: trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp       
2008-07-19 10:18:54 UTC (rev 15639)
+++ trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.cpp       
2008-07-19 10:27:52 UTC (rev 15640)
@@ -13,6 +13,7 @@
 #include "KX_ClientObjectInfo.h"
 
 #include "PHY_IPhysicsEnvironment.h"
+#include "CcdPhysicsEnvironment.h"
 
 
 KX_BulletPhysicsController::KX_BulletPhysicsController (const 
CcdConstructionInfo& ci, bool dyna)
@@ -167,10 +168,15 @@
        btRigidBody *body = GetRigidBody();
        if (body->getActivationState() != DISABLE_SIMULATION)
        {
+               btBroadphaseProxy* handle = body->getBroadphaseHandle();
                m_savedCollisionFlags = body->getCollisionFlags();
+               m_savedCollisionFilterGroup = handle->m_collisionFilterGroup;
+               m_savedCollisionFilterMask = handle->m_collisionFilterMask;
                body->setActivationState(DISABLE_SIMULATION);
-               body->setCollisionFlags((btCollisionObject::CF_STATIC_OBJECT)|
-                       ((ghost)?btCollisionObject::CF_NO_CONTACT_RESPONSE:0));
+               GetPhysicsEnvironment()->updateCcdPhysicsController(this, 
+                       
btCollisionObject::CF_STATIC_OBJECT|((ghost)?btCollisionObject::CF_NO_CONTACT_RESPONSE:(m_savedCollisionFlags&btCollisionObject::CF_NO_CONTACT_RESPONSE)),
+                       btBroadphaseProxy::StaticFilter, 
+                       btBroadphaseProxy::AllFilter ^ 
btBroadphaseProxy::StaticFilter);
        }
 }
 
@@ -180,7 +186,10 @@
        if (body->getActivationState() == DISABLE_SIMULATION)
        {
                GetRigidBody()->forceActivationState(ACTIVE_TAG);
-               body->setCollisionFlags(m_savedCollisionFlags);
+               GetPhysicsEnvironment()->updateCcdPhysicsController(this, 
+                       m_savedCollisionFlags,
+                       m_savedCollisionFilterGroup,
+                       m_savedCollisionFilterMask);
        }
 }
 

Modified: trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.h
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.h 
2008-07-19 10:18:54 UTC (rev 15639)
+++ trunk/blender/source/gameengine/Ketsji/KX_BulletPhysicsController.h 
2008-07-19 10:27:52 UTC (rev 15640)
@@ -9,6 +9,8 @@
 {
 private:
        int m_savedCollisionFlags;
+       short int m_savedCollisionFilterGroup;
+       short int m_savedCollisionFilterMask;
 public:
 
        KX_BulletPhysicsController (const CcdConstructionInfo& ci, bool dyna);

Modified: 
trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
===================================================================
--- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp    
2008-07-19 10:18:54 UTC (rev 15639)
+++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp    
2008-07-19 10:27:52 UTC (rev 15640)
@@ -466,7 +466,17 @@
 
 }
 
+void   CcdPhysicsEnvironment::updateCcdPhysicsController(CcdPhysicsController* 
ctrl, int newCollisionFlags, short int newCollisionGroup, short int 
newCollisionMask)
+{
+       // this function is used when the collisionning group of a controller 
is changed
+       // remove and add the collistioning object
+       btRigidBody* body = ctrl->GetRigidBody();
 
+       m_dynamicsWorld->removeCollisionObject(body);
+       body->setCollisionFlags(newCollisionFlags);
+       m_dynamicsWorld->addCollisionObject(body, newCollisionGroup, 
newCollisionMask);
+}
+
 void   CcdPhysicsEnvironment::beginFrame()
 {
 

Modified: trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
===================================================================
--- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h      
2008-07-19 10:18:54 UTC (rev 15639)
+++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h      
2008-07-19 10:27:52 UTC (rev 15640)
@@ -183,6 +183,8 @@
 
                void    removeCcdPhysicsController(CcdPhysicsController* ctrl);
 
+               void    updateCcdPhysicsController(CcdPhysicsController* ctrl, 
int newCollisionFlags, short int newCollisionGroup, short int newCollisionMask);
+
                btBroadphaseInterface*  getBroadphase();
 
                


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to