]> git.tdb.fi Git - libs/gl.git/blob - source/transform.cpp
Use bezier splines in Animation
[libs/gl.git] / source / transform.cpp
1 #include "transform.h"
2
3 namespace Msp {
4 namespace GL {
5
6 Transform::Transform():
7         position(0.0f, 0.0f, 0.0f),
8         euler(Angle::zero(), Angle::zero(), Angle::zero()),
9         scale(1.0f, 1.0f, 1.0f)
10 { }
11
12 Transform Transform::from_matrix(const Matrix &matrix)
13 {
14         Transform trn;
15         trn.position = matrix.column(3).slice<3>(0);
16
17         trn.euler.z = Geometry::atan2<float>(matrix(1, 0), matrix(0, 0));
18         Matrix m = Matrix::rotation(-trn.euler.z, Vector3(0.0f, 0.0f, 1.0f))*matrix;
19         trn.euler.y = Geometry::atan2<float>(m(2, 0), m(0, 0));
20         m = Matrix::rotation(-trn.euler.y, Vector3(0.0f, 1.0f, 0.0f))*m;
21         trn.euler.x = Geometry::atan2<float>(m(2, 1), m(1, 1));
22         m = Matrix::rotation(-trn.euler.x, Vector3(1.0f, 0.0f, 0.0f))*m;
23
24         trn.scale = Vector3(m(0, 0), m(1, 1), m(2, 2));
25
26         return trn;
27 }
28
29 void Transform::set_position(const Vector3 &p)
30 {
31         position = p;
32 }
33
34 void Transform::set_euler(const AngleVector3 &e)
35 {
36         euler = e;
37 }
38
39 void Transform::set_rotation(const Angle &angle, const Vector3 &axis)
40 {
41         euler = from_matrix(Matrix::rotation(angle, axis)).euler;
42 }
43
44 void Transform::set_scale(float s)
45 {
46         set_scale(Vector3(s, s, s));
47 }
48
49 void Transform::set_scale(const Vector3 &s)
50 {
51         scale = s;
52 }
53
54 Matrix Transform::to_matrix() const
55 {
56         Matrix result;
57         result.translate(position);
58         result.rotate(euler.z, Vector3(0.0f, 0.0f, 1.0f));
59         result.rotate(euler.y, Vector3(0.0f, 1.0f, 0.0f));
60         result.rotate(euler.x, Vector3(1.0f, 0.0f, 0.0f));
61         result.scale(scale);
62         return result;
63 }
64
65
66 Transform::Loader::Loader(Transform &t):
67         DataFile::ObjectLoader<Transform>(t)
68 {
69         add("position", &Loader::position);
70         add("euler", &Loader::euler);
71         add("rotation", &Loader::rotation);
72         add("scale_uniform", &Loader::scale_uniform);
73         add("scale", &Loader::scale);
74 }
75
76 void Transform::Loader::position(float x, float y, float z)
77 {
78         obj.set_position(Vector3(x, y, z));
79 }
80
81 void Transform::Loader::euler(float x, float y, float z)
82 {
83         obj.set_euler(AngleVector3(Angle::from_degrees(x), Angle::from_degrees(y), Angle::from_degrees(z)));
84 }
85
86 void Transform::Loader::rotation(float a, float x, float y, float z)
87 {
88         obj.set_rotation(Angle::from_degrees(a), Vector3(x, y, z));
89 }
90
91 void Transform::Loader::scale_uniform(float s)
92 {
93         obj.set_scale(s);
94 }
95
96 void Transform::Loader::scale(float x, float y, float z)
97 {
98         obj.set_scale(Vector3(x, y, z));
99 }
100
101 } // namespace GL
102 } // namespace Msp