From f55a598199837ab93321c25ed74f3e81f3078549 Mon Sep 17 00:00:00 2001 From: DrSocalkwe3n Date: Thu, 11 Sep 2025 09:37:47 +0600 Subject: [PATCH] * --- Src/Client/Vulkan/Abstract.hpp | 2 +- Src/Client/Vulkan/VulkanRenderSession.cpp | 60 ++++++++-------- Src/Client/Vulkan/VulkanRenderSession.hpp | 83 ++++++++++++++++------- Src/Common/Abstract.cpp | 4 +- assets/shaders/chunk/node.vert | 8 +-- 5 files changed, 96 insertions(+), 61 deletions(-) diff --git a/Src/Client/Vulkan/Abstract.hpp b/Src/Client/Vulkan/Abstract.hpp index e753a21..906851b 100644 --- a/Src/Client/Vulkan/Abstract.hpp +++ b/Src/Client/Vulkan/Abstract.hpp @@ -35,7 +35,7 @@ struct VoxelVertexPoint { struct NodeVertexStatic { uint32_t - FX : 9, FY : 9, FZ : 9, // Позиция -15 -120 ~ 240 360 +15 / 16 + FX : 9, FY : 9, FZ : 9, // Позиция -224 ~ 288; 64 позиций в одной ноде, 7.5 метров в ряд N1 : 4, // Не занято LS : 1, // Масштаб карты освещения (1м/16 или 1м) Tex : 18, // Текстура diff --git a/Src/Client/Vulkan/VulkanRenderSession.cpp b/Src/Client/Vulkan/VulkanRenderSession.cpp index 7ff0147..9e83680 100644 --- a/Src/Client/Vulkan/VulkanRenderSession.cpp +++ b/Src/Client/Vulkan/VulkanRenderSession.cpp @@ -332,9 +332,9 @@ void ChunkMeshGenerator::run(uint8_t id) { // Рендерим обычный кубоид if(!(fullCovered & 0b000100)) { - v.FX = 135+x*16; - v.FY = 135+y*16+16; - v.FZ = 135+z*16+16; + v.FX = 224+x*16; + v.FY = 224+y*16+16; + v.FZ = 224+z*16+16; v.TU = 0; v.TV = 0; result.NodeVertexs.push_back(v); @@ -347,8 +347,8 @@ void ChunkMeshGenerator::run(uint8_t id) { v.TV = 65535; result.NodeVertexs.push_back(v); - v.FX = 135+x*16; - v.FZ = 135+z*16+16; + v.FX = 224+x*16; + v.FZ = 224+z*16+16; v.TU = 0; v.TV = 0; result.NodeVertexs.push_back(v); @@ -365,9 +365,9 @@ void ChunkMeshGenerator::run(uint8_t id) { } if(!(fullCovered & 0b001000)) { - v.FX = 135+x*16; - v.FY = 135+y*16; - v.FZ = 135+z*16+16; + v.FX = 224+x*16; + v.FY = 224+y*16; + v.FZ = 224+z*16+16; v.TU = 0; v.TV = 0; result.NodeVertexs.push_back(v); @@ -380,8 +380,8 @@ void ChunkMeshGenerator::run(uint8_t id) { v.TU = 65535; result.NodeVertexs.push_back(v); - v.FX = 135+x*16; - v.FZ = 135+z*16+16; + v.FX = 224+x*16; + v.FZ = 224+z*16+16; v.TU = 0; v.TV = 0; result.NodeVertexs.push_back(v); @@ -398,9 +398,9 @@ void ChunkMeshGenerator::run(uint8_t id) { } if(!(fullCovered & 0b000001)) { - v.FX = 135+x*16+16; - v.FY = 135+y*16; - v.FZ = 135+z*16+16; + v.FX = 224+x*16+16; + v.FY = 224+y*16; + v.FZ = 224+z*16+16; v.TU = 0; v.TV = 0; result.NodeVertexs.push_back(v); @@ -413,8 +413,8 @@ void ChunkMeshGenerator::run(uint8_t id) { v.TU = 65535; result.NodeVertexs.push_back(v); - v.FY = 135+y*16; - v.FZ = 135+z*16+16; + v.FY = 224+y*16; + v.FZ = 224+z*16+16; v.TU = 0; v.TV = 0; result.NodeVertexs.push_back(v); @@ -431,9 +431,9 @@ void ChunkMeshGenerator::run(uint8_t id) { } if(!(fullCovered & 0b000010)) { - v.FX = 135+x*16; - v.FY = 135+y*16; - v.FZ = 135+z*16+16; + v.FX = 224+x*16; + v.FY = 224+y*16; + v.FZ = 224+z*16+16; v.TU = 0; v.TV = 0; result.NodeVertexs.push_back(v); @@ -446,8 +446,8 @@ void ChunkMeshGenerator::run(uint8_t id) { v.TV = 65535; result.NodeVertexs.push_back(v); - v.FY = 135+y*16; - v.FZ = 135+z*16+16; + v.FY = 224+y*16; + v.FZ = 224+z*16+16; v.TU = 0; v.TV = 0; result.NodeVertexs.push_back(v); @@ -464,9 +464,9 @@ void ChunkMeshGenerator::run(uint8_t id) { } if(!(fullCovered & 0b010000)) { - v.FX = 135+x*16; - v.FY = 135+y*16; - v.FZ = 135+z*16+16; + v.FX = 224+x*16; + v.FY = 224+y*16; + v.FZ = 224+z*16+16; v.TU = 0; v.TV = 0; result.NodeVertexs.push_back(v); @@ -479,8 +479,8 @@ void ChunkMeshGenerator::run(uint8_t id) { v.TV = 65535; result.NodeVertexs.push_back(v); - v.FX = 135+x*16; - v.FY = 135+y*16; + v.FX = 224+x*16; + v.FY = 224+y*16; v.TU = 0; v.TV = 0; result.NodeVertexs.push_back(v); @@ -497,9 +497,9 @@ void ChunkMeshGenerator::run(uint8_t id) { } if(!(fullCovered & 0b100000)) { - v.FX = 135+x*16; - v.FY = 135+y*16; - v.FZ = 135+z*16; + v.FX = 224+x*16; + v.FY = 224+y*16; + v.FZ = 224+z*16; v.TU = 0; v.TV = 0; result.NodeVertexs.push_back(v); @@ -512,8 +512,8 @@ void ChunkMeshGenerator::run(uint8_t id) { v.TU = 65535; result.NodeVertexs.push_back(v); - v.FX = 135+x*16; - v.FY = 135+y*16; + v.FX = 224+x*16; + v.FY = 224+y*16; v.TU = 0; v.TV = 0; result.NodeVertexs.push_back(v); diff --git a/Src/Client/Vulkan/VulkanRenderSession.hpp b/Src/Client/Vulkan/VulkanRenderSession.hpp index 2595099..1515f1b 100644 --- a/Src/Client/Vulkan/VulkanRenderSession.hpp +++ b/Src/Client/Vulkan/VulkanRenderSession.hpp @@ -53,6 +53,9 @@ struct WorldPCO { static_assert(sizeof(WorldPCO) == 128); +/* + Хранит модели и предоставляет их конечные варианты +*/ class ModelProvider { struct Model { // В вершинах текущей модели TexId ссылается на локальный текстурный ключ @@ -77,28 +80,23 @@ class ModelProvider { std::vector DownUse; // Для постройки зависимостей bool Ready = false; - - // Если модель использовалась для рендера нод, то для неё надо переформировать вершины - // std::optional> NodeVertecies; }; public: // Предкомпилирует модель Model getModel(ResourceId id) { - auto lock = Models.lock(); std::vector used; - return getModelSynced(*lock, id, used); + return getModel(id, used); } // Применяет изменения, возвращая все затронутые модели - std::vector onModelChanges(std::vector> newOrChanged, std::vector lost) { - auto lock = Models.lock(); - std::vector result; + std::vector onModelChanges(std::vector> newOrChanged, std::vector lost) { + std::vector result; std::move_only_function makeUnready; makeUnready = [&](ResourceId id) { - auto iterModel = lock->find(id); - if(iterModel == lock->end()) + auto iterModel = Models.find(id); + if(iterModel == Models.end()) return; if(!iterModel->second.Ready) @@ -107,8 +105,8 @@ public: result.push_back(id); for(ResourceId downId : iterModel->second.DownUse) { - auto iterModel = lock->find(downId); - if(iterModel == lock->end()) + auto iterModel = Models.find(downId); + if(iterModel == Models.end()) return; auto iter = std::find(iterModel->second.UpUse.begin(), iterModel->second.UpUse.end(), id); @@ -130,11 +128,11 @@ public: } for(ResourceId lostId : lost) { - auto iterModel = lock->find(lostId); - if(iterModel == lock->end()) + auto iterModel = Models.find(lostId); + if(iterModel == Models.end()) continue; - lock->erase(iterModel); + Models.erase(iterModel); } for(const auto& [key, resource] : newOrChanged) { @@ -250,7 +248,7 @@ public: LOG.warn() << "Не удалось распарсить модель " << type << ":\n\t" << exc.what(); } - lock->insert({key, std::move(model)}); + Models.insert({key, std::move(model)}); } std::sort(result.begin(), result.end()); @@ -262,12 +260,12 @@ public: private: Logger LOG = "Client>ModelProvider"; // Таблица моделей - TOS::SpinlockObject> Models; + std::unordered_map Models; uint64_t UniqId = 0; - Model getModelSynced(std::unordered_map& models, ResourceId id, std::vector& used) { - auto iterModel = models.find(id); - if(iterModel == models.end()) { + Model getModel(ResourceId id, std::vector& used) { + auto iterModel = Models.find(id); + if(iterModel == Models.end()) { // Нет такой модели, ну и хрен с ним return {}; } @@ -285,8 +283,8 @@ private: // Отмечаемся в зависимостях for(ResourceId subId : deps) { - auto iterModel = models.find(subId); - if(iterModel == models.end()) + auto iterModel = Models.find(subId); + if(iterModel == Models.end()) continue; iterModel->second.UpUse.push_back(id); @@ -305,7 +303,7 @@ private: continue; } - Model model = getModelSynced(models, id, used); + Model model = getModel(id, used); for(auto& [face, vertecies] : model.Vertecies) trans.apply(vertecies); @@ -364,8 +362,45 @@ private: } }; -class ModelProviderForChunkMeshGeneretaor { +/* + Хранит информацию о моделях при различных состояниях нод +*/ +class NodestateProvider { public: + struct Model { + // В вершинах текущей модели TexId ссылается на локальный текстурный ключ + // 0 -> default_texture -> luavox:grass.png + std::vector TextureKeys; + // Привязка локальных ключей к глобальным + std::unordered_map TextureMap; + // Вершины со всеми применёнными трансформациями, с CullFace + std::unordered_map> Vertecies; + }; + +public: + NodestateProvider(ModelProvider& mp) + : MP(mp) + {} + + // Применяет изменения, возвращает изменённые описания состояний + std::vector onNodestateChanges(std::vector> newOrChanged, std::vector lost, std::vector changedModels) { + std::vector result; + + + + + return result; + } + + std::vector getModelsForNode(DefNodeId id, uint8_t meta) { + + } + +private: + Logger LOG = "Client>NodestateProvider"; + ModelProvider& MP; + + }; diff --git a/Src/Common/Abstract.cpp b/Src/Common/Abstract.cpp index 2bbf2dd..3993b7f 100644 --- a/Src/Common/Abstract.cpp +++ b/Src/Common/Abstract.cpp @@ -1844,7 +1844,7 @@ PreparedModel::PreparedModel(const std::u8string& data) { for(int iter = 0; iter < 3; iter++) lr >> cuboid.To[iter]; - uint16_t facesSize; + uint8_t facesSize; lr >> facesSize; cuboid.Faces.reserve(facesSize); @@ -1867,7 +1867,7 @@ PreparedModel::PreparedModel(const std::u8string& data) { cuboid.Faces.insert({(EnumFace) type, face}); } - uint16_t transformationsSize; + uint8_t transformationsSize; lr >> transformationsSize; cuboid.Trs.OPs.reserve(transformationsSize); diff --git a/assets/shaders/chunk/node.vert b/assets/shaders/chunk/node.vert index d75b827..21927e2 100644 --- a/assets/shaders/chunk/node.vert +++ b/assets/shaders/chunk/node.vert @@ -16,7 +16,7 @@ layout(push_constant) uniform UniformBufferObject { // struct NodeVertexStatic { // uint32_t -// FX : 9, FY : 9, FZ : 9, // Позиция 15 -120 ~ 240 360 15 / 16 +// FX : 9, FY : 9, FZ : 9, // Позиция -224 ~ 288; 64 позиций в одной ноде, 7.5 метров в ряд // N1 : 4, // Не занято // LS : 1, // Масштаб карты освещения (1м/16 или 1м) // Tex : 18, // Текстура @@ -27,9 +27,9 @@ layout(push_constant) uniform UniformBufferObject { void main() { vec4 baseVec = ubo.model*vec4( - float(Vertex.x & 0x1ff) / 16.f - 135/16.f, - float((Vertex.x >> 9) & 0x1ff) / 16.f - 135/16.f, - float((Vertex.x >> 18) & 0x1ff) / 16.f - 135/16.f, + float(Vertex.x & 0x1ff) / 64.f - 3.5f, + float((Vertex.x >> 9) & 0x1ff) / 64.f - 3.5f, + float((Vertex.x >> 18) & 0x1ff) / 64.f - 3.5f, 1 );