1 #ifndef MSP_GL_ANIMATION_H_
2 #define MSP_GL_ANIMATION_H_
4 #include <msp/core/refptr.h>
5 #include <msp/datafile/objectloader.h>
6 #include <msp/interpolate/spline.h>
7 #include <msp/time/timedelta.h>
13 class AnimationEventObserver;
19 An Animation is a sequence of KeyFrames combined with timing information. The
20 state at any point in the animation can be interpolated from the keyframes.
25 class Loader: public DataFile::CollectionObjectLoader<Animation>
28 Time::TimeDelta current_time;
34 Loader(Animation &, Collection &);
37 virtual void finish();
39 void load_kf(const std::string &, bool);
40 void load_kf_inline(bool);
42 void control_keyframe(const std::string &);
43 void control_keyframe_inline();
44 void event(const std::string &);
45 void event1i(const std::string &, int);
46 void event1f(const std::string &, float);
47 void event2f(const std::string &, float, float);
48 void event3f(const std::string &, float, float, float);
49 void event4f(const std::string &, float, float, float, float);
51 void keyframe(const std::string &);
52 void keyframe_inline();
53 void slopes(float, float);
74 virtual void apply(float, Matrix &) const = 0;
75 virtual void apply(float, KeyFrame::AnimatedUniform &) const = 0;
79 class ValueCurve: public Curve
82 typedef typename Interpolate::SplineKnot<float, N> Knot;
85 Interpolate::Spline<float, 3, N> spline;
88 ValueCurve(CurveTarget, const std::vector<Knot> &);
90 virtual void apply(float, Matrix &) const;
91 virtual void apply(float, KeyFrame::AnimatedUniform &) const;
97 const std::string &name;
99 ExtractUniform(const std::string &n): name(n) { }
101 bool operator()(const KeyFrame &, typename Interpolate::SplineValue<float, N>::Type &) const;
106 Time::TimeDelta time;
107 RefPtr<const KeyFrame> keyframe;
113 Time::TimeDelta time;
123 UniformInfo(const std::string &, unsigned);
130 const Animation *animation;
131 Time::TimeDelta elapsed;
132 std::vector<Event>::const_iterator event_iter;
136 Iterator(const Animation &);
138 Iterator &operator+=(const Time::TimeDelta &);
139 void dispatch_events(AnimationEventObserver &);
141 bool is_end() const { return end; }
142 Matrix get_matrix() const;
143 KeyFrame::AnimatedUniform get_uniform(unsigned) const;
144 Matrix get_pose_matrix(unsigned) const;
148 const Armature *armature;
149 std::vector<TimedKeyFrame> keyframes;
150 std::vector<Event> events;
152 std::vector<UniformInfo> uniforms;
153 std::vector<Curve *> curves;
159 void set_armature(const Armature &);
160 const Armature *get_armature() const { return armature; }
162 unsigned get_n_uniforms() const { return uniforms.size(); }
163 unsigned get_slot_for_uniform(const std::string &) const;
164 const std::string &get_uniform_name(unsigned) const;
166 void add_keyframe(const Time::TimeDelta &, const KeyFrame &);
167 void add_keyframe(const Time::TimeDelta &, const KeyFrame &, float);
168 void add_keyframe(const Time::TimeDelta &, const KeyFrame &, float, float);
169 void add_control_keyframe(const KeyFrame &);
171 void add_keyframe(const Time::TimeDelta &, const KeyFrame *, bool, bool);
172 void prepare_keyframe(TimedKeyFrame &);
173 void create_curves();
174 template<unsigned N, typename T>
175 void create_curve(CurveTarget target, const T &);
176 static bool extract_position(const KeyFrame &, Vector3 &);
177 static bool extract_euler(const KeyFrame &, Vector3 &);
178 static bool extract_scale(const KeyFrame &, Vector3 &);
180 void add_event(const Time::TimeDelta &, const std::string &, const Variant & = Variant());
182 const Msp::Time::TimeDelta &get_duration() const;
184 void set_looping(bool);