Home | nevrax.com |
|
value_smoother.cppGo to the documentation of this file.00001 00007 /* Copyright, 2001 Nevrax Ltd. 00008 * 00009 * This file is part of NEVRAX NEL. 00010 * NEVRAX NEL is free software; you can redistribute it and/or modify 00011 * it under the terms of the GNU General Public License as published by 00012 * the Free Software Foundation; either version 2, or (at your option) 00013 * any later version. 00014 00015 * NEVRAX NEL is distributed in the hope that it will be useful, but 00016 * WITHOUT ANY WARRANTY; without even the implied warranty of 00017 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00018 * General Public License for more details. 00019 00020 * You should have received a copy of the GNU General Public License 00021 * along with NEVRAX NEL; see the file COPYING. If not, write to the 00022 * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, 00023 * MA 02111-1307, USA. 00024 */ 00025 00026 #include "stdmisc.h" 00027 00028 #include "nel/misc/value_smoother.h" 00029 00030 00031 using namespace std; 00032 00033 00034 namespace NLMISC 00035 { 00036 00037 00038 CValueSmoother::CValueSmoother(uint n) 00039 { 00040 nlassert(n!=0); 00041 init(n); 00042 } 00043 00044 void CValueSmoother::reset() 00045 { 00046 fill(_LastFrames.begin(), _LastFrames.end(), 0); 00047 00048 _CurFrame= 0; 00049 _NumFrame= 0; 00050 _FrameSum= 0; 00051 } 00052 00053 void CValueSmoother::init(uint n) 00054 { 00055 nlassert(n!=0); 00056 00057 // reset all the array to 0. 00058 _LastFrames.clear(); 00059 _LastFrames.resize(n, 0); 00060 00061 _CurFrame= 0; 00062 _NumFrame= 0; 00063 _FrameSum= 0; 00064 } 00065 00066 void CValueSmoother::addValue(float dt) 00067 { 00068 // update the frame sum. NB: see init(), at start, array is full of 0. so it works even for un-inited values. 00069 _FrameSum-= _LastFrames[_CurFrame]; 00070 _FrameSum+= dt; 00071 00072 // bkup this value in the array. 00073 _LastFrames[_CurFrame]= dt; 00074 00075 // next frame. 00076 _CurFrame++; 00077 _CurFrame%=_LastFrames.size(); 00078 00079 // update the number of frames added. 00080 _NumFrame++; 00081 _NumFrame= min(_NumFrame, _LastFrames.size()); 00082 } 00083 00084 float CValueSmoother::getSmoothValue() 00085 { 00086 if(_NumFrame) 00087 return _FrameSum / _NumFrame; 00088 else 00089 return 0; 00090 } 00091 00092 00093 00094 } // NLMISC |