From 7cdb3c636f7a3f69ad4badbf36cccf970d747690 Mon Sep 17 00:00:00 2001 From: Shu Date: Mon, 12 Oct 2020 10:18:24 +0200 Subject: [PATCH] Vk LodModel --- src/client/Client.cpp | 5 +++-- src/client/contouring/FlatDualMC.cpp | 7 +++++++ src/client/render/vk/CommandCenter.cpp | 1 + src/client/render/vk/CommandCenter.hpp | 2 +- src/client/render/vk/Renderer.cpp | 5 +++-- src/client/render/vk/api/Buffers.cpp | 2 +- src/client/render/vk/api/Buffers.hpp | 1 + src/client/render/vk/api/Models.cpp | 15 +++++++++++++++ src/client/render/vk/api/Models.hpp | 23 ++++++++++++----------- 9 files changed, 44 insertions(+), 17 deletions(-) diff --git a/src/client/Client.cpp b/src/client/Client.cpp index 6f52055..860798a 100644 --- a/src/client/Client.cpp +++ b/src/client/Client.cpp @@ -178,9 +178,10 @@ void Client::run(server_handle* const localHandle) { window.waitTargetFPS(); } while (!(inputs.isDown(Input::Quit) || window.shouldClose())); + options.contouring = state.contouring->getOptions(); + world.reset(); + render::UI::Unload(); render::Renderer::Unload(); window.destroy(); - - options.contouring = state.contouring->getOptions(); } \ No newline at end of file diff --git a/src/client/contouring/FlatDualMC.cpp b/src/client/contouring/FlatDualMC.cpp index 63b3e43..13ce463 100644 --- a/src/client/contouring/FlatDualMC.cpp +++ b/src/client/contouring/FlatDualMC.cpp @@ -64,6 +64,13 @@ namespace contouring { if (worker.joinable()) worker.join(); } + + //TODO: prefer unique_ptr + for(auto& buffer: buffers) { + for(auto& val: buffer.second.second) { + delete val.second; + } + } } std::string FlatDualMC::getOptions() const { diff --git a/src/client/render/vk/CommandCenter.cpp b/src/client/render/vk/CommandCenter.cpp index 21b0beb..fb773d5 100644 --- a/src/client/render/vk/CommandCenter.cpp +++ b/src/client/render/vk/CommandCenter.cpp @@ -271,6 +271,7 @@ void CommandCenter::recordModel(uint32_t i) { vkCmdDrawIndexed(graphicsBuffers[i], static_cast(buffer::vk::indices.size()), 1, 0, 0, 0); } void CommandCenter::startEntityPass(uint32_t) { } +void CommandCenter::recordIndicator(uint32_t, glm::mat4) { } void CommandCenter::recordPostprocess(uint32_t idx, const Subpass& skyPass, bool skybox, glm::mat4, glm::mat4) { vkCmdNextSubpass(graphicsBuffers[idx], VK_SUBPASS_CONTENTS_INLINE); if (skybox) { diff --git a/src/client/render/vk/CommandCenter.hpp b/src/client/render/vk/CommandCenter.hpp index 73889c5..ab02c9c 100644 --- a/src/client/render/vk/CommandCenter.hpp +++ b/src/client/render/vk/CommandCenter.hpp @@ -21,7 +21,7 @@ public: void startWorldPass(uint32_t idx, const Subpass&); void recordModel(uint32_t idx); void startEntityPass(uint32_t idx); - //void recordModel(uint32_t idx); + void recordIndicator(uint32_t idx, glm::mat4 model); void recordPostprocess(uint32_t idx, const Subpass&, bool skybox, glm::mat4 view, glm::mat4 proj); void submitGraphics(uint32_t, VkSemaphore, VkSemaphore, VkFence); diff --git a/src/client/render/vk/Renderer.cpp b/src/client/render/vk/Renderer.cpp index 0bd5826..894e02d 100644 --- a/src/client/render/vk/Renderer.cpp +++ b/src/client/render/vk/Renderer.cpp @@ -398,6 +398,7 @@ bool Renderer::Load(Window& window, const renderOptions& opt, int samples) { } sInstance = new Renderer(instance, device, physicalInfo, opt); + LodModel::MakeDefault(); return true; } @@ -438,10 +439,10 @@ std::function &)> Rend }; } -size_t Renderer::drawIndicatorCube(glm::mat4) { +size_t Renderer::drawIndicatorCube(glm::mat4 model) { assert(currentImage < swapChain->getImageViews().size()); - //commandCenter->drawIndicator(model); + commandCenter->recordIndicator(currentImage, model); return 0; } diff --git a/src/client/render/vk/api/Buffers.cpp b/src/client/render/vk/api/Buffers.cpp index dc46277..5d964e5 100644 --- a/src/client/render/vk/api/Buffers.cpp +++ b/src/client/render/vk/api/Buffers.cpp @@ -49,7 +49,7 @@ memory::ptr render::vk::createBuffer(VkDeviceSize size, VkBufferUsageFlags usage } return memory; } -memory::ptr createBuffers(const std::vector& requirements, VkMemoryPropertyFlags properties, std::vector& out) { +memory::ptr render::vk::createBuffers(const std::vector& requirements, VkMemoryPropertyFlags properties, std::vector& out) { assert(!requirements.empty()); out.resize(requirements.size()+1); diff --git a/src/client/render/vk/api/Buffers.hpp b/src/client/render/vk/api/Buffers.hpp index 1dfb513..59f091e 100644 --- a/src/client/render/vk/api/Buffers.hpp +++ b/src/client/render/vk/api/Buffers.hpp @@ -89,4 +89,5 @@ private: }; memory::ptr createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, const render::data_view view, Buffer::info &out); +memory::ptr createBuffers(const std::vector &requirements, VkMemoryPropertyFlags properties, std::vector &out); } \ No newline at end of file diff --git a/src/client/render/vk/api/Models.cpp b/src/client/render/vk/api/Models.cpp index b33b2a0..e2bd8bf 100644 --- a/src/client/render/vk/api/Models.cpp +++ b/src/client/render/vk/api/Models.cpp @@ -7,4 +7,19 @@ std::unique_ptr Shape::Create(const std::vector& vertices) { data_view view(vertices); auto mem = createBuffer(view.size, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, view, tmp); return std::unique_ptr(new Shape(tmp.ref, std::move(mem), vertices.size())); +} + +std::unique_ptr LodModel::Create(const LodData& data) { + std::vector tmp; + data_view vertices(data.first.vertices); + data_view indices(data.first.indices); + auto mem = createBuffers({{vertices.size, Usage::VERTEX, vertices}, {indices.size, Usage::INDEX, indices}}, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, tmp); + return std::unique_ptr(new LodModel(data.first.indices.size(), data.second, tmp.at(0).ref, tmp.at(1).ref, std::move(mem))); +} + +std::unique_ptr createLodModelVk(const LodModel::LodData& data) { + return LodModel::Create(data); +} +void LodModel::MakeDefault() { + render::LodModel::createFunc = createLodModelVk; } \ No newline at end of file diff --git a/src/client/render/vk/api/Models.hpp b/src/client/render/vk/api/Models.hpp index e792802..79ae695 100644 --- a/src/client/render/vk/api/Models.hpp +++ b/src/client/render/vk/api/Models.hpp @@ -62,20 +62,21 @@ private: size_t indexSize; GLuint vertexBufferId; GLuint indexBufferId; -}; -class LodModel final: public render::LodModel { +};*/ +class LodModel final: public render::LodModel, public ShortIndexedVertexBuffer { public: - LodModel(const LodData&); - ~LodModel(); + static std::unique_ptr Create(const LodData&); static void MakeDefault(); - size_t draw(); - size_t drawInstanced(size_t count); - -private: - GLuint vertexBufferId; - GLuint indexBufferId; -};*/ +protected: + LodModel(size_t size, const std::vector& off, + VkBuffer vertex, VkBuffer index, memory::ptr mem): + ShortIndexedVertexBuffer(vertex, index, std::move(mem)) + { + indexSize = size; + offsets = off; + } +}; } \ No newline at end of file