]> git.tdb.fi Git - libs/gl.git/blob - source/animationplayer.h
93482c74f9b88daac2744e343f2bc04ab6bbdb42
[libs/gl.git] / source / animationplayer.h
1 #ifndef MSP_GL_ANIMATIONPLAYER_H_
2 #define MSP_GL_ANIMATIONPLAYER_H_
3
4 #include <msp/time/timedelta.h>
5 #include "animation.h"
6 #include "matrix.h"
7
8 namespace Msp {
9 namespace GL {
10
11 class AnimatedObject;
12
13 /**
14 The bridge between Animations and AnimatedObjects.  A single AnimationPlayer
15 can handle an arbitrary number of animations simultaneously.
16 */
17 class AnimationPlayer
18 {
19 private:
20         struct AnimationSlot
21         {
22                 const Animation *animation;
23                 Animation::Iterator iterator;
24
25                 AnimationSlot(const Animation &);
26         };
27
28         struct ObjectSlot
29         {
30                 AnimatedObject &object;
31                 Matrix base_matrix;
32                 const Armature *armature;
33                 std::vector<AnimationSlot> animations;
34                 bool stacked;
35
36                 ObjectSlot(AnimatedObject &);
37         };
38
39         typedef std::map<const AnimatedObject *, ObjectSlot> ObjectMap;
40
41         ObjectMap objects;
42
43 private:
44         ObjectSlot &get_slot(AnimatedObject &);
45
46 public:
47         /// Plays an animation on an object.  Any previous animations are replaced.
48         void play(AnimatedObject &, const Animation &);
49
50         /** Plays an animation, stacked with other animations.  If no animations are
51         playing yet, the object's current matrix is used as the base. */
52         void play_stacked(AnimatedObject &, const Animation &);
53
54         /// Returns the number of animations currently affecting an object.
55         unsigned get_n_active_animations(const AnimatedObject &) const;
56
57         /// Stops all animations affecting an object.
58         void stop(AnimatedObject &);
59
60         /// Stops a single animation affecting an object.
61         void stop(AnimatedObject &, const Animation &);
62
63         /** Advances all playing animations.  Should be called in a regular manner,
64         preferably just before rendering. */
65         void tick(const Time::TimeDelta &);
66
67 private:
68         bool tick_single(ObjectSlot &, const Time::TimeDelta &);
69         bool tick_stacked(ObjectSlot &, const Time::TimeDelta &);
70         static void set_object_uniform(AnimatedObject &, const std::string &, const KeyFrame::AnimatedUniform &);
71 };
72
73 } // namespace GL
74 } // namespace Msp
75
76 #endif