#pragma once #include "../Utils/MeshHelper.hpp" class WorldObject { public: virtual ~WorldObject() = 0; virtual const Mesh& GetObjectMesh() const = 0; virtual const size_t GetObjectVerticesCount() const = 0; const M3D_MATRIX GetTransform() const 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() const noexcept { M3D_F4X4 out; M3D_V4StoreF4x4(&out, GetTransform()); return out; } const M3D_BoundingBox& GetAABB() const noexcept { return aabb; } //TODO: recompute AABB when changing these parameters 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; inline static M3D_BoundingBox aabb; 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; } const size_t GetObjectVerticesCount() const noexcept override { return mMesh.GetVerticesCount(); } void LoadMeshFromObjFile(std::string file); void UpdateAABBFromMesh() noexcept { M3D_BoundingBox::CreateFromPoints(aabb, GetObjectVerticesCount(), reinterpret_cast(GetObjectMesh().vertices.data()), sizeof(Vertex)); } protected: inline static Mesh mMesh; inline static bool isMeshLoaded = false; }; #include "WorldObject.tpp"