X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fmodel%2Fcomposite.cpp;h=f43b7264a57ef60463fc600997a7d71a7ff34ac5;hb=8fdc24f0b3fb287f5d4e1c7d1f85ad85d5ed2414;hp=4cf2f12f2aef7be9607e4296754d5879f41acee5;hpb=2ea26d9ca5eaeae65daa0edbbaeada8c1f23670e;p=blank.git diff --git a/src/model/composite.cpp b/src/model/composite.cpp index 4cf2f12..f43b726 100644 --- a/src/model/composite.cpp +++ b/src/model/composite.cpp @@ -1,7 +1,9 @@ #include "CompositeModel.hpp" #include "CompositeInstance.hpp" +#include "Skeletons.hpp" #include "EntityModel.hpp" +#include "shapes.hpp" #include "../graphics/DirectionalLighting.hpp" #include @@ -10,7 +12,10 @@ namespace blank { CompositeModel::CompositeModel() -: node_model(nullptr) +: parent(nullptr) +, node_model(nullptr) +, id(0) +, bounds{{ 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }} , position(0.0f) , orientation(1.0f, 0.0f, 0.0f, 0.0f) , parts() { @@ -99,4 +104,97 @@ void CompositeInstance::Render(const glm::mat4 &M, DirectionalLighting &prog) co } } + +Skeletons::Skeletons() +: skeletons() +, models() { + +} + +Skeletons::~Skeletons() { + +} + +void Skeletons::LoadHeadless() { + skeletons.clear(); + skeletons.reserve(4); + { + AABB bounds{{ -0.5f, -0.5f, -0.5f }, { 0.5f, 0.5f, 0.5f }}; + skeletons.emplace_back(new CompositeModel); + skeletons[0]->ID(1); + skeletons[0]->Bounds(bounds); + } + { + AABB bounds{{ -0.5f, -0.25f, -0.5f }, { 0.5f, 0.25f, 0.5f }}; + skeletons.emplace_back(new CompositeModel); + skeletons[1]->ID(2); + skeletons[1]->Bounds(bounds); + } + { + AABB bounds{{ -0.25f, -0.5f, -0.25f }, { 0.25f, 0.5f, 0.25f }}; + skeletons.emplace_back(new CompositeModel); + skeletons[2]->ID(3); + skeletons[2]->Bounds(bounds); + } + { + AABB bounds{{ -0.25f, -0.5f, -0.35f }, { 0.25f, 0.5f, 0.35f }}; + skeletons.emplace_back(new CompositeModel); + skeletons[3]->ID(4); + skeletons[3]->Bounds(bounds); + } +} + +void Skeletons::Load() { + LoadHeadless(); + models.resize(4); + EntityModel::Buffer buf; + { + CuboidShape shape(skeletons[0]->Bounds()); + shape.Vertices(buf, 3.0f); + buf.colors.resize(shape.VertexCount(), { 1.0f, 1.0f, 0.0f }); + models[0].Update(buf); + skeletons[0]->SetNodeModel(&models[0]); + } + { + CuboidShape shape(skeletons[1]->Bounds()); + buf.Clear(); + shape.Vertices(buf, 0.0f); + buf.colors.resize(shape.VertexCount(), { 0.0f, 1.0f, 1.0f }); + models[1].Update(buf); + skeletons[1]->SetNodeModel(&models[1]); + } + { + StairShape shape(skeletons[2]->Bounds(), { 0.4f, 0.4f }); + buf.Clear(); + shape.Vertices(buf, 1.0f); + buf.colors.resize(shape.VertexCount(), { 1.0f, 0.0f, 1.0f }); + models[2].Update(buf); + skeletons[2]->SetNodeModel(&models[2]); + } + { + CuboidShape shape(skeletons[3]->Bounds()); + buf.Clear(); + shape.Vertices(buf, 2.0f); + buf.colors.resize(shape.VertexCount(), { 1.0f, 0.25f, 0.5f }); + models[3].Update(buf); + skeletons[3]->SetNodeModel(&models[3]); + } +} + +CompositeModel *Skeletons::ByID(std::uint16_t id) noexcept { + if (id == 0 || id > skeletons.size()) { + return nullptr; + } else { + return skeletons[id - 1].get(); + } +} + +const CompositeModel *Skeletons::ByID(std::uint16_t id) const noexcept { + if (id == 0 || id > skeletons.size()) { + return nullptr; + } else { + return skeletons[id - 1].get(); + } +} + }