ProtoTank/Engine/World/WorldObject.hpp

62 lines
2.0 KiB
C++

#pragma once
#include "../Utils/MeshHelper.hpp"
class WorldObject {
public:
virtual const Mesh& GetObjectMesh() const = 0;
virtual const size_t GetObjectVerticesCount() 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;
}
const M3D_BoundingBox& GetAABB() const noexcept { return aabb; }
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;
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 D>
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<const M3D_F3*>(GetObjectMesh().vertices.data()), sizeof(Vertex));
}
protected:
inline static Mesh mMesh;
};
#include "WorldObject.tpp"