make tile unload safer

This commit is contained in:
T1ti
2024-08-17 05:30:31 +02:00
parent 9e958e8404
commit 01dd6ec74a
4 changed files with 13 additions and 5 deletions

View File

@@ -78,7 +78,7 @@ void Noggit::Action::undo(bool redo)
if (pair.second.tmp_edit_values) if (pair.second.tmp_edit_values)
texture_set->getTempAlphamaps() = std::make_unique<tmp_edit_alpha_values>(*pair.second.tmp_edit_values); texture_set->getTempAlphamaps() = std::make_unique<tmp_edit_alpha_values>(*pair.second.tmp_edit_values);
else else
texture_set->getTempAlphamaps() = nullptr; texture_set->getTempAlphamaps().reset();
std::memcpy(texture_set->getMCLYEntries(), &pair.second.layers_info, sizeof(layer_info) * 4); std::memcpy(texture_set->getMCLYEntries(), &pair.second.layers_info, sizeof(layer_info) * 4);
texture_set->setNTextures(pair.second.n_textures); texture_set->setNTextures(pair.second.n_textures);

View File

@@ -74,11 +74,15 @@ MapTile::MapTile( int pX
MapTile::~MapTile() MapTile::~MapTile()
{ {
for (auto& pair : object_instances)
{ {
for (auto& instance : pair.second) std::lock_guard<std::mutex> const lock(_mutex);
for (auto& pair : object_instances)
{ {
instance->derefTile(this); for (auto& instance : pair.second)
{
instance->derefTile(this);
}
} }
} }

View File

@@ -15,6 +15,8 @@ SceneObject::SceneObject(SceneObjectTypes type, Noggit::NoggitRenderContext cont
, _context(context) , _context(context)
, pos(0.f, 0.f, 0.f) , pos(0.f, 0.f, 0.f)
, dir(0.f, 0.f, 0.f) , dir(0.f, 0.f, 0.f)
, uid(0)
, frame(0)
{ {
// min and max initialized to their opposites // min and max initialized to their opposites
extents[0] = glm::vec3(std::numeric_limits<float>::max()); extents[0] = glm::vec3(std::numeric_limits<float>::max());
@@ -86,6 +88,7 @@ void SceneObject::normalizeDirection()
void SceneObject::refTile(MapTile* tile) void SceneObject::refTile(MapTile* tile)
{ {
assert(tile);
auto it = std::find(_tiles.begin(), _tiles.end(), tile); auto it = std::find(_tiles.begin(), _tiles.end(), tile);
if (it == _tiles.end()) if (it == _tiles.end())
_tiles.push_back(tile); _tiles.push_back(tile);
@@ -93,6 +96,7 @@ void SceneObject::refTile(MapTile* tile)
void SceneObject::derefTile(MapTile* tile) void SceneObject::derefTile(MapTile* tile)
{ {
assert(tile);
auto it = std::find(_tiles.begin(), _tiles.end(), tile); auto it = std::find(_tiles.begin(), _tiles.end(), tile);
if (it != _tiles.end()) if (it != _tiles.end())
_tiles.erase(it); _tiles.erase(it);

View File

@@ -2039,7 +2039,7 @@ void World::remove_models_if_needed(std::vector<uint32_t> const& uids)
/* /*
if (uids.size()) if (uids.size())
{ {
update_models_by_filename(); need_model_updates = true;
}*/ }*/
} }