From b0049e608859bd129bb5c13fecdd161811741185 Mon Sep 17 00:00:00 2001 From: Benoit Bolsee Date: Sat, 19 Apr 2008 21:09:40 +0000 Subject: [PATCH] fix BGE bug #8094: Collision sensor on child object makes the object rotate or move very fast. Collision sensor can now be set on child object without side effect. --- source/gameengine/Ketsji/KX_NearSensor.cpp | 15 +++++++++++++++ source/gameengine/Ketsji/KX_NearSensor.h | 1 + source/gameengine/Ketsji/KX_TouchSensor.cpp | 14 ++------------ 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/source/gameengine/Ketsji/KX_NearSensor.cpp b/source/gameengine/Ketsji/KX_NearSensor.cpp index e646e8ef84f..4086ac53f2a 100644 --- a/source/gameengine/Ketsji/KX_NearSensor.cpp +++ b/source/gameengine/Ketsji/KX_NearSensor.cpp @@ -75,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) diff --git a/source/gameengine/Ketsji/KX_NearSensor.h b/source/gameengine/Ketsji/KX_NearSensor.h index 994090eea8c..c6724caccc3 100644 --- a/source/gameengine/Ketsji/KX_NearSensor.h +++ b/source/gameengine/Ketsji/KX_NearSensor.h @@ -68,6 +68,7 @@ public: PyTypeObject* T=&Type); */ virtual ~KX_NearSensor(); + virtual void SynchronizeTransform(); virtual CValue* GetReplica(); virtual bool Evaluate(CValue* event); diff --git a/source/gameengine/Ketsji/KX_TouchSensor.cpp b/source/gameengine/Ketsji/KX_TouchSensor.cpp index c4a01d5918c..3f185359de0 100644 --- a/source/gameengine/Ketsji/KX_TouchSensor.cpp +++ b/source/gameengine/Ketsji/KX_TouchSensor.cpp @@ -48,18 +48,8 @@ void KX_TouchSensor::SynchronizeTransform() { - - 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(); - } - + // the touch sensor does not require any synchronization: it uses + // the same physical object which is already synchronized by Blender }