diff --git a/Src/Client/Vulkan/Vulkan.cpp b/Src/Client/Vulkan/Vulkan.cpp index 91b9b27..8a753ec 100644 --- a/Src/Client/Vulkan/Vulkan.cpp +++ b/Src/Client/Vulkan/Vulkan.cpp @@ -584,6 +584,7 @@ void Vulkan::run() // vkAssert(!vkQueueWaitIdle(Graphics.DeviceQueueGraphic)); { + // Эту хрень надо убрать auto lockQueue = Graphics.DeviceQueueGraphic.lock(); vkDeviceWaitIdle(Graphics.Device); lockQueue.unlock(); diff --git a/Src/Client/Vulkan/VulkanRenderSession.cpp b/Src/Client/Vulkan/VulkanRenderSession.cpp index 89ff14c..5662fbe 100644 --- a/Src/Client/Vulkan/VulkanRenderSession.cpp +++ b/Src/Client/Vulkan/VulkanRenderSession.cpp @@ -1205,10 +1205,15 @@ void VulkanRenderSession::drawWorld(GlobalTime gTime, float dTime, VkCommandBuff Pos::GlobalChunk x64offset = X64Offset >> Pos::Object_t::BS_Bit >> 4; Pos::GlobalRegion x64offset_region = x64offset >> 2; - auto [voxelVertexs, nodeVertexs] = VKCTX->ThreadVertexObj.getChunksForRender(WorldId, Pos, 2, PCO.ProjView, x64offset_region); + auto [voxelVertexs, nodeVertexs] = VKCTX->ThreadVertexObj.getChunksForRender(WorldId, Pos, 1, PCO.ProjView, x64offset_region); + + size_t count = 0; + glm::mat4 orig = PCO.Model; for(auto& [chunkPos, vertexs, vertexCount] : nodeVertexs) { + count += vertexCount; + glm::vec3 cpos(chunkPos-x64offset); PCO.Model = glm::translate(orig, cpos*16.f); auto [vkBufferN, offset] = vertexs; @@ -1224,6 +1229,9 @@ void VulkanRenderSession::drawWorld(GlobalTime gTime, float dTime, VkCommandBuff vkCmdDraw(drawCmd, vertexCount, 1, offset, 0); } + TOS::Logger LOG = "VRS"; + LOG.debug() << "Node: drawCals: " << nodeVertexs.size() << " vertexs: " << count; + PCO.Model = orig; // auto iterWorld = External.ChunkVoxelMesh.find(WorldId); diff --git a/Src/Common/Abstract.hpp b/Src/Common/Abstract.hpp index 528a083..8bb5438 100644 --- a/Src/Common/Abstract.hpp +++ b/Src/Common/Abstract.hpp @@ -396,7 +396,7 @@ using ResourceId = uint32_t; Если объекты удаляются, то сторона клиента об этом не уведомляется */ enum class EnumAssets { - Nodestate, Patricle, Animation, Model, Texture, Sound, Font, MAX_ENUM + Nodestate, Particle, Animation, Model, Texture, Sound, Font, MAX_ENUM }; using AssetsNodestate = ResourceId; diff --git a/Src/Server/Abstract.cpp b/Src/Server/Abstract.cpp index 59dae1d..5cbf82b 100644 --- a/Src/Server/Abstract.cpp +++ b/Src/Server/Abstract.cpp @@ -1,4 +1,5 @@ #include "Abstract.hpp" +#include namespace LV::Server { @@ -249,7 +250,7 @@ NodeStateCondition nodestateExpression(const std::vector& entrie case EnumTokenKind::EQ: value = std::get(leftToken) == std::get(rightToken); break; case EnumTokenKind::NE: value = std::get(leftToken) != std::get(rightToken); break; - default: assert(false); + default: std::unreachable(); } @@ -273,7 +274,7 @@ NodeStateCondition nodestateExpression(const std::vector& entrie case EnumTokenKind::EQ: bin.op = Op::EQ; break; case EnumTokenKind::NE: bin.op = Op::NE; break; - default: assert(false); + default: std::unreachable(); } if(int* value = std::get_if(&leftToken)) { @@ -344,7 +345,7 @@ NodeStateCondition nodestateExpression(const std::vector& entrie case Op::Pos: return +rNodeValue; case Op::Neg: return -rNodeValue; default: - assert(false); + std::unreachable(); } } else if(const Node::Binary* value = std::get_if(&node.v)) { int lNodeValue = lambdaCalcNode(value->lhs); @@ -365,10 +366,10 @@ NodeStateCondition nodestateExpression(const std::vector& entrie case Op::And: return lNodeValue&&rNodeValue; case Op::Or: return lNodeValue||rNodeValue; default: - assert(false); + std::unreachable(); } } else { - assert(false); + std::unreachable(); } }; diff --git a/Src/Server/AssetsManager.cpp b/Src/Server/AssetsManager.cpp index 523d302..79f18eb 100644 --- a/Src/Server/AssetsManager.cpp +++ b/Src/Server/AssetsManager.cpp @@ -1,18 +1,144 @@ #include "AssetsManager.hpp" #include "Common/Abstract.hpp" +#include "png++/rgb_pixel.hpp" #include +#include +#include #include #include +#include namespace LV::Server { AssetsManager::Resource AssetsManager::loadResourceFromFile(EnumAssets type, fs::path path) const { - return AssetsManager::Resource(path); + switch(type) { + case EnumAssets::Nodestate: return loadResourceFromFile_Nodestate(path); + case EnumAssets::Particle: return loadResourceFromFile_Particle(path); + case EnumAssets::Animation: return loadResourceFromFile_Animation(path); + case EnumAssets::Model: return loadResourceFromFile_Model(path); + case EnumAssets::Texture: return loadResourceFromFile_Texture(path); + case EnumAssets::Sound: return loadResourceFromFile_Sound(path); + case EnumAssets::Font: return loadResourceFromFile_Font(path); + default: + std::unreachable(); + } } -AssetsManager::Resource AssetsManager::loadResourceFromLua(EnumAssets type, void*) const { - return AssetsManager::Resource("assets/null"); +AssetsManager::Resource AssetsManager::loadResourceFromLua(EnumAssets type, const sol::table& profile) const { + switch(type) { + case EnumAssets::Nodestate: return loadResourceFromLua_Nodestate(profile); + case EnumAssets::Particle: return loadResourceFromLua_Particle(profile); + case EnumAssets::Animation: return loadResourceFromLua_Animation(profile); + case EnumAssets::Model: return loadResourceFromLua_Model(profile); + case EnumAssets::Texture: return loadResourceFromLua_Texture(profile); + case EnumAssets::Sound: return loadResourceFromLua_Sound(profile); + case EnumAssets::Font: return loadResourceFromLua_Font(profile); + default: + std::unreachable(); + } +} + +AssetsManager::Resource AssetsManager::loadResourceFromFile_Nodestate(fs::path path) const { + std::unreachable(); +} + +AssetsManager::Resource AssetsManager::loadResourceFromFile_Particle(fs::path path) const { + std::unreachable(); +} + +AssetsManager::Resource AssetsManager::loadResourceFromFile_Animation(fs::path path) const { + std::unreachable(); +} + +AssetsManager::Resource AssetsManager::loadResourceFromFile_Model(fs::path path) const { + /* + json, obj, glTF + */ + std::unreachable(); +} + +AssetsManager::Resource AssetsManager::loadResourceFromFile_Texture(fs::path path) const { + Resource res(path); + + if(res.size() < 8) + MAKE_ERROR("Файл не является текстурой png или jpeg (недостаточный размер файла)"); + + if(png_check_sig(reinterpret_cast((unsigned char*) res.data()), 8)) { + // Это png + return res; + } else if((int) res.data()[0] == 0xFF && (int) res.data()[1] == 0xD8) { + // Это jpeg + return res; + } else { + MAKE_ERROR("Файл не является текстурой png или jpeg"); + } + + std::unreachable(); +} + +AssetsManager::Resource AssetsManager::loadResourceFromFile_Sound(fs::path path) const { + std::unreachable(); +} + +AssetsManager::Resource AssetsManager::loadResourceFromFile_Font(fs::path path) const { + std::unreachable(); +} + +AssetsManager::Resource AssetsManager::loadResourceFromLua_Nodestate(const sol::table& profile) const { + if(std::optional path = profile.get>("path")) { + return AssetsManager::Resource(*path); + } + + std::unreachable(); +} + +AssetsManager::Resource AssetsManager::loadResourceFromLua_Particle(const sol::table& profile) const { + if(std::optional path = profile.get>("path")) { + return AssetsManager::Resource(*path); + } + + std::unreachable(); +} + +AssetsManager::Resource AssetsManager::loadResourceFromLua_Animation(const sol::table& profile) const { + if(std::optional path = profile.get>("path")) { + return AssetsManager::Resource(*path); + } + + std::unreachable(); +} + +AssetsManager::Resource AssetsManager::loadResourceFromLua_Model(const sol::table& profile) const { + if(std::optional path = profile.get>("path")) { + return AssetsManager::Resource(*path); + } + + std::unreachable(); +} + +AssetsManager::Resource AssetsManager::loadResourceFromLua_Texture(const sol::table& profile) const { + if(std::optional path = profile.get>("path")) { + return AssetsManager::Resource(*path); + } + + std::unreachable(); +} + +AssetsManager::Resource AssetsManager::loadResourceFromLua_Sound(const sol::table& profile) const { + if(std::optional path = profile.get>("path")) { + return AssetsManager::Resource(*path); + } + + std::unreachable(); +} + +AssetsManager::Resource AssetsManager::loadResourceFromLua_Font(const sol::table& profile) const { + if(std::optional path = profile.get>("path")) { + return AssetsManager::Resource(*path); + } + + std::unreachable(); } AssetsManager::AssetsManager(asio::io_context& ioc) @@ -70,14 +196,14 @@ AssetsManager::Out_recheckResources AssetsManager::recheckResources(const Assets switch ((EnumAssets) type) { case EnumAssets::Nodestate: file /= "nodestate"; break; - case EnumAssets::Patricle: file /= "particle"; break; + case EnumAssets::Particle: file /= "particle"; break; case EnumAssets::Animation: file /= "animation"; break; case EnumAssets::Model: file /= "model"; break; case EnumAssets::Texture: file /= "texture"; break; case EnumAssets::Sound: file /= "sound"; break; case EnumAssets::Font: file /= "font"; break; default: - assert(false); + std::unreachable(); } file /= key; @@ -159,14 +285,14 @@ AssetsManager::Out_recheckResources AssetsManager::recheckResources(const Assets switch ((EnumAssets) type) { case EnumAssets::Nodestate: resourcesPath /= "nodestate"; break; - case EnumAssets::Patricle: resourcesPath /= "particle"; break; + case EnumAssets::Particle: resourcesPath /= "particle"; break; case EnumAssets::Animation: resourcesPath /= "animation"; break; case EnumAssets::Model: resourcesPath /= "model"; break; case EnumAssets::Texture: resourcesPath /= "texture"; break; case EnumAssets::Sound: resourcesPath /= "sound"; break; case EnumAssets::Font: resourcesPath /= "font"; break; default: - assert(false); + std::unreachable(); } auto& findList = findedResources[type][domain]; diff --git a/Src/Server/AssetsManager.hpp b/Src/Server/AssetsManager.hpp index baa5ccc..51ce53b 100644 --- a/Src/Server/AssetsManager.hpp +++ b/Src/Server/AssetsManager.hpp @@ -91,8 +91,24 @@ private: Загрузка ресурса с файла. При необходимости приводится к внутреннему формату и сохраняется в кеше */ - Resource loadResourceFromFile(EnumAssets type, fs::path path) const; - Resource loadResourceFromLua(EnumAssets type, void*) const; + Resource loadResourceFromFile (EnumAssets type, fs::path path) const; + Resource loadResourceFromLua (EnumAssets type, const sol::table& profile) const; + + Resource loadResourceFromFile_Nodestate (fs::path path) const; + Resource loadResourceFromFile_Particle (fs::path path) const; + Resource loadResourceFromFile_Animation (fs::path path) const; + Resource loadResourceFromFile_Model (fs::path path) const; + Resource loadResourceFromFile_Texture (fs::path path) const; + Resource loadResourceFromFile_Sound (fs::path path) const; + Resource loadResourceFromFile_Font (fs::path path) const; + + Resource loadResourceFromLua_Nodestate (const sol::table& profile) const; + Resource loadResourceFromLua_Particle (const sol::table& profile) const; + Resource loadResourceFromLua_Animation (const sol::table& profile) const; + Resource loadResourceFromLua_Model (const sol::table& profile) const; + Resource loadResourceFromLua_Texture (const sol::table& profile) const; + Resource loadResourceFromLua_Sound (const sol::table& profile) const; + Resource loadResourceFromLua_Font (const sol::table& profile) const; public: AssetsManager(asio::io_context& ioc); diff --git a/Src/Server/ContentManager.hpp b/Src/Server/ContentManager.hpp index 463ff7c..d1eeb9b 100644 --- a/Src/Server/ContentManager.hpp +++ b/Src/Server/ContentManager.hpp @@ -120,7 +120,7 @@ class ContentManager { Profiles_Item.push_back(std::make_unique>()); break; default: - assert(false); + std::unreachable(); } return resId; diff --git a/Src/Server/GameServer.cpp b/Src/Server/GameServer.cpp index b3e45d9..27a0923 100644 --- a/Src/Server/GameServer.cpp +++ b/Src/Server/GameServer.cpp @@ -1615,7 +1615,7 @@ void GameServer::initLuaAssets() { }; core->set_function("register_nodestate", [&](const std::string& key, const sol::table& profile) { reg(EnumAssets::Nodestate, key, profile); }); - core->set_function("register_particle", [&](const std::string& key, const sol::table& profile) { reg(EnumAssets::Patricle, key, profile); }); + core->set_function("register_particle", [&](const std::string& key, const sol::table& profile) { reg(EnumAssets::Particle, key, profile); }); core->set_function("register_animation", [&](const std::string& key, const sol::table& profile) { reg(EnumAssets::Animation, key, profile); }); core->set_function("register_model", [&](const std::string& key, const sol::table& profile) { reg(EnumAssets::Model, key, profile); }); core->set_function("register_texture", [&](const std::string& key, const sol::table& profile) { reg(EnumAssets::Texture, key, profile); }); diff --git a/Src/Server/RemoteClient.cpp b/Src/Server/RemoteClient.cpp index 27510e9..fe8f89f 100644 --- a/Src/Server/RemoteClient.cpp +++ b/Src/Server/RemoteClient.cpp @@ -497,7 +497,7 @@ ResourceRequest RemoteClient::pushPreparedPackets() { void RemoteClient::informateAssets(const std::vector>& resources) { - std::vector> newForClient; + std::vector> newForClient; for(auto& [type, resId, domain, key, resource] : resources) { auto hash = resource.hash(); @@ -525,7 +525,7 @@ void RemoteClient::informateAssets(const std::vector(iter->second) != hash ) { // Требуется перепривязать идентификатор к новому хешу - newForClient.push_back({(EnumAssets) type, resId, domain, key, hash}); + newForClient.push_back({(EnumAssets) type, resId, domain, key, hash, resource.size()}); std::get(iter->second) = hash; } } @@ -540,9 +540,9 @@ void RemoteClient::informateAssets(const std::vectorNextPacket << (uint8_t) ToClient::L1::Resource // Оповещение << ((uint8_t) ToClient::L2Resource::Bind) << uint32_t(newForClient.size()); - for(auto& [type, resId, domain, key, hash] : newForClient) { + for(auto& [type, resId, domain, key, hash, size] : newForClient) { // TODO: может внести ограничение на длину домена и ключа? - lock->NextPacket << uint8_t(type) << uint32_t(resId) << domain << key; + lock->NextPacket << uint8_t(type) << uint32_t(resId) << domain << key << size; lock->NextPacket.write((const std::byte*) hash.data(), hash.size()); } } diff --git a/Work/imgui.ini b/Work/imgui.ini index d73b63b..cb4f8f5 100644 --- a/Work/imgui.ini +++ b/Work/imgui.ini @@ -4,5 +4,5 @@ Size=400,400 [Window][MainMenu] Pos=0,0 -Size=1920,1142 +Size=960,540