From 5e38892fa3c0b792c45005afe099f3fbb15e50ef Mon Sep 17 00:00:00 2001 From: Bixilon Date: Thu, 3 Nov 2022 18:23:16 +0100 Subject: [PATCH] improve sun drawing performance --- .../gui/rendering/sky/sun/SunRenderer.kt | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/sky/sun/SunRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/sun/SunRenderer.kt index 237b25864..25c27a823 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/sky/sun/SunRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/sun/SunRenderer.kt @@ -18,15 +18,14 @@ import de.bixilon.kotlinglm.mat4x4.Mat4 import de.bixilon.kotlinglm.vec2.Vec2 import de.bixilon.kotlinglm.vec3.Vec3 import de.bixilon.kotlinglm.vec4.Vec4 +import de.bixilon.kutil.watcher.DataWatcher.Companion.observe import de.bixilon.minosoft.data.world.time.DayPhases import de.bixilon.minosoft.data.world.time.WorldTime -import de.bixilon.minosoft.gui.rendering.events.CameraMatrixChangeEvent import de.bixilon.minosoft.gui.rendering.sky.SkyChildRenderer import de.bixilon.minosoft.gui.rendering.sky.SkyRenderer import de.bixilon.minosoft.gui.rendering.system.base.BlendingFunctions import de.bixilon.minosoft.gui.rendering.system.base.RenderingCapabilities import de.bixilon.minosoft.gui.rendering.textures.TextureUtil.texture -import de.bixilon.minosoft.modding.event.listener.CallbackEventListener.Companion.listen import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.util.KUtil.minecraft import de.bixilon.minosoft.util.KUtil.minosoft @@ -39,11 +38,12 @@ class SunRenderer( ) : SkyChildRenderer { private val texture = sky.renderWindow.textureManager.staticTextures.createTexture(SUN) private val shader = sky.renderWindow.renderSystem.createShader(minosoft("weather/sun")) - private var mesh = SunMesh(sky.renderWindow) + private val mesh = SunMesh(sky.renderWindow) private var day = -1L private var matrix = Mat4() private var matrixUpdate = true private var sunModifier = 0.0f + private var intensity = -1.0f override fun init() { shader.load() @@ -69,7 +69,7 @@ class SunRenderer( override fun postInit() { prepareMesh() sky.renderWindow.textureManager.staticTextures.use(shader) - sky.renderWindow.connection.events.listen { calculateMatrix(it.projectionMatrix, it.viewMatrix) } + sky::matrix.observe(this) { calculateMatrix(it) } } private fun getSunAngle(): Float { @@ -94,8 +94,8 @@ class SunRenderer( } } - private fun calculateMatrix(projection: Mat4 = sky.renderWindow.camera.matrixHandler.projectionMatrix, view: Mat4 = sky.renderWindow.camera.matrixHandler.viewMatrix) { - val matrix = projection * view.toMat3().toMat4() + private fun calculateMatrix(base: Mat4) { + val matrix = Mat4(base) matrix.rotateAssign(getSunAngle().rad, Vec3(0, 0, -1)) matrix.translateAssign(Vec3(0.0f, -0.01f, 0.0f)) // prevents face fighting @@ -112,23 +112,25 @@ class SunRenderer( this.day = time.day sunModifier = Random(day.murmur64()).nextFloat(0.0f, 0.2f) } + calculateMatrix(sky.matrix) } override fun draw() { shader.use() - calculateMatrix() if (matrixUpdate) { shader.setMat4("uSunMatrix", matrix) - shader.setVec4("uTintColor", Vec4(1.0f, 1.0f, 1.0f, calculateSunIntensity())) + + val intensity = calculateSunIntensity() + if (this.intensity != intensity) { + shader.setVec4("uTintColor", Vec4(1.0f, 1.0f, 1.0f, intensity)) + this.intensity = intensity + } this.matrixUpdate = false } sky.renderSystem.enable(RenderingCapabilities.BLENDING) sky.renderSystem.setBlendFunction(BlendingFunctions.SOURCE_ALPHA, BlendingFunctions.ONE, BlendingFunctions.ONE, BlendingFunctions.ZERO) - mesh.unload() - mesh = SunMesh(sky.renderWindow) - prepareMesh() mesh.draw() sky.renderSystem.resetBlending() }