diff options
Diffstat (limited to 'indra/llcommon/llcriticaldamp.cpp')
-rw-r--r-- | indra/llcommon/llcriticaldamp.cpp | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/indra/llcommon/llcriticaldamp.cpp b/indra/llcommon/llcriticaldamp.cpp new file mode 100644 index 0000000000..ee7dfecdaa --- /dev/null +++ b/indra/llcommon/llcriticaldamp.cpp @@ -0,0 +1,72 @@ +/** + * @file llcriticaldamp.cpp + * @brief Implementation of the critical damping functionality. + * + * Copyright (c) 2002-$CurrentYear$, Linden Research, Inc. + * $License$ + */ + +#include "linden_common.h" +#include <math.h> + +#include "llcriticaldamp.h" + +//----------------------------------------------------------------------------- +// static members +//----------------------------------------------------------------------------- +LLFrameTimer LLCriticalDamp::sInternalTimer; +std::map<F32, F32> LLCriticalDamp::sInterpolants; +F32 LLCriticalDamp::sTimeDelta; + +//----------------------------------------------------------------------------- +// LLCriticalDamp() +//----------------------------------------------------------------------------- +LLCriticalDamp::LLCriticalDamp() +{ + sTimeDelta = 0.f; +} + +// static +//----------------------------------------------------------------------------- +// updateInterpolants() +//----------------------------------------------------------------------------- +void LLCriticalDamp::updateInterpolants() +{ + sTimeDelta = sInternalTimer.getElapsedTimeAndResetF32(); + + F32 time_constant; + + for (std::map<F32, F32>::iterator iter = sInterpolants.begin(); + iter != sInterpolants.end(); iter++) + { + time_constant = iter->first; + F32 new_interpolant = 1.f - pow(2.f, -sTimeDelta / time_constant); + new_interpolant = llclamp(new_interpolant, 0.f, 1.f); + sInterpolants[time_constant] = new_interpolant; + } +} + +//----------------------------------------------------------------------------- +// getInterpolant() +//----------------------------------------------------------------------------- +F32 LLCriticalDamp::getInterpolant(const F32 time_constant, BOOL use_cache) +{ + if (time_constant == 0.f) + { + return 1.f; + } + + if (use_cache && sInterpolants.count(time_constant)) + { + return sInterpolants[time_constant]; + } + + F32 interpolant = 1.f - pow(2.f, -sTimeDelta / time_constant); + interpolant = llclamp(interpolant, 0.f, 1.f); + if (use_cache) + { + sInterpolants[time_constant] = interpolant; + } + + return interpolant; +} |