diff --git a/src/rendering/terrain_manager.cpp b/src/rendering/terrain_manager.cpp index 1f5c8066..67d486b3 100644 --- a/src/rendering/terrain_manager.cpp +++ b/src/rendering/terrain_manager.cpp @@ -912,8 +912,8 @@ bool TerrainManager::advanceFinalization(FinalizingTile& ft) { // Commit tile to loadedTiles auto tile = std::make_unique(); tile->coord = coord; - tile->terrain = pending->terrain; // copy (not move) — pending is cached for reuse - tile->mesh = pending->mesh; // copy (not move) — pending is cached for reuse + tile->terrain = std::move(pending->terrain); + tile->mesh = std::move(pending->mesh); tile->loaded = true; tile->m2InstanceIds = std::move(ft.m2InstanceIds); tile->wmoInstanceIds = std::move(ft.wmoInstanceIds); @@ -921,7 +921,9 @@ bool TerrainManager::advanceFinalization(FinalizingTile& ft) { tile->doodadUniqueIds = std::move(ft.tileUniqueIds); getTileBounds(coord, tile->minX, tile->minY, tile->maxX, tile->maxY); loadedTiles[coord] = std::move(tile); - putCachedTile(pending); + // NOTE: Don't cache pending here — std::move above empties terrain/mesh, + // so the cached tile would have 0 valid chunks on reuse. Tiles are + // re-parsed from ADT files (file-cache hit) when they re-enter range. // Now safe to remove from pendingTiles (tile is in loadedTiles) {