X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fanimation.h;h=3404f45bd9f8c446f5110844e2cae7114fffe6ea;hp=58a76583392270e5f1c0dd7a348d0fe10cff23d7;hb=f14516331a9b98b1d9d6c9c4e44787167f87a813;hpb=8b9d1625ac367114612b57a83901033ffc2bc7e0 diff --git a/source/animation.h b/source/animation.h index 58a76583..3404f45b 100644 --- a/source/animation.h +++ b/source/animation.h @@ -4,12 +4,13 @@ #include #include #include +#include "keyframe.h" namespace Msp { namespace GL { +class AnimationEventObserver; class Armature; -class KeyFrame; class Matrix; class Pose; @@ -31,9 +32,15 @@ public: private: void init(); + 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); }; private: @@ -43,7 +50,7 @@ private: float scale; AxisInterpolation(); - AxisInterpolation(const double *, const double *); + AxisInterpolation(const float *, const float *); }; struct MatrixInterpolation @@ -60,26 +67,40 @@ private: 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; - TimedKeyFrame(const Animation &); - void prepare(); + TimedKeyFrame(); + void prepare(const Animation &); + }; + + struct Event + { + Time::TimeDelta time; + std::string name; + Variant value; }; - typedef std::list KeyFrameList; + struct UniformInfo + { + std::string name; + unsigned size; + + UniformInfo(const std::string &, unsigned); + }; public: class Iterator { private: - const Animation &animation; - KeyFrameList::const_iterator iter; + const Animation *animation; + std::vector::const_iterator iter; + std::vector::const_iterator event_iter; Time::TimeDelta time_since_keyframe; bool end; @@ -87,16 +108,20 @@ 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: const Armature *armature; - KeyFrameList keyframes; + std::vector keyframes; + std::vector events; bool looping; + std::vector uniforms; public: Animation(); @@ -105,11 +130,17 @@ public: 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 &); private: + void add_keyframe(const Time::TimeDelta &, const RefPtr &); void prepare_keyframe(TimedKeyFrame &); - public: + void add_event(const Time::TimeDelta &, const std::string &, const Variant & = Variant()); + void set_looping(bool); };