From 420b91db29485df39fd6e724e782c449158811cb Mon Sep 17 00:00:00 2001 From: James Cook Date: Tue, 2 Jan 2007 08:33:20 +0000 Subject: Print done when done. --- indra/llcommon/llcriticaldamp.cpp | 72 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 indra/llcommon/llcriticaldamp.cpp (limited to 'indra/llcommon/llcriticaldamp.cpp') 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 + +#include "llcriticaldamp.h" + +//----------------------------------------------------------------------------- +// static members +//----------------------------------------------------------------------------- +LLFrameTimer LLCriticalDamp::sInternalTimer; +std::map 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::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; +} -- cgit v1.2.3