BGE Animations: Making BL_Action::SetFrame() not so dependent on timing. This should smooth out things like setActionFrame().

This commit is contained in:
Mitchell Stokes 2011-06-23 23:19:39 +00:00
parent 12ca476b8b
commit f969b813a4
2 changed files with 18 additions and 4 deletions

@ -66,7 +66,8 @@ BL_Action::BL_Action(class KX_GameObject* gameobj)
m_blendpose(NULL),
m_sg_contr(NULL),
m_ptrrna(NULL),
m_done(true)
m_done(true),
m_bcalc_local_time(true)
{
if (m_obj->GetGameObjectType() == SCA_IObject::OBJ_ARMATURE)
{
@ -184,6 +185,10 @@ void BL_Action::SetFrame(float frame)
else if (frame > max(m_startframe, m_endframe))
frame = max(m_startframe, m_endframe);
m_localtime = frame;
m_bcalc_local_time = false;
#if 0
// We don't set m_localtime directly since it's recalculated
// in the next update. So, we modify the value (m_starttime)
// used to calculate m_localtime the next time SetLocalTime() is called.
@ -194,6 +199,7 @@ void BL_Action::SetFrame(float frame)
dt = -dt;
m_starttime -= dt / (KX_KetsjiEngine::GetAnimFrameRate()*m_speed);
#endif
}
void BL_Action::SetLocalTime(float curtime)
@ -212,9 +218,16 @@ void BL_Action::Update(float curtime)
if (m_done)
return;
curtime -= KX_KetsjiEngine::GetSuspendedDelta();
SetLocalTime(curtime);
// We only want to calculate the current time we weren't given a frame (e.g., from SetFrame())
if (m_bcalc_local_time)
{
curtime -= KX_KetsjiEngine::GetSuspendedDelta();
SetLocalTime(curtime);
}
else
{
m_bcalc_local_time = true;
}
// Handle wrap around
if (m_localtime < min(m_startframe, m_endframe) || m_localtime > max(m_startframe, m_endframe))

@ -64,6 +64,7 @@ private:
short m_ipo_flags;
bool m_done;
bool m_bcalc_local_time;
void InitIPO();
void SetLocalTime(float curtime);