X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2Fanimation.cpp;h=a8d9e9698625b027997586745cd71b9c73c1d305;hb=bec07999d95b76f4b47cffcc564d0cd0afc0435e;hp=0d0ce75e951176dc3444b29c1b231b7f8c530735;hpb=553f3ec4fbe28a37978ee53b9b6e22fedb691e1d;p=libs%2Fgl.git diff --git a/source/animation.cpp b/source/animation.cpp index 0d0ce75e..a8d9e969 100644 --- a/source/animation.cpp +++ b/source/animation.cpp @@ -18,9 +18,11 @@ Animation::Animation(): looping(false) { } -// Avoid synthesizing ~RefPtr in files including animation.h Animation::~Animation() -{ } +{ + for(vector::iterator i=curves.begin(); i!=curves.end(); ++i) + delete *i; +} void Animation::set_armature(const Armature &a) { @@ -50,6 +52,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 +78,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 +236,7 @@ void Animation::create_curve(CurveTarget target, int component, const T &extract typename Interpolate::SplineValue::Type value; if(extract(*i->keyframe, value)) { + typename Knot::Value dvalue = value; float x = i->time/Time::sec; if(i->control) { @@ -232,14 +249,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; } @@ -250,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(target, component, knots)); } @@ -304,7 +329,7 @@ Animation::Curve::Curve(CurveTarget t, int c): template Animation::ValueCurve::ValueCurve(CurveTarget t, int c, const vector &k): Curve(t, c), - spline(Interpolate::BezierSpline(k)) + spline(Interpolate::BezierSpline(k)) { } template @@ -319,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) { @@ -358,9 +389,9 @@ template void Animation::ValueCurve::apply(float x, KeyFrame::AnimatedUniform &uni) const { uni.size = N; - typename Interpolate::Spline::Value value = spline(x); + typename Interpolate::Spline::Value value = spline(x); for(unsigned i=0; i::get(value, i); + uni.values[i] = Interpolate::SplineValue::get(value, i); }