animationmanager: optimize avar state

This commit is contained in:
vaxerski 2023-07-19 22:40:03 +02:00
parent 80cd2ef3d7
commit 7091d4e597
2 changed files with 13 additions and 14 deletions

View file

@ -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();
}
@ -253,6 +246,7 @@ class CAnimatedVariable {
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)

View file

@ -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) {