]> git.tdb.fi Git - libs/gl.git/blob - source/transform.cpp
Move transform loading to ObjectInstance
[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 void Transform::set_position(const Vector3 &p)
13 {
14         position = p;
15 }
16
17 void Transform::set_euler(const AngleVector3 &e)
18 {
19         euler = e;
20 }
21
22 void Transform::set_scale(const Vector3 &s)
23 {
24         scale = s;
25 }
26
27 Matrix Transform::to_matrix() const
28 {
29         Matrix result;
30         result.translate(position);
31         result.rotate(euler.z, Vector3(0.0f, 0.0f, 1.0f));
32         result.rotate(euler.y, Vector3(0.0f, 1.0f, 0.0f));
33         result.rotate(euler.x, Vector3(1.0f, 0.0f, 0.0f));
34         result.scale(scale);
35         return result;
36 }
37
38
39 Transform::Loader::Loader(Transform &t):
40         DataFile::ObjectLoader<Transform>(t)
41 {
42         add("position", &Loader::position);
43         add("euler", &Loader::euler);
44         add("rotation", &Loader::rotation);
45         add("scale_uniform", &Loader::scale_uniform);
46         add("scale", &Loader::scale);
47 }
48
49 void Transform::Loader::position(float x, float y, float z)
50 {
51         obj.position = Vector3(x, y, z);
52 }
53
54 void Transform::Loader::euler(float x, float y, float z)
55 {
56         obj.euler = AngleVector3(Angle::from_degrees(x), Angle::from_degrees(y), Angle::from_degrees(z));
57 }
58
59 void Transform::Loader::rotation(float a, float x, float y, float z)
60 {
61         Matrix matrix = Matrix::rotation(Angle::from_degrees(a), Vector3(x, y, z));
62         obj.euler.z = Geometry::atan2<float>(matrix(1, 0), matrix(0, 0));
63         matrix = Matrix::rotation(-obj.euler.z, Vector3(0.0f, 0.0f, 1.0f))*matrix;
64         obj.euler.y = Geometry::atan2<float>(matrix(2, 0), matrix(0, 0));
65         matrix = Matrix::rotation(-obj.euler.y, Vector3(0.0f, 1.0f, 0.0f))*matrix;
66         obj.euler.x = Geometry::atan2<float>(matrix(2, 1), matrix(1, 1));
67 }
68
69 void Transform::Loader::scale_uniform(float s)
70 {
71         obj.scale = Vector3(s, s, s);
72 }
73
74 void Transform::Loader::scale(float x, float y, float z)
75 {
76         obj.scale = Vector3(x, y, z);
77 }
78
79 } // namespace GL
80 } // namespace Msp