From aee19b619e964c45ac0ac1c47445344c08b0f5e1 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Mon, 7 Nov 2022 21:49:41 +0100 Subject: [PATCH] make sky renderer AsyncRenderer --- .../minosoft/gui/rendering/sky/SkyRenderer.kt | 10 ++++++++-- .../gui/rendering/sky/clouds/CloudsRenderer.kt | 18 +++++++++++++++--- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/sky/SkyRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/SkyRenderer.kt index 9bc15f0ca..b977624c5 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/sky/SkyRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/SkyRenderer.kt @@ -20,6 +20,7 @@ import de.bixilon.kutil.watcher.DataWatcher.Companion.watched import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.events.CameraMatrixChangeEvent +import de.bixilon.minosoft.gui.rendering.renderer.renderer.AsyncRenderer import de.bixilon.minosoft.gui.rendering.renderer.renderer.Renderer import de.bixilon.minosoft.gui.rendering.renderer.renderer.RendererBuilder import de.bixilon.minosoft.gui.rendering.sky.box.SkyboxRenderer @@ -38,7 +39,7 @@ import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection class SkyRenderer( val connection: PlayConnection, override val renderWindow: RenderWindow, -) : Renderer, PreDrawable { +) : Renderer, PreDrawable, AsyncRenderer { override val renderSystem: RenderSystem = renderWindow.renderSystem override val framebuffer: Framebuffer? = null override val polygonMode: PolygonModes = PolygonModes.DEFAULT @@ -77,7 +78,7 @@ class SkyRenderer( connection.world::dimension.observe(this) { properties = it?.skyProperties ?: OverworldSkyProperties } } - override fun prePrepareDraw() { + override fun prepareDrawAsync() { if (updateTime) { this.time = connection.world.time for (renderer in renderer) { @@ -87,6 +88,11 @@ class SkyRenderer( } for (renderer in renderer) { renderer.updateAsync() + } + } + + override fun prePrepareDraw() { + for (renderer in renderer) { renderer.update() } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/sky/clouds/CloudsRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/clouds/CloudsRenderer.kt index 2571bdecb..68915d150 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/sky/clouds/CloudsRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/clouds/CloudsRenderer.kt @@ -23,6 +23,7 @@ import de.bixilon.minosoft.config.profile.delegate.watcher.SimpleProfileDelegate import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.world.time.WorldTime import de.bixilon.minosoft.gui.rendering.RenderWindow +import de.bixilon.minosoft.gui.rendering.renderer.renderer.AsyncRenderer import de.bixilon.minosoft.gui.rendering.renderer.renderer.Renderer import de.bixilon.minosoft.gui.rendering.renderer.renderer.RendererBuilder import de.bixilon.minosoft.gui.rendering.sky.SkyRenderer @@ -33,13 +34,15 @@ import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.EMPTY import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.protocol.network.connection.play.PlayConnectionStates import de.bixilon.minosoft.util.KUtil.minosoft +import de.bixilon.minosoft.util.KUtil.murmur64 +import java.util.* import kotlin.math.abs class CloudsRenderer( private val sky: SkyRenderer, private val connection: PlayConnection, override val renderWindow: RenderWindow, -) : Renderer, OpaqueDrawable { +) : Renderer, OpaqueDrawable, AsyncRenderer { override val renderSystem: RenderSystem = renderWindow.renderSystem private val shader = renderSystem.createShader(minosoft("sky/clouds")) val matrix = CloudMatrix() @@ -52,6 +55,8 @@ class CloudsRenderer( private set private var maxDistance = 0.0f private var yOffset = 0.0f + private var day = -1L + private var randomSpeed = 0.0f override val skipOpaque: Boolean get() = !sky.properties.clouds || !sky.profile.clouds.enabled || connection.profiles.block.viewDistance < 3 @@ -153,7 +158,14 @@ class CloudsRenderer( } else { push(arrayDelta) } - check(arrays[4].offset == cloudPosition) // ToDo: remove debug check + } + + override fun prepareDrawAsync() { + val day = sky.time.day + if (day != this.day) { + this.day = day + randomSpeed = Random(sky.time.age.murmur64()).nextFloat(0.0f, 0.1f) + } } override fun postPrepareDraw() { @@ -184,7 +196,7 @@ class CloudsRenderer( } private fun getCloudSpeed(): Float { - return 0.5f + return randomSpeed + 0.1f } private fun updateOffset() {