BGE bug fix (continuation of previous bug fix):
[blender-staging.git] / source / gameengine / Ketsji / KX_NearSensor.cpp
index 8f85a889d21ab5d01583c1bb78b0a2123b8a9ca8..bae87c281238b1a05437722f397d1812e820bd5d 100644 (file)
@@ -3,15 +3,12 @@
  *
  * $Id$
  *
- * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
+ * ***** BEGIN GPL LICENSE BLOCK *****
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
  * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License.  See http://www.blender.org/BL/ for information
- * about this.
+ * of the License, or (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -29,7 +26,7 @@
  *
  * Contributor(s): none yet.
  *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
+ * ***** END GPL LICENSE BLOCK *****
  */
 
 #include "KX_NearSensor.h"
@@ -78,6 +75,21 @@ KX_NearSensor::KX_NearSensor(SCA_EventManager* eventmgr,
        SynchronizeTransform();
 }
 
+void KX_NearSensor::SynchronizeTransform()
+{
+       // The near and radar sensors are using a different physical object which is 
+       // not linked to the parent object, must synchronize it.
+       if (m_physCtrl)
+       {
+               KX_GameObject* parent = ((KX_GameObject*)GetParent());
+               MT_Vector3 pos = parent->NodeGetWorldPosition();
+               MT_Quaternion orn = parent->NodeGetWorldOrientation().getRotation();
+               m_physCtrl->setPosition(pos.x(),pos.y(),pos.z());
+               m_physCtrl->setOrientation(orn.x(),orn.y(),orn.z(),orn.w());
+               m_physCtrl->calcXform();
+       }
+}
+
 void KX_NearSensor::RegisterSumo(KX_TouchEventManager *touchman)
 {
        if (m_physCtrl)
@@ -86,14 +98,19 @@ void KX_NearSensor::RegisterSumo(KX_TouchEventManager *touchman)
        }
 }
 
+void KX_NearSensor::UnregisterSumo(KX_TouchEventManager* touchman)
+{
+       if (m_physCtrl)
+       {
+               touchman->GetPhysicsEnvironment()->removeSensor(m_physCtrl);
+       }
+}
+
 CValue* KX_NearSensor::GetReplica()
 {
        KX_NearSensor* replica = new KX_NearSensor(*this);
        replica->m_colliders = new CListValue();
-       replica->m_bCollision = false;
-       replica->m_bTriggered= false;
-       replica->m_hitObject = NULL;
-       replica->m_bLastTriggered = false;
+       replica->Init();
        // this will copy properties and so on...
        CValue::AddDataToReplica(replica);
        
@@ -126,9 +143,6 @@ CValue* KX_NearSensor::GetReplica()
 
 void KX_NearSensor::ReParent(SCA_IObject* parent)
 {
-
-       SCA_ISensor::ReParent(parent);
-       
        m_client_info->m_gameobject = static_cast<KX_GameObject*>(parent); 
        m_client_info->m_sensors.push_back(this);
        
@@ -142,6 +156,7 @@ void KX_NearSensor::ReParent(SCA_IObject* parent)
 */
        ((KX_GameObject*)GetParent())->GetSGNode()->ComputeWorldTransforms(NULL);
        SynchronizeTransform();
+       SCA_ISensor::ReParent(parent);
 }
 
 
@@ -175,13 +190,13 @@ bool KX_NearSensor::Evaluate(CValue* event)
                {
                        if (m_physCtrl)
                        {
-                               m_physCtrl->SetMargin(m_ResetMargin);
+                               m_physCtrl->SetRadius(m_ResetMargin);
                        }
                } else
                {
                        if (m_physCtrl)
                        {
-                               m_physCtrl->SetMargin(m_Margin);
+                               m_physCtrl->SetRadius(m_Margin);
                        }
 
                }
@@ -237,8 +252,10 @@ bool       KX_NearSensor::NewHandleCollision(void* obj1,void* obj2,const PHY_CollData
                        client_info->m_gameobject :
                        NULL);
        
-       // these checks are done already in BroadPhaseFilterCollision()
-       if (gameobj /*&& (gameobj != parent)*/)
+       // Add the same check as in SCA_ISensor::Activate(), 
+       // we don't want to record collision when the sensor is not active.
+       if (m_links && !m_suspended &&
+               gameobj /* done in BroadPhaseFilterCollision() && (gameobj != parent)*/)
        {
                if (!m_colliders->SearchValue(gameobj))
                        m_colliders->Add(gameobj->AddRef());
@@ -294,14 +311,10 @@ PyParentObject KX_NearSensor::Parents[] = {
 
 
 PyMethodDef KX_NearSensor::Methods[] = {
-       {"setProperty", 
-        (PyCFunction) KX_NearSensor::sPySetProperty,      METH_VARARGS, SetProperty_doc},
-       {"getProperty", 
-        (PyCFunction) KX_NearSensor::sPyGetProperty,      METH_VARARGS, GetProperty_doc},
-       {"getHitObject", 
-        (PyCFunction) KX_NearSensor::sPyGetHitObject,     METH_VARARGS, GetHitObject_doc},
-       {"getHitObjectList", 
-        (PyCFunction) KX_NearSensor::sPyGetHitObjectList, METH_VARARGS, GetHitObjectList_doc},
+       {"setProperty", (PyCFunction) KX_NearSensor::sPySetProperty,      METH_VARARGS, (PY_METHODCHAR)SetProperty_doc},
+       {"getProperty", (PyCFunction) KX_NearSensor::sPyGetProperty,      METH_VARARGS, (PY_METHODCHAR)GetProperty_doc},
+       {"getHitObject",(PyCFunction) KX_NearSensor::sPyGetHitObject,     METH_VARARGS, (PY_METHODCHAR)GetHitObject_doc},
+       {"getHitObjectList", (PyCFunction) KX_NearSensor::sPyGetHitObjectList, METH_VARARGS, (PY_METHODCHAR)GetHitObjectList_doc},
        {NULL,NULL} //Sentinel
 };