Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #ifndef __SP_MATH_INTERPOLATOR_H__
00009 #define __SP_MATH_INTERPOLATOR_H__
00010
00011
00012 #include "Base/spMath.hpp"
00013 #include "Base/spTimer.hpp"
00014
00015
00016 namespace sp
00017 {
00018 namespace math
00019 {
00020
00021
00026 class Interpolator
00027 {
00028
00029 public:
00030
00031 virtual ~Interpolator()
00032 {
00033 }
00034
00035 virtual void update() = 0;
00036
00037 virtual bool playing() const = 0;
00038
00039 protected:
00040
00041 Interpolator()
00042 {
00043 }
00044
00045 };
00046
00047
00048 namespace InterpolatorManager
00049 {
00050
00055 SP_EXPORT void add(Interpolator* Interp);
00056
00061 SP_EXPORT void remove(Interpolator* Interp);
00062
00064 SP_EXPORT void update();
00065
00066 }
00067
00068
00083 template <typename T, typename I, T Func(const T&, const T&, const I&)>
00084 class FunctionalInterpolator : public Interpolator
00085 {
00086
00087 public:
00088
00089 FunctionalInterpolator(const T &Min = T(0), const T &Max = T(1)) :
00090 Min_ (Min ),
00091 Max_ (Max ),
00092 State_ (I(0) ),
00093 Speed_ (I(0) ),
00094 Playing_ (false ),
00095 Finished_ (false )
00096 {
00097 }
00098 ~FunctionalInterpolator()
00099 {
00100 InterpolatorManager::remove(this);
00101 }
00102
00103
00104
00105 void play(const I &Speed)
00106 {
00107 Playing_ = true;
00108 Finished_ = false;
00109 Speed_ = Speed;
00110 State_ = I(0);
00111
00112 InterpolatorManager::add(this);
00113 }
00114
00115 void play(u64 Duration)
00116 {
00117 play(static_cast<I>(1000.0 / (io::Timer::getFPS() * Duration)));
00118 }
00119
00120 void stop(bool Reset = false)
00121 {
00122 Playing_ = false;
00123 if (Reset)
00124 State_ = I(0);
00125 }
00126
00127 void update()
00128 {
00129 if (Playing_)
00130 {
00131 State_ += Speed_;
00132
00133 if (State_ >= I(1))
00134 {
00135 State_ = I(1);
00136 Finished_ = true;
00137
00138 stop();
00139 }
00140 }
00141 }
00142
00143 T get() const
00144 {
00145 return Func(Min_, Max_, State_);
00146 }
00147
00149 bool playing() const
00150 {
00151 return Playing_;
00152 }
00153
00154
00155
00157 inline bool finished() const
00158 {
00159 return Finished_;
00160 }
00161
00162 inline void setState(const I &State)
00163 {
00164 State_ = State;
00165 }
00166 inline const I& getState() const
00167 {
00168 return State_;
00169 }
00170
00171 inline void setMin(const T &Min)
00172 {
00173 Min_ = Min;
00174 }
00175 inline const T& getMin() const
00176 {
00177 return Min_;
00178 }
00179
00180 inline void setMax(const T &Max)
00181 {
00182 Max_ = Max;
00183 }
00184 inline const T& getMax() const
00185 {
00186 return Max_;
00187 }
00188
00189 private:
00190
00191
00192
00193 T Min_, Max_;
00194 I State_;
00195 I Speed_;
00196
00197 bool Playing_;
00198 bool Finished_;
00199
00200 };
00201
00202 typedef FunctionalInterpolator<f32, f32, &Lerp> LinearInterpolator;
00203 typedef FunctionalInterpolator<f32, f32, &LerpParabolic> ParabolicInterpolator;
00204 typedef FunctionalInterpolator<f32, f32, &LerpSin> SinInterpolator;
00205
00206
00207 }
00208
00209 }
00210
00211
00212 #endif
00213
00214
00215
00216