BGE Animations: Making BL_Action::SetFrame() not so dependent on timing. This should...
authorMitchell Stokes <mogurijin@gmail.com>
Thu, 23 Jun 2011 23:19:39 +0000 (23:19 +0000)
committerMitchell Stokes <mogurijin@gmail.com>
Thu, 23 Jun 2011 23:19:39 +0000 (23:19 +0000)
source/gameengine/Ketsji/BL_Action.cpp
source/gameengine/Ketsji/BL_Action.h

index 06cf031885968a7cdf6a945c25077e83ce8b53a1..cf37260243108c431b6db225884d949f04176733 100644 (file)
@@ -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))
index b5d9f0566cd79f7a6b51681a082e0c77aaf4e591..d9d134db9f1baf7762a97f41139ca8031c2215f9 100644 (file)
@@ -64,6 +64,7 @@ private:
        short m_ipo_flags;
 
        bool m_done;
+       bool m_bcalc_local_time;
 
        void InitIPO();
        void SetLocalTime(float curtime);