]> git.tdb.fi Git - libs/game.git/blob - source/game/transform.h
Decorate things which constitute the public API of the library
[libs/game.git] / source / game / transform.h
1 #ifndef MSP_GAME_TRANSFORM_H_
2 #define MSP_GAME_TRANSFORM_H_
3
4 #include <msp/geometry/quaternion.h>
5 #include <msp/linal/matrix.h>
6 #include <msp/linal/vector.h>
7 #include "component.h"
8 #include "mspgame_api.h"
9
10 namespace Msp::Game {
11
12 struct TransformValues
13 {
14         LinAl::Vector<float, 3> position;
15         Geometry::Quaternion<float> rotation = Geometry::Quaternion<float>::one();
16         LinAl::Vector<float, 3> scale = { 1.0f, 1.0f, 1.0f };
17
18         TransformValues() = default;
19         TransformValues(const LinAl::Vector<float, 3> &p): position(p) { }
20         TransformValues(const LinAl::Vector<float, 3> &p, const Geometry::Quaternion<float> &r,
21                 const LinAl::Vector<float, 3> &s = LinAl::Vector<float, 3>(1.0f, 1.0f, 1.0f)):
22                 position(p), rotation(r), scale(s)
23         { }
24 };
25
26 struct TransformData
27 {
28         TransformValues values;
29         LinAl::Matrix<float, 4, 4> local_matrix = LinAl::Matrix<float, 4, 4>::identity();
30         LinAl::Matrix<float, 4, 4> world_matrix = LinAl::Matrix<float, 4, 4>::identity();
31 };
32
33 class MSPGAME_API Transform: public BufferedComponent<TransformData>
34 {
35 public:
36         Transform(Handle<Entity>);
37
38         void set_values(const TransformValues &);
39         void set_position(const LinAl::Vector<float, 3> &);
40         void set_rotation(const Geometry::Quaternion<float> &);
41         void set_scale(const LinAl::Vector<float, 3> &);
42         const TransformValues &get_values() const { return read().values; }
43         const LinAl::Vector<float, 3> &get_position() const { return read().values.position; }
44         const Geometry::Quaternion<float> &get_rotation() const { return read().values.rotation; }
45         const LinAl::Vector<float, 3> &get_scale() const { return read().values.scale; }
46         const LinAl::Matrix<float, 4, 4> &get_world_matrix() const { return read().world_matrix; }
47
48         void update_world_matrix(const Transform *);
49 };
50
51 } // namespace Msp::Game
52
53 #endif