#include <msp/linal/matrix.h>
#include <msp/linal/vector.h>
#include "component.h"
+#include "mspgame_api.h"
namespace Msp::Game {
{ }
};
-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>);
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 *);
};