Since the t value is raised to the third power, floats with their 24-bit
mantissa started to run out of precision around 30 seconds. Doubles
should be good for several hours. If that somehow turns out to not be
enough I'll invent some way to chain animations.
typename Interpolate::SplineValue<float, N>::Type value;
if(extract(*i->keyframe, value))
{
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)
{
float x = i->time/Time::sec;
if(i->control)
{
if(n_control==1)
{
typename Knot::Value cv = knots.back().y;
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;
}
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));
template<unsigned N>
Animation::ValueCurve<N>::ValueCurve(CurveTarget t, int c, const vector<Knot> &k):
Curve(t, 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))
void Animation::ValueCurve<N>::apply(float x, KeyFrame::AnimatedUniform &uni) const
{
uni.size = 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);
}
for(unsigned i=0; i<N; ++i)
uni.values[i] = Interpolate::SplineValue<float, N>::get(value, i);
}
class ValueCurve: public Curve
{
public:
class ValueCurve: public Curve
{
public:
- typedef typename Interpolate::SplineKnot<float, N> Knot;
+ typedef typename Interpolate::SplineKnot<double, N> Knot;
- Interpolate::Spline<float, 3, N> spline;
+ Interpolate::Spline<double, 3, N> spline;
public:
ValueCurve(CurveTarget, int, const std::vector<Knot> &);
public:
ValueCurve(CurveTarget, int, const std::vector<Knot> &);