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