From b5877ff3caa8390dabb3ed14a71db27ef5e7a238 Mon Sep 17 00:00:00 2001 From: Yousef Khadadeh Date: Thu, 1 Jan 2026 23:28:26 +0300 Subject: [PATCH] Can now save/load resources --- src/DrawingProgram/DrawingProgram.cpp | 4 ++++ src/DrawingProgram/DrawingProgram.hpp | 1 + .../Layers/DrawingProgramLayer.cpp | 5 +++++ .../Layers/DrawingProgramLayer.hpp | 2 ++ .../Layers/DrawingProgramLayerFolder.cpp | 5 +++++ .../Layers/DrawingProgramLayerFolder.hpp | 2 ++ .../Layers/DrawingProgramLayerListItem.cpp | 7 +++++++ .../Layers/DrawingProgramLayerListItem.hpp | 2 ++ .../Layers/DrawingProgramLayerManager.cpp | 4 ++++ .../Layers/DrawingProgramLayerManager.hpp | 1 + src/ResourceManager.cpp | 20 +++++++++++++++++++ src/ResourceManager.hpp | 4 ++++ src/World.cpp | 2 ++ 13 files changed, 59 insertions(+) diff --git a/src/DrawingProgram/DrawingProgram.cpp b/src/DrawingProgram/DrawingProgram.cpp index 8b3b7bb..9c43499 100644 --- a/src/DrawingProgram/DrawingProgram.cpp +++ b/src/DrawingProgram/DrawingProgram.cpp @@ -545,6 +545,10 @@ void DrawingProgram::save_file(cereal::PortableBinaryOutputArchive& a) const { layerMan.save_file(a); } +void DrawingProgram::get_used_resources(std::unordered_set& resourceSet) { + layerMan.get_used_resources(resourceSet); +} + void DrawingProgram::draw(SkCanvas* canvas, const DrawData& drawData) { if(drawData.dontUseDrawProgCache) layerMan.draw(canvas, drawData); diff --git a/src/DrawingProgram/DrawingProgram.hpp b/src/DrawingProgram/DrawingProgram.hpp index 9dc65a6..9f4a6ef 100644 --- a/src/DrawingProgram/DrawingProgram.hpp +++ b/src/DrawingProgram/DrawingProgram.hpp @@ -36,6 +36,7 @@ class DrawingProgram { void init_client_callbacks(); void add_file_to_canvas_by_path(const std::filesystem::path& filePath, Vector2f dropPos, bool addInSameThread); void add_file_to_canvas_by_data(const std::string& fileName, std::string_view fileBuffer, Vector2f dropPos); + void get_used_resources(std::unordered_set& resourceSet); void load_file(cereal::PortableBinaryInputArchive& a, VersionNumber version); void save_file(cereal::PortableBinaryOutputArchive& a) const; diff --git a/src/DrawingProgram/Layers/DrawingProgramLayer.cpp b/src/DrawingProgram/Layers/DrawingProgramLayer.cpp index db0c917..d1426fd 100644 --- a/src/DrawingProgram/Layers/DrawingProgramLayer.cpp +++ b/src/DrawingProgram/Layers/DrawingProgramLayer.cpp @@ -70,3 +70,8 @@ void DrawingProgramLayer::save_file(cereal::PortableBinaryOutputArchive& a) cons for(auto& comp : *components) comp.obj->save_file(a); } + +void DrawingProgramLayer::get_used_resources(std::unordered_set& resourceSet) const { + for(auto& comp : *components) + comp.obj->get_comp().get_used_resources(resourceSet); +} diff --git a/src/DrawingProgram/Layers/DrawingProgramLayer.hpp b/src/DrawingProgram/Layers/DrawingProgramLayer.hpp index 2692b36..a8e1802 100644 --- a/src/DrawingProgram/Layers/DrawingProgramLayer.hpp +++ b/src/DrawingProgram/Layers/DrawingProgramLayer.hpp @@ -18,6 +18,8 @@ class DrawingProgramLayer { void load_file(cereal::PortableBinaryInputArchive& a, VersionNumber version, DrawingProgramLayerManager& layerMan); void save_file(cereal::PortableBinaryOutputArchive& a) const; + + void get_used_resources(std::unordered_set& resourceSet) const; private: std::function eraseCallback; }; diff --git a/src/DrawingProgram/Layers/DrawingProgramLayerFolder.cpp b/src/DrawingProgram/Layers/DrawingProgramLayerFolder.cpp index 6f095fe..0dde772 100644 --- a/src/DrawingProgram/Layers/DrawingProgramLayerFolder.cpp +++ b/src/DrawingProgram/Layers/DrawingProgramLayerFolder.cpp @@ -69,3 +69,8 @@ void DrawingProgramLayerFolder::save_file(cereal::PortableBinaryOutputArchive& a for(auto& listItem : *folderList) listItem.obj->save_file(a); } + +void DrawingProgramLayerFolder::get_used_resources(std::unordered_set& resourceSet) const { + for(auto& listItem : *folderList) + listItem.obj->get_used_resources(resourceSet); +} diff --git a/src/DrawingProgram/Layers/DrawingProgramLayerFolder.hpp b/src/DrawingProgram/Layers/DrawingProgramLayerFolder.hpp index 45a2ba1..06ecfbd 100644 --- a/src/DrawingProgram/Layers/DrawingProgramLayerFolder.hpp +++ b/src/DrawingProgram/Layers/DrawingProgramLayerFolder.hpp @@ -21,4 +21,6 @@ class DrawingProgramLayerFolder { void load_file(cereal::PortableBinaryInputArchive& a, VersionNumber version, DrawingProgramLayerManager& layerMan); void save_file(cereal::PortableBinaryOutputArchive& a) const; + + void get_used_resources(std::unordered_set& resourceSet) const; }; diff --git a/src/DrawingProgram/Layers/DrawingProgramLayerListItem.cpp b/src/DrawingProgram/Layers/DrawingProgramLayerListItem.cpp index 4c1682d..1053ce0 100644 --- a/src/DrawingProgram/Layers/DrawingProgramLayerListItem.cpp +++ b/src/DrawingProgram/Layers/DrawingProgramLayerListItem.cpp @@ -121,6 +121,13 @@ void DrawingProgramLayerListItem::save_file(cereal::PortableBinaryOutputArchive& layerData->save_file(a); } +void DrawingProgramLayerListItem::get_used_resources(std::unordered_set& resourceSet) const { + if(folderData) + folderData->get_used_resources(resourceSet); + else + layerData->get_used_resources(resourceSet); +} + void DrawingProgramLayerListItem::draw(SkCanvas* canvas, const DrawData& drawData) const { if(displayData->visible) { SkPaint layerPaint; diff --git a/src/DrawingProgram/Layers/DrawingProgramLayerListItem.hpp b/src/DrawingProgram/Layers/DrawingProgramLayerListItem.hpp index f8da55f..afec8a0 100644 --- a/src/DrawingProgram/Layers/DrawingProgramLayerListItem.hpp +++ b/src/DrawingProgram/Layers/DrawingProgramLayerListItem.hpp @@ -2,6 +2,7 @@ #include #include #include +#include #include "DrawingProgramLayerFolder.hpp" #include "DrawingProgramLayer.hpp" #include "SerializedBlendMode.hpp" @@ -29,6 +30,7 @@ class DrawingProgramLayerListItem { void get_flattened_component_list(std::vector& objList) const; void get_flattened_layer_list(std::vector& objList); void scale_up(const WorldScalar& scaleUpAmount); + void get_used_resources(std::unordered_set& resourceSet) const; void set_alpha(DrawingProgramLayerManager& layerMan, float newAlpha) const; float get_alpha() const; diff --git a/src/DrawingProgram/Layers/DrawingProgramLayerManager.cpp b/src/DrawingProgram/Layers/DrawingProgramLayerManager.cpp index 5cd4903..cf119cd 100644 --- a/src/DrawingProgram/Layers/DrawingProgramLayerManager.cpp +++ b/src/DrawingProgram/Layers/DrawingProgramLayerManager.cpp @@ -120,3 +120,7 @@ void DrawingProgramLayerManager::load_file(cereal::PortableBinaryInputArchive& a void DrawingProgramLayerManager::save_file(cereal::PortableBinaryOutputArchive& a) const { layerTreeRoot->save_file(a); } + +void DrawingProgramLayerManager::get_used_resources(std::unordered_set& resourceSet) { + layerTreeRoot->get_used_resources(resourceSet); +} diff --git a/src/DrawingProgram/Layers/DrawingProgramLayerManager.hpp b/src/DrawingProgram/Layers/DrawingProgramLayerManager.hpp index 034d575..2b0d7f6 100644 --- a/src/DrawingProgram/Layers/DrawingProgramLayerManager.hpp +++ b/src/DrawingProgram/Layers/DrawingProgramLayerManager.hpp @@ -42,6 +42,7 @@ class DrawingProgramLayerManager { void load_file(cereal::PortableBinaryInputArchive& a, VersionNumber version); void save_file(cereal::PortableBinaryOutputArchive& a) const; + void get_used_resources(std::unordered_set& resourceSet); bool layer_tree_root_exists(); const DrawingProgramLayerListItem& get_layer_root(); diff --git a/src/ResourceManager.cpp b/src/ResourceManager.cpp index 6096b8b..8e6366f 100644 --- a/src/ResourceManager.cpp +++ b/src/ResourceManager.cpp @@ -12,6 +12,7 @@ #include "World.hpp" #include "ResourceDisplay/FileResourceDisplay.hpp" #include +#include ResourceManager::ResourceManager(World& initWorld): world(initWorld) @@ -180,3 +181,22 @@ std::unordered_map ResourceManager::c const std::vector>& ResourceManager::resource_list() { return resourceList; } + +void ResourceManager::load_file(cereal::PortableBinaryInputArchive& a, VersionNumber version) { + std::unordered_map loadedResources; + a(loadedResources); + for(auto& [netID, rData] : loadedResources) + resourceList.emplace_back(world.netObjMan.make_obj_direct_with_specific_id(netID, rData)); +} + +void ResourceManager::save_file(cereal::PortableBinaryOutputArchive& a) const { + std::unordered_set usedResources; + world.drawProg.get_used_resources(usedResources); + std::unordered_map strippedResources; + for(auto& n : resourceList) + strippedResources.emplace(n.get_net_id(), *n); + std::erase_if(strippedResources, [&](const auto& p) { + return !usedResources.contains(p.first); + }); + a(strippedResources); +} diff --git a/src/ResourceManager.hpp b/src/ResourceManager.hpp index 5925996..e8b25f6 100644 --- a/src/ResourceManager.hpp +++ b/src/ResourceManager.hpp @@ -5,6 +5,7 @@ #include "ResourceDisplay/ResourceDisplay.hpp" #include #include +#include class World; @@ -33,6 +34,9 @@ class ResourceManager { float get_resource_retrieval_progress(const NetworkingObjects::NetObjID& id); std::unordered_map copy_resource_set_to_map(const std::unordered_set& resourceSet) const; + void load_file(cereal::PortableBinaryInputArchive& a, VersionNumber version); + void save_file(cereal::PortableBinaryOutputArchive& a) const; + World& world; private: std::unordered_map> displays; diff --git a/src/World.cpp b/src/World.cpp index 81c97f9..66f7bd6 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -433,6 +433,7 @@ void World::save_file(cereal::PortableBinaryOutputArchive& a) const { drawProg.save_file(a); bMan.save_file(a); gridMan.save_file(a); + rMan.save_file(a); } void World::load_file(cereal::PortableBinaryInputArchive& a, VersionNumber version) { @@ -441,6 +442,7 @@ void World::load_file(cereal::PortableBinaryInputArchive& a, VersionNumber versi drawProg.load_file(a, version); bMan.load_file(a, version); gridMan.load_file(a, version); + rMan.load_file(a, version); } WorldScalar World::calculate_zoom_from_uniform_zoom(WorldScalar uniformZoom, WorldVec oldWindowSize) {