1 #include "animatedobject.h"
2 #include "animationplayer.h"
10 AnimationPlayer::ObjectSlot &AnimationPlayer::get_slot(AnimatedObject &obj)
12 ObjectMap::iterator i = objects.find(&obj);
16 return objects.insert(ObjectMap::value_type(&obj, ObjectSlot(obj))).first->second;
19 void AnimationPlayer::play(AnimatedObject &obj, const Animation &anim)
21 ObjectSlot &obj_slot = get_slot(obj);
22 obj_slot.animations.clear();
23 obj_slot.base_matrix = Matrix();
24 obj_slot.stacked = false;
25 obj_slot.armature = anim.get_armature();
26 obj_slot.animations.push_back(AnimationSlot(anim));
29 void AnimationPlayer::play_stacked(AnimatedObject &obj, const Animation &anim)
31 ObjectSlot &obj_slot = get_slot(obj);
32 if(obj_slot.animations.empty())
33 obj_slot.base_matrix = *obj.get_matrix();
34 // TODO check for incompatible armature
35 obj_slot.stacked = true;
36 obj_slot.armature = anim.get_armature();
37 obj_slot.animations.push_back(AnimationSlot(anim));
40 unsigned AnimationPlayer::get_n_active_animations(const AnimatedObject &obj) const
42 ObjectMap::const_iterator i = objects.find(&obj);
43 return (i!=objects.end() ? i->second.animations.size() : 0);
46 void AnimationPlayer::stop(AnimatedObject &obj)
51 void AnimationPlayer::tick(const Time::TimeDelta &dt)
53 for(ObjectMap::iterator i=objects.begin(); i!=objects.end(); )
57 keep = tick_stacked(i->second, dt);
59 keep = tick_single(i->second, dt);
68 bool AnimationPlayer::tick_single(ObjectSlot &slot, const Time::TimeDelta &dt)
70 AnimatedObject &obj = slot.object;
71 AnimationSlot &anim = slot.animations.front();
73 obj.set_matrix(anim.iterator.get_matrix());
76 unsigned max_index = slot.armature->get_max_link_index();
77 for(unsigned i=0; i<=max_index; ++i)
78 obj.set_pose_matrix(i, anim.iterator.get_pose_matrix(i));
81 return !anim.iterator.is_end();
84 bool AnimationPlayer::tick_stacked(ObjectSlot &slot, const Time::TimeDelta &dt)
86 Matrix matrix = slot.base_matrix;
87 for(AnimationList::iterator i=slot.animations.begin(); i!=slot.animations.end(); ++i)
90 matrix *= i->iterator.get_matrix();
92 slot.object.set_matrix(matrix);
96 unsigned max_index = slot.armature->get_max_link_index();
97 for(unsigned i=0; i<=max_index; ++i)
100 /* XXX This is in all likelihood incorrect. The stacking should be
101 performed on local matrices. */
102 for(AnimationList::iterator j=slot.animations.begin(); j!=slot.animations.end(); ++j)
103 if(j->animation.get_armature())
104 matrix *= j->iterator.get_pose_matrix(i);
105 slot.object.set_pose_matrix(i, matrix);
109 for(AnimationList::iterator i=slot.animations.begin(); i!=slot.animations.end(); )
111 if(i->iterator.is_end())
112 slot.animations.erase(i++);
117 return !slot.animations.empty();
121 AnimationPlayer::ObjectSlot::ObjectSlot(AnimatedObject &o):
128 AnimationPlayer::AnimationSlot::AnimationSlot(const Animation &a):