BGE: Fix T45945: Action bouncing.
authorPorteries Tristan <republicthunderbolt9@gmail.com>
Wed, 28 Oct 2015 13:30:52 +0000 (14:30 +0100)
committerPorteries Tristan <republicthunderbolt9@gmail.com>
Wed, 28 Oct 2015 14:13:12 +0000 (15:13 +0100)
Bug introduced in 583fa7d1e, KX_GameObject.setActionFrame can make BL_Action::m_starttime negative. But in BL_Action::Update m_starttime is set to the current time if it's negative.
To fix it we use a boolean BL_Action::m_initializedTime to know if we should initialize the time in BL_Action::Update, it's more stable than comparing times.

Tested with bug task T45945 and T32054, with an extra patch about to fix suspend resume scene issues with actions : D1569

source/gameengine/Ketsji/BL_Action.cpp
source/gameengine/Ketsji/BL_Action.h

index 5889f5ed412a03bdca6ea9af9ed0641745da0996..89d8ec0d4ca42f4466f299be0ec6590b6ae0f3e3 100644 (file)
@@ -84,7 +84,8 @@ BL_Action::BL_Action(class KX_GameObject* gameobj)
        m_blendmode(ACT_BLEND_BLEND),
        m_ipo_flags(0),
        m_done(true),
-       m_calc_localtime(true)
+       m_calc_localtime(true),
+       m_initializedTime(false)
 {
 }
 
@@ -271,6 +272,7 @@ bool BL_Action::Play(const char* name,
        m_layer_weight = layer_weight;
        
        m_done = false;
+       m_initializedTime = false;
 
        return true;
 }
@@ -400,8 +402,10 @@ void BL_Action::Update(float curtime)
 
        // Grab the start time here so we don't end up with a negative m_localframe when
        // suspending and resuming scenes.
-       if (m_starttime < 0)
+       if (!m_initializedTime) {
                m_starttime = curtime;
+               m_initializedTime = true;
+       }
 
        if (m_calc_localtime)
                SetLocalTime(curtime);
index f41b2ef9460e3ea7c506334f4424c63654b36fe2..f4c2975a547425fe237e6ebaa6c9ef38938113e7 100644 (file)
@@ -69,6 +69,8 @@ private:
 
        bool m_done;
        bool m_calc_localtime;
+       /// Set to true when m_starttime is initialized in Update.
+       bool m_initializedTime;
 
        void ClearControllerList();
        void InitIPO();