]> git.tdb.fi Git - libs/gl.git/blobdiff - source/animation.h
Share shader data between copied RenderPasses
[libs/gl.git] / source / animation.h
index a4bdabdd95401757b32c032ca56b646c2e58c92b..1ae571e7db217e8e624c6475dc6c4731ebf08a9d 100644 (file)
@@ -4,12 +4,14 @@
 #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 Armature;
 class Matrix;
+class Pose;
 
 /**
 An Animation is a sequence of KeyFrames combined with timing information.  The
@@ -41,7 +43,7 @@ private:
                float scale;
 
                AxisInterpolation();
-               AxisInterpolation(const double *, const double *);
+               AxisInterpolation(const float *, const float *);
        };
 
        struct MatrixInterpolation
@@ -64,6 +66,8 @@ private:
                Time::TimeDelta delta_t;
                RefPtr<const KeyFrame> keyframe;
                MatrixInterpolation matrix;
+               std::vector<KeyFrame::AnimatedUniform> uniforms;
+               std::vector<MatrixInterpolation> pose_matrices;
 
                TimedKeyFrame(const Animation &);
                void prepare();
@@ -71,6 +75,14 @@ private:
 
        typedef std::list<TimedKeyFrame> KeyFrameList;
 
+       struct UniformInfo
+       {
+               std::string name;
+               unsigned size;
+
+               UniformInfo(const std::string &, unsigned);
+       };
+
 public:
        class Iterator
        {
@@ -87,14 +99,26 @@ public:
 
                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;
        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 &);
 private: