From 831fd25444771b5795b85b25266f6bf553fa58ee Mon Sep 17 00:00:00 2001 From: Bixilon Date: Sat, 13 Nov 2021 19:20:03 +0100 Subject: [PATCH] fix empty chunk data handling, improve multithreading in WorldRenderer --- .../gui/rendering/block/WorldRenderer.kt | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/block/WorldRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/block/WorldRenderer.kt index d1e2fd0a9..5240da12b 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/block/WorldRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/block/WorldRenderer.kt @@ -35,10 +35,7 @@ import de.bixilon.minosoft.gui.rendering.system.base.phases.TransparentDrawable import de.bixilon.minosoft.gui.rendering.util.VecUtil.chunkPosition import de.bixilon.minosoft.gui.rendering.util.VecUtil.sectionHeight import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3iUtil.EMPTY -import de.bixilon.minosoft.modding.event.events.BlockSetEvent -import de.bixilon.minosoft.modding.event.events.ChunkDataChangeEvent -import de.bixilon.minosoft.modding.event.events.ChunkUnloadEvent -import de.bixilon.minosoft.modding.event.events.MassBlockSetEvent +import de.bixilon.minosoft.modding.event.events.* import de.bixilon.minosoft.modding.event.invoker.CallbackEventInvoker import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.util.KUtil.synchronizedMapOf @@ -111,6 +108,7 @@ class WorldRenderer( connection.registerEvent(CallbackEventInvoker.of { onFrustumChange() }) + connection.registerEvent(CallbackEventInvoker.of { unloadWorld() }) connection.registerEvent(CallbackEventInvoker.of { updateChunk(it.chunkPosition, it.chunk, true) }) connection.registerEvent(CallbackEventInvoker.of { updateSection(it.blockPosition.chunkPosition, it.blockPosition.sectionHeight) }) connection.registerEvent(CallbackEventInvoker.of { @@ -136,6 +134,22 @@ class WorldRenderer( connection.registerEvent(CallbackEventInvoker.of { unloadChunk(it.chunkPosition) }) } + private fun unloadWorld() { + renderWindow.queue += { + for (sections in meshes.values) { + for (mesh in sections.values) { + mesh.unload() + } + } + meshes.clear() + incomplete.clear() + queue.clear() + visibleOpaque.clear() + visibleTranslucent.clear() + visibleTransparent.clear() + } + } + private fun unloadChunk(chunkPosition: Vec2i) { incomplete -= chunkPosition renderWindow.queue += { queue.remove(chunkPosition) }