summaryrefslogtreecommitdiff
path: root/indra/llcommon
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llcommon')
-rw-r--r--indra/llcommon/llcriticaldamp.cpp50
-rw-r--r--indra/llcommon/llcriticaldamp.h82
2 files changed, 37 insertions, 95 deletions
diff --git a/indra/llcommon/llcriticaldamp.cpp b/indra/llcommon/llcriticaldamp.cpp
index 27fef0e6dc..49aac9ce75 100644
--- a/indra/llcommon/llcriticaldamp.cpp
+++ b/indra/llcommon/llcriticaldamp.cpp
@@ -32,9 +32,8 @@
// static members
//-----------------------------------------------------------------------------
LLFrameTimer LLCriticalDamp::sInternalTimer;
+std::map<F32, F32> LLCriticalDamp::sInterpolants;
F32 LLCriticalDamp::sTimeDelta;
-F32 LLCriticalDamp::sInterpolants[kNumCachedInterpolants];
-F32 LLCriticalDamp::sInterpolatedValues[kNumCachedInterpolants];
//-----------------------------------------------------------------------------
// LLCriticalDamp()
@@ -42,17 +41,6 @@ F32 LLCriticalDamp::sInterpolatedValues[kNumCachedInterpolants];
LLCriticalDamp::LLCriticalDamp()
{
sTimeDelta = 0.f;
-
- // Init the core interpolant values (to which many, many enums map)
- //
- setInterpolantConstant(InterpDelta_0_025, 0.025f);
- setInterpolantConstant(InterpDelta_0_05, 0.05f );
- setInterpolantConstant(InterpDelta_0_06, 0.06f);
- setInterpolantConstant(InterpDelta_0_10, 0.10f);
- setInterpolantConstant(InterpDelta_0_15, 0.15f);
- setInterpolantConstant(InterpDelta_0_20, 0.20f);
- setInterpolantConstant(InterpDelta_0_25, 0.25f);
- setInterpolantConstant(InterpDelta_0_30, 0.30f);
}
// static
@@ -63,10 +51,40 @@ void LLCriticalDamp::updateInterpolants()
{
sTimeDelta = sInternalTimer.getElapsedTimeAndResetF32();
- U32 i;
- for (i = 0; i < kNumCachedInterpolants; i++)
+ 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))
{
- sInterpolatedValues[i] = llclamp(sTimeDelta / sInterpolants[ i], 0.0f, 1.0f);
+ 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;
}
diff --git a/indra/llcommon/llcriticaldamp.h b/indra/llcommon/llcriticaldamp.h
index 19a2ddb77a..52f052ae25 100644
--- a/indra/llcommon/llcriticaldamp.h
+++ b/indra/llcommon/llcriticaldamp.h
@@ -32,98 +32,22 @@
#include "llframetimer.h"
-// These enums each represent one fixed-time delta value
-// that we interpolate once given the actual sTimeDelta time
-// that has passed. This allows us to calculate the interp portion
-// of those values once and then look them up repeatedly per frame.
-//
-enum InterpDelta
-{
- InterpDelta_0_025, // 0.025
- InterpDeltaTeenier = InterpDelta_0_025,
- InterpDeltaFolderOpenTime = InterpDelta_0_025,
- InterpDeltaFolderCloseTime = InterpDelta_0_025,
- InterpDeltaCameraFocusHalfLife = InterpDelta_0_025, // USED TO BE ZERO....
-
- InterpDelta_0_05, // 0.05
- InterpDeltaTeeny = InterpDelta_0_05,
-
- InterpDelta_0_06, // 0.06
- InterpDeltaObjectDampingConstant = InterpDelta_0_06,
- InterpDeltaCameraZoomHalfLife = InterpDelta_0_06,
- InterpDeltaFovZoomHalfLife = InterpDelta_0_06,
- InterpDeltaManipulatorScaleHalfLife = InterpDelta_0_06,
- InterpDeltaContextFadeTime = InterpDelta_0_06,
-
- InterpDelta_0_10, // 0.10
- InterpDeltaSmaller = InterpDelta_0_10,
- InterpDeltaTargetLagHalfLife = InterpDelta_0_10,
- InterpDeltaSpeedAdjustTime = InterpDelta_0_10,
-
- InterpDelta_0_15, // 0.15
- InterpDeltaFadeWeight = InterpDelta_0_15,
- InterpDeltaHeadLookAtLagHalfLife = InterpDelta_0_15,
-
- InterpDelta_0_20, // 0.20
- InterpDeltaSmall = InterpDelta_0_20,
- InterpDeltaTorsoLagHalfLife = InterpDelta_0_20,
- InterpDeltaPositionDampingTC = InterpDelta_0_20,
-
- InterpDelta_0_25, // 0.25
- InterpDeltaCameraLagHalfLife = InterpDelta_0_25,
- InterpDeltaTorsoTargetLagHalfLife = InterpDelta_0_25,
- InterpDeltaTorsoLookAtLagHalfLife = InterpDelta_0_25,
-
- InterpDelta_0_30, // 0.3
- InterpDeltaSmallish = InterpDelta_0_30,
-
- // Dynamically set interpolants which use setInterpolantConstant
- //
- InterpDeltaCameraSmoothingHalfLife,
- InterpDeltaBehindnessLag,
- InterpDeltaFocusLag,
- InterpDeltaPositionLag,
- InterpDeltaOpenTime,
- InterpDeltaCloseTime,
-
- kNumCachedInterpolants
-};
-
class LL_COMMON_API LLCriticalDamp
{
public:
LLCriticalDamp();
- // Updates all the known interp delta values for fast lookup in calls to getInterpolant(InterpDelta)
- //
+ // MANIPULATORS
static void updateInterpolants();
- static inline void setInterpolantConstant(InterpDelta whichDelta, const F32 time_constant)
- {
- llassert(whichDelta < kNumCachedInterpolants);
- sInterpolants[whichDelta] = time_constant;
- }
-
// ACCESSORS
- static inline F32 getInterpolant(InterpDelta whichDelta)
- {
- llassert(whichDelta < kNumCachedInterpolants);
- return sInterpolatedValues[whichDelta];
- }
-
- static inline F32 getInterpolant(const F32 time_constant)
- {
- return llclamp((sTimeDelta / time_constant), 0.0f, 1.0f);
- }
+ static F32 getInterpolant(const F32 time_constant, BOOL use_cache = TRUE);
protected:
static LLFrameTimer sInternalTimer; // frame timer for calculating deltas
- //static std::map<F32, F32> sInterpolants;
- static F32 sInterpolants[kNumCachedInterpolants];
- static F32 sInterpolatedValues[kNumCachedInterpolants];
+ static std::map<F32, F32> sInterpolants;
static F32 sTimeDelta;
};
#endif // LL_LLCRITICALDAMP_H
-