diff --git a/src/helpers/AnimatedVariable.hpp b/src/helpers/AnimatedVariable.hpp index d819ce1f..ccba625d 100644 --- a/src/helpers/AnimatedVariable.hpp +++ b/src/helpers/AnimatedVariable.hpp @@ -148,17 +148,8 @@ class CAnimatedVariable { } // checks if an animation is in progress - bool isBeingAnimated() { - switch (m_eVarType) { - case AVARTYPE_FLOAT: return m_fValue != m_fGoal; - case AVARTYPE_VECTOR: return m_vValue != m_vGoal; - case AVARTYPE_COLOR: return m_cValue != m_cGoal; - default: UNREACHABLE(); - } - - UNREACHABLE(); - - return false; // just so that the warning is suppressed + inline bool isBeingAnimated() { + return m_bIsBeingAnimated; } void warp(bool endCallback = true) { @@ -178,6 +169,8 @@ class CAnimatedVariable { default: UNREACHABLE(); } + m_bIsBeingAnimated = false; + if (endCallback) onAnimationEnd(); } @@ -251,8 +244,9 @@ class CAnimatedVariable { SAnimationPropertyConfig* m_pConfig = nullptr; - bool m_bDummy = true; - bool m_bIsRegistered = false; + bool m_bDummy = true; + bool m_bIsRegistered = false; + bool m_bIsBeingAnimated = false; std::chrono::system_clock::time_point animationBegin; @@ -267,6 +261,8 @@ class CAnimatedVariable { // methods void onAnimationEnd() { + m_bIsBeingAnimated = false; + if (m_fEndCallback) { // loading m_bRemoveEndAfterRan before calling the callback allows the callback to delete this animation safely if it is false. auto removeEndCallback = m_bRemoveEndAfterRan; @@ -277,6 +273,8 @@ class CAnimatedVariable { } void onAnimationBegin() { + m_bIsBeingAnimated = true; + if (m_fBeginCallback) { m_fBeginCallback(this); if (m_bRemoveBeginAfterRan) diff --git a/src/managers/AnimationManager.cpp b/src/managers/AnimationManager.cpp index fa1e2941..0973c759 100644 --- a/src/managers/AnimationManager.cpp +++ b/src/managers/AnimationManager.cpp @@ -61,7 +61,8 @@ void CAnimationManager::tick() { for (auto& av : m_lAnimatedVariables) { // first of all, check if we need to update it at all - if (!av->isBeingAnimated()) + // TODO: this has a 100% cache miss rate, maybe move active avars to a separate vec + if (!av->m_bIsBeingAnimated) continue; if (av->m_eDamagePolicy == AVARDAMAGE_SHADOW && !*PSHADOWSENABLED) {