diff --git a/indra/newview/rlvdefines.h b/indra/newview/rlvdefines.h index f354bd002d..29cc03a913 100644 --- a/indra/newview/rlvdefines.h +++ b/indra/newview/rlvdefines.h @@ -71,6 +71,7 @@ const S32 RLVa_VERSION_PATCH = 0; #define RLV_ROOT_FOLDER "#RLV" #define RLV_CMD_PREFIX '@' +#define RLV_MODIFIER_ANIMATION_FREQUENCY 10 #define RLV_MODIFIER_TPLOCAL_DEFAULT 256.f // Any teleport that's more than a region away is non-local #define RLV_MODIFIER_FARTOUCH_DEFAULT 1.5f // Specifies the default @fartouch distance #define RLV_MODIFIER_SITTP_DEFAULT 1.5f // Specifies the default @sittp distance diff --git a/indra/newview/rlvmodifiers.cpp b/indra/newview/rlvmodifiers.cpp index 8df8ca294c..ce082254f2 100644 --- a/indra/newview/rlvmodifiers.cpp +++ b/indra/newview/rlvmodifiers.cpp @@ -24,11 +24,8 @@ RlvBehaviourModifierAnimator::~RlvBehaviourModifierAnimator() { - if (m_pTimer) - { - delete m_pTimer; - m_pTimer = nullptr; - } + if (!m_TimerHandle.isDead()) + m_TimerHandle.markDead(); } void RlvBehaviourModifierAnimator::addTween(const LLUUID& idObject, ERlvBehaviourModifier eBhvrMod, RlvBehaviourModifierAnimationType eAnimType, const RlvBehaviourModifierValue& endValue, float nDuration) @@ -38,7 +35,7 @@ void RlvBehaviourModifierAnimator::addTween(const LLUUID& idObject, ERlvBehaviou if (m_Tweens.end() != itTween) m_Tweens.erase(itTween); - if (RlvBehaviourModifier* pBhvrModifier = RlvBehaviourDictionary::instance().getModifier(eBhvrMod)) + if (const RlvBehaviourModifier* pBhvrModifier = RlvBehaviourDictionary::instance().getModifier(eBhvrMod)) { RlvBehaviourModifierTween newTween; newTween.idObject = idObject; @@ -50,8 +47,8 @@ void RlvBehaviourModifierAnimator::addTween(const LLUUID& idObject, ERlvBehaviou newTween.endValue = endValue; if (newTween.startValue.which() == newTween.endValue.which()) { - if (!m_pTimer) - m_pTimer = new AnimationTimer(); + if (m_TimerHandle.isDead()) + m_TimerHandle = (new AnimationTimer())->getHandle(); m_Tweens.emplace_back(std::move(newTween)); } } @@ -60,23 +57,22 @@ void RlvBehaviourModifierAnimator::addTween(const LLUUID& idObject, ERlvBehaviou void RlvBehaviourModifierAnimator::clearTweens(const LLUUID& idObject, ERlvBehaviourModifier eBhvrMod) { m_Tweens.erase(std::remove_if(m_Tweens.begin(), m_Tweens.end(), - [&idObject, eBhvrMod](const RlvBehaviourModifierTween& cmpTween) - { - return cmpTween.idObject == idObject && ((cmpTween.eBhvrMod == eBhvrMod) || (RLV_MODIFIER_UNKNOWN == eBhvrMod)); - }), m_Tweens.end()); + [&idObject, eBhvrMod](const RlvBehaviourModifierTween& cmpTween) + { + return cmpTween.idObject == idObject && ((cmpTween.eBhvrMod == eBhvrMod) || (RLV_MODIFIER_UNKNOWN == eBhvrMod)); + }), m_Tweens.end()); } // ==================================================================================== // RlvBehaviourModifierAnimator timer // -#define ANIMATION_FREQUENCY 10 - RlvBehaviourModifierAnimator::AnimationTimer::AnimationTimer() - : LLEventTimer(1.f / ANIMATION_FREQUENCY) + : LLEventTimer(1.f / RLV_MODIFIER_ANIMATION_FREQUENCY) { } + BOOL RlvBehaviourModifierAnimator::AnimationTimer::tick() { RlvBehaviourModifierAnimator& modAnimatior = RlvBehaviourModifierAnimator::instance(); @@ -105,7 +101,7 @@ BOOL RlvBehaviourModifierAnimator::AnimationTimer::tick() auto itTween = std::find_if(modAnimatior.m_Tweens.begin(), modAnimatior.m_Tweens.end(), [&curTween](const RlvBehaviourModifierTween& t) { - // NOTE: implementation leak - taking advantage of the fact that we know there can only be one active tween per object/modifier/type combnination + // NOTE: implementation leak - taking advantage of the fact that we know there can only be one active tween per object/modifier/type combination return t.idObject == curTween.idObject && t.eBhvrMod == curTween.eBhvrMod && t.eAnimType == curTween.eAnimType; }); modAnimatior.m_Tweens.erase(itTween); @@ -113,12 +109,7 @@ BOOL RlvBehaviourModifierAnimator::AnimationTimer::tick() } } - if (modAnimatior.m_Tweens.empty()) - { - modAnimatior.m_pTimer = nullptr; - return true; - } - return false; + return modAnimatior.m_Tweens.empty(); } // ==================================================================================== diff --git a/indra/newview/rlvmodifiers.h b/indra/newview/rlvmodifiers.h index 5f36d310e2..7328530a97 100644 --- a/indra/newview/rlvmodifiers.h +++ b/indra/newview/rlvmodifiers.h @@ -16,11 +16,12 @@ #pragma once +#include "llhandle.h" #include "llsingleton.h" #include "rlvhelper.h" // ==================================================================================== -// RlvBehaviourModifierAnimator - Helper types +// RlvBehaviourModifierAnimator - A class to animate behaviour modifiers // enum class RlvBehaviourModifierAnimationType { Lerp }; @@ -36,13 +37,8 @@ struct RlvBehaviourModifierTween RlvBehaviourModifierValue endValue; }; -// ==================================================================================== -// RlvBehaviourModifierAnimator - A class to animate behaviour modifiers -// - class RlvBehaviourModifierAnimator : public LLSingleton { - friend class AnimationTimer; LLSINGLETON_EMPTY_CTOR(RlvBehaviourModifierAnimator); public: ~RlvBehaviourModifierAnimator() override; @@ -58,7 +54,8 @@ public: /* * Animation timer */ - class AnimationTimer : LLEventTimer +protected: + class AnimationTimer : public LLEventTimer, public LLHandleProvider { public: AnimationTimer(); @@ -68,8 +65,9 @@ public: /* * Member variables */ - std::list m_Tweens; - AnimationTimer* m_pTimer = nullptr; +protected: + LLHandle m_TimerHandle; + std::list< RlvBehaviourModifierTween> m_Tweens; }; // ====================================================================================