+#include <msp/core/algorithm.h>
#include "animatedobject.h"
#include "animationplayer.h"
#include "armature.h"
return (i!=objects.end() ? i->second.animations.size() : 0);
}
+void AnimationPlayer::observe_events(AnimatedObject &obj, AnimationEventObserver &observer)
+{
+ Target &target = get_slot(obj);
+ if(find(target.event_observers, &observer)==target.event_observers.end())
+ target.event_observers.push_back(&observer);
+}
+
+void AnimationPlayer::unobserve_events(AnimatedObject &obj, AnimationEventObserver &observer)
+{
+ ObjectMap::iterator i = objects.find(&obj);
+ if(i==objects.end())
+ return;
+
+ vector<AnimationEventObserver *>::iterator j = find(i->second.event_observers, &observer);
+ if(j!=i->second.event_observers.end())
+ i->second.event_observers.erase(j);
+}
+
+void AnimationPlayer::unobserve_events(AnimationEventObserver &observer)
+{
+ for(ObjectMap::iterator i=objects.begin(); i!=objects.end(); ++i)
+ {
+ vector<AnimationEventObserver *>::iterator j = find(i->second.event_observers, &observer);
+ if(j!=i->second.event_observers.end())
+ i->second.event_observers.erase(j);
+ }
+}
+
void AnimationPlayer::stop(AnimatedObject &obj)
{
objects.erase(&obj);
{
if(i->second.stacked)
tick_stacked(i->second, dt);
- else
+ else if(!i->second.animations.empty())
tick_single(i->second, dt);
- if(i->second.animations.empty())
+ if(i->second.animations.empty() && i->second.event_observers.empty())
objects.erase(i++);
else
++i;
target.object.set_pose_matrix(i, anim.iterator.get_pose_matrix(i));
}
- if(!anim.iterator.is_end())
+ anim.iterator.dispatch_events(target);
+
+ if(anim.iterator.is_end())
target.animations.clear();
}
for(vector<PlayingAnimation>::iterator i=target.animations.begin(); i!=target.animations.end(); )
{
+ i->iterator.dispatch_events(target);
+
if(i->iterator.is_end())
i = target.animations.erase(i);
else
}
+AnimationPlayer::PlayingAnimation::PlayingAnimation(const Animation &a):
+ animation(&a),
+ iterator(*animation)
+{ }
+
+
AnimationPlayer::Target::Target(AnimatedObject &o):
object(o),
armature(0),
stacked(false)
{ }
-
-AnimationPlayer::PlayingAnimation::PlayingAnimation(const Animation &a):
- animation(&a),
- iterator(*animation)
-{ }
+void AnimationPlayer::Target::animation_event(AnimatedObject *, const string &name, const Variant &value)
+{
+ for(vector<AnimationEventObserver *>::const_iterator i=event_observers.begin(); i!=event_observers.end(); ++i)
+ (*i)->animation_event(&object, name, value);
+}
} // namespace GL
} // namespace Msp