1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================
#include "cbase.h"
#include "fx_interpvalue.h"
CInterpolatedValue::CInterpolatedValue( void ) : m_flStartTime( 0.0f ), m_flEndTime( 0.0f ), m_flStartValue( 0.0f ), m_flEndValue( 0.0f ), m_nInterpType( INTERP_LINEAR )
{
}
CInterpolatedValue::CInterpolatedValue( float startTime, float endTime, float startValue, float endValue, InterpType_t type ) :
m_flStartTime( startTime ), m_flEndTime( endTime ), m_flStartValue( startValue ), m_flEndValue( endValue ), m_nInterpType( type )
{
}
void CInterpolatedValue::SetTime( float start, float end )
{
m_flStartTime = start; m_flEndTime = end;
}
void CInterpolatedValue::SetRange( float start, float end )
{
m_flStartValue = start; m_flEndValue = end;
}
void CInterpolatedValue::SetType( InterpType_t type )
{
m_nInterpType = type;
}
// Set the value with no range
void CInterpolatedValue::SetAbsolute( float value )
{
m_flStartValue = m_flEndValue = value;
m_flStartTime = m_flEndTime = gpGlobals->curtime;
m_nInterpType = INTERP_LINEAR;
}
// Set the value with range and time supplied
void CInterpolatedValue::Init( float startValue, float endValue, float dt, InterpType_t type /*= INTERP_LINEAR*/ )
{
if ( dt <= 0.0f )
{
SetAbsolute( endValue );
return;
}
SetTime( gpGlobals->curtime, gpGlobals->curtime + dt );
SetRange( startValue, endValue );
SetType( type );
}
// Start from the current value and move towards the end value
void CInterpolatedValue::InitFromCurrent( float endValue, float dt, InterpType_t type /*= INTERP_LINEAR*/ )
{
Init( Interp( gpGlobals->curtime ), endValue, dt, type );
}
// Find our interpolated value at the given point in time
float CInterpolatedValue::Interp( float curTime )
{
switch( m_nInterpType )
{
case INTERP_LINEAR:
{
if ( curTime >= m_flEndTime )
return m_flEndValue;
if ( curTime <= m_flStartTime )
return m_flStartValue;
return RemapVal( curTime, m_flStartTime, m_flEndTime, m_flStartValue, m_flEndValue );
}
case INTERP_SPLINE:
{
if ( curTime >= m_flEndTime )
return m_flEndValue;
if ( curTime <= m_flStartTime )
return m_flStartValue;
return SimpleSplineRemapVal( curTime, m_flStartTime, m_flEndTime, m_flStartValue, m_flEndValue );
}
}
// NOTENOTE: You managed to pass in a bogus interpolation type!
Assert(0);
return -1.0f;
}
|