X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fmodel%2FCompositeModel.hpp;fp=src%2Fmodel%2FCompositeModel.hpp;h=b548a9c8485dbe20337f7e5af52959fbcee6ae3e;hb=d02daa5a4805dc3184884f3a7cd7620e5787adcb;hp=0000000000000000000000000000000000000000;hpb=5cd73a8f2b40e59ec13aa2a6af33bc8e2a6b9a6c;p=blank.git diff --git a/src/model/CompositeModel.hpp b/src/model/CompositeModel.hpp new file mode 100644 index 0000000..b548a9c --- /dev/null +++ b/src/model/CompositeModel.hpp @@ -0,0 +1,56 @@ +#ifndef BLANK_MODEL_COMPOSITEMODEL_HPP_ +#define BLANK_MODEL_COMPOSITEMODEL_HPP_ + +#include +#include +#include + + +namespace blank { + +class DirectionalLighting; +class EntityModel; + +class CompositeModel { + +public: + CompositeModel(); + + CompositeModel(const CompositeModel &) = delete; + CompositeModel &operator =(const CompositeModel &) = delete; + + 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 HasNodeModel() const noexcept { return node_model; } + void SetNodeModel(const EntityModel *m) noexcept { node_model = m; } + + const EntityModel &NodeModel() const noexcept { return *node_model; } + + CompositeModel &AddPart(); + bool HasParent() const noexcept { return parent; } + CompositeModel &Parent() const noexcept { return *parent; } + bool IsRoot() const noexcept { return !HasParent(); } + + glm::mat4 LocalTransform() const noexcept; + glm::mat4 GlobalTransform() const noexcept; + + void Render(const glm::mat4 &, DirectionalLighting &) const; + +private: + CompositeModel *parent; + const EntityModel *node_model; + + glm::vec3 position; + glm::quat orientation; + + std::list parts; + +}; + +} + +#endif