+#ifndef MSP_GAME_TRANSFORM_H_
+#define MSP_GAME_TRANSFORM_H_
+
+#include <msp/geometry/quaternion.h>
+#include <msp/linal/matrix.h>
+#include <msp/linal/vector.h>
+#include "component.h"
+
+namespace Msp::Game {
+
+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 };
+};
+
+class Transform: public Component
+{
+private:
+ TransformValues values;
+ LinAl::Matrix<float, 4, 4> local_matrix;
+ LinAl::Matrix<float, 4, 4> world_matrix;
+
+public:
+ Transform(Handle<Entity>);
+
+ void set_values(const TransformValues &);
+ 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; }
+
+ void update_world_matrix(const Transform *);
+};
+
+} // namespace Msp::Game
+
+#endif