From 01dd6ec74a6d51e955d682c1910db50f681779a9 Mon Sep 17 00:00:00 2001 From: T1ti <40864460+T1ti@users.noreply.github.com> Date: Sat, 17 Aug 2024 05:30:31 +0200 Subject: [PATCH] make tile unload safer --- src/noggit/Action.cpp | 2 +- src/noggit/MapTile.cpp | 10 +++++++--- src/noggit/SceneObject.cpp | 4 ++++ src/noggit/World.cpp | 2 +- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/noggit/Action.cpp b/src/noggit/Action.cpp index a4568c4d..64d849a1 100755 --- a/src/noggit/Action.cpp +++ b/src/noggit/Action.cpp @@ -78,7 +78,7 @@ void Noggit::Action::undo(bool redo) if (pair.second.tmp_edit_values) texture_set->getTempAlphamaps() = std::make_unique(*pair.second.tmp_edit_values); else - texture_set->getTempAlphamaps() = nullptr; + texture_set->getTempAlphamaps().reset(); std::memcpy(texture_set->getMCLYEntries(), &pair.second.layers_info, sizeof(layer_info) * 4); texture_set->setNTextures(pair.second.n_textures); diff --git a/src/noggit/MapTile.cpp b/src/noggit/MapTile.cpp index 99d8cb47..aca320a3 100755 --- a/src/noggit/MapTile.cpp +++ b/src/noggit/MapTile.cpp @@ -74,11 +74,15 @@ MapTile::MapTile( int pX MapTile::~MapTile() { - for (auto& pair : object_instances) { - for (auto& instance : pair.second) + std::lock_guard const lock(_mutex); + + for (auto& pair : object_instances) { - instance->derefTile(this); + for (auto& instance : pair.second) + { + instance->derefTile(this); + } } } diff --git a/src/noggit/SceneObject.cpp b/src/noggit/SceneObject.cpp index 1c6985a6..a8539155 100755 --- a/src/noggit/SceneObject.cpp +++ b/src/noggit/SceneObject.cpp @@ -15,6 +15,8 @@ SceneObject::SceneObject(SceneObjectTypes type, Noggit::NoggitRenderContext cont , _context(context) , pos(0.f, 0.f, 0.f) , dir(0.f, 0.f, 0.f) +, uid(0) +, frame(0) { // min and max initialized to their opposites extents[0] = glm::vec3(std::numeric_limits::max()); @@ -86,6 +88,7 @@ void SceneObject::normalizeDirection() void SceneObject::refTile(MapTile* tile) { + assert(tile); auto it = std::find(_tiles.begin(), _tiles.end(), tile); if (it == _tiles.end()) _tiles.push_back(tile); @@ -93,6 +96,7 @@ void SceneObject::refTile(MapTile* tile) void SceneObject::derefTile(MapTile* tile) { + assert(tile); auto it = std::find(_tiles.begin(), _tiles.end(), tile); if (it != _tiles.end()) _tiles.erase(it); diff --git a/src/noggit/World.cpp b/src/noggit/World.cpp index 0114f709..b6b29aa9 100755 --- a/src/noggit/World.cpp +++ b/src/noggit/World.cpp @@ -2039,7 +2039,7 @@ void World::remove_models_if_needed(std::vector const& uids) /* if (uids.size()) { - update_models_by_filename(); + need_model_updates = true; }*/ }