You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
2.5 KiB
97 lines
2.5 KiB
![]()
4 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
//=============================================================================//
|
||
|
|
||
|
#include "cbase.h"
|
||
|
#include "simple_keys.h"
|
||
|
|
||
|
// memdbgon must be the last include file in a .cpp file!!!
|
||
|
#include "tier0/memdbgon.h"
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Simple key interpolations
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
// Input : &out -
|
||
|
// t -
|
||
|
// &start -
|
||
|
// &end -
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CSimpleKeyInterp::Interp( Vector &out, float t, const CSimpleKeyInterp &start, const CSimpleKeyInterp &end )
|
||
|
{
|
||
|
float delta = end.GetTime() - start.GetTime();
|
||
|
t = clamp( t-start.GetTime(), 0.f, delta );
|
||
|
|
||
|
float unitT = (delta > 0) ? (t / delta) : 1;
|
||
|
|
||
|
switch( end.m_interp )
|
||
|
{
|
||
|
case KEY_SPLINE:
|
||
|
unitT = SimpleSpline( unitT );
|
||
|
break;
|
||
|
case KEY_ACCELERATE:
|
||
|
unitT *= unitT;
|
||
|
break;
|
||
|
case KEY_DECELERATE:
|
||
|
unitT = sqrt(unitT);
|
||
|
break;
|
||
|
default:
|
||
|
case KEY_LINEAR:
|
||
|
//unitT = unitT;
|
||
|
break;
|
||
|
}
|
||
|
out = (1-unitT) * ((Vector)start) + unitT * ((Vector)end);
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Simple key list
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
// Input : &key -
|
||
|
// Output : int
|
||
|
//-----------------------------------------------------------------------------
|
||
|
int CSimpleKeyList::Insert( const CSimpleKeyInterp &key )
|
||
|
{
|
||
|
for ( int i = 0; i < m_list.Count(); i++ )
|
||
|
{
|
||
|
if ( key.GetTime() < m_list[i].GetTime() )
|
||
|
return m_list.InsertBefore( i, key );
|
||
|
}
|
||
|
|
||
|
return m_list.AddToTail( key );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
// Input : &out -
|
||
|
// t -
|
||
|
// Output : Returns true on success, false on failure.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool CSimpleKeyList::Interp( Vector &out, float t )
|
||
|
{
|
||
|
int startIndex = -1;
|
||
|
|
||
|
out.Init();
|
||
|
for ( int i = 0; i < m_list.Count(); i++ )
|
||
|
{
|
||
|
if ( t < m_list[i].GetTime() )
|
||
|
{
|
||
|
// before start
|
||
|
if ( startIndex < 0 )
|
||
|
return false;
|
||
|
CSimpleKeyInterp::Interp( out, t, m_list[startIndex], m_list[i] );
|
||
|
return true;
|
||
|
}
|
||
|
startIndex = i;
|
||
|
}
|
||
|
|
||
|
// past end
|
||
|
return false;
|
||
|
}
|