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)
{
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)
{
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;
}
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));
}
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>
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)
{
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);
+ uni.values[i] = Interpolate::SplineValue<double, N>::get(value, i);
}