Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean-Luc Peurière <jlp@nerim.net>2005-12-18 22:10:26 +0300
committerJean-Luc Peurière <jlp@nerim.net>2005-12-18 22:10:26 +0300
commit63d0e03bcfd6a9d1e0ce800d2f7d797e336f7f21 (patch)
treee530c810698df762d41b2eaa8c9a22225a69d509
parentc33831ac1632ac0a0e42e174035dd0d0ea15a087 (diff)
applying Volker Mische engine patch
correct bug #3594
-rw-r--r--source/gameengine/Ketsji/KX_IpoActuator.cpp16
-rw-r--r--source/gameengine/Ketsji/KX_KetsjiEngine.cpp29
-rw-r--r--source/gameengine/Ketsji/KX_KetsjiEngine.h11
-rw-r--r--source/gameengine/Ketsji/KX_Scene.cpp20
-rw-r--r--source/gameengine/Ketsji/KX_Scene.h22
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_Scene*> KX_SceneList;