#if !defined(CTRL__OldInterpolation_h__INCLUDED) #define CTRL__OldInterpolation_h__INCLUDED #pragma once #include "SmObject.h" /***************************************************************************\ ***************************************************************************** * * class OldInterpolationT * * OldInterpolationT defines a common implementation class for building * Interpolation functions that can be used with Animations in DirectUser. * ***************************************************************************** \***************************************************************************/ template class OldInterpolationT : public SmObjectT { // Operations public: static HRESULT Build(REFIID riid, void ** ppv) { OldInterpolationT * pObj = new OldInterpolationT; if (pObj != NULL) { pObj->m_cRef = 0; HRESULT hr = pObj->QueryInterface(riid, ppv); if (FAILED(hr)) { delete pObj; } return hr; } else { return E_OUTOFMEMORY; } } }; /***************************************************************************\ ***************************************************************************** * * class OldLinearInterpolation * ***************************************************************************** \***************************************************************************/ class OldLinearInterpolation : public ILinearInterpolation { public: STDMETHOD_(float, Compute)(float flProgress, float flStart, float flEnd) { return (1.0f - flProgress) * flStart + flProgress * flEnd; } protected: static const IID * s_rgpIID[]; }; /***************************************************************************\ ***************************************************************************** * * class OldLogInterpolation * ***************************************************************************** \***************************************************************************/ class OldLogInterpolation : public ILogInterpolation { // Operations public: inline OldLogInterpolation() { m_flScale = 1.0f; } STDMETHOD_(float, Compute)(float flProgress, float flStart, float flEnd) { float flMax = (float) log10(m_flScale * 9.0f + 1.0f); float flT = (float) log10(flProgress * m_flScale * 9.0f + 1.0f) / flMax; return (1.0f - flT) * flStart + flT * flEnd; } STDMETHOD_(void, SetScale)(float flScale) { m_flScale = flScale; } // Data protected: float m_flScale; static const IID * s_rgpIID[]; }; /***************************************************************************\ ***************************************************************************** * * class OldExpInterpolation * ***************************************************************************** \***************************************************************************/ class OldExpInterpolation : public IExpInterpolation { // Operations public: inline OldExpInterpolation() { m_flScale = 1.0f; } STDMETHOD_(float, Compute)(float flProgress, float flStart, float flEnd) { double dflProgress = flProgress; double dflStart = flStart; double dflEnd = flEnd; double dflScale = m_flScale; double dflMax = (((10.0 * dflScale) - 1.0) / 9.0); double dflT = (((pow(10.0 * dflScale, dflProgress) - 1.0) / 9.0) / dflMax); return (float) ((1.0 - dflT) * dflStart + dflT * dflEnd); } STDMETHOD_(void, SetScale)(float flScale) { m_flScale = flScale; } // Data protected: float m_flScale; static const IID * s_rgpIID[]; }; /***************************************************************************\ ***************************************************************************** * * class OldSInterpolation * ***************************************************************************** \***************************************************************************/ class OldSInterpolation : public ISInterpolation { // Operations public: inline OldSInterpolation() { m_flScale = 1.0f; } STDMETHOD_(float, Compute)(float flProgress, float flStart, float flEnd) { // // Slow - fast - slow // double dflProgress = flProgress; double dflStart = flStart; double dflEnd = flEnd; double dflScale = m_flScale; double dflMax; double dflT; if (dflProgress < 0.5) { double dflPartProgress = dflProgress * 2.0; dflMax = (((10.0 * dflScale) - 1.0) / 9.0) * 2.0; dflT = ((pow(10.0 * dflScale, dflPartProgress) - 1.0) / 9.0) / dflMax; } else { double dflPartProgress = (1.0 - dflProgress) * 2.0; dflMax = (((10.0 * dflScale) - 1.0) / 9.0) * 2.0; dflT = 1.0 - ((pow(10.0 * dflScale, dflPartProgress) - 1.0) / 9.0) / dflMax; } return (float) ((1.0 - dflT) * dflStart + dflT * dflEnd); } STDMETHOD_(void, SetScale)(float flScale) { m_flScale = flScale; } // Data protected: float m_flScale; static const IID * s_rgpIID[]; }; #endif // CTRL__OldInterpolation_h__INCLUDED