]> git.tdb.fi Git - libs/gl.git/blob - source/armature.cpp
Improve legacy mode logic in ProgramBuilder
[libs/gl.git] / source / armature.cpp
1 #include <msp/core/maputils.h>
2 #include "armature.h"
3
4 using namespace std;
5
6 namespace Msp {
7 namespace GL {
8
9 Armature::Link &Armature::add_link()
10 {
11         links.push_back(Link(string(), links.size()));
12         return links.back();
13 }
14
15 const Armature::Link &Armature::get_link(unsigned index) const
16 {
17         for(list<Link>::const_iterator i=links.begin(); i!=links.end(); ++i)
18                 if(i->get_index()==index)
19                         return *i;
20         throw key_error(typeid(list<Link>));
21 }
22
23 const Armature::Link &Armature::get_link(const string &name) const
24 {
25         for(list<Link>::const_iterator i=links.begin(); i!=links.end(); ++i)
26                 if(i->get_name()==name)
27                         return *i;
28         throw key_error(typeid(list<Link>));
29 }
30
31 unsigned Armature::get_max_link_index() const
32 {
33         unsigned max_index = 0;
34         for(list<Link>::const_iterator i=links.begin(); i!=links.end(); ++i)
35                 max_index = max(max_index, i->get_index());
36         return max_index;
37 }
38
39
40 Armature::Link::Link(const string &n, unsigned i):
41         name(n),
42         index(i),
43         parent(0)
44 { }
45
46 void Armature::Link::set_parent(const Link *p)
47 {
48         parent = p;
49 }
50
51 void Armature::Link::set_base(const Vector3 &b)
52 {
53         base = b;
54 }
55
56
57 Armature::Loader::Loader(Armature &a):
58         DataFile::ObjectLoader<Armature>(a)
59 {
60         add("link", &Loader::link);
61 }
62
63 void Armature::Loader::link(const string &n)
64 {
65         Link lnk(n, obj.links.size());
66         load_sub(lnk, obj);
67         obj.links.push_back(lnk);
68 }
69
70
71 Armature::Link::Loader::Loader(Link &l, const Armature &a):
72         DataFile::ObjectLoader<Link>(l),
73         armature(a)
74 {
75         add("base",   &Loader::base);
76         add("index",  &Link::index);
77         add("parent", &Loader::parent);
78 }
79
80 void Armature::Link::Loader::base(float x, float y, float z)
81 {
82         obj.base = Vector3(x, y, z);
83 }
84
85 void Armature::Link::Loader::parent(const string &n)
86 {
87         obj.parent = &armature.get_link(n);
88 }
89
90 } // namespace GL
91 } // namespace Msp