From 86858d238ef80ab5628cb04485751d997601d90a Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Tue, 16 Dec 2025 13:48:21 +0300 Subject: [PATCH] Resource manager works over network --- src/DrawingProgram/DrawingProgram.cpp | 3 --- src/DrawingProgram/DrawingProgram.hpp | 1 - src/ResourceManager.cpp | 20 +++++++++++++------- src/Server/MainServer.hpp | 1 - src/World.cpp | 3 +-- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/DrawingProgram/DrawingProgram.cpp b/src/DrawingProgram/DrawingProgram.cpp index 155bc57..76ccdc5 100644 --- a/src/DrawingProgram/DrawingProgram.cpp +++ b/src/DrawingProgram/DrawingProgram.cpp @@ -68,9 +68,6 @@ void DrawingProgram::set_component_list_callbacks() { }); } -void DrawingProgram::init_client_callbacks() { -} - void DrawingProgram::scale_up(const WorldScalar& scaleUpAmount) { //for(auto& c : components->get_data()) // c->obj->scale_up(scaleUpAmount); diff --git a/src/DrawingProgram/DrawingProgram.hpp b/src/DrawingProgram/DrawingProgram.hpp index 53e598a..c587987 100644 --- a/src/DrawingProgram/DrawingProgram.hpp +++ b/src/DrawingProgram/DrawingProgram.hpp @@ -23,7 +23,6 @@ class DrawingProgram { public: DrawingProgram(World& initWorld); void init(); - void init_client_callbacks(); void set_component_list_callbacks(); void toolbar_gui(); void tool_options_gui(); diff --git a/src/ResourceManager.cpp b/src/ResourceManager.cpp index 1c24c04..1038d9f 100644 --- a/src/ResourceManager.cpp +++ b/src/ResourceManager.cpp @@ -19,15 +19,21 @@ ResourceManager::ResourceManager(World& initWorld): void ResourceManager::init_client_callbacks() { world.con.client_add_recv_callback(SERVER_NEW_RESOURCE_ID, [&](cereal::PortableBinaryInputArchive& message) { - NetworkingObjects::NetObjID idBeingRetrieved; - message(idBeingRetrieved); - resourcesBeingRetrieved.emplace(idBeingRetrieved, 0); + if(!world.con.host_exists()) { + NetworkingObjects::NetObjID idBeingRetrieved; + message(idBeingRetrieved); + // There is a scenario where the resource id and data messages can be sent twice for the same resource (a resource can be sent early before CLIENT_INITIAL_DATA is sent, and then resent with CLIENT_INITIAL_DATA), so check if resource already exists, and only keep track of the ID if the resource doesn't exist yet + if(!world.netObjMan.get_obj_temporary_ref_from_id(idBeingRetrieved)) + resourcesBeingRetrieved.emplace(idBeingRetrieved, 0); + } }); world.con.client_add_recv_callback(SERVER_NEW_RESOURCE_DATA, [&](cereal::PortableBinaryInputArchive& message) { - ResourceData newResource; - message(newResource); - resourceList.emplace_back(world.netObjMan.make_obj_direct_with_specific_id(resourcesBeingRetrieved.begin()->first, newResource)); - resourcesBeingRetrieved.clear(); + if(!world.con.host_exists() && !resourcesBeingRetrieved.empty()) { // If the resource was sent for the second time, this will be empty, so we can ignore the message + ResourceData newResource; + message(newResource); + resourceList.emplace_back(world.netObjMan.make_obj_direct_with_specific_id(resourcesBeingRetrieved.begin()->first, newResource)); + resourcesBeingRetrieved.clear(); + } }); } diff --git a/src/Server/MainServer.hpp b/src/Server/MainServer.hpp index 3b2d704..fc9a80e 100644 --- a/src/Server/MainServer.hpp +++ b/src/Server/MainServer.hpp @@ -12,7 +12,6 @@ class MainServer { ~MainServer(); std::shared_ptr netServer; std::unordered_map clients; - std::unordered_map resource_download_progress(); private: World& world; void ensure_display_name_unique(std::string& displayName); diff --git a/src/World.cpp b/src/World.cpp index 18b41f6..2ce64d8 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -75,7 +75,6 @@ World::World(MainProgram& initMain, OpenWorldInfo& worldInfo): } } - drawProg.init_client_callbacks(); rMan.init_client_callbacks(); init_client_callbacks(); con.client_send_items_to_server(RELIABLE_COMMAND_CHANNEL, SERVER_INITIAL_DATA, displayName, false); @@ -301,8 +300,8 @@ void World::start_hosting(const std::string& initNetSource, const std::string& s return; main.init_net_library(); con.init_local_p2p(*this, serverLocalID); - drawProg.init_client_callbacks(); rMan.init_client_callbacks(); + rMan.init_server_callbacks(); init_client_callbacks(); con.client_send_items_to_server(RELIABLE_COMMAND_CHANNEL, SERVER_INITIAL_DATA, displayName, true, drawData.cam.c, main.window.size.cast().eval()); conType = CONNECTIONTYPE_SERVER;