applying Volker Mische engine patch

correct bug #3594
This commit is contained in:
Jean-Luc Peurière 2005-12-18 19:10:26 +00:00
parent c33831ac16
commit 63d0e03bcf
5 changed files with 92 additions and 6 deletions

@ -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;

@ -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;

@ -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.
*/

@ -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

@ -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;