]> git.tdb.fi Git - libs/gl.git/blob - source/animation.h
Change some class names
[libs/gl.git] / source / animation.h
1 #ifndef MSP_GL_ANIMATION_H_
2 #define MSP_GL_ANIMATION_H_
3
4 #include <msp/core/refptr.h>
5 #include <msp/datafile/objectloader.h>
6 #include <msp/time/timedelta.h>
7 #include "keyframe.h"
8
9 namespace Msp {
10 namespace GL {
11
12 class Armature;
13 class Matrix;
14 class Pose;
15
16 /**
17 An Animation is a sequence of KeyFrames combined with timing information.  The
18 state at any point in the animation can be interpolated from the keyframes.
19 */
20 class Animation
21 {
22 public:
23         class Loader: public DataFile::CollectionObjectLoader<Animation>
24         {
25         private:
26                 Time::TimeDelta current_time;
27
28         public:
29                 Loader(Animation &);
30                 Loader(Animation &, Collection &);
31         private:
32                 void init();
33
34                 void keyframe(const std::string &);
35                 void keyframe_inline();
36                 void interval(float);
37         };
38
39 private:
40         struct AxisInterpolation
41         {
42                 float slope;
43                 float scale;
44
45                 AxisInterpolation();
46                 AxisInterpolation(const float *, const float *);
47         };
48
49         struct MatrixInterpolation
50         {
51                 const Matrix *matrix1;
52                 const Matrix *matrix2;
53                 AxisInterpolation axes[3];
54
55                 MatrixInterpolation();
56                 MatrixInterpolation(const Matrix &, const Matrix &);
57
58                 Matrix get(float) const;
59         };
60
61         struct TimedKeyFrame
62         {
63                 const Animation &animation;
64                 const TimedKeyFrame *prev;
65                 Time::TimeDelta time;
66                 Time::TimeDelta delta_t;
67                 RefPtr<const KeyFrame> keyframe;
68                 MatrixInterpolation matrix;
69                 std::vector<KeyFrame::AnimatedUniform> uniforms;
70                 std::vector<MatrixInterpolation> pose_matrices;
71
72                 TimedKeyFrame(const Animation &);
73                 void prepare();
74         };
75
76         struct UniformInfo
77         {
78                 std::string name;
79                 unsigned size;
80
81                 UniformInfo(const std::string &, unsigned);
82         };
83
84 public:
85         class Iterator
86         {
87         private:
88                 const Animation *animation;
89                 std::vector<TimedKeyFrame>::const_iterator iter;
90                 Time::TimeDelta time_since_keyframe;
91                 bool end;
92
93         public:
94                 Iterator(const Animation &);
95
96                 Iterator &operator+=(const Time::TimeDelta &);
97
98                 bool is_end() const { return end; }
99                 Matrix get_matrix() const;
100                 KeyFrame::AnimatedUniform get_uniform(unsigned) const;
101                 Matrix get_pose_matrix(unsigned) const;
102         };
103
104 private:
105         const Armature *armature;
106         std::vector<TimedKeyFrame> keyframes;
107         bool looping;
108         std::vector<UniformInfo> uniforms;
109
110 public:
111         Animation();
112         ~Animation();
113
114         void set_armature(const Armature &);
115         const Armature *get_armature() const { return armature; }
116
117         unsigned get_n_uniforms() const { return uniforms.size(); }
118         unsigned get_slot_for_uniform(const std::string &) const;
119         const std::string &get_uniform_name(unsigned) const;
120
121         void add_keyframe(const Time::TimeDelta &, const KeyFrame &);
122 private:
123         void prepare_keyframe(TimedKeyFrame &);
124
125 public:
126         void set_looping(bool);
127 };
128
129 } // namespace GL
130 } // namespace Msp
131
132 #endif