diff --git a/source/gameengine/Ketsji/KX_IpoActuator.cpp b/source/gameengine/Ketsji/KX_IpoActuator.cpp index 376d7f3172f..b72e29e955f 100644 --- a/source/gameengine/Ketsji/KX_IpoActuator.cpp +++ b/source/gameengine/Ketsji/KX_IpoActuator.cpp @@ -119,6 +119,7 @@ KX_IpoActuator::KX_IpoActuator(SCA_IObject* gameobj, m_type((IpoActType)acttype) { m_starttime = -2.0*fabs(m_endframe - m_startframe) - 1.0; + m_bIpoPlaying = false; } void KX_IpoActuator::SetStart(float starttime) @@ -211,27 +212,43 @@ bool KX_IpoActuator::Update(double curtime, bool frame) } m_events.clear(); - if (bNegativeEvent) - RemoveAllEvents(); + if (m_type != KX_ACT_IPO_PLAY) + { + if (bNegativeEvent) + RemoveAllEvents(); + } } double start_smaller_then_end = ( m_startframe < m_endframe ? 1.0 : -1.0); bool result=true; - if (m_starttime < -2.0*start_smaller_then_end*(m_endframe - m_startframe)) - m_starttime = curtime - KX_KetsjiEngine::GetSuspendedDelta(); - + if (!bNegativeEvent) + { + if (m_starttime < -2.0*start_smaller_then_end*(m_endframe - m_startframe)) + { + m_starttime = curtime - KX_KetsjiEngine::GetSuspendedDelta(); + m_bIpoPlaying = true; + } + } + switch (m_type) { case KX_ACT_IPO_PLAY: { // Check if playing forwards. result = ! finished - bNegativeEvent = false; // quick fix for message IPO issue - if (start_smaller_then_end > 0.0) - result = (m_localtime < m_endframe && !(m_localtime == m_startframe && bNegativeEvent)); + + if (!bNegativeEvent) + { + if (start_smaller_then_end > 0.0) + result = (m_localtime < m_endframe && !(m_localtime == m_startframe && bNegativeEvent)); + else + result = (m_localtime > m_endframe && !(m_localtime == m_startframe && bNegativeEvent)); + } else - result = (m_localtime > m_endframe && !(m_localtime == m_startframe && bNegativeEvent)); + { + result = (m_bIpoPlaying && (m_localtime < m_endframe)); + } if (result) { diff --git a/source/gameengine/Ketsji/KX_IpoActuator.h b/source/gameengine/Ketsji/KX_IpoActuator.h index 677d72f546e..9a7d1a92751 100644 --- a/source/gameengine/Ketsji/KX_IpoActuator.h +++ b/source/gameengine/Ketsji/KX_IpoActuator.h @@ -81,6 +81,8 @@ protected: /** Apply a force-ipo locally? */ bool m_force_ipo_local; + bool m_bIpoPlaying; + public: enum IpoActType {