]> git.tdb.fi Git - libs/game.git/blob - source/game/transform.cpp
Convert components to buffered where appropriate
[libs/game.git] / source / game / transform.cpp
1 #include "transform.h"
2 #include <msp/geometry/affinetransform.h>
3
4 namespace Msp::Game {
5
6 Transform::Transform(Handle<Entity> e):
7         BufferedComponent<TransformData>(e)
8 { }
9
10 void Transform::set_values(const TransformValues &v)
11 {
12         write().values = v;
13 }
14
15 void Transform::set_position(const LinAl::Vector<float, 3> &p)
16 {
17         write().values.position = p;
18 }
19
20 void Transform::set_rotation(const Geometry::Quaternion<float> &r)
21 {
22         write().values.rotation = normalize(r);
23 }
24
25 void Transform::set_scale(const LinAl::Vector<float, 3> &s)
26 {
27         write().values.scale = s;
28 }
29
30 void Transform::update_world_matrix(const Transform *parent)
31 {
32         using Affine = Geometry::AffineTransform<float, 3>;
33
34         Data &d = write();
35         d.local_matrix = Affine::translation(d.values.position)*
36                 Affine::rotation(d.values.rotation)*Affine::scaling(d.values.scale);
37         if(parent)
38                 d.world_matrix = parent->get_world_matrix()*d.local_matrix;
39         else
40                 d.world_matrix = d.local_matrix;
41 }
42
43 } // namespace Msp::Game