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 Transform: public BufferedComponent<TransformData>
+{
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 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 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 *);
};