X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fanimation.h;h=83b369bfca1f1e975df889de113d9655ca77db80;hp=1460c944894350ed5aa44ea57f5c0465c8da6a44;hb=025016d7628be9c43b20999325dcbaae5cb3c3b8;hpb=4c5ba8f7d3bc755d6256cb6bf75907a1b10fc290 diff --git a/source/animation.h b/source/animation.h index 1460c944..83b369bf 100644 --- a/source/animation.h +++ b/source/animation.h @@ -3,13 +3,17 @@ #include #include +#include #include +#include "keyframe.h" namespace Msp { namespace GL { -class KeyFrame; +class AnimationEventObserver; +class Armature; class Matrix; +class Pose; /** An Animation is a sequence of KeyFrames combined with timing information. The @@ -22,69 +26,144 @@ public: { private: Time::TimeDelta current_time; + float start_slope; + float end_slope; public: Loader(Animation &); Loader(Animation &, Collection &); private: void init(); - + virtual void finish(); + + 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 { - float slope; - float scale; + protected: + CurveTarget target; + + Curve(CurveTarget); + 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; - AxisInterpolation(); + public: + ValueCurve(CurveTarget, const std::vector &); + + 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 keyframe; - AxisInterpolation axes[3]; }; - typedef std::list KeyFrameList; + struct Event + { + Time::TimeDelta time; + std::string name; + Variant value; + }; + + struct UniformInfo + { + std::string name; + unsigned size; + + UniformInfo(const std::string &, unsigned); + }; public: class Iterator { private: - const Animation &animation; - KeyFrameList::const_iterator iter; - Time::TimeDelta time_since_keyframe; + const Animation *animation; + 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; + KeyFrame::AnimatedUniform get_uniform(unsigned) const; + Matrix get_pose_matrix(unsigned) const; }; private: - KeyFrameList keyframes; + const Armature *armature; + std::vector keyframes; + std::vector events; bool looping; + std::vector uniforms; + std::vector curves; public: Animation(); + ~Animation(); + + void set_armature(const Armature &); + const Armature *get_armature() const { return armature; } + + unsigned get_n_uniforms() const { return uniforms.size(); } + unsigned get_slot_for_uniform(const std::string &) const; + const std::string &get_uniform_name(unsigned) const; void add_keyframe(const Time::TimeDelta &, const KeyFrame &); - void set_looping(bool); + void add_keyframe(const Time::TimeDelta &, const KeyFrame &, float); + void add_keyframe(const Time::TimeDelta &, const KeyFrame &, float, float); private: + void add_keyframe(const Time::TimeDelta &, const RefPtr &, float, float); void prepare_keyframe(TimedKeyFrame &); + void create_curves(); + template + void create_uniform_curve(const std::string &); +public: + void add_event(const Time::TimeDelta &, const std::string &, const Variant & = Variant()); + + const Msp::Time::TimeDelta &get_duration() const; - Matrix compute_matrix(const TimedKeyFrame &, const Time::TimeDelta &) const; + void set_looping(bool); }; } // namespace GL