#include <msp/time/timedelta.h>
#include "animation.h"
+#include "matrix.h"
namespace Msp {
namespace GL {
class AnimationPlayer
{
private:
- struct Slot
+ struct AnimationSlot
{
- AnimatedObject &object;
const Animation &animation;
Animation::Iterator iterator;
- Slot(AnimatedObject &, const Animation &);
+ AnimationSlot(const Animation &);
+ };
+
+ typedef std::list<AnimationSlot> AnimationList;
+
+ struct ObjectSlot
+ {
+ AnimatedObject &object;
+ Matrix base_matrix;
+ const Armature *armature;
+ AnimationList animations;
+ bool stacked;
+
+ ObjectSlot(AnimatedObject &);
};
- std::list<Slot> slots;
+ typedef std::map<const AnimatedObject *, ObjectSlot> ObjectMap;
+
+ ObjectMap objects;
+
+private:
+ ObjectSlot &get_slot(AnimatedObject &);
public:
- /** Plays an animation on an object. */
+ /// Plays an animation on an object. Any previous animations are replaced.
void play(AnimatedObject &, const Animation &);
+ /** Plays an animation, stacked with other animations. If no animations are
+ playing yet, the object's current matrix is used as the base. */
+ void play_stacked(AnimatedObject &, const Animation &);
+
+ /// Returns the number of animations currently affecting an object.
+ unsigned get_n_active_animations(const AnimatedObject &) const;
+
+ /// Stops all animations affecting an object.
+ void stop(AnimatedObject &);
+
+ /// Stops a single animation affecting an object.
+ void stop(AnimatedObject &, const Animation &);
+
/** Advances all playing animations. Should be called in a regular manner,
preferably just before rendering. */
void tick(const Time::TimeDelta &);
+
+private:
+ bool tick_single(ObjectSlot &, const Time::TimeDelta &);
+ bool tick_stacked(ObjectSlot &, const Time::TimeDelta &);
};
} // namespace GL