diff --git a/stepmania/src/SampleHistory.cpp b/stepmania/src/SampleHistory.cpp new file mode 100644 index 0000000000..4051d9ccff --- /dev/null +++ b/stepmania/src/SampleHistory.cpp @@ -0,0 +1,89 @@ +#include "global.h" +#include "SampleHistory.h" +#include "RageLog.h" +#include "RageUtil.h" +#include "Foreach.h" + +SampleHistory::SampleHistory() +{ + m_iLastHistory = 0; + m_iHistorySamplesPerSecond = 60.0f; + m_fHistorySeconds = 0.0f; + m_fToSample = 1 / m_iHistorySamplesPerSecond; + + m_fHistorySeconds = 10.0f; + int iSamples = lrintf( m_iHistorySamplesPerSecond * m_fHistorySeconds ); + m_afHistory.resize( iSamples ); +} + +float SampleHistory::GetSampleNum( float fSamplesAgo ) const +{ + fSamplesAgo = min( fSamplesAgo, (float) m_afHistory.size() - 1 ); + if( fSamplesAgo < 0 ) + fSamplesAgo = 0; + if( m_afHistory.size() == 0 ) + return 0.0f; + + float fSample = m_iLastHistory - fSamplesAgo - 1; + + float f = floorf( fSample ); + int iSample = lrintf(f); + int iNextSample = iSample + 1; + wrap( iSample, m_afHistory.size() ); + wrap( iNextSample, m_afHistory.size() ); + + float p = fSample - f; + float fRet = lerp( p, m_afHistory[iSample], m_afHistory[iNextSample] ); +// LOG->Trace( "%.3f: %i, %i, %.3f (f %.3f, %.3f)", fSample, iSample, iNextSample, fRet, f, p ); + return fRet; +} + +float SampleHistory::GetSample( float fSecondsAgo ) const +{ + float fSamplesAgo = fSecondsAgo * m_iHistorySamplesPerSecond; + return GetSampleNum( fSamplesAgo ); +} + +void SampleHistory::AddSample( float fSample, float fDeltaTime ) +{ + while( fDeltaTime > 0.0001f ) + { + float fTime = min( m_fToSample, fDeltaTime ); + m_fToSample -= fTime; + fDeltaTime -= fTime; + + if( m_fToSample < 0.0001f ) + { + ++m_iLastHistory; + m_iLastHistory %= m_afHistory.size(); + m_fToSample += 1.0f / m_iHistorySamplesPerSecond; + } + + m_afHistory[m_iLastHistory] = fSample; + } +} + +/* + * (c) 2006-2007 Glenn Maynard + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons to + * whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS + * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ diff --git a/stepmania/src/SampleHistory.h b/stepmania/src/SampleHistory.h new file mode 100644 index 0000000000..6a77099095 --- /dev/null +++ b/stepmania/src/SampleHistory.h @@ -0,0 +1,48 @@ +/* SampleHistory - Store a trailing history of values, and retrieve values with interpolation. */ + +#ifndef SAMPLE_HISTORY_H +#define SAMPLE_HISTORY_H + +class SampleHistory +{ +public: + SampleHistory(); + void AddSample( float fSample, float fDeltaTime ); + float GetSample( float fSecondsAgo ) const; + +private: + float GetSampleNum( float fSamplesAgo ) const; + + vector m_afHistory; + int m_iLastHistory; + int m_iHistorySamplesPerSecond; + float m_fHistorySeconds; + float m_fToSample; +}; + +#endif + +/* + * (c) 2006-2007 Glenn Maynard + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, and/or sell copies of the Software, and to permit persons to + * whom the Software is furnished to do so, provided that the above + * copyright notice(s) and this permission notice appear in all copies of + * the Software and that both the above copyright notice(s) and this + * permission notice appear in supporting documentation. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF + * THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS + * INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */