]> git.tdb.fi Git - libs/gl.git/blob - source/animation/transform.cpp
Check the flat qualifier from the correct member
[libs/gl.git] / source / animation / transform.cpp
1 #include "transform.h"
2
3 namespace Msp {
4 namespace GL {
5
6 Transform Transform::from_matrix(const Matrix &matrix)
7 {
8         Transform trn;
9         trn.position = matrix.column(3).slice<3>(0);
10
11         trn.euler.z = Geometry::atan2<float>(matrix(1, 0), matrix(0, 0));
12         Matrix m = Matrix::rotation(-trn.euler.z, Vector3(0.0f, 0.0f, 1.0f))*matrix;
13         trn.euler.y = Geometry::atan2<float>(-m(2, 0), m(0, 0));
14         m = Matrix::rotation(-trn.euler.y, Vector3(0.0f, 1.0f, 0.0f))*m;
15         trn.euler.x = Geometry::atan2<float>(m(2, 1), m(1, 1));
16         m = Matrix::rotation(-trn.euler.x, Vector3(1.0f, 0.0f, 0.0f))*m;
17
18         trn.scale = Vector3(m(0, 0), m(1, 1), m(2, 2));
19
20         trn.mask = POSITION|EULER|SCALE;
21         return trn;
22 }
23
24 void Transform::set_position(const Vector3 &p)
25 {
26         position = p;
27         mask = mask|POSITION;
28 }
29
30 void Transform::set_euler(const AngleVector3 &e)
31 {
32         euler = e;
33         mask = mask|EULER;
34 }
35
36 void Transform::set_rotation(const Angle &angle, const Vector3 &axis)
37 {
38         euler = from_matrix(Matrix::rotation(angle, axis)).euler;
39         mask = mask|EULER;
40 }
41
42 void Transform::set_scale(float s)
43 {
44         set_scale(Vector3(s, s, s));
45 }
46
47 void Transform::set_scale(const Vector3 &s)
48 {
49         scale = s;
50         mask = mask|SCALE;
51 }
52
53 Matrix Transform::to_matrix() const
54 {
55         Matrix result;
56         result.translate(position);
57         result.rotate(euler.z, Vector3(0.0f, 0.0f, 1.0f));
58         result.rotate(euler.y, Vector3(0.0f, 1.0f, 0.0f));
59         result.rotate(euler.x, Vector3(1.0f, 0.0f, 0.0f));
60         result.scale(scale);
61         return result;
62 }
63
64
65 Transform::Loader::Loader(Transform &t):
66         DataFile::ObjectLoader<Transform>(t)
67 {
68         add("position_x", &Loader::position_x);
69         add("position_y", &Loader::position_y);
70         add("position_z", &Loader::position_z);
71         add("position", &Loader::position);
72         add("euler_x", &Loader::euler_x);
73         add("euler_y", &Loader::euler_y);
74         add("euler_z", &Loader::euler_z);
75         add("euler", &Loader::euler);
76         add("rotation", &Loader::rotation);
77         add("scale_x", &Loader::scale_x);
78         add("scale_y", &Loader::scale_y);
79         add("scale_z", &Loader::scale_z);
80         add("scale", &Loader::scale_uniform);
81         add("scale", &Loader::scale);
82 }
83
84 void Transform::Loader::position_x(float x)
85 {
86         obj.position.x = x;
87         obj.mask = obj.mask|POSITION_X;
88 }
89
90 void Transform::Loader::position_y(float y)
91 {
92         obj.position.y = y;
93         obj.mask = obj.mask|POSITION_Y;
94 }
95
96 void Transform::Loader::position_z(float z)
97 {
98         obj.position.z = z;
99         obj.mask = obj.mask|POSITION_Z;
100 }
101
102 void Transform::Loader::position(float x, float y, float z)
103 {
104         obj.set_position(Vector3(x, y, z));
105 }
106
107 void Transform::Loader::euler_x(float x)
108 {
109         obj.euler.x = Angle::from_degrees(x);
110         obj.mask = obj.mask|EULER_X;
111 }
112
113 void Transform::Loader::euler_y(float y)
114 {
115         obj.euler.y = Angle::from_degrees(y);
116         obj.mask = obj.mask|EULER_Y;
117 }
118
119 void Transform::Loader::euler_z(float z)
120 {
121         obj.euler.z = Angle::from_degrees(z);
122         obj.mask = obj.mask|EULER_Z;
123 }
124
125 void Transform::Loader::euler(float x, float y, float z)
126 {
127         obj.set_euler(AngleVector3(Angle::from_degrees(x), Angle::from_degrees(y), Angle::from_degrees(z)));
128 }
129
130 void Transform::Loader::rotation(float a, float x, float y, float z)
131 {
132         obj.set_rotation(Angle::from_degrees(a), Vector3(x, y, z));
133 }
134
135 void Transform::Loader::scale_x(float x)
136 {
137         obj.scale.x = x;
138         obj.mask = obj.mask|SCALE_X;
139 }
140
141 void Transform::Loader::scale_y(float y)
142 {
143         obj.scale.y = y;
144         obj.mask = obj.mask|SCALE_Y;
145 }
146
147 void Transform::Loader::scale_z(float z)
148 {
149         obj.scale.z = z;
150         obj.mask = obj.mask|SCALE_Z;
151 }
152
153 void Transform::Loader::scale_uniform(float s)
154 {
155         obj.set_scale(s);
156 }
157
158 void Transform::Loader::scale(float x, float y, float z)
159 {
160         obj.set_scale(Vector3(x, y, z));
161 }
162
163 } // namespace GL
164 } // namespace Msp