]> git.tdb.fi Git - libs/game.git/blobdiff - source/game/transform.h
Decorate things which constitute the public API of the library
[libs/game.git] / source / game / transform.h
index 603076024adbdd27c2aa659cd5c805c320fa0d51..fc63f29d4dbfa0d082bfa014269c78e20797a0bb 100644 (file)
@@ -5,6 +5,7 @@
 #include <msp/linal/matrix.h>
 #include <msp/linal/vector.h>
 #include "component.h"
+#include "mspgame_api.h"
 
 namespace Msp::Game {
 
@@ -13,15 +14,24 @@ struct TransformValues
        LinAl::Vector<float, 3> position;
        Geometry::Quaternion<float> rotation = Geometry::Quaternion<float>::one();
        LinAl::Vector<float, 3> scale = { 1.0f, 1.0f, 1.0f };
+
+       TransformValues() = default;
+       TransformValues(const LinAl::Vector<float, 3> &p): position(p) { }
+       TransformValues(const LinAl::Vector<float, 3> &p, const Geometry::Quaternion<float> &r,
+               const LinAl::Vector<float, 3> &s = LinAl::Vector<float, 3>(1.0f, 1.0f, 1.0f)):
+               position(p), rotation(r), scale(s)
+       { }
 };
 
-class Transform: public Component
+struct TransformData
 {
-private:
        TransformValues values;
-       LinAl::Matrix<float, 4, 4> local_matrix;
-       LinAl::Matrix<float, 4, 4> world_matrix;
+       LinAl::Matrix<float, 4, 4> local_matrix = LinAl::Matrix<float, 4, 4>::identity();
+       LinAl::Matrix<float, 4, 4> world_matrix = LinAl::Matrix<float, 4, 4>::identity();
+};
 
+class MSPGAME_API Transform: public BufferedComponent<TransformData>
+{
 public:
        Transform(Handle<Entity>);
 
@@ -29,11 +39,11 @@ public:
        void set_position(const LinAl::Vector<float, 3> &);
        void set_rotation(const Geometry::Quaternion<float> &);
        void set_scale(const LinAl::Vector<float, 3> &);
-       const TransformValues &get_values() const { return values; }
-       const LinAl::Vector<float, 3> &get_position() const { return values.position; }
-       const Geometry::Quaternion<float> &get_rotation() const { return values.rotation; }
-       const LinAl::Vector<float, 3> &get_scale() const { return values.scale; }
-       const LinAl::Matrix<float, 4, 4> &get_world_matrix() const { return world_matrix; }
+       const TransformValues &get_values() const { return read().values; }
+       const LinAl::Vector<float, 3> &get_position() const { return read().values.position; }
+       const Geometry::Quaternion<float> &get_rotation() const { return read().values.rotation; }
+       const LinAl::Vector<float, 3> &get_scale() const { return read().values.scale; }
+       const LinAl::Matrix<float, 4, 4> &get_world_matrix() const { return read().world_matrix; }
 
        void update_world_matrix(const Transform *);
 };