diff --git a/src/main/java/de/bixilon/minosoft/config/profile/profiles/rendering/overlay/weather/WeatherC.kt b/src/main/java/de/bixilon/minosoft/config/profile/profiles/rendering/overlay/weather/WeatherC.kt index 26da0e278..7257e9919 100644 --- a/src/main/java/de/bixilon/minosoft/config/profile/profiles/rendering/overlay/weather/WeatherC.kt +++ b/src/main/java/de/bixilon/minosoft/config/profile/profiles/rendering/overlay/weather/WeatherC.kt @@ -26,5 +26,4 @@ class WeatherC { * Enables snow overlay */ var snow by delegate(true) - } diff --git a/src/main/java/de/bixilon/minosoft/data/world/time/WorldTime.kt b/src/main/java/de/bixilon/minosoft/data/world/time/WorldTime.kt index a2aafe950..1f12bc9f4 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/time/WorldTime.kt +++ b/src/main/java/de/bixilon/minosoft/data/world/time/WorldTime.kt @@ -35,7 +35,7 @@ class WorldTime( val phase = DayPhases.of(time) val progress = phase.getProgress(time) - val day = this.age / ProtocolDefinition.TICKS_PER_DAY + val day = (this.age + 6000) / ProtocolDefinition.TICKS_PER_DAY - 1 // day changes at midnight (18k) val skyAngle: Float diff --git a/src/main/java/de/bixilon/minosoft/data/world/weather/WorldWeather.kt b/src/main/java/de/bixilon/minosoft/data/world/weather/WorldWeather.kt index 148edb0f1..e0d8846e0 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/weather/WorldWeather.kt +++ b/src/main/java/de/bixilon/minosoft/data/world/weather/WorldWeather.kt @@ -14,7 +14,7 @@ package de.bixilon.minosoft.data.world.weather data class WorldWeather( - val rain: Float = 1.0f, + val rain: Float = 0.0f, val thunder: Float = 0.0f, ) { val raining: Boolean get() = rain > 0.0f diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/DebugHUDElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/DebugHUDElement.kt index b73d4ee1a..d179afb26 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/DebugHUDElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/other/DebugHUDElement.kt @@ -52,13 +52,11 @@ import de.bixilon.minosoft.gui.rendering.world.WorldRenderer import de.bixilon.minosoft.modding.event.listener.CallbackEventListener.Companion.listen import de.bixilon.minosoft.properties.MinosoftProperties import de.bixilon.minosoft.properties.MinosoftPropertiesLoader -import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.terminal.RunConfiguration import de.bixilon.minosoft.util.KUtil.format import de.bixilon.minosoft.util.KUtil.toResourceLocation import de.bixilon.minosoft.util.Reference import de.bixilon.minosoft.util.SystemInformation -import kotlin.math.abs class DebugHUDElement(guiRenderer: GUIRenderer) : Element(guiRenderer), LayoutedElement, Initializable { private val connection = renderWindow.connection @@ -177,7 +175,7 @@ class DebugHUDElement(guiRenderer: GUIRenderer) : Element(guiRenderer), Layouted connection.world::time.observe(this) { // ToDo: Kutil 1.18: Allow instant fire text = BaseComponent( "Time ", it.time, " (", it.phase, ")", ", cycling=", it.cycling, "\n", - "Date ", "day=", abs(it.age) / ProtocolDefinition.TICKS_PER_DAY, " (", it.moonPhase, ")" + "Date ", "day=", it.day, " (", it.moonPhase, ")" ) } } 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 6edca5079..c534af6c2 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 @@ -24,6 +24,7 @@ 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 import de.bixilon.minosoft.gui.rendering.sky.properties.OverworldSkyProperties +import de.bixilon.minosoft.gui.rendering.sky.sun.SunRenderer import de.bixilon.minosoft.gui.rendering.system.base.DepthFunctions import de.bixilon.minosoft.gui.rendering.system.base.PolygonModes import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem @@ -44,6 +45,7 @@ class SkyRenderer( var matrix by watched(Mat4()) val profile = connection.profiles.rendering.sky private val box = SkyboxRenderer(this).register() + private val sun = SunRenderer(this).register() override fun init(latch: CountUpAndDownLatch) { for (renderer in renderer) { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/sky/box/SkyboxRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/box/SkyboxRenderer.kt index a1da8bebf..f68b1b329 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/sky/box/SkyboxRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/box/SkyboxRenderer.kt @@ -43,6 +43,7 @@ import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.interpolateLinea import de.bixilon.minosoft.modding.event.events.blocks.chunk.ChunkDataChangeEvent import de.bixilon.minosoft.modding.event.listener.CallbackEventListener.Companion.listen import de.bixilon.minosoft.util.KUtil.minosoft +import de.bixilon.minosoft.util.KUtil.murmur64 import java.util.* import kotlin.math.PI import kotlin.math.abs @@ -120,17 +121,6 @@ class SkyboxRenderer( } } - @Deprecated("Kutil 1.18") - fun Long.murmur64(): Long { - var value = this - value = value xor (value ushr 33) - value *= -0xae502812aa7333L - value = value xor (value ushr 33) - value *= -0x3b314601e57a13adL - value = value xor (value ushr 33) - return value - } - override fun init() { colorShader.load() diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/sky/sun/SunMesh.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/sun/SunMesh.kt new file mode 100644 index 000000000..7b0dfdeca --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/sun/SunMesh.kt @@ -0,0 +1,44 @@ +/* + * Minosoft + * Copyright (C) 2020-2022 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.gui.rendering.sky.sun + +import de.bixilon.kotlinglm.vec2.Vec2 +import de.bixilon.kotlinglm.vec3.Vec3 +import de.bixilon.minosoft.gui.rendering.RenderWindow +import de.bixilon.minosoft.gui.rendering.system.base.MeshUtil.buffer +import de.bixilon.minosoft.gui.rendering.system.base.buffer.vertex.PrimitiveTypes +import de.bixilon.minosoft.gui.rendering.system.base.texture.texture.AbstractTexture +import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh +import de.bixilon.minosoft.gui.rendering.util.mesh.MeshStruct + +open class SunMesh(renderWindow: RenderWindow, primitiveType: PrimitiveTypes = renderWindow.renderSystem.preferredPrimitiveType) : Mesh(renderWindow, SunMeshStruct, primitiveType, initialCacheSize = 2 * 3 * SunMeshStruct.FLOATS_PER_VERTEX) { + + fun addVertex(position: Vec3, texture: AbstractTexture, uv: Vec2) { + data.add(position.x) + data.add(position.y) + data.add(position.z) + data.add(uv.x) + data.add(uv.y) + data.add(texture.renderData.shaderTextureId.buffer()) + } + + + data class SunMeshStruct( + val position: Vec3, + val uv: Vec2, + val indexLayerAnimation: Int, + ) { + companion object : MeshStruct(SunMeshStruct::class) + } +} 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 new file mode 100644 index 000000000..ff0972ff7 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/sky/sun/SunRenderer.kt @@ -0,0 +1,136 @@ +/* + * Minosoft + * Copyright (C) 2020-2022 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +package de.bixilon.minosoft.gui.rendering.sky.sun + +import de.bixilon.kotlinglm.func.rad +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.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.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 +import de.bixilon.minosoft.util.KUtil.murmur64 +import java.util.* +import kotlin.math.pow + +class SunRenderer( + private val sky: SkyRenderer, +) : 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 var day = -1L + private var matrix = Mat4() + private var matrixUpdate = true + private var sunModifier = 0.0f + + override fun init() { + shader.load() + } + + private fun prepareMesh() { + mesh.addYQuad( + start = Vec2(-0.15f, -0.15f), + y = 1f, + end = Vec2(+0.15f, +0.15f), + vertexConsumer = { position, uv -> + mesh.addVertex( + position = position, + texture = texture, + uv = uv, + ) + } + ) + + mesh.load() + } + + override fun postInit() { + prepareMesh() +// sky.renderWindow.textureManager.staticTextures.use(shader) + sky.renderWindow.connection.events.listen { calculateMatrix(it.projectionMatrix, it.viewMatrix) } + } + + private fun getSunAngle(): Float { + val time = sky.renderWindow.connection.world.time + + // 270: sunrise (23k-0k) + // 0: day (0-12k) + // 90: sunset (12k-13k) + // 180: night (13k-23k) + + + return ((time.time / ProtocolDefinition.TICKS_PER_DAYf) - 0.25f) * 360.0f + } + + private fun calculateSunIntensity(): Float { + val time = sky.renderWindow.connection.world.time + return when (time.phase) { + DayPhases.NIGHT -> 0.0f + DayPhases.DAY -> 1.0f + DayPhases.SUNSET -> (1.0f - time.progress).pow(2) + DayPhases.SUNRISE -> time.progress.pow(2) + } + } + + private fun calculateMatrix(projection: Mat4 = sky.renderWindow.camera.matrixHandler.projectionMatrix, view: Mat4 = sky.renderWindow.camera.matrixHandler.viewMatrix) { + val matrix = projection * view.toMat3().toMat4() + + matrix.rotateAssign(getSunAngle().rad, Vec3(0, 0, -1)) + matrix.translateAssign(Vec3(0.0f, -0.01f, 0.0f)) // prevents face fighting + + matrix.translateAssign(Vec3(0.0f, -sunModifier, 0.0f)) // moves the sun closer to the player based on the day (sun appears bigger) + + + this.matrix = matrix + this.matrixUpdate = true + } + + override fun onTimeUpdate(time: WorldTime) { + if (this.day != time.day) { + this.day = time.day + sunModifier = Random(day.murmur64()).nextFloat(0.0f, 0.2f) + } + } + + override fun draw() { + shader.use() + calculateMatrix() + if (matrixUpdate) { + shader.setMat4("uSunMatrix", matrix) + shader.setVec4("uTintColor", Vec4(1.0f, 1.0f, 1.0f, calculateSunIntensity())) + this.matrixUpdate = false + } + sky.renderSystem.enable(RenderingCapabilities.BLENDING) + + mesh.unload() + mesh = SunMesh(sky.renderWindow) + prepareMesh() + mesh.draw() + sky.renderSystem.disable(RenderingCapabilities.BLENDING) + } + + companion object { + private val SUN = minecraft("environment/sun").texture() + } +} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/util/mesh/Mesh.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/util/mesh/Mesh.kt index 14f308f8d..db1148d7f 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/util/mesh/Mesh.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/util/mesh/Mesh.kt @@ -85,13 +85,16 @@ abstract class Mesh( addQuad(positions, uvStart, uvEnd, vertexConsumer) } - fun addYQuad(start: Vec2, y: Float, end: Vec2, uvStart: Vec2 = Vec2(0.0f, 0.0f), uvEnd: Vec2 = Vec2(1.0f, 1.0f), vertexConsumer: (position: Vec3, uv: Vec2) -> Unit) { + fun addYQuad(start: Vec2, y: Float, end: Vec2, uvStart: Vec2 = Vec2(0.0f, 0.0f), uvEnd: Vec2 = Vec2(1.0f, 1.0f), reversed: Boolean = false, vertexConsumer: (position: Vec3, uv: Vec2) -> Unit) { val positions = arrayOf( Vec3(start.x, y, start.y), Vec3(start.x, y, end.y), Vec3(end.x, y, end.y), Vec3(end.x, y, start.y), ) + if (reversed) { + positions.reverse() + } addQuad(positions, uvStart, uvEnd, vertexConsumer) } diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/ConnectionUtil.kt b/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/ConnectionUtil.kt index 74c9ae1e4..1fed154e0 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/ConnectionUtil.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/network/connection/play/ConnectionUtil.kt @@ -25,6 +25,8 @@ import de.bixilon.minosoft.data.entities.entities.player.local.HealthCondition import de.bixilon.minosoft.data.text.BaseComponent import de.bixilon.minosoft.data.text.ChatComponent import de.bixilon.minosoft.data.text.formatting.color.ChatColors +import de.bixilon.minosoft.data.world.time.WorldTime +import de.bixilon.minosoft.data.world.weather.WorldWeather import de.bixilon.minosoft.gui.rendering.RenderConstants import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.EMPTY import de.bixilon.minosoft.modding.event.events.InternalMessageReceiveEvent @@ -128,5 +130,7 @@ class ConnectionUtil( connection.fire(ContainerCloseEvent(connection, it.id ?: -1, it)) } connection.player.healthCondition = HealthCondition() + connection.world.time = WorldTime(connection.world) + connection.world.weather = WorldWeather() } } diff --git a/src/main/java/de/bixilon/minosoft/util/KUtil.kt b/src/main/java/de/bixilon/minosoft/util/KUtil.kt index 674b4025b..64b303188 100644 --- a/src/main/java/de/bixilon/minosoft/util/KUtil.kt +++ b/src/main/java/de/bixilon/minosoft/util/KUtil.kt @@ -318,4 +318,15 @@ object KUtil { if (this is CharSequence) return this.length return toString().length } + + @Deprecated("Kutil 1.18") + fun Long.murmur64(): Long { + var value = this + value = value xor (value ushr 33) + value *= -0xae502812aa7333L + value = value xor (value ushr 33) + value *= -0x3b314601e57a13adL + value = value xor (value ushr 33) + return value + } } diff --git a/src/main/resources/assets/minosoft/rendering/shader/weather/sun/sun.fsh b/src/main/resources/assets/minosoft/rendering/shader/weather/sun/sun.fsh new file mode 100644 index 000000000..6a7466a32 --- /dev/null +++ b/src/main/resources/assets/minosoft/rendering/shader/weather/sun/sun.fsh @@ -0,0 +1,33 @@ +/* + * Minosoft + * Copyright (C) 2020 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program.If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +#version 330 core + +out vec4 foutColor; + +flat in uint finTextureIndex; +in vec3 finTextureCoordinates; + +uniform vec4 uTintColor; + +// #include "minosoft:texture" + + + +void main() { + // vec4 texelColor = getTexture(finTextureIndex, finTextureCoordinates); + foutColor = vec4(1.0f, 0.5f, 0.5f, 1.0f) * uTintColor; + if (foutColor.a == 0.0f) { + discard; + } +} diff --git a/src/main/resources/assets/minosoft/rendering/shader/weather/sun/sun.vsh b/src/main/resources/assets/minosoft/rendering/shader/weather/sun/sun.vsh new file mode 100644 index 000000000..bc7486059 --- /dev/null +++ b/src/main/resources/assets/minosoft/rendering/shader/weather/sun/sun.vsh @@ -0,0 +1,32 @@ +/* + * Minosoft + * Copyright (C) 2020 Moritz Zwerger + * + * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program.If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ + +#version 330 core + +layout (location = 0) in vec3 vinPosition; +layout (location = 1) in vec2 vinUV; +layout (location = 2) in uint vinIndexLayerAnimation; + +//flat out uint finTextureIndex; +//out vec3 finTextureCoordinates; + +uniform mat4 uSunMatrix; + +#include "minosoft:color" + +void main() { + gl_Position = uSunMatrix * vec4(vinPosition, 1.0f); + + // finTextureIndex = vinIndexLayerAnimation >> 28u; + // finTextureCoordinates = vec3(vinUV, ((vinIndexLayerAnimation >> 12) & 0xFFFFu)); +}