X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fmodel%2FCompositeModel.cpp;fp=src%2Fmodel%2FCompositeModel.cpp;h=d5b25af461fa34a2f6bdc63edd7592cad08929bb;hb=d02daa5a4805dc3184884f3a7cd7620e5787adcb;hp=0000000000000000000000000000000000000000;hpb=5cd73a8f2b40e59ec13aa2a6af33bc8e2a6b9a6c;p=blank.git diff --git a/src/model/CompositeModel.cpp b/src/model/CompositeModel.cpp new file mode 100644 index 0000000..d5b25af --- /dev/null +++ b/src/model/CompositeModel.cpp @@ -0,0 +1,55 @@ +#include "CompositeModel.hpp" + +#include "EntityModel.hpp" +#include "../graphics/DirectionalLighting.hpp" + +#include + + +namespace blank { + +CompositeModel::CompositeModel() +: node_model(nullptr) +, position(0.0f) +, orientation(1.0f, 0.0f, 0.0f, 0.0f) +, parts() { + +} + + +CompositeModel &CompositeModel::AddPart() { + parts.emplace_back(); + parts.back().parent = this; + return parts.back(); +} + + +glm::mat4 CompositeModel::LocalTransform() const noexcept { + glm::mat4 transform(toMat4(orientation)); + transform[3].x = position.x; + transform[3].y = position.y; + transform[3].z = position.z; + return transform; +} + +glm::mat4 CompositeModel::GlobalTransform() const noexcept { + if (HasParent()) { + return Parent().GlobalTransform() * LocalTransform(); + } else { + return LocalTransform(); + } +} + + +void CompositeModel::Render(const glm::mat4 &M, DirectionalLighting &prog) const { + glm::mat4 transform(M * LocalTransform()); + if (HasNodeModel()) { + prog.SetM(transform); + NodeModel().Draw(); + } + for (const CompositeModel &part : parts) { + part.Render(transform, prog); + } +} + +}