#pragma once #include "../Utils/MeshHelper.hpp" class WorldObject { public: virtual const Mesh& GetObjectMesh() const = 0; const M3D_MATRIX GetTransform() noexcept { M3D_MATRIX M = M3D_MIdentity(); M *= M3D_TransformMatrixScale(M3D_V4LoadF3(&scale)); M *= M3D_TransformMatrixRotation(M3D_V4LoadF3(&rot)); M *= M3D_TransformMatrixTranslate(M3D_V4LoadF3(&pos)); return M; } const M3D_F4X4 GetTransform4x4f() noexcept { M3D_F4X4 out; M3D_V4StoreF4x4(&out, GetTransform()); return out; } void SetPosition(M3D_F3& _pos) noexcept { pos = _pos; } void SetPosition(float _x, float _y, float _z) noexcept { pos = M3D_F3(_x, _y, _z); } void SetRotation(M3D_F3& _rot) noexcept { rot = _rot; } void SetRotation(float _x, float _y, float _z) noexcept { rot = M3D_F3(_x, _y, _z); } void SetScale(M3D_F3& _scale) noexcept { scale = _scale; } void SetScale(float _s) noexcept { scale = M3D_F3(_s, _s, _s); } void SetScale(float _x, float _y, float _z) noexcept { scale = M3D_F3(_x, _y, _z); } protected: WorldObject() = default; private: M3D_F3 scale = M3D_F3(1.0f, 1.0f, 1.0f); M3D_F3 rot = M3D_F3(0.0f, 0.0f, 0.0f); M3D_F3 pos = M3D_F3(0.0f, 0.0f, 0.0f); }; template class WorldObjectAbstract : virtual public WorldObject { public: virtual ~WorldObjectAbstract() = 0; const Mesh& GetObjectMesh() const noexcept override { return mMesh; } protected: inline static Mesh mMesh; }; template inline WorldObjectAbstract::~WorldObjectAbstract() {}