From d9fbee255932be73a37936b6f44c9677644ab91c Mon Sep 17 00:00:00 2001 From: Bixilon Date: Tue, 14 Dec 2021 10:14:26 +0100 Subject: [PATCH] refactor weather and time storing, fix some world bugs #59 --- .../RainGradientSetGameEventHandler.kt | 2 +- .../ThunderGradientSetGameEventHandler.kt | 2 +- .../rain/RainStartGameEventHandler.kt | 4 +- .../handlers/rain/RainStopGameEventHandler.kt | 4 +- .../de/bixilon/minosoft/data/world/World.kt | 34 ++--------------- .../minosoft/data/world/time/WorldTime.kt | 37 +++++++++++++++++++ .../data/world/weather/WorldWeather.kt | 8 ++++ .../minosoft/gui/rendering/sky/SkyRenderer.kt | 14 +++---- .../minosoft/gui/rendering/world/LightMap.kt | 4 +- .../modding/event/events/TimeChangeEvent.kt | 3 +- .../packets/s2c/play/WorldTimeSetS2CP.kt | 5 ++- 11 files changed, 69 insertions(+), 48 deletions(-) create mode 100644 src/main/java/de/bixilon/minosoft/data/world/time/WorldTime.kt create mode 100644 src/main/java/de/bixilon/minosoft/data/world/weather/WorldWeather.kt diff --git a/src/main/java/de/bixilon/minosoft/data/registries/other/game/event/handlers/gradients/RainGradientSetGameEventHandler.kt b/src/main/java/de/bixilon/minosoft/data/registries/other/game/event/handlers/gradients/RainGradientSetGameEventHandler.kt index 882338ac0..5cd0db824 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/other/game/event/handlers/gradients/RainGradientSetGameEventHandler.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/other/game/event/handlers/gradients/RainGradientSetGameEventHandler.kt @@ -22,6 +22,6 @@ object RainGradientSetGameEventHandler : GameEventHandler { override val RESOURCE_LOCATION: ResourceLocation = "minecraft:rain_gradient_set".toResourceLocation() override fun handle(data: Float, connection: PlayConnection) { - connection.world.rainGradient = data + connection.world.weather.rainGradient = data } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/other/game/event/handlers/gradients/ThunderGradientSetGameEventHandler.kt b/src/main/java/de/bixilon/minosoft/data/registries/other/game/event/handlers/gradients/ThunderGradientSetGameEventHandler.kt index 41688f1bb..31d88c2f2 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/other/game/event/handlers/gradients/ThunderGradientSetGameEventHandler.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/other/game/event/handlers/gradients/ThunderGradientSetGameEventHandler.kt @@ -22,6 +22,6 @@ object ThunderGradientSetGameEventHandler : GameEventHandler { override val RESOURCE_LOCATION: ResourceLocation = "minecraft:thunder_gradient_set".toResourceLocation() override fun handle(data: Float, connection: PlayConnection) { - connection.world.thunderGradient = data + connection.world.weather.thunderGradient = data } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/other/game/event/handlers/rain/RainStartGameEventHandler.kt b/src/main/java/de/bixilon/minosoft/data/registries/other/game/event/handlers/rain/RainStartGameEventHandler.kt index 5630096be..695bdcd97 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/other/game/event/handlers/rain/RainStartGameEventHandler.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/other/game/event/handlers/rain/RainStartGameEventHandler.kt @@ -22,7 +22,7 @@ object RainStartGameEventHandler : GameEventHandler { override val RESOURCE_LOCATION: ResourceLocation = "minecraft:rain_start".toResourceLocation() override fun handle(data: Float, connection: PlayConnection) { - connection.world.raining = true - connection.world.rainGradient = 1.0f + connection.world.weather.raining = true + connection.world.weather.rainGradient = 1.0f } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/other/game/event/handlers/rain/RainStopGameEventHandler.kt b/src/main/java/de/bixilon/minosoft/data/registries/other/game/event/handlers/rain/RainStopGameEventHandler.kt index 2501728fd..253fe21a3 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/other/game/event/handlers/rain/RainStopGameEventHandler.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/other/game/event/handlers/rain/RainStopGameEventHandler.kt @@ -22,7 +22,7 @@ object RainStopGameEventHandler : GameEventHandler { override val RESOURCE_LOCATION: ResourceLocation = "minecraft:rain_stop".toResourceLocation() override fun handle(data: Float, connection: PlayConnection) { - connection.world.raining = false - connection.world.rainGradient = 0.0f + connection.world.weather.raining = false + connection.world.weather.rainGradient = 0.0f } } diff --git a/src/main/java/de/bixilon/minosoft/data/world/World.kt b/src/main/java/de/bixilon/minosoft/data/world/World.kt index f83b82b55..877e6f9f4 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/World.kt +++ b/src/main/java/de/bixilon/minosoft/data/world/World.kt @@ -22,7 +22,9 @@ import de.bixilon.minosoft.data.registries.blocks.types.FluidBlock import de.bixilon.minosoft.data.registries.dimension.DimensionProperties import de.bixilon.minosoft.data.world.biome.accessor.BiomeAccessor import de.bixilon.minosoft.data.world.biome.accessor.NoiseBiomeAccessor +import de.bixilon.minosoft.data.world.time.WorldTime import de.bixilon.minosoft.data.world.view.WorldView +import de.bixilon.minosoft.data.world.weather.WorldWeather import de.bixilon.minosoft.gui.rendering.particle.ParticleRenderer import de.bixilon.minosoft.gui.rendering.particle.types.Particle import de.bixilon.minosoft.gui.rendering.util.VecUtil.blockPosition @@ -35,10 +37,8 @@ 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.protocol.network.connection.play.PlayConnection -import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.util.KUtil.lockMapOf import de.bixilon.minosoft.util.KUtil.toSynchronizedMap -import de.bixilon.minosoft.util.MMath import de.bixilon.minosoft.util.ReadWriteLock import de.bixilon.minosoft.util.chunk.ChunkUtil.canBuildBiomeCache import de.bixilon.minosoft.util.chunk.ChunkUtil.getChunkNeighbourPositions @@ -46,13 +46,9 @@ import de.bixilon.minosoft.util.chunk.ChunkUtil.isInViewDistance import de.bixilon.minosoft.util.chunk.ChunkUtil.received import de.bixilon.minosoft.util.collections.LockMap import de.bixilon.minosoft.util.delegate.DelegateManager.delegate -import glm_.func.common.clamp import glm_.vec2.Vec2i import glm_.vec3.Vec3 import glm_.vec3.Vec3i -import kotlin.math.PI -import kotlin.math.abs -import kotlin.math.cos import kotlin.random.Random /** @@ -70,11 +66,8 @@ class World( var difficulty: Difficulties? = null var difficultyLocked = false var hashedSeed = 0L - var time = 0L - var age = 0L - var raining = false - var rainGradient = 0.0f - var thunderGradient = 0.0f + val time = WorldTime(this) + val weather = WorldWeather() val view = WorldView(connection) private val random = Random @@ -234,25 +227,6 @@ class World( return get(blockPosition.chunkPosition)?.getLight(blockPosition.inChunkPosition) ?: 0x00 } - val skyAngle: Float - get() { - val fractionalPath = MMath.fractionalPart(abs(time) / ProtocolDefinition.TICKS_PER_DAYf - 0.25) - val angle = 0.5 - cos(fractionalPath * Math.PI) / 2.0 - return ((fractionalPath * 2.0 + angle) / 3.0).toFloat() - } - - val lightBase: Double - get() { - var base = 1.0f - (cos(skyAngle * 2.0 * PI) * 2.0 + 0.2) - base = base.clamp(0.0, 1.0) - base = 1.0 - base - - base *= 1.0 - ((rainGradient * 5.0) / 16.0) - base *= 1.0 - (((thunderGradient * rainGradient) * 5.0) / 16.0) - return base * 0.8 + 0.2 - } - - /** * @return All 8 neighbour chunks */ 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 new file mode 100644 index 000000000..426f74730 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/world/time/WorldTime.kt @@ -0,0 +1,37 @@ +package de.bixilon.minosoft.data.world.time + +import de.bixilon.minosoft.data.world.World +import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition +import de.bixilon.minosoft.util.MMath +import glm_.func.common.clamp +import kotlin.math.PI +import kotlin.math.abs +import kotlin.math.cos + +class WorldTime( + private val world: World, +) { + var time = 0L + var age = 0L + + + val skyAngle: Float + get() { + val fractionalPath = MMath.fractionalPart(abs(time) / ProtocolDefinition.TICKS_PER_DAYf - 0.25) + val angle = 0.5 - cos(fractionalPath * Math.PI) / 2.0 + return ((fractionalPath * 2.0 + angle) / 3.0).toFloat() + } + + + val lightBase: Double + get() { + var base = 1.0f - (cos(skyAngle * 2.0 * PI) * 2.0 + 0.2) + base = base.clamp(0.0, 1.0) + base = 1.0 - base + + base *= 1.0 - ((world.weather.rainGradient * 5.0) / 16.0) + base *= 1.0 - (((world.weather.thunderGradient * world.weather.rainGradient) * 5.0) / 16.0) + return base * 0.8 + 0.2 + } + +} 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 new file mode 100644 index 000000000..c83f647a4 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/world/weather/WorldWeather.kt @@ -0,0 +1,8 @@ +package de.bixilon.minosoft.data.world.weather + +class WorldWeather { + + var raining = false + var rainGradient = 0.0f + var thunderGradient = 0.0f +} 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 a96575ab2..94305da5c 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 @@ -46,7 +46,7 @@ class SkyRenderer( private val skyboxMesh = SkyboxMesh(renderWindow) private var skySunMesh = SimpleTextureMesh(renderWindow) private lateinit var sunTexture: AbstractTexture - private var sunMatrixUpToDate: Boolean = true + private var updateSun: Boolean = true var baseColor = RenderConstants.DEFAULT_SKY_COLOR @@ -66,22 +66,21 @@ class SkyRenderer( } }) connection.registerEvent(CallbackEventInvoker.of { - if (connection.world.time != it.time) { - sunMatrixUpToDate = true + if (connection.world.time.time != it.time) { + updateSun = true } }) sunTexture = renderWindow.textureManager.staticTextures.createTexture(SUN_TEXTURE_RESOURCE_LOCATION) } private fun setSunMatrix(projectionViewMatrix: Mat4) { - val timeAngle = (connection.world.skyAngle * 360.0f).rad + val timeAngle = (connection.world.time.skyAngle * 360.0f).rad val rotatedMatrix = if (timeAngle == 0.0f) { projectionViewMatrix } else { projectionViewMatrix.rotate(timeAngle, Vec3(0.0f, 0.0f, 1.0f)) } skySunShader.use().setMat4("uSkyViewProjectionMatrix", rotatedMatrix) - sunMatrixUpToDate = false } override fun postInit() { @@ -89,7 +88,7 @@ class SkyRenderer( } private fun drawSun() { - if (sunMatrixUpToDate) { + if (updateSun) { setSunMatrix(renderWindow.camera.matrixHandler.projectionMatrix * renderWindow.camera.matrixHandler.viewMatrix.toMat3().toMat4()) skySunMesh.unload() @@ -102,11 +101,12 @@ class SkyRenderer( position = position, texture = sunTexture, uv = uv, - tintColor = ChatColors.WHITE.with(alpha = 1.0f - connection.world.rainGradient), // ToDo: Depends on time + tintColor = ChatColors.WHITE.with(alpha = 1.0f - connection.world.weather.rainGradient), // ToDo: Depends on time ) } ) skySunMesh.load() + updateSun = false } renderSystem.enable(RenderingCapabilities.BLENDING) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/world/LightMap.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/world/LightMap.kt index 8cd0e40ad..09af66f51 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/world/LightMap.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/world/LightMap.kt @@ -29,7 +29,7 @@ import kotlin.math.max import kotlin.math.pow import kotlin.math.sin - +@Deprecated("Needs refactoring") class LightMap(private val connection: PlayConnection) { private val profile = connection.profiles.rendering.light private val nightVisionStatusEffect = connection.registries.statusEffectRegistry[DefaultStatusEffects.NIGHT_VISION] @@ -50,7 +50,7 @@ class LightMap(private val connection: PlayConnection) { } fun update() { - val skyGradient = connection.world.lightBase.toFloat() + val skyGradient = connection.world.time.lightBase.toFloat() // ToDo: Lightning diff --git a/src/main/java/de/bixilon/minosoft/modding/event/events/TimeChangeEvent.kt b/src/main/java/de/bixilon/minosoft/modding/event/events/TimeChangeEvent.kt index 3df4deb97..fe9046ec6 100644 --- a/src/main/java/de/bixilon/minosoft/modding/event/events/TimeChangeEvent.kt +++ b/src/main/java/de/bixilon/minosoft/modding/event/events/TimeChangeEvent.kt @@ -16,6 +16,7 @@ import de.bixilon.minosoft.modding.event.EventInitiators import de.bixilon.minosoft.modding.event.events.connection.play.PlayConnectionEvent import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.protocol.packets.s2c.play.WorldTimeSetS2CP +import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition class TimeChangeEvent( connection: PlayConnection, @@ -25,5 +26,5 @@ class TimeChangeEvent( ) : PlayConnectionEvent(connection, initiator) { - constructor(connection: PlayConnection, packet: WorldTimeSetS2CP) : this(connection, EventInitiators.SERVER, packet.age, packet.time) + constructor(connection: PlayConnection, packet: WorldTimeSetS2CP) : this(connection, EventInitiators.SERVER, packet.age, packet.time % ProtocolDefinition.TICKS_PER_DAY) } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/WorldTimeSetS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/WorldTimeSetS2CP.kt index 32538dcb8..c787faada 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/WorldTimeSetS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/WorldTimeSetS2CP.kt @@ -16,6 +16,7 @@ import de.bixilon.minosoft.modding.event.events.TimeChangeEvent import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer +import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import de.bixilon.minosoft.util.logging.Log import de.bixilon.minosoft.util.logging.LogLevels import de.bixilon.minosoft.util.logging.LogMessageType @@ -25,8 +26,8 @@ class WorldTimeSetS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() { val time = buffer.readLong() override fun handle(connection: PlayConnection) { - connection.world.age = age - connection.world.time = time + connection.world.time.age = age + connection.world.time.time = time % ProtocolDefinition.TICKS_PER_DAY connection.fireEvent(TimeChangeEvent(connection, this)) }