/*==LICENSE==*
CyanWorlds.com Engine - MMOG client, server and tools
Copyright (C) 2011 Cyan Worlds, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
You can contact Cyan Worlds, Inc. by email legal@cyan.com
or by snail mail at:
Cyan Worlds, Inc.
14617 N Newport Hwy
Mead, WA 99021
*==LICENSE==*/
#ifndef plTimedInterp_inc
#define plTimedInterp_inc
// There's no auto update on this, the owner is
// required to call update periodically.
//
// This isn't optimized in any way, and is still
// fairly general. Adding features would most likely
// be best implemented in a derived type.
// Notably lacking features are:
// ability to read and write,
// auto-eval on significant time change
//
//
// Requires class T to have the following members
// T& operator+=(const class T& t);
// T& operator-=(const class T& t);
// T& operator*=(hsScalar scale);
// T& operator=(const class T&); // unless builtin = is adequate.
//
template class plTimedInterp
{
protected:
T fInit;
T fCurr;
T fTarg;
double fDuration;
double fEnd;
const T& IEnd();
const T& IBegin();
const T& IEval(hsScalar parm);
public:
plTimedInterp();
plTimedInterp(const T& t);
const T& Set(const T& val) { return SetTarget(val, 0, 0); }
const T& SetTarget(const T& targ, double start, double duration);
const T& Update(double t);
operator T() const { return fCurr; }
const T& Value() const { return fCurr; }
};
template
plTimedInterp::plTimedInterp()
: fDuration(0),
fEnd(0)
{
}
template
plTimedInterp::plTimedInterp(const T& t)
: fInit(t),
fCurr(t),
fTarg(t),
fDuration(0),
fEnd(0)
{
}
template
const T&
plTimedInterp::Update(double t)
{
if( fDuration <= 0 )
return IEnd();
hsScalar parm = hsScalar((fEnd - t) / fDuration);
if( parm <= 0 )
return IEnd();
else if( parm >= 1.f )
return IBegin();
return IEval(parm);
}
template
const T&
plTimedInterp::SetTarget(const T& targ, double start, double dur)
{
fEnd = start + dur;
fDuration = dur;
fTarg = targ;
if( dur <= 0 )
fCurr = targ;
fInit = fCurr;
return fCurr;
}
template
const T&
plTimedInterp::IEnd()
{
fDuration = 0;
fCurr = fTarg;
return fCurr;
}
template
const T&
plTimedInterp::IBegin()
{
return fCurr;
}
template
const T&
plTimedInterp::IEval(hsScalar parm)
{
fCurr = fInit;
fCurr -= fTarg;
fCurr *= parm;
fCurr += fTarg;
return fCurr;
}
#endif // plTimedInterp_inc