X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fanimation.h;h=d053ee9004835154acd8f22f3a91ab5655148c67;hp=011c8558ca52f32659247c263b7cdb17f46359c5;hb=f88bce7df357cf12ce20b7dc8c7d179d2ae95920;hpb=d901696935a6bf9fdad6ac8abe65ffab79bd297d diff --git a/source/animation.h b/source/animation.h index 011c8558..d053ee90 100644 --- a/source/animation.h +++ b/source/animation.h @@ -69,8 +69,9 @@ private: { protected: CurveTarget target; + int component; - Curve(CurveTarget); + Curve(CurveTarget, int); public: virtual ~Curve() { } @@ -88,12 +89,25 @@ private: Interpolate::Spline spline; public: - ValueCurve(CurveTarget, const std::vector &); + ValueCurve(CurveTarget, int, const std::vector &); 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 struct ExtractUniform { @@ -154,6 +168,7 @@ private: bool looping; std::vector uniforms; std::vector curves; + unsigned uniform_curve_offset; public: Animation(); @@ -167,16 +182,19 @@ public: const std::string &get_uniform_name(unsigned) const; void add_keyframe(const Time::TimeDelta &, const KeyFrame &); + void add_keyframe_owned(const Time::TimeDelta &, const KeyFrame *); DEPRECATED void add_keyframe(const Time::TimeDelta &, const KeyFrame &, float); DEPRECATED void add_keyframe(const Time::TimeDelta &, const KeyFrame &, float, float); void add_control_keyframe(const KeyFrame &); + void add_control_keyframe_owned(const KeyFrame *); private: void add_keyframe(const Time::TimeDelta &, const KeyFrame *, float, float, bool); void add_keyframe(const Time::TimeDelta &, const KeyFrame *, bool, bool); void prepare_keyframe(TimedKeyFrame &); void create_curves(); + void create_curve(CurveTarget, Transform::ComponentMask, ExtractComponent::Extract); template - void create_curve(CurveTarget target, const T &); + void create_curve(CurveTarget target, int, const T &); static bool extract_position(const KeyFrame &, Vector3 &); static bool extract_euler(const KeyFrame &, Vector3 &); static bool extract_scale(const KeyFrame &, Vector3 &);