--- /dev/null
+#include <msp/core/maputils.h>
+#include "armature.h"
+
+using namespace std;
+
+namespace Msp {
+namespace GL {
+
+Armature::Link &Armature::add_link()
+{
+ links.push_back(Link(string(), links.size()));
+ return links.back();
+}
+
+const Armature::Link &Armature::get_link(unsigned index) const
+{
+ for(vector<Link>::const_iterator i=links.begin(); i!=links.end(); ++i)
+ if(i->get_index()==index)
+ return *i;
+ throw key_error(typeid(list<Link>));
+}
+
+const Armature::Link &Armature::get_link(const string &name) const
+{
+ for(vector<Link>::const_iterator i=links.begin(); i!=links.end(); ++i)
+ if(i->get_name()==name)
+ return *i;
+ throw key_error(typeid(list<Link>));
+}
+
+unsigned Armature::get_max_link_index() const
+{
+ unsigned max_index = 0;
+ for(vector<Link>::const_iterator i=links.begin(); i!=links.end(); ++i)
+ max_index = max(max_index, i->get_index());
+ return max_index;
+}
+
+
+Armature::Link::Link(const string &n, unsigned i):
+ name(n),
+ index(i),
+ parent(0)
+{ }
+
+void Armature::Link::set_parent(const Link *p)
+{
+ parent = p;
+}
+
+void Armature::Link::set_base(const Vector3 &b)
+{
+ base = b;
+}
+
+
+Armature::Loader::Loader(Armature &a):
+ DataFile::ObjectLoader<Armature>(a)
+{
+ add("link", &Loader::link);
+}
+
+void Armature::Loader::link(const string &n)
+{
+ Link lnk(n, obj.links.size());
+ load_sub(lnk, obj);
+ obj.links.push_back(lnk);
+}
+
+
+Armature::Link::Loader::Loader(Link &l, const Armature &a):
+ DataFile::ObjectLoader<Link>(l),
+ armature(a)
+{
+ add("base", &Loader::base);
+ add("index", &Link::index);
+ add("parent", &Loader::parent);
+}
+
+void Armature::Link::Loader::base(float x, float y, float z)
+{
+ obj.base = Vector3(x, y, z);
+}
+
+void Armature::Link::Loader::parent(const string &n)
+{
+ obj.parent = &armature.get_link(n);
+}
+
+} // namespace GL
+} // namespace Msp