#include <msp/core/refptr.h>
#include <msp/datafile/objectloader.h>
+#include <msp/interpolate/spline.h>
#include <msp/time/timedelta.h>
#include "keyframe.h"
Loader(Animation &, Collection &);
private:
void init();
+ virtual void finish();
void event(const std::string &);
void event1i(const std::string &, int);
};
private:
- struct AxisInterpolation
+ enum CurveTarget
{
- float slope;
- float scale;
+ POSITION,
+ EULER,
+ SCALE,
+ UNIFORM
+ };
+
+ class Curve
+ {
+ protected:
+ CurveTarget target;
+
+ Curve(CurveTarget);
+ public:
+ virtual ~Curve() { }
- AxisInterpolation();
- AxisInterpolation(const float *, const float *);
+ virtual void apply(float, Matrix &) const = 0;
+ virtual void apply(float, KeyFrame::AnimatedUniform &) const = 0;
};
- struct MatrixInterpolation
+ template<unsigned N>
+ class ValueCurve: public Curve
{
- const Matrix *matrix1;
- const Matrix *matrix2;
- AxisInterpolation axes[3];
+ public:
+ typedef typename Interpolate::SplineKnot<float, N> Knot;
- MatrixInterpolation();
- MatrixInterpolation(const Matrix &, const Matrix &);
+ private:
+ Interpolate::Spline<float, 1, N> spline;
- Matrix get(float) const;
+ public:
+ ValueCurve(CurveTarget, const std::vector<Knot> &);
+
+ virtual void apply(float, Matrix &) const;
+ virtual void apply(float, KeyFrame::AnimatedUniform &) const;
};
struct TimedKeyFrame
{
- const TimedKeyFrame *prev;
Time::TimeDelta time;
- Time::TimeDelta delta_t;
float start_slope;
float end_slope;
RefPtr<const KeyFrame> keyframe;
- MatrixInterpolation matrix;
- std::vector<KeyFrame::AnimatedUniform> uniforms;
- std::vector<MatrixInterpolation> pose_matrices;
-
- TimedKeyFrame();
- void prepare(const Animation &);
};
struct Event
{
private:
const Animation *animation;
- std::vector<TimedKeyFrame>::const_iterator iter;
+ Time::TimeDelta elapsed;
std::vector<Event>::const_iterator event_iter;
- Time::TimeDelta time_since_keyframe;
- float x;
bool end;
public:
std::vector<Event> events;
bool looping;
std::vector<UniformInfo> uniforms;
+ std::vector<Curve *> curves;
public:
Animation();
private:
void add_keyframe(const Time::TimeDelta &, const RefPtr<const KeyFrame> &, float, float);
void prepare_keyframe(TimedKeyFrame &);
+ void create_curves();
+ template<unsigned N>
+ void create_uniform_curve(const std::string &);
public:
void add_event(const Time::TimeDelta &, const std::string &, const Variant & = Variant());