diff --git a/Src/Client/Abstract.hpp b/Src/Client/Abstract.hpp index 3063f76..a2f7a36 100644 --- a/Src/Client/Abstract.hpp +++ b/Src/Client/Abstract.hpp @@ -85,10 +85,6 @@ struct World { }; -struct DefVoxelInfo { - -}; - struct DefWorldInfo { }; @@ -153,7 +149,7 @@ public: } Binary; struct { - std::unordered_map DefVoxel; + std::unordered_map DefVoxel; std::unordered_map DefNode; std::unordered_map DefWorld; std::unordered_map DefPortal; diff --git a/Src/Client/ServerSession.cpp b/Src/Client/ServerSession.cpp index b360779..24320a0 100644 --- a/Src/Client/ServerSession.cpp +++ b/Src/Client/ServerSession.cpp @@ -50,11 +50,21 @@ struct PP_Content_RegionRemove : public ParsedPacket { {} }; -struct PP_Definition_FreeNode : public ParsedPacket { - DefNodeId_t Id; +struct PP_Definition_Voxel : public ParsedPacket { + DefVoxelId_t Id; + DefVoxel_t Def; - PP_Definition_FreeNode(DefNodeId_t id) - : ParsedPacket(ToClient::L1::Definition, (uint8_t) ToClient::L2Definition::Node), + PP_Definition_Voxel(DefVoxelId_t id, DefVoxel_t def) + : ParsedPacket(ToClient::L1::Definition, (uint8_t) ToClient::L2Definition::Voxel), + Id(id), Def(def) + {} +}; + +struct PP_Definition_FreeVoxel : public ParsedPacket { + DefVoxelId_t Id; + + PP_Definition_FreeVoxel(DefVoxelId_t id) + : ParsedPacket(ToClient::L1::Definition, (uint8_t) ToClient::L2Definition::FreeVoxel), Id(id) {} }; @@ -69,6 +79,15 @@ struct PP_Definition_Node : public ParsedPacket { {} }; +struct PP_Definition_FreeNode : public ParsedPacket { + DefNodeId_t Id; + + PP_Definition_FreeNode(DefNodeId_t id) + : ParsedPacket(ToClient::L1::Definition, (uint8_t) ToClient::L2Definition::FreeNode), + Id(id) + {} +}; + struct PP_Resource_InitResSend : public ParsedPacket { Hash_t Hash; BinaryResource Resource; @@ -327,16 +346,33 @@ void ServerSession::atFreeDrawTime(GlobalTime gTime, float dTime) { } else if(pack->Level1 == ToClient::L1::Definition) { ToClient::L2Definition l2 = ToClient::L2Definition(pack->Level2); - if(l2 == ToClient::L2Definition::Node) { + + if(l2 == ToClient::L2Definition::Voxel) { + PP_Definition_Voxel &p = *dynamic_cast(pack); + Registry.DefVoxel[p.Id] = p.Def; + onContentDefinesAdd[EnumDefContent::Voxel].push_back(p.Id); + } else if(l2 == ToClient::L2Definition::FreeVoxel) { + PP_Definition_FreeVoxel &p = *dynamic_cast(pack); + { + auto iter = Registry.DefVoxel.find(p.Id); + if(iter != Registry.DefVoxel.end()) + Registry.DefVoxel.erase(iter); + } + onContentDefinesLost[EnumDefContent::Voxel].push_back(p.Id); + } else if(l2 == ToClient::L2Definition::Node) { PP_Definition_Node &p = *dynamic_cast(pack); Registry.DefNode[p.Id] = p.Def; onContentDefinesAdd[EnumDefContent::Node].push_back(p.Id); } else if(l2 == ToClient::L2Definition::FreeNode) { PP_Definition_FreeNode &p = *dynamic_cast(pack); + { + auto iter = Registry.DefNode.find(p.Id); + if(iter != Registry.DefNode.end()) + Registry.DefNode.erase(iter); + } onContentDefinesLost[EnumDefContent::Node].push_back(p.Id); } - } else if(pack->Level1 == ToClient::L1::Content) { ToClient::L2Content l2 = ToClient::L2Content(pack->Level2); if(l2 == ToClient::L2Content::ChunkVoxels) { diff --git a/Src/Client/Vulkan/VulkanRenderSession.hpp b/Src/Client/Vulkan/VulkanRenderSession.hpp index cf26769..6084ea3 100644 --- a/Src/Client/Vulkan/VulkanRenderSession.hpp +++ b/Src/Client/Vulkan/VulkanRenderSession.hpp @@ -106,7 +106,7 @@ class VulkanRenderSession : public IRenderSession, public IVulkanDependent { // Для отрисовки вокселей std::shared_ptr VoxelShaderVertex, VoxelShaderGeometry, VoxelShaderFragmentOpaque, VoxelShaderFragmentTransparent; - VkPipeline + VkPipeline VoxelOpaquePipeline = VK_NULL_HANDLE, // Альфа канал может быть либо 255, либо 0 VoxelTransparentPipeline = VK_NULL_HANDLE; // Допускается полупрозрачность и смешивание