X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fanimation.h;h=d053ee9004835154acd8f22f3a91ab5655148c67;hp=929cb13f497318c3a91492cc1cf18d36584f267e;hb=f88bce7df357cf12ce20b7dc8c7d179d2ae95920;hpb=573ea4e5602c4321cc1d75daf9ed0beed5cde280 diff --git a/source/animation.h b/source/animation.h index 929cb13f..d053ee90 100644 --- a/source/animation.h +++ b/source/animation.h @@ -3,12 +3,14 @@ #include #include +#include #include #include "keyframe.h" namespace Msp { namespace GL { +class AnimationEventObserver; class Armature; class Matrix; class Pose; @@ -24,53 +26,110 @@ public: { private: Time::TimeDelta current_time; + float start_slope; + float end_slope; + int slopes_set; public: Loader(Animation &); Loader(Animation &, Collection &); private: void init(); - + virtual void finish(); + + void check_slopes_and_control(bool, bool); + void add_kf(const KeyFrame *, bool, bool); + void load_kf(const std::string &, bool); + void load_kf_inline(bool); + + void control_keyframe(const std::string &); + void control_keyframe_inline(); + void event(const std::string &); + void event1i(const std::string &, int); + void event1f(const std::string &, float); + void event2f(const std::string &, float, float); + void event3f(const std::string &, float, float, float); + void event4f(const std::string &, float, float, float, float); + void interval(float); void keyframe(const std::string &); void keyframe_inline(); - void interval(float); + void slopes(float, float); }; private: - struct AxisInterpolation + 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 + class ValueCurve: public Curve + { + public: + typedef typename Interpolate::SplineKnot Knot; + + private: + Interpolate::Spline spline; + + public: + ValueCurve(CurveTarget, int, const std::vector &); + + virtual void apply(float, Matrix &) const; + virtual void apply(float, KeyFrame::AnimatedUniform &) const; + }; + + struct ExtractComponent { - float slope; - float scale; + 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) { } - AxisInterpolation(); - AxisInterpolation(const float *, const float *); + bool operator()(const KeyFrame &, float &) const; }; - struct MatrixInterpolation + template + struct ExtractUniform { - const Matrix *matrix1; - const Matrix *matrix2; - AxisInterpolation axes[3]; + const std::string &name; - MatrixInterpolation(); - MatrixInterpolation(const Matrix &, const Matrix &); + ExtractUniform(const std::string &n): name(n) { } - Matrix get(float) const; + bool operator()(const KeyFrame &, typename Interpolate::SplineValue::Type &) const; }; struct TimedKeyFrame { - const Animation &animation; - const TimedKeyFrame *prev; Time::TimeDelta time; - Time::TimeDelta delta_t; RefPtr keyframe; - MatrixInterpolation matrix; - std::vector uniforms; - std::vector pose_matrices; + bool control; + }; - TimedKeyFrame(const Animation &); - void prepare(); + struct Event + { + Time::TimeDelta time; + std::string name; + Variant value; }; struct UniformInfo @@ -86,14 +145,15 @@ public: { private: const Animation *animation; - std::vector::const_iterator iter; - Time::TimeDelta time_since_keyframe; + Time::TimeDelta elapsed; + std::vector::const_iterator event_iter; bool end; public: Iterator(const Animation &); Iterator &operator+=(const Time::TimeDelta &); + void dispatch_events(AnimationEventObserver &); bool is_end() const { return end; } Matrix get_matrix() const; @@ -104,8 +164,11 @@ public: private: const Armature *armature; std::vector keyframes; + std::vector events; bool looping; std::vector uniforms; + std::vector curves; + unsigned uniform_curve_offset; public: Animation(); @@ -119,11 +182,29 @@ 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, int, const T &); + static bool extract_position(const KeyFrame &, Vector3 &); + static bool extract_euler(const KeyFrame &, Vector3 &); + static bool extract_scale(const KeyFrame &, Vector3 &); public: + void add_event(const Time::TimeDelta &, const std::string &, const Variant & = Variant()); + + const Msp::Time::TimeDelta &get_duration() const; + void set_looping(bool); + bool is_looping() const { return looping; } }; } // namespace GL