00001 #include "interp.h"
00002
00007 #include <cmath>
00008 #include <math/matrix4.h>
00009
00011
00012 GltInterpolator::GltInterpolator()
00013 : _active(false),
00014 _loop(false),
00015 _realTime(true),
00016 _duration(0.0),
00017 _frame(0)
00018 {
00019 }
00020
00021 GltInterpolator::~GltInterpolator()
00022 {
00023 }
00024
00025 void
00026 GltInterpolator::start(const double duration,const bool loop)
00027 {
00028 _duration = duration;
00029 _active = true;
00030 _loop = loop;
00031 _realTime = true;
00032 _timer.start();
00033 }
00034
00035 void
00036 GltInterpolator::start(const bool loop)
00037 {
00038 _active = true;
00039 _loop = loop;
00040 _realTime = false;
00041 _frame = 0;
00042 }
00043
00044 void
00045 GltInterpolator::stop()
00046 {
00047 _active = false;
00048 expired() = true;
00049 }
00050
00051 void
00052 GltInterpolator::restart(void)
00053 {
00054 _active = true;
00055 _frame = 0;
00056 _timer.start();
00057 }
00058
00059 const bool &GltInterpolator::active() const { return _active; }
00060 const bool &GltInterpolator::loop() const { return _loop; }
00061 const bool &GltInterpolator::realTime() const { return _realTime; }
00062 const double &GltInterpolator::duration() const { return _duration; }
00063 const int &GltInterpolator::frame() const { return _frame; }
00064
00065 bool &GltInterpolator::active() { return _active; }
00066 bool &GltInterpolator::loop() { return _loop; }
00067 bool &GltInterpolator::realTime() { return _realTime; }
00068 double &GltInterpolator::duration() { return _duration; }
00069 int &GltInterpolator::frame() { return _frame; }
00070
00072
00073 GltInterpolatorColor::GltInterpolatorColor(GltColor &color)
00074 : _color(color)
00075 {
00076 }
00077
00078 GltInterpolatorColor::~GltInterpolatorColor()
00079 {
00080 }
00081
00082 void
00083 GltInterpolatorColor::draw() const
00084 {
00085 if (_active)
00086 {
00087
00088
00089 if (_realTime)
00090 {
00091 if (_duration==0.0)
00092 _color = _colorMap.lookup(_colorMap.end());
00093 else
00094 {
00095 double t = _timer.elapsed();
00096
00097 if (_loop)
00098 t = fmod(t,_duration)/_duration;
00099 else
00100 t = CLAMP(t/_duration,0.0,1.0);
00101
00102 _color = _colorMap.lookup(_colorMap.start() + _colorMap.duration()*t);
00103 }
00104
00105
00106
00107 if (_timer.elapsed()>_duration && !_loop)
00108 ((GltInterpolatorColor *) this)->stop();
00109 }
00110 else
00111
00112
00113
00114 {
00115 _color = _colorMap.lookup(double(_frame));
00116 ((GltInterpolatorColor *) this)->_frame++;
00117 if (double(_frame)>_colorMap.end())
00118 {
00119 if (_loop)
00120 ((GltInterpolatorColor *) this)->_frame = 0;
00121 else
00122 ((GltInterpolatorColor *) this)->stop();
00123 }
00124 }
00125 }
00126 }
00127
00128 GltColorMap &GltInterpolatorColor::colorMap() { return _colorMap; }
00129 const GltColorMap &GltInterpolatorColor::colorMap() const { return _colorMap; }
00130
00132
00133 GltInterpolatorRotation::GltInterpolatorRotation(Matrix &matrix)
00134 : _matrix(matrix), _axis(VectorY), _center(Vector0)
00135 {
00136 }
00137
00138 GltInterpolatorRotation::~GltInterpolatorRotation()
00139 {
00140 }
00141
00142 void
00143 GltInterpolatorRotation::draw() const
00144 {
00145 if (_active && _duration!=0.0 && _axis!=Vector0)
00146 {
00147 const double t = _timer.elapsed();
00148
00149 _matrix *=
00150 matrixTranslate(_center) *
00151 matrixRotate(_axis,t/_duration*360.0) *
00152 matrixTranslate(-_center);
00153
00154 ((GltInterpolatorRotation *) this)->_timer.start();
00155
00156
00157
00158 if (t>_duration && !_loop)
00159 ((GltInterpolatorRotation *) this)->stop();
00160 }
00161 }
00162
00163 Vector &GltInterpolatorRotation::axis() { return _axis; }
00164 const Vector &GltInterpolatorRotation::axis() const { return _axis; }
00165
00166 Vector &GltInterpolatorRotation::center() { return _center; }
00167 const Vector &GltInterpolatorRotation::center() const { return _center; }