From 63d0e03bcfd6a9d1e0ce800d2f7d797e336f7f21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Luc=20Peuri=C3=A8re?= Date: Sun, 18 Dec 2005 19:10:26 +0000 Subject: [PATCH] applying Volker Mische engine patch correct bug #3594 --- source/gameengine/Ketsji/KX_IpoActuator.cpp | 16 ++++++++--- source/gameengine/Ketsji/KX_KetsjiEngine.cpp | 29 ++++++++++++++++++++ source/gameengine/Ketsji/KX_KetsjiEngine.h | 11 +++++++- source/gameengine/Ketsji/KX_Scene.cpp | 20 +++++++++++++- source/gameengine/Ketsji/KX_Scene.h | 22 +++++++++++++++ 5 files changed, 92 insertions(+), 6 deletions(-) diff --git a/source/gameengine/Ketsji/KX_IpoActuator.cpp b/source/gameengine/Ketsji/KX_IpoActuator.cpp index df4a5047ef1..1b6b92c790d 100644 --- a/source/gameengine/Ketsji/KX_IpoActuator.cpp +++ b/source/gameengine/Ketsji/KX_IpoActuator.cpp @@ -163,7 +163,8 @@ bool KX_IpoActuator::ClampLocalTime() void KX_IpoActuator::SetStartTime(float curtime) { float direction = m_startframe < m_endframe ? 1.0 : -1.0; - + + curtime = curtime - KX_KetsjiEngine::GetSuspendedDelta(); if (m_direction > 0) m_starttime = curtime - direction*(m_localtime - m_startframe)/KX_FIXED_FRAME_PER_SEC; else @@ -172,7 +173,14 @@ void KX_IpoActuator::SetStartTime(float curtime) void KX_IpoActuator::SetLocalTime(float curtime) { - float delta_time = (curtime - m_starttime)*KX_FIXED_FRAME_PER_SEC; + float delta_time = ((curtime - m_starttime) - KX_KetsjiEngine::GetSuspendedDelta())*KX_FIXED_FRAME_PER_SEC; + + // negative delta_time is caused by floating point inaccuracy + // perhaps the inaccuracy could be reduced a bit + if ((m_localtime==m_startframe || m_localtime==m_endframe) && delta_time<0.0) + { + delta_time = 0.0; + } if (m_endframe < m_startframe) delta_time = -delta_time; @@ -211,7 +219,7 @@ bool KX_IpoActuator::Update(double curtime, bool frame) bool result=true; if (m_starttime < -2.0*start_smaller_then_end*(m_endframe - m_startframe)) - m_starttime = curtime; + m_starttime = curtime - KX_KetsjiEngine::GetSuspendedDelta(); switch (m_type) { @@ -241,7 +249,7 @@ bool KX_IpoActuator::Update(double curtime, bool frame) } else { m_localtime=m_startframe; - m_starttime=curtime; + SetStartTime(curtime); m_direction=1; } break; diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp index a163e8fde58..e82ecd83fee 100644 --- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp +++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp @@ -99,6 +99,9 @@ const char KX_KetsjiEngine::m_profileLabels[tc_numCategories][15] = { double KX_KetsjiEngine::m_ticrate = DEFAULT_LOGIC_TIC_RATE; +double KX_KetsjiEngine::m_suspendedtime = 0.0; +double KX_KetsjiEngine::m_suspendeddelta = 0.0; + /** * Constructor of the Ketsji Engine @@ -355,6 +358,12 @@ void KX_KetsjiEngine::NextFrame() if (!scene->IsSuspended()) { + // if the scene was suspended recalcutlate the delta tu "curtime" + m_suspendedtime = scene->getSuspendedTime(); + if (scene->getSuspendedTime()!=0.0) + scene->setSuspendedDelta(scene->getSuspendedDelta()+curtime-scene->getSuspendedTime()); + m_suspendeddelta = scene->getSuspendedDelta(); + m_logger->StartLog(tc_physics, m_kxsystem->GetTimeInSeconds(), true); m_logger->StartLog(tc_network, m_kxsystem->GetTimeInSeconds(), true); scene->GetNetworkScene()->proceed(localtime); @@ -403,7 +412,11 @@ void KX_KetsjiEngine::NextFrame() m_sceneconverter->WritePhysicsObjectToAnimationIpo(m_currentFrame++); } + scene->setSuspendedTime(0.0); } // suspended + else + if(scene->getSuspendedTime()==0.0) + scene->setSuspendedTime(curtime); DoSound(scene); @@ -439,6 +452,12 @@ void KX_KetsjiEngine::NextFrame() if (!scene->IsSuspended()) { + // if the scene was suspended recalcutlate the delta tu "curtime" + m_suspendedtime = scene->getSuspendedTime(); + if (scene->getSuspendedTime()!=0.0) + scene->setSuspendedDelta(scene->getSuspendedDelta()+curtime-scene->getSuspendedTime()); + m_suspendeddelta = scene->getSuspendedDelta(); + // set Python hooks for each scene PHY_SetActiveEnvironment(scene->GetPhysicsEnvironment()); PHY_SetActiveScene(scene); @@ -459,7 +478,12 @@ void KX_KetsjiEngine::NextFrame() // Actuators can affect the scenegraph m_logger->StartLog(tc_scenegraph, m_kxsystem->GetTimeInSeconds(), true); scene->UpdateParents(curtime); + + scene->setSuspendedTime(0.0); } // suspended + else + if(scene->getSuspendedTime()==0.0) + scene->setSuspendedTime(curtime); DoSound(scene); @@ -1224,6 +1248,11 @@ bool KX_KetsjiEngine::GetUseFixedTime(void) const return m_bFixedTime; } +double KX_KetsjiEngine::GetSuspendedDelta() +{ + return m_suspendeddelta; +} + double KX_KetsjiEngine::GetTicRate() { return m_ticrate; diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.h b/source/gameengine/Ketsji/KX_KetsjiEngine.h index 7f0b4fd59f9..f7c919e19d5 100644 --- a/source/gameengine/Ketsji/KX_KetsjiEngine.h +++ b/source/gameengine/Ketsji/KX_KetsjiEngine.h @@ -103,6 +103,9 @@ private: double m_deltatime; static double m_ticrate; + static double m_suspendedtime; + static double m_suspendeddelta; + int m_exitcode; STR_String m_exitstring; /** @@ -237,7 +240,13 @@ public: * @return Current setting for display all frames. */ bool GetUseFixedTime(void) const; - + + /** + * Returns the difference between the local time of the scene (when it + * was running and not suspended) and the "curtime" + */ + static double GetSuspendedDelta(); + /** * Gets the number of logic updates per second. */ diff --git a/source/gameengine/Ketsji/KX_Scene.cpp b/source/gameengine/Ketsji/KX_Scene.cpp index cabba5cacb0..6ad420375e6 100644 --- a/source/gameengine/Ketsji/KX_Scene.cpp +++ b/source/gameengine/Ketsji/KX_Scene.cpp @@ -112,7 +112,8 @@ KX_Scene::KX_Scene(class SCA_IInputDevice* keyboarddevice, m_active_camera(NULL), m_ueberExecutionPriority(0) { - + m_suspendedtime = 0.0; + m_suspendeddelta = 0.0; m_activity_culling = false; m_suspend = false; @@ -1135,6 +1136,23 @@ void KX_Scene::SetPhysicsEnvironment(class PHY_IPhysicsEnvironment* physEnv) m_logicmgr->RegisterEventManager(touchmgr); return; } + +void KX_Scene::setSuspendedTime(double suspendedtime) +{ + m_suspendedtime = suspendedtime; +} +double KX_Scene::getSuspendedTime() +{ + return m_suspendedtime; +} +void KX_Scene::setSuspendedDelta(double suspendeddelta) +{ + m_suspendeddelta = suspendeddelta; +} +double KX_Scene::getSuspendedDelta() +{ + return m_suspendeddelta; +} //---------------------------------------------------------------------------- //Python diff --git a/source/gameengine/Ketsji/KX_Scene.h b/source/gameengine/Ketsji/KX_Scene.h index 0c0ee4e287a..7203fa87acc 100644 --- a/source/gameengine/Ketsji/KX_Scene.h +++ b/source/gameengine/Ketsji/KX_Scene.h @@ -251,6 +251,9 @@ protected: void MarkVisible(SG_Tree *node, RAS_IRasterizer* rasty); void MarkSubTreeVisible(SG_Tree *node, RAS_IRasterizer* rasty, bool visible); void MarkVisible(RAS_IRasterizer* rasty, KX_GameObject* gameobj); + + double m_suspendedtime; + double m_suspendeddelta; /** * This stores anything from python @@ -515,6 +518,25 @@ public: virtual PyObject* _getattr(const STR_String& attr); /* name, active_camera, gravity, suspended, viewport, framing, activity_culling, activity_culling_radius */ virtual int _setattr(const STR_String &attr, PyObject *pyvalue); virtual int _delattr(const STR_String &attr); + + /** + * Sets the time the scene was suspended + */ + void setSuspendedTime(double suspendedtime); + /** + * Returns the "curtime" the scene was suspended + */ + double getSuspendedTime(); + /** + * Sets the difference between the local time of the scene (when it + * was running and not suspended) and the "curtime" + */ + void setSuspendedDelta(double suspendeddelta); + /** + * Returns the difference between the local time of the scene (when it + * was running and not suspended) and the "curtime" + */ + double getSuspendedDelta(); }; typedef std::vector KX_SceneList;