diff --git a/Src/Client/Vulkan/VulkanRenderSession.cpp b/Src/Client/Vulkan/VulkanRenderSession.cpp index 71dd985..b54bea8 100644 --- a/Src/Client/Vulkan/VulkanRenderSession.cpp +++ b/Src/Client/Vulkan/VulkanRenderSession.cpp @@ -497,7 +497,8 @@ void ChunkMeshGenerator::run(uint8_t id) { // Вычислить индексы и сократить вершины { - + std::vector indexes; + } } diff --git a/Src/Client/Vulkan/VulkanRenderSession.hpp b/Src/Client/Vulkan/VulkanRenderSession.hpp index 22ed016..2dc061a 100644 --- a/Src/Client/Vulkan/VulkanRenderSession.hpp +++ b/Src/Client/Vulkan/VulkanRenderSession.hpp @@ -72,7 +72,7 @@ struct ChunkMeshGenerator { // Вершины нод std::vector NodeVertexs; // Индексы - std::variant, std::vector> NodeIndicies; + std::variant, std::vector> NodeIndexes; }; // Очередь чанков на перерисовку @@ -164,7 +164,9 @@ public: : VkInst(vkInst), CMG(serverSession), VertexPool_Voxels(vkInst), - VertexPool_Nodes(vkInst) + VertexPool_Nodes(vkInst), + IndexPool_Nodes_16(vkInst), + IndexPool_Nodes_32(vkInst) { assert(vkInst); assert(serverSession); @@ -253,8 +255,9 @@ public: auto& chunk = iterRegion->second[iter]; if(chunk.VoxelPointer) VPV_ToFree[frameRetirement].emplace_back(std::move(chunk.VoxelPointer)); - if(chunk.NodePointer) - VPN_ToFree[frameRetirement].emplace_back(std::move(chunk.NodePointer)); + if(chunk.NodePointer) { + VPN_ToFree[frameRetirement].emplace_back(std::move(chunk.NodePointer), std::move(chunk.NodeIndexes)); + } } iterWorld->second.erase(iterRegion); @@ -305,8 +308,13 @@ public: VPV_ToFree[FrameRoulette].clear(); - for(auto pointer : VPN_ToFree[FrameRoulette]) { - VertexPool_Nodes.dropVertexs(pointer); + for(auto& pointer : VPN_ToFree[FrameRoulette]) { + VertexPool_Nodes.dropVertexs(std::get<0>(pointer)); + if(VertexPool::Pointer* ind = std::get_if::Pointer>(&std::get<1>(pointer))) { + IndexPool_Nodes_16.dropVertexs(*ind); + } else if(VertexPool::Pointer* ind = std::get_if::Pointer>(&std::get<1>(pointer))) { + IndexPool_Nodes_32.dropVertexs(*ind); + } } VPN_ToFree[FrameRoulette].clear(); @@ -330,12 +338,15 @@ private: // Буферы для хранения вершин VertexPool VertexPool_Voxels; VertexPool VertexPool_Nodes; + VertexPool IndexPool_Nodes_16; + VertexPool IndexPool_Nodes_32; struct ChunkObj_t { std::vector Voxels; VertexPool::Pointer VoxelPointer; std::vector Nodes; VertexPool::Pointer NodePointer; + std::variant::Pointer, VertexPool::Pointer> NodeIndexes; }; // Склад указателей на вершины чанков @@ -346,7 +357,10 @@ private: uint8_t FrameRoulette = 0; // Вершины, ожидающие удаления по прошествию какого-то количества кадров std::vector::Pointer> VPV_ToFree[FRAME_COUNT_RESOURCE_LATENCY]; - std::vector::Pointer> VPN_ToFree[FRAME_COUNT_RESOURCE_LATENCY]; + std::vector::Pointer, + std::variant::Pointer, VertexPool::Pointer> + >> VPN_ToFree[FRAME_COUNT_RESOURCE_LATENCY]; // Следующий идентификатор запроса uint32_t NextRequest = 0;