+ 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
+ {
+ typedef bool (*Extract)(const KeyFrame &, Vector3 &);
+
+ Extract extract;
+ unsigned index;
+ Transform::ComponentMask mask;
+
+ ExtractComponent(Extract e, unsigned i, Transform::ComponentMask m): extract(e), index(i), mask(m) { }
+
+ bool operator()(const KeyFrame &, float &) const;
+ };
+
+ template<unsigned N>
+ struct ExtractUniform
+ {
+ const std::string &name;
+
+ ExtractUniform(const std::string &n): name(n) { }
+
+ bool operator()(const KeyFrame &, typename Interpolate::SplineValue<float, N>::Type &) const;