19 #ifndef OSGANIMATION_INTERPOLATOR
20 #define OSGANIMATION_INTERPOLATOR 1
23 #include <osgAnimation/Keyframe>
28 template <
class TYPE,
class KEY>
40 int key_size = keys.
size();
42 osg::notify(
osg::WARN) <<
"TemplateInterpolatorBase::getKeyIndexFromTime the container is empty, impossible to get key index from time" << std::endl;;
50 double time1 = keysVector[mid].
getTime();
63 template <
class TYPE,
class KEY=TYPE>
72 if (time >= keyframes.back().getTime())
74 result = keyframes.back().getValue();
77 else if (time <= keyframes.front().getTime())
79 result = keyframes.front().getValue();
84 result = keyframes[i].getValue();
89 template <
class TYPE,
class KEY=TYPE>
98 if (time >= keyframes.back().getTime())
100 result = keyframes.back().getValue();
103 else if (time <= keyframes.front().getTime())
105 result = keyframes.front().getValue();
110 float blend = (time - keyframes[i].getTime()) / ( keyframes[i+1].getTime() - keyframes[i].getTime());
111 const TYPE& v1 = keyframes[i].getValue();
112 const TYPE& v2 = keyframes[i+1].getValue();
113 result = v1*(1-blend) + v2*blend;
118 template <
class TYPE,
class KEY=TYPE>
125 if (time >= keyframes.back().getTime())
127 result = keyframes.back().getValue();
130 else if (time <= keyframes.front().getTime())
132 result = keyframes.front().getValue();
137 float blend = (time - keyframes[i].getTime()) / ( keyframes[i+1].getTime() - keyframes[i].getTime());
138 const TYPE& q1 = keyframes[i].getValue();
139 const TYPE& q2 = keyframes[i+1].getValue();
140 result.slerp(blend,q1,q2);
145 template <
class TYPE,
class KEY>
153 if (time >= keyframes.back().getTime())
155 keyframes.back().getValue().uncompress(keyframes.mScale, keyframes.mMin, result);
158 else if (time <= keyframes.front().getTime())
160 keyframes.front().getValue().uncompress(keyframes.mScale, keyframes.mMin, result);
165 float blend = (time - keyframes[i].getTime()) / ( keyframes[i+1].getTime() - keyframes[i].getTime());
167 keyframes[i].getValue().uncompress(keyframes.mScale, keyframes.mMin, v1);
168 keyframes[i+1].getValue().uncompress(keyframes.mScale, keyframes.mMin, v2);
169 result = v1*(1-blend) + v2*blend;
175 template <
class TYPE,
class KEY=TYPE>
184 if (time >= keyframes.back().getTime())
186 result = keyframes.back().getValue().getPosition();
189 else if (time <= keyframes.front().getTime())
191 result = keyframes.front().getValue().getPosition();
197 float t = (time - keyframes[i].getTime()) / ( keyframes[i+1].getTime() - keyframes[i].getTime());
198 float one_minus_t = 1.0-t;
199 float one_minus_t2 = one_minus_t * one_minus_t;
200 float one_minus_t3 = one_minus_t2 * one_minus_t;
203 TYPE v0 = keyframes[i].getValue().getPosition() * one_minus_t3;
204 TYPE v1 = keyframes[i].getValue().getControlPointIn() * (3.0 * t * one_minus_t2);
205 TYPE v2 = keyframes[i].getValue().getControlPointOut() * (3.0 * t2 * one_minus_t);
206 TYPE v3 = keyframes[i+1].getValue().getPosition() * (t2 * t);
208 result = v0 + v1 + v2 + v3;
TemplateSphericalLinearInterpolator< osg::Quat, osg::Quat > QuatSphericalLinearInterpolator
TemplateStepInterpolator< float, float > FloatStepInterpolator
TemplateSphericalLinearInterpolator()
TemplateLinearInterpolator< osg::Vec2, osg::Vec2 > Vec2LinearInterpolator
TemplateStepInterpolator< osg::Vec3, Vec3Packed > Vec3PackedStepInterpolator
virtual unsigned int size() const
TemplateLinearInterpolator< osg::Vec3, Vec3Packed > Vec3PackedLinearInterpolator
TemplateLinearPackedInterpolator()
TemplateLinearInterpolator< float, float > FloatLinearInterpolator
TemplateCubicBezierInterpolator< float, FloatCubicBezier > FloatCubicBezierInterpolator
TemplateCubicBezierInterpolator< osg::Vec3, Vec3CubicBezier > Vec3CubicBezierInterpolator
TemplateLinearInterpolator< double, double > DoubleLinearInterpolator
TemplateCubicBezierInterpolator< double, DoubleCubicBezier > DoubleCubicBezierInterpolator
void getValue(const TemplateKeyframeContainer< KEY > &keyframes, double time, TYPE &result) const
void getValue(const TemplateKeyframeContainer< KEY > &keyframes, double time, TYPE &result) const
TemplateCubicBezierInterpolator()
TemplateCubicBezierInterpolator< osg::Vec2, Vec2CubicBezier > Vec2CubicBezierInterpolator
TemplateStepInterpolator< double, double > DoubleStepInterpolator
int getKeyIndexFromTime(const TemplateKeyframeContainer< KEY > &keys, double time) const
TemplateLinearInterpolator< osg::Matrixf, osg::Matrixf > MatrixLinearInterpolator
TemplateStepInterpolator< osg::Vec4, osg::Vec4 > Vec4StepInterpolator
TemplateLinearInterpolator()
void getValue(const TemplateKeyframeContainer< KEY > &keyframes, double time, TYPE &result) const
TemplateStepInterpolator()
void getValue(const TemplateKeyframeContainer< KEY > &keyframes, double time, TYPE &result) const
TemplateInterpolatorBase()
OSG_EXPORT std::ostream & notify(const NotifySeverity severity)
TemplateCubicBezierInterpolator< osg::Vec4, Vec4CubicBezier > Vec4CubicBezierInterpolator
TemplateLinearInterpolator< osg::Vec4, osg::Vec4 > Vec4LinearInterpolator
void getValue(const TemplateKeyframeContainer< KEY > &keyframes, double time, TYPE &result) const
TemplateStepInterpolator< osg::Vec3, osg::Vec3 > Vec3StepInterpolator
TemplateStepInterpolator< osg::Vec2, osg::Vec2 > Vec2StepInterpolator
TemplateStepInterpolator< osg::Quat, osg::Quat > QuatStepInterpolator
TemplateLinearInterpolator< osg::Vec3, osg::Vec3 > Vec3LinearInterpolator