#include <msp/time/timedelta.h>
#include "animation.h"
+#include "matrix.h"
namespace Msp {
namespace GL {
private:
struct AnimationSlot
{
- const Animation &animation;
+ const Animation *animation;
Animation::Iterator iterator;
AnimationSlot(const Animation &);
};
- typedef std::list<AnimationSlot> AnimationList;
-
struct ObjectSlot
{
AnimatedObject &object;
Matrix base_matrix;
const Armature *armature;
- AnimationList animations;
+ std::vector<AnimationSlot> animations;
bool stacked;
ObjectSlot(AnimatedObject &);
};
- typedef std::map<AnimatedObject *, ObjectSlot> ObjectMap;
+ typedef std::map<const AnimatedObject *, ObjectSlot> ObjectMap;
ObjectMap objects;
playing yet, the object's current matrix is used as the base. */
void play_stacked(AnimatedObject &, const Animation &);
- /// Stops any animations affecting an object.
+ /// 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 &);
+ static void set_object_uniform(AnimatedObject &, const std::string &, const KeyFrame::AnimatedUniform &);
};
} // namespace GL