#include <msp/core/refptr.h>
#include <msp/datafile/objectloader.h>
#include <msp/time/timedelta.h>
+#include "keyframe.h"
namespace Msp {
namespace GL {
-class KeyFrame;
+class AnimationEventObserver;
+class Armature;
class Matrix;
+class Pose;
/**
An Animation is a sequence of KeyFrames combined with timing information. The
{
private:
Time::TimeDelta current_time;
+ float start_slope;
+ float end_slope;
public:
Loader(Animation &);
private:
void init();
+ void event(const std::string &);
+ void event1i(const std::string &, int);
+ void event1f(const std::string &, float);
+ void event2f(const std::string &, float, float);
+ void event3f(const std::string &, float, float, float);
+ void event4f(const std::string &, float, float, float, float);
+ void interval(float);
void keyframe(const std::string &);
void keyframe_inline();
- void interval(float);
+ void slopes(float, float);
};
private:
float scale;
AxisInterpolation();
+ AxisInterpolation(const float *, const float *);
+ };
+
+ struct MatrixInterpolation
+ {
+ const Matrix *matrix1;
+ const Matrix *matrix2;
+ AxisInterpolation axes[3];
+
+ MatrixInterpolation();
+ MatrixInterpolation(const Matrix &, const Matrix &);
+
+ Matrix get(float) const;
};
struct TimedKeyFrame
const TimedKeyFrame *prev;
Time::TimeDelta time;
Time::TimeDelta delta_t;
+ float start_slope;
+ float end_slope;
RefPtr<const KeyFrame> keyframe;
- AxisInterpolation axes[3];
+ MatrixInterpolation matrix;
+ std::vector<KeyFrame::AnimatedUniform> uniforms;
+ std::vector<MatrixInterpolation> pose_matrices;
+
+ TimedKeyFrame();
+ void prepare(const Animation &);
};
- typedef std::list<TimedKeyFrame> KeyFrameList;
+ struct Event
+ {
+ Time::TimeDelta time;
+ std::string name;
+ Variant value;
+ };
+
+ struct UniformInfo
+ {
+ std::string name;
+ unsigned size;
+
+ UniformInfo(const std::string &, unsigned);
+ };
public:
class Iterator
{
private:
- const Animation &animation;
- KeyFrameList::const_iterator iter;
+ const Animation *animation;
+ std::vector<TimedKeyFrame>::const_iterator iter;
+ std::vector<Event>::const_iterator event_iter;
Time::TimeDelta time_since_keyframe;
+ float x;
bool end;
public:
Iterator(const Animation &);
Iterator &operator+=(const Time::TimeDelta &);
+ void dispatch_events(AnimationEventObserver &);
bool is_end() const { return end; }
Matrix get_matrix() const;
+ KeyFrame::AnimatedUniform get_uniform(unsigned) const;
+ Matrix get_pose_matrix(unsigned) const;
};
private:
- KeyFrameList keyframes;
+ const Armature *armature;
+ std::vector<TimedKeyFrame> keyframes;
+ std::vector<Event> events;
bool looping;
+ std::vector<UniformInfo> uniforms;
public:
Animation();
+ ~Animation();
+
+ void set_armature(const Armature &);
+ const Armature *get_armature() const { return armature; }
+
+ unsigned get_n_uniforms() const { return uniforms.size(); }
+ unsigned get_slot_for_uniform(const std::string &) const;
+ const std::string &get_uniform_name(unsigned) const;
void add_keyframe(const Time::TimeDelta &, const KeyFrame &);
- void set_looping(bool);
+ void add_keyframe(const Time::TimeDelta &, const KeyFrame &, float);
+ void add_keyframe(const Time::TimeDelta &, const KeyFrame &, float, float);
private:
+ void add_keyframe(const Time::TimeDelta &, const RefPtr<const KeyFrame> &, float, float);
void prepare_keyframe(TimedKeyFrame &);
+public:
+ void add_event(const Time::TimeDelta &, const std::string &, const Variant & = Variant());
- Matrix compute_matrix(const TimedKeyFrame &, const Time::TimeDelta &) const;
+ const Msp::Time::TimeDelta &get_duration() const;
+
+ void set_looping(bool);
};
} // namespace GL