diff --git a/include/Helpers/NetworkingObjects/NetObjOrderedList.hpp b/include/Helpers/NetworkingObjects/NetObjOrderedList.hpp index cddf0c7..a2d8d40 100644 --- a/include/Helpers/NetworkingObjects/NetObjOrderedList.hpp +++ b/include/Helpers/NetworkingObjects/NetObjOrderedList.hpp @@ -594,6 +594,7 @@ namespace NetworkingObjects { //} // Code that calls post_sync_callback + set_positions_for_object_info_vector(clientData); for(auto& [id, objInfo] : newServerObjects) this->call_insert_callback(objInfo); this->call_post_sync_callback(); diff --git a/src/CanvasComponents/CanvasComponentContainer.cpp b/src/CanvasComponents/CanvasComponentContainer.cpp index 4de70e1..5809cf3 100644 --- a/src/CanvasComponents/CanvasComponentContainer.cpp +++ b/src/CanvasComponents/CanvasComponentContainer.cpp @@ -12,6 +12,7 @@ CanvasComponentContainer::CanvasComponentContainer() { } CanvasComponentContainer::CanvasComponentContainer(NetworkingObjects::NetObjManager& objMan, CanvasComponentType type) { compAllocator = objMan.make_obj_direct(type); + compAllocator->comp->compContainer = this; } void CanvasComponentContainer::register_class(NetObjManager& objMan) { @@ -37,6 +38,7 @@ void CanvasComponentContainer::write_constructor_func(const NetworkingObjects::N void CanvasComponentContainer::read_constructor_func(const NetworkingObjects::NetObjTemporaryPtr& o, cereal::PortableBinaryInputArchive& a, const std::shared_ptr& c) { a(o->coords); o->compAllocator = o.get_obj_man()->read_create_message(a, c); + o->compAllocator->comp->compContainer = o.get(); } void CanvasComponentContainer::delay_post_assignment_update(DrawingProgram& drawP, CanvasComponent& comp) { diff --git a/src/DrawingProgram/DrawingProgram.cpp b/src/DrawingProgram/DrawingProgram.cpp index 2db8601..ab1fbd3 100644 --- a/src/DrawingProgram/DrawingProgram.cpp +++ b/src/DrawingProgram/DrawingProgram.cpp @@ -95,6 +95,19 @@ void DrawingProgram::clear_draw_cache() { selection.clear_own_cached_surfaces(); } +void DrawingProgram::write_components_server(cereal::PortableBinaryOutputArchive& a) { + components.write_create_message(a); +} + +void DrawingProgram::read_components_client(cereal::PortableBinaryInputArchive& a) { + components = world.netObjMan.read_create_message>(a, nullptr); + parallel_loop_all_components([&](const auto& c){ + c->obj->commit_update_dont_invalidate_cache(*this); + }); + compCache.test_rebuild(components->get_data(), true); + set_component_list_callbacks(); +} + void DrawingProgram::toolbar_gui() { Toolbar& t = world.main.toolbar; t.gui.push_id("Drawing Program Toolbar GUI"); diff --git a/src/DrawingProgram/DrawingProgram.hpp b/src/DrawingProgram/DrawingProgram.hpp index 422eeb5..aaa4f10 100644 --- a/src/DrawingProgram/DrawingProgram.hpp +++ b/src/DrawingProgram/DrawingProgram.hpp @@ -31,6 +31,8 @@ class DrawingProgram { void update(); void scale_up(const WorldScalar& scaleUpAmount); void draw(SkCanvas* canvas, const DrawData& drawData); + void write_components_server(cereal::PortableBinaryOutputArchive& a); + void read_components_client(cereal::PortableBinaryInputArchive& a); std::unordered_set get_used_resources() const; void load_file(cereal::PortableBinaryInputArchive& a, VersionNumber version); diff --git a/src/Server/MainServer.cpp b/src/Server/MainServer.cpp index 4ef5601..b1f23c5 100644 --- a/src/Server/MainServer.cpp +++ b/src/Server/MainServer.cpp @@ -66,6 +66,7 @@ MainServer::MainServer(World& initWorld, const std::string& serverLocalID): a(CLIENT_INITIAL_DATA, isDirectConnect, newClient.serverID, newClient.cursorColor, newClient.displayName, newClient.camCoords, newClient.windowSize, fileDisplayName, clients, data); world.bMan.bookmarks.write_create_message(a); world.gridMan.grids.write_create_message(a); + world.drawProg.write_components_server(a); } netServer->send_string_stream_to_client(client, RELIABLE_COMMAND_CHANNEL, ss); for(auto& [id, rData] : data.resources) { diff --git a/src/Toolbar.cpp b/src/Toolbar.cpp index 7a3c1ca..0f26bd3 100644 --- a/src/Toolbar.cpp +++ b/src/Toolbar.cpp @@ -1246,7 +1246,8 @@ void Toolbar::performance_metrics() { std::stringstream a; a << "FPS: " << std::fixed << std::setprecision(0) << (1.0 / main.deltaTime); gui.text_label(a.str()); - gui.text_label("Item Count: " + std::to_string(main.world->drawProg.components->size())); + if(main.world->drawProg.components) + gui.text_label("Item Count: " + std::to_string(main.world->drawProg.components->size())); std::stringstream b; b << "Coord: " << main.world->drawData.cam.c.pos.x().display_int_str(5) << ", " << main.world->drawData.cam.c.pos.y().display_int_str(5); gui.text_label(b.str()); diff --git a/src/World.cpp b/src/World.cpp index 5aa3304..1caae80 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -23,6 +23,7 @@ #include #include #include +#include "CanvasComponents/CanvasComponent.hpp" #include "CanvasComponents/CanvasComponentContainer.hpp" #include "CanvasComponents/CanvasComponentAllocator.hpp" @@ -86,6 +87,7 @@ void World::init_net_obj_type_list() { NetworkingObjects::register_ordered_list_class(netObjMan); CanvasComponentAllocator::register_class(*this, netObjMan); CanvasComponentContainer::register_class(netObjMan); + NetworkingObjects::register_ordered_list_class(netObjMan); } void World::init_client_callbacks() { @@ -103,9 +105,9 @@ void World::init_client_callbacks() { message(newBackColor); set_canvas_background_color(newBackColor, false); message(canvasScale); - //drawProg.initialize_draw_data(message); bMan.bookmarks = netObjMan.read_create_message>(message, nullptr); gridMan.grids = netObjMan.read_create_message>(message, nullptr); + drawProg.read_components_client(message); } nextClientID = get_max_id(ownID); clientStillConnecting = false;