forked from bartvdbraak/blender
parent
c33831ac16
commit
63d0e03bcf
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user