]> git.tdb.fi Git - libs/gl.git/blob - source/animation.h
58a76583392270e5f1c0dd7a348d0fe10cff23d7
[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
8 namespace Msp {
9 namespace GL {
10
11 class Armature;
12 class KeyFrame;
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 double *, const double *);
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<MatrixInterpolation> pose_matrices;
70
71                 TimedKeyFrame(const Animation &);
72                 void prepare();
73         };
74
75         typedef std::list<TimedKeyFrame> KeyFrameList;
76
77 public:
78         class Iterator
79         {
80         private:
81                 const Animation &animation;
82                 KeyFrameList::const_iterator iter;
83                 Time::TimeDelta time_since_keyframe;
84                 bool end;
85
86         public:
87                 Iterator(const Animation &);
88
89                 Iterator &operator+=(const Time::TimeDelta &);
90
91                 bool is_end() const { return end; }
92                 Matrix get_matrix() const;
93                 Matrix get_pose_matrix(unsigned) const;
94         };
95
96 private:
97         const Armature *armature;
98         KeyFrameList keyframes;
99         bool looping;
100
101 public:
102         Animation();
103         ~Animation();
104
105         void set_armature(const Armature &);
106         const Armature *get_armature() const { return armature; }
107
108         void add_keyframe(const Time::TimeDelta &, const KeyFrame &);
109 private:
110         void prepare_keyframe(TimedKeyFrame &);
111
112 public:
113         void set_looping(bool);
114 };
115
116 } // namespace GL
117 } // namespace Msp
118
119 #endif