forked from bartvdbraak/blender
parent
c33831ac16
commit
63d0e03bcf
@ -163,7 +163,8 @@ bool KX_IpoActuator::ClampLocalTime()
|
|||||||
void KX_IpoActuator::SetStartTime(float curtime)
|
void KX_IpoActuator::SetStartTime(float curtime)
|
||||||
{
|
{
|
||||||
float direction = m_startframe < m_endframe ? 1.0 : -1.0;
|
float direction = m_startframe < m_endframe ? 1.0 : -1.0;
|
||||||
|
|
||||||
|
curtime = curtime - KX_KetsjiEngine::GetSuspendedDelta();
|
||||||
if (m_direction > 0)
|
if (m_direction > 0)
|
||||||
m_starttime = curtime - direction*(m_localtime - m_startframe)/KX_FIXED_FRAME_PER_SEC;
|
m_starttime = curtime - direction*(m_localtime - m_startframe)/KX_FIXED_FRAME_PER_SEC;
|
||||||
else
|
else
|
||||||
@ -172,7 +173,14 @@ void KX_IpoActuator::SetStartTime(float curtime)
|
|||||||
|
|
||||||
void KX_IpoActuator::SetLocalTime(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)
|
if (m_endframe < m_startframe)
|
||||||
delta_time = -delta_time;
|
delta_time = -delta_time;
|
||||||
@ -211,7 +219,7 @@ bool KX_IpoActuator::Update(double curtime, bool frame)
|
|||||||
|
|
||||||
bool result=true;
|
bool result=true;
|
||||||
if (m_starttime < -2.0*start_smaller_then_end*(m_endframe - m_startframe))
|
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)
|
switch (m_type)
|
||||||
{
|
{
|
||||||
@ -241,7 +249,7 @@ bool KX_IpoActuator::Update(double curtime, bool frame)
|
|||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
m_localtime=m_startframe;
|
m_localtime=m_startframe;
|
||||||
m_starttime=curtime;
|
SetStartTime(curtime);
|
||||||
m_direction=1;
|
m_direction=1;
|
||||||
}
|
}
|
||||||
break;
|
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_ticrate = DEFAULT_LOGIC_TIC_RATE;
|
||||||
|
|
||||||
|
double KX_KetsjiEngine::m_suspendedtime = 0.0;
|
||||||
|
double KX_KetsjiEngine::m_suspendeddelta = 0.0;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor of the Ketsji Engine
|
* Constructor of the Ketsji Engine
|
||||||
@ -355,6 +358,12 @@ void KX_KetsjiEngine::NextFrame()
|
|||||||
|
|
||||||
if (!scene->IsSuspended())
|
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_physics, m_kxsystem->GetTimeInSeconds(), true);
|
||||||
m_logger->StartLog(tc_network, m_kxsystem->GetTimeInSeconds(), true);
|
m_logger->StartLog(tc_network, m_kxsystem->GetTimeInSeconds(), true);
|
||||||
scene->GetNetworkScene()->proceed(localtime);
|
scene->GetNetworkScene()->proceed(localtime);
|
||||||
@ -403,7 +412,11 @@ void KX_KetsjiEngine::NextFrame()
|
|||||||
m_sceneconverter->WritePhysicsObjectToAnimationIpo(m_currentFrame++);
|
m_sceneconverter->WritePhysicsObjectToAnimationIpo(m_currentFrame++);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
scene->setSuspendedTime(0.0);
|
||||||
} // suspended
|
} // suspended
|
||||||
|
else
|
||||||
|
if(scene->getSuspendedTime()==0.0)
|
||||||
|
scene->setSuspendedTime(curtime);
|
||||||
|
|
||||||
DoSound(scene);
|
DoSound(scene);
|
||||||
|
|
||||||
@ -439,6 +452,12 @@ void KX_KetsjiEngine::NextFrame()
|
|||||||
|
|
||||||
if (!scene->IsSuspended())
|
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
|
// set Python hooks for each scene
|
||||||
PHY_SetActiveEnvironment(scene->GetPhysicsEnvironment());
|
PHY_SetActiveEnvironment(scene->GetPhysicsEnvironment());
|
||||||
PHY_SetActiveScene(scene);
|
PHY_SetActiveScene(scene);
|
||||||
@ -459,7 +478,12 @@ void KX_KetsjiEngine::NextFrame()
|
|||||||
// Actuators can affect the scenegraph
|
// Actuators can affect the scenegraph
|
||||||
m_logger->StartLog(tc_scenegraph, m_kxsystem->GetTimeInSeconds(), true);
|
m_logger->StartLog(tc_scenegraph, m_kxsystem->GetTimeInSeconds(), true);
|
||||||
scene->UpdateParents(curtime);
|
scene->UpdateParents(curtime);
|
||||||
|
|
||||||
|
scene->setSuspendedTime(0.0);
|
||||||
} // suspended
|
} // suspended
|
||||||
|
else
|
||||||
|
if(scene->getSuspendedTime()==0.0)
|
||||||
|
scene->setSuspendedTime(curtime);
|
||||||
|
|
||||||
DoSound(scene);
|
DoSound(scene);
|
||||||
|
|
||||||
@ -1224,6 +1248,11 @@ bool KX_KetsjiEngine::GetUseFixedTime(void) const
|
|||||||
return m_bFixedTime;
|
return m_bFixedTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double KX_KetsjiEngine::GetSuspendedDelta()
|
||||||
|
{
|
||||||
|
return m_suspendeddelta;
|
||||||
|
}
|
||||||
|
|
||||||
double KX_KetsjiEngine::GetTicRate()
|
double KX_KetsjiEngine::GetTicRate()
|
||||||
{
|
{
|
||||||
return m_ticrate;
|
return m_ticrate;
|
||||||
|
@ -103,6 +103,9 @@ private:
|
|||||||
double m_deltatime;
|
double m_deltatime;
|
||||||
static double m_ticrate;
|
static double m_ticrate;
|
||||||
|
|
||||||
|
static double m_suspendedtime;
|
||||||
|
static double m_suspendeddelta;
|
||||||
|
|
||||||
int m_exitcode;
|
int m_exitcode;
|
||||||
STR_String m_exitstring;
|
STR_String m_exitstring;
|
||||||
/**
|
/**
|
||||||
@ -237,7 +240,13 @@ public:
|
|||||||
* @return Current setting for display all frames.
|
* @return Current setting for display all frames.
|
||||||
*/
|
*/
|
||||||
bool GetUseFixedTime(void) const;
|
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.
|
* 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_active_camera(NULL),
|
||||||
m_ueberExecutionPriority(0)
|
m_ueberExecutionPriority(0)
|
||||||
{
|
{
|
||||||
|
m_suspendedtime = 0.0;
|
||||||
|
m_suspendeddelta = 0.0;
|
||||||
|
|
||||||
m_activity_culling = false;
|
m_activity_culling = false;
|
||||||
m_suspend = false;
|
m_suspend = false;
|
||||||
@ -1135,6 +1136,23 @@ void KX_Scene::SetPhysicsEnvironment(class PHY_IPhysicsEnvironment* physEnv)
|
|||||||
m_logicmgr->RegisterEventManager(touchmgr);
|
m_logicmgr->RegisterEventManager(touchmgr);
|
||||||
return;
|
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
|
//Python
|
||||||
|
@ -251,6 +251,9 @@ protected:
|
|||||||
void MarkVisible(SG_Tree *node, RAS_IRasterizer* rasty);
|
void MarkVisible(SG_Tree *node, RAS_IRasterizer* rasty);
|
||||||
void MarkSubTreeVisible(SG_Tree *node, RAS_IRasterizer* rasty, bool visible);
|
void MarkSubTreeVisible(SG_Tree *node, RAS_IRasterizer* rasty, bool visible);
|
||||||
void MarkVisible(RAS_IRasterizer* rasty, KX_GameObject* gameobj);
|
void MarkVisible(RAS_IRasterizer* rasty, KX_GameObject* gameobj);
|
||||||
|
|
||||||
|
double m_suspendedtime;
|
||||||
|
double m_suspendeddelta;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This stores anything from python
|
* 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 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 _setattr(const STR_String &attr, PyObject *pyvalue);
|
||||||
virtual int _delattr(const STR_String &attr);
|
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;
|
typedef std::vector<KX_Scene*> KX_SceneList;
|
||||||
|
Loading…
Reference in New Issue
Block a user