+ enum CurveTarget
+ {
+ POSITION,
+ EULER,
+ SCALE,
+ UNIFORM
+ };
+
+ class Curve
+ {
+ protected:
+ CurveTarget target;
+ int component;
+
+ Curve(CurveTarget, int);
+ public:
+ virtual ~Curve() { }
+
+ virtual void apply(float, Matrix &) const = 0;
+ virtual void apply(float, KeyFrame::AnimatedUniform &) const = 0;
+ };
+
+ template<unsigned N>
+ class ValueCurve: public Curve
+ {
+ public:
+ typedef typename Interpolate::SplineKnot<double, N> Knot;
+
+ private:
+ Interpolate::Spline<double, 3, N> spline;
+
+ public:
+ ValueCurve(CurveTarget, int, const std::vector<Knot> &);
+
+ virtual void apply(float, Matrix &) const;
+ virtual void apply(float, KeyFrame::AnimatedUniform &) const;
+ };
+
+ struct ExtractComponent