Revision: 15975
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15975
Author:   ben2610
Date:     2008-08-05 18:23:33 +0200 (Tue, 05 Aug 2008)

Log Message:
-----------
BGE fix bug #17430: BGE Collide/Touch Sensor interfearing with other unrelated 
sensor states. The bug was introduced in the recent logic optimization patch. 
It only affects collision and touch sensors. The bug is fixed by keeping track 
of registration count.

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

Modified: trunk/blender/source/gameengine/Ketsji/KX_TouchEventManager.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_TouchEventManager.cpp     
2008-08-05 16:12:40 UTC (rev 15974)
+++ trunk/blender/source/gameengine/Ketsji/KX_TouchEventManager.cpp     
2008-08-05 16:23:33 UTC (rev 15975)
@@ -100,17 +100,17 @@
 void KX_TouchEventManager::RegisterSensor(SCA_ISensor* sensor)
 {
        KX_TouchSensor* touchsensor = static_cast<KX_TouchSensor*>(sensor);
-       m_sensors.insert(touchsensor);
-
-       touchsensor->RegisterSumo(this);
+       if (m_sensors.insert(touchsensor).second)
+               // the sensor was effectively inserted, register it
+               touchsensor->RegisterSumo(this);
 }
 
 void KX_TouchEventManager::RemoveSensor(SCA_ISensor* sensor)
 {
        KX_TouchSensor* touchsensor = static_cast<KX_TouchSensor*>(sensor);
-       m_sensors.erase(touchsensor);
-
-       touchsensor->UnregisterSumo(this);
+       if (m_sensors.erase(touchsensor))
+               // the sensor was effectively removed, unregister it
+               touchsensor->UnregisterSumo(this);
 }
 
 

Modified: 
trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
===================================================================
--- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp     
2008-08-05 16:12:40 UTC (rev 15974)
+++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp     
2008-08-05 16:23:33 UTC (rev 15975)
@@ -42,7 +42,8 @@
 {
        m_collisionDelay = 0;
        m_newClientInfo = 0;
-       
+       m_registerCount = 0;
+               
        m_MotionState = ci.m_MotionState;
        m_bulletMotionState = 0;
        
@@ -217,7 +218,7 @@
 void           CcdPhysicsController::PostProcessReplica(class 
PHY_IMotionState* motionstate,class PHY_IPhysicsController* parentctrl)
 {
        m_MotionState = motionstate;
-
+       m_registerCount = 0;
        
 
        m_body = 0;

Modified: trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.h
===================================================================
--- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.h       
2008-08-05 16:12:40 UTC (rev 15974)
+++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsController.h       
2008-08-05 16:23:33 UTC (rev 15975)
@@ -110,12 +110,19 @@
 
 
        void*           m_newClientInfo;
-
+       int                     m_registerCount;        // needed when multiple 
sensors use the same controller
        CcdConstructionInfo     m_cci;//needed for replication
        void GetWorldOrientation(btMatrix3x3& mat);
 
        void CreateRigidbody();
 
+       bool Register() { 
+               return (m_registerCount++ == 0) ? true : false;
+       }
+       bool Unregister() {
+               return (--m_registerCount == 0) ? true : false;
+       }
+
        protected:
                void setWorldOrientation(const btMatrix3x3& mat);
 

Modified: 
trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp
===================================================================
--- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp    
2008-08-05 16:12:40 UTC (rev 15974)
+++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp    
2008-08-05 16:23:33 UTC (rev 15975)
@@ -439,6 +439,9 @@
        m_dynamicsWorld->removeRigidBody(ctrl->GetRigidBody());
        m_controllers.erase(ctrl);
 
+       if (ctrl->m_registerCount != 0)
+               printf("Warning: removing controller with non-zero 
m_registerCount: %d\n", ctrl->m_registerCount);
+
        //remove it from the triggers
        m_triggerControllers.erase(ctrl);
 }
@@ -473,6 +476,13 @@
        }
 }
 
+void CcdPhysicsEnvironment::disableCcdPhysicsController(CcdPhysicsController* 
ctrl)
+{
+       if (m_controllers.erase(ctrl))
+       {
+               m_dynamicsWorld->removeRigidBody(ctrl->GetRigidBody());
+       }
+}
 
 
 void   CcdPhysicsEnvironment::beginFrame()
@@ -885,13 +895,17 @@
 
 void CcdPhysicsEnvironment::removeCollisionCallback(PHY_IPhysicsController* 
ctrl)
 {
-       m_triggerControllers.erase((CcdPhysicsController*)ctrl);
+       CcdPhysicsController* ccdCtrl = (CcdPhysicsController*)ctrl;
+       if (ccdCtrl->Unregister())
+               m_triggerControllers.erase(ccdCtrl);
 }
 
 
 void CcdPhysicsEnvironment::removeSensor(PHY_IPhysicsController* ctrl)
 {
-       removeCcdPhysicsController((CcdPhysicsController*)ctrl);
+       removeCollisionCallback(ctrl);
+
+       disableCcdPhysicsController((CcdPhysicsController*)ctrl);
 }
 
 void CcdPhysicsEnvironment::addTouchCallback(int response_class, 
PHY_ResponseCallback callback, void *user)
@@ -930,8 +944,8 @@
 {
        CcdPhysicsController* ccdCtrl = 
static_cast<CcdPhysicsController*>(ctrl);
 
-       //printf("requestCollisionCallback\n");
-       m_triggerControllers.insert(ccdCtrl);
+       if (ccdCtrl->Register())
+               m_triggerControllers.insert(ccdCtrl);
 }
 
 void   CcdPhysicsEnvironment::CallbackTriggers()

Modified: trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h
===================================================================
--- trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h      
2008-08-05 16:12:40 UTC (rev 15974)
+++ trunk/blender/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.h      
2008-08-05 16:23:33 UTC (rev 15975)
@@ -186,10 +186,7 @@
 
                void    updateCcdPhysicsController(CcdPhysicsController* ctrl, 
btScalar newMass, int newCollisionFlags, short int newCollisionGroup, short int 
newCollisionMask);
 
-               void    disableCcdPhysicsController(CcdPhysicsController* ctrl)
-               { 
-                       removeCcdPhysicsController(ctrl); 
-               }
+               void    disableCcdPhysicsController(CcdPhysicsController* ctrl);
 
                void    enableCcdPhysicsController(CcdPhysicsController* ctrl);
 


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

Reply via email to