]> git.tdb.fi Git - libs/gl.git/blobdiff - source/animation.h
Add a function to set depth clip of EnvironmentMap
[libs/gl.git] / source / animation.h
index 1460c944894350ed5aa44ea57f5c0465c8da6a44..3404f45bd9f8c446f5110844e2cae7114fffe6ea 100644 (file)
@@ -4,12 +4,15 @@
 #include <msp/core/refptr.h>
 #include <msp/datafile/objectloader.h>
 #include <msp/time/timedelta.h>
+#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
@@ -29,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:
@@ -41,6 +50,19 @@ private:
                float scale;
 
                AxisInterpolation();
+               AxisInterpolation(const float *, const float *);
+       };
+
+       struct MatrixInterpolation
+       {
+               const Matrix *matrix1;
+               const Matrix *matrix2;
+               AxisInterpolation axes[3];
+
+               MatrixInterpolation();
+               MatrixInterpolation(const Matrix &, const Matrix &);
+
+               Matrix get(float) const;
        };
 
        struct TimedKeyFrame
@@ -49,17 +71,36 @@ private:
                Time::TimeDelta time;
                Time::TimeDelta delta_t;
                RefPtr<const KeyFrame> keyframe;
-               AxisInterpolation axes[3];
+               MatrixInterpolation matrix;
+               std::vector<KeyFrame::AnimatedUniform> uniforms;
+               std::vector<MatrixInterpolation> pose_matrices;
+
+               TimedKeyFrame();
+               void prepare(const Animation &);
+       };
+
+       struct Event
+       {
+               Time::TimeDelta time;
+               std::string name;
+               Variant value;
        };
 
-       typedef std::list<TimedKeyFrame> 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<TimedKeyFrame>::const_iterator iter;
+               std::vector<Event>::const_iterator event_iter;
                Time::TimeDelta time_since_keyframe;
                bool end;
 
@@ -67,24 +108,40 @@ 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<TimedKeyFrame> keyframes;
+       std::vector<Event> events;
        bool looping;
+       std::vector<UniformInfo> uniforms;
 
 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);
 private:
+       void add_keyframe(const Time::TimeDelta &, const RefPtr<const KeyFrame> &);
        void prepare_keyframe(TimedKeyFrame &);
+public:
+       void add_event(const Time::TimeDelta &, const std::string &, const Variant & = Variant());
 
-       Matrix compute_matrix(const TimedKeyFrame &, const Time::TimeDelta &) const;
+       void set_looping(bool);
 };
 
 } // namespace GL