]> git.tdb.fi Git - libs/gl.git/blobdiff - source/animation/armature.cpp
Rearrange soucre files into subdirectories
[libs/gl.git] / source / animation / armature.cpp
diff --git a/source/animation/armature.cpp b/source/animation/armature.cpp
new file mode 100644 (file)
index 0000000..6e921e3
--- /dev/null
@@ -0,0 +1,91 @@
+#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