00001 #ifndef _BUFFERED_NUMBER_H_
00002 #define _BUFFERED_NUMBER_H_
00003
00004 #include "utils.h"
00005 #include "ClampedNumber.h"
00006 #include "UpdateableNumber.h"
00007
00008 namespace luma
00009 {
00010 namespace numbers
00011 {
00012
00030 template <class T, class Number = ClampedNumber<T>>
00031 class BufferedNumber : public UpdateableNumber<T>
00032 {
00033 private:
00034 Number mIdealValue;
00035 Number mValue;
00036
00037 public:
00042 BufferedNumber(T initialValue, T min, T max, T increment);
00043
00048 T getValue() const;
00049
00053 void setValue(T value, float elapsedTime = TIME_UNIT);
00054
00061 void forceValue(T value);
00062 };
00063
00064 template <class T, class Number>
00065 BufferedNumber<T, Number>::BufferedNumber(T initialValue, T min, T max, T increment):
00066 mIdealValue(initialValue, min, max, increment),
00067 mValue(initialValue, min, max, increment)
00068 {
00069 }
00070
00071 template <class T, class Number>
00072 T BufferedNumber<T, Number>::getValue() const
00073 {
00074 return mValue;
00075 }
00076
00077 template <class T, class Number>
00078 void BufferedNumber<T, Number>::setValue(T value, float elapsedTime)
00079 {
00080 mIdealValue.setValue(value);
00081
00082 if (mValue + mValue.increment() * elapsedTime * frameRate < mIdealValue)
00083 mValue.inc(elapsedTime);
00084 else if(mValue - mValue.increment() * elapsedTime * frameRate > mIdealValue)
00085 mValue.dec(elapsedTime);
00086 else
00087 mValue.setValue(value);
00088 }
00089
00090 template <class T, class Number>
00091 void BufferedNumber<T, Number>::forceValue(T value)
00092 {
00093 mIdealValue.setValue(value);
00094 mValue.setValue(value);
00095 }
00096
00097 };};
00098
00099 #endif //_BUFFERED_NUMBER_H_