#pragma once #include "Math/Rotation.hpp" #include "World/Position.hpp" namespace MC { class Transform { public: Transform() : m_scale(1) {} explicit Transform(Position::World position) : m_position(position), m_scale(1) {} Transform(Position::World position, Rotation rotation, Vector<3> scale) : m_position(position), m_rotation(rotation), m_scale(scale) {} Vector<3> forward() const; Vector<3> right() const; Vector<3> up() const; Position::World& position() { return m_position; } const Position::World& position() const { return m_position; } Rotation& rotation() { return m_rotation; } const Rotation& rotation() const { return m_rotation; } Vector<3>& scale() { return m_scale; } const Vector<3>& scale() const { return m_scale; } private: Vector<3> unit_vector(Vector<3> axis) const; // TODO: Use a non-MC::World position class. // I don't want coupling between the game implementation // and what is essentially engine code. Position::World m_position; Rotation m_rotation; Vector<3> m_scale; }; }