]> git.tdb.fi Git - libs/gl.git/blobdiff - source/animation.cpp
Fix applying of single-component scaling curves
[libs/gl.git] / source / animation.cpp
index 37f583d5ec53b43324e67f7fcd1237a25bbefa80..e568d2217f1ff18f54323509e455c6b61443881a 100644 (file)
@@ -18,9 +18,11 @@ Animation::Animation():
        looping(false)
 { }
 
-// Avoid synthesizing ~RefPtr in files including animation.h
 Animation::~Animation()
-{ }
+{
+       for(vector<Curve *>::iterator i=curves.begin(); i!=curves.end(); ++i)
+               delete *i;
+}
 
 void Animation::set_armature(const Armature &a)
 {
@@ -265,6 +267,14 @@ void Animation::create_curve(CurveTarget target, int component, const T &extract
        while(n_control--)
                knots.pop_back();
 
+       if(knots.size()==1)
+       {
+               knots.push_back(knots.back());
+               knots.push_back(knots.back());
+               knots.back().x += 1;
+               knots.push_back(knots.back());
+       }
+
        curves.push_back(new ValueCurve<N>(target, component, knots));
 }
 
@@ -334,12 +344,18 @@ void Animation::ValueCurve<1>::apply(float x, Matrix &matrix) const
        float value = spline(x);
        if(target==POSITION || target==SCALE)
        {
-               Vector3 vec;
-               vec[component] = value;
                if(target==POSITION)
+               {
+                       Vector3 vec;
+                       vec[component] = value;
                        matrix.translate(vec);
+               }
                else
+               {
+                       Vector3 vec(1.0f, 1.0f, 1.0f);
+                       vec[component] = value;
                        matrix.scale(vec);
+               }
        }
        else if(target==EULER)
        {