]> git.tdb.fi Git - libs/gl.git/blobdiff - source/animation.cpp
Use double for animation curves
[libs/gl.git] / source / animation.cpp
index 0d0ce75e951176dc3444b29c1b231b7f8c530735..37f583d5ec53b43324e67f7fcd1237a25bbefa80 100644 (file)
@@ -50,6 +50,12 @@ void Animation::add_keyframe(const Time::TimeDelta &t, const KeyFrame &kf)
        create_curves();
 }
 
+void Animation::add_keyframe_owned(const Time::TimeDelta &t, const KeyFrame *kf)
+{
+       add_keyframe(t, kf, false, true);
+       create_curves();
+}
+
 void Animation::add_keyframe(const Time::TimeDelta &t, const KeyFrame &kf, float slope)
 {
        add_keyframe(t, &kf, slope, slope, false);
@@ -70,6 +76,14 @@ void Animation::add_control_keyframe(const KeyFrame &kf)
        add_keyframe(keyframes.back().time, &kf, true, false);
 }
 
+void Animation::add_control_keyframe_owned(const KeyFrame *kf)
+{
+       if(keyframes.empty())
+               throw invalid_operation("Animation::add_control_keyframe_owned");
+
+       add_keyframe(keyframes.back().time, kf, true, true);
+}
+
 void Animation::add_keyframe(const Time::TimeDelta &t, const KeyFrame *kf, float ss, float es, bool owned)
 {
        if(keyframes.empty())
@@ -220,6 +234,7 @@ void Animation::create_curve(CurveTarget target, int component, const T &extract
                typename Interpolate::SplineValue<float, N>::Type value;
                if(extract(*i->keyframe, value))
                {
+                       typename Knot::Value dvalue = value;
                        float x = i->time/Time::sec;
                        if(i->control)
                        {
@@ -232,14 +247,14 @@ void Animation::create_curve(CurveTarget target, int component, const T &extract
                                if(n_control==1)
                                {
                                        typename Knot::Value cv = knots.back().y;
-                                       knots.back().y = (knots[knots.size()-2].y+cv*2.0f)/3.0f;
-                                       knots.push_back(Knot(x, (value+cv*2.0f)/3.0f));
+                                       knots.back().y = (knots[knots.size()-2].y+cv*2.0)/3.0;
+                                       knots.push_back(Knot(x, (dvalue+cv*2.0)/3.0));
                                }
                                else if(n_control==0 && !knots.empty())
                                {
                                        typename Knot::Value prev = knots.back().y;
-                                       knots.push_back(Knot(knots.back().x, (prev*2.0f+value)/3.0f));
-                                       knots.push_back(Knot(x, (prev+value*2.0f)/3.0f));
+                                       knots.push_back(Knot(knots.back().x, (prev*2.0+dvalue)/3.0));
+                                       knots.push_back(Knot(x, (prev+dvalue*2.0)/3.0));
                                }
                                n_control = 0;
                        }
@@ -304,7 +319,7 @@ Animation::Curve::Curve(CurveTarget t, int c):
 template<unsigned N>
 Animation::ValueCurve<N>::ValueCurve(CurveTarget t, int c, const vector<Knot> &k):
        Curve(t, c),
-       spline(Interpolate::BezierSpline<float, 3, N>(k))
+       spline(Interpolate::BezierSpline<double, 3, N>(k))
 { }
 
 template<unsigned N>
@@ -358,7 +373,7 @@ template<unsigned N>
 void Animation::ValueCurve<N>::apply(float x, KeyFrame::AnimatedUniform &uni) const
 {
        uni.size = N;
-       typename Interpolate::Spline<float, 3, N>::Value value = spline(x);
+       typename Interpolate::Spline<double, 3, N>::Value value = spline(x);
        for(unsigned i=0; i<N; ++i)
                uni.values[i] = Interpolate::SplineValue<float, N>::get(value, i);
 }