X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmodel%2FModel.hpp;fp=src%2Fmodel%2FModel.hpp;h=118ac2e2004d723d0351c9a458a705006a562bcd;hb=eba29c8ad489194cd1e3cd64b5f23424ad4384ef;hp=0000000000000000000000000000000000000000;hpb=3542823a1af7f5063d7cc8da84efa248eb889b8a;p=blank.git diff --git a/src/model/Model.hpp b/src/model/Model.hpp new file mode 100644 index 0000000..118ac2e --- /dev/null +++ b/src/model/Model.hpp @@ -0,0 +1,69 @@ +#ifndef BLANK_MODEL_MODEL_HPP_ +#define BLANK_MODEL_MODEL_HPP_ + +#include "geometry.hpp" + +#include +#include +#include +#include + + +namespace blank { + +class Instance; +class EntityMesh; + +class Model { + +public: + Model(); + + Model(const Model &) = delete; + Model &operator =(const Model &) = delete; + + std::uint32_t ID() const noexcept { return id; } + void ID(std::uint32_t i) noexcept { id = i; } + + const AABB &Bounds() const noexcept { return bounds; } + void Bounds(const AABB &b) noexcept { bounds = b; } + + const glm::vec3 &Position() const noexcept { return position; } + void Position(const glm::vec3 &p) noexcept { position = p; } + + const glm::quat &Orientation() const noexcept { return orientation; } + void Orientation(const glm::quat &o) noexcept { orientation = o; } + + bool HasNodeMesh() const noexcept { return node_mesh; } + void SetNodeMesh(const EntityMesh *m) noexcept { node_mesh = m; } + + const EntityMesh &NodeMesh() const noexcept { return *node_mesh; } + + Model &AddPart(); + bool HasParent() const noexcept { return parent; } + Model &Parent() const noexcept { return *parent; } + bool IsRoot() const noexcept { return !HasParent(); } + + glm::mat4 LocalTransform() const noexcept; + glm::mat4 GlobalTransform() const noexcept; + + void Instantiate(Instance &) const; + +private: + Model *parent; + const EntityMesh *node_mesh; + + std::uint32_t id; + + AABB bounds; + + glm::vec3 position; + glm::quat orientation; + + std::list parts; + +}; + +} + +#endif