From 496c16a4707f30b36aee6ae46754ca4f7f96ca79 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Sat, 4 Dec 2021 19:08:47 +0100 Subject: [PATCH] world renderer: fix crash when lowering render distance --- .../profiles/block/BlockProfileManager.kt | 2 +- .../gui/rendering/world/WorldRenderer.kt | 34 +++++++++++++++---- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/block/BlockProfileManager.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/block/BlockProfileManager.kt index 756903789..98a4ce6a4 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/block/BlockProfileManager.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/block/BlockProfileManager.kt @@ -27,7 +27,7 @@ object BlockProfileManager : ProfileManager { override fun createDefaultProfile(name: String): BlockProfile { currentLoadingPath = name - val profile = BlockProfile("Default block profile") + val profile = BlockProfile("Default block profile") currentLoadingPath = null profiles[name] = profile diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/world/WorldRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/world/WorldRenderer.kt index ff159d208..ff1e9af1c 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/world/WorldRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/world/WorldRenderer.kt @@ -258,23 +258,27 @@ class WorldRenderer( connection.registerEvent(CallbackEventInvoker.of { // Unload all chunks(-sections) that are out of view distance + + queueLock.lock() + culledQueueLock.lock() + meshesToLoadLock.lock() meshesToUnloadLock.lock() + loadedMeshesLock.lock() + val loadedMeshesToRemove: MutableSet = mutableSetOf() for ((chunkPosition, sections) in loadedMeshes) { if (isChunkVisible(chunkPosition)) { continue } + loadedMeshesToRemove += chunkPosition for (mesh in sections.values) { + if (mesh in meshesToUnload) { + continue + } meshesToUnload += mesh } } - meshesToUnloadLock.unlock() + loadedMeshes -= loadedMeshesToRemove - - queueLock.lock() - queue.removeAll { !isChunkVisible(it.chunkPosition) } - queueLock.unlock() - - culledQueueLock.lock() val toRemove: MutableSet = mutableSetOf() for ((chunkPosition, _) in culledQueue) { if (isChunkVisible(chunkPosition)) { @@ -283,7 +287,22 @@ class WorldRenderer( toRemove += chunkPosition } culledQueue -= toRemove + + queue.removeAll { !isChunkVisible(it.chunkPosition) } + + meshesToLoad.removeAll { !isChunkVisible(it.chunkPosition) } + + for (task in preparingTasks.toMutableSet()) { + if (!isChunkVisible(task.chunkPosition)) { + task.runnable.interrupt() + } + } + + loadedMeshesLock.unlock() + queueLock.unlock() culledQueueLock.unlock() + meshesToLoadLock.unlock() + meshesToUnloadLock.unlock() }) } @@ -354,6 +373,7 @@ class WorldRenderer( for (mesh in meshes.values) { meshesToUnload += mesh } + loadedMeshes -= chunkPosition } loadedMeshesLock.unlock()