diff --git a/src/MainProgram.cpp b/src/MainProgram.cpp index 6ecc6e1..c514b5c 100755 --- a/src/MainProgram.cpp +++ b/src/MainProgram.cpp @@ -96,6 +96,8 @@ void MainProgram::update() { std::shared_ptr oldWorld = world; world = worlds[worldIndex]; + if(oldWorld != world && oldWorld) + oldWorld->on_switch_out(); deltaTime.update_time_since(); deltaTime.update_time_point(); diff --git a/src/ResourceDisplay/ImageResourceDisplay.cpp b/src/ResourceDisplay/ImageResourceDisplay.cpp index ec64e47..01fc26a 100644 --- a/src/ResourceDisplay/ImageResourceDisplay.cpp +++ b/src/ResourceDisplay/ImageResourceDisplay.cpp @@ -287,6 +287,20 @@ ResourceDisplay::Type ImageResourceDisplay::get_type() const { return ResourceDisplay::Type::IMAGE; } +void ImageResourceDisplay::clear_cache() { + if(loadThread) { + shutdownLoadThread = true; + loadThread->join(); + loadThread = nullptr; + } + for(auto& frame : frames) { + for(auto& mipmap : frame.mipmapLevels) + mipmap = nullptr; + } + for(auto& mipmapStatus : mipmapLevelsStatus) + mipmapStatus = MipmapLevelStatus::UNALLOCATED; +} + ImageResourceDisplay::~ImageResourceDisplay() { if(loadThread) { shutdownLoadThread = true; diff --git a/src/ResourceDisplay/ImageResourceDisplay.hpp b/src/ResourceDisplay/ImageResourceDisplay.hpp index 05505a4..f31a84f 100644 --- a/src/ResourceDisplay/ImageResourceDisplay.hpp +++ b/src/ResourceDisplay/ImageResourceDisplay.hpp @@ -16,6 +16,7 @@ class ImageResourceDisplay : public ResourceDisplay { virtual float get_dimension_scale() const override; virtual Type get_type() const override; virtual void camera_view_update(const CoordSpaceHelper& compCoords, const SCollision::AABB& compAABB, const DrawData& drawData, const SkRect& imRect) override; + virtual void clear_cache() override; virtual ~ImageResourceDisplay() override; static int IMAGE_LOAD_THREAD_COUNT_MAX; diff --git a/src/ResourceDisplay/ResourceDisplay.cpp b/src/ResourceDisplay/ResourceDisplay.cpp index 8d0b900..4affc1e 100644 --- a/src/ResourceDisplay/ResourceDisplay.cpp +++ b/src/ResourceDisplay/ResourceDisplay.cpp @@ -3,4 +3,7 @@ void ResourceDisplay::camera_view_update(const CoordSpaceHelper& compCoords, const SCollision::AABB& compAABB, const DrawData& drawData, const SkRect& imRect) { } +void ResourceDisplay::clear_cache() { +} + ResourceDisplay::~ResourceDisplay() {} diff --git a/src/ResourceDisplay/ResourceDisplay.hpp b/src/ResourceDisplay/ResourceDisplay.hpp index b5b9bc8..b92b59b 100644 --- a/src/ResourceDisplay/ResourceDisplay.hpp +++ b/src/ResourceDisplay/ResourceDisplay.hpp @@ -27,5 +27,6 @@ class ResourceDisplay { virtual float get_dimension_scale() const = 0; virtual Type get_type() const = 0; virtual void camera_view_update(const CoordSpaceHelper& compCoords, const SCollision::AABB& compAABB, const DrawData& drawData, const SkRect& imRect); + virtual void clear_cache(); virtual ~ResourceDisplay(); }; diff --git a/src/ResourceManager.cpp b/src/ResourceManager.cpp index 0c515af..bc5e66e 100644 --- a/src/ResourceManager.cpp +++ b/src/ResourceManager.cpp @@ -200,3 +200,8 @@ void ResourceManager::save_file(cereal::PortableBinaryOutputArchive& a) const { }); a(strippedResources); } + +void ResourceManager::clear_display_cache() { + for(auto& [id, display] : displays) + display->clear_cache(); +} diff --git a/src/ResourceManager.hpp b/src/ResourceManager.hpp index e8b25f6..101e451 100644 --- a/src/ResourceManager.hpp +++ b/src/ResourceManager.hpp @@ -33,6 +33,7 @@ class ResourceManager { const std::vector>& resource_list(); float get_resource_retrieval_progress(const NetworkingObjects::NetObjID& id); std::unordered_map copy_resource_set_to_map(const std::unordered_set& resourceSet) const; + void clear_display_cache(); void load_file(cereal::PortableBinaryInputArchive& a, VersionNumber version); void save_file(cereal::PortableBinaryOutputArchive& a) const; diff --git a/src/World.cpp b/src/World.cpp index 08705b5..06f6991 100644 --- a/src/World.cpp +++ b/src/World.cpp @@ -244,6 +244,10 @@ void World::unfocus_update() { return; } +void World::on_switch_out() { + rMan.clear_display_cache(); +} + void World::send_chat_message(const std::string& message) { if(!clientStillConnecting) ownClientData->send_chat_message(ownClientData, *this, message); diff --git a/src/World.hpp b/src/World.hpp index 954674e..d00a84d 100644 --- a/src/World.hpp +++ b/src/World.hpp @@ -66,6 +66,7 @@ class World { void focus_update(); void unfocus_update(); + void on_switch_out(); void draw(SkCanvas* canvas); void early_destroy();