diff --git a/src/net/torvald/terrarum/blockproperties/BlockPropUtil.kt b/src/net/torvald/terrarum/blockproperties/BlockPropUtil.kt index 3102fb163..833b8f010 100644 --- a/src/net/torvald/terrarum/blockproperties/BlockPropUtil.kt +++ b/src/net/torvald/terrarum/blockproperties/BlockPropUtil.kt @@ -108,7 +108,7 @@ object BlockPropUtil { return when (prop.dynamicLuminosityFunction) { 1 -> getTorchFlicker(prop) 2 -> (INGAME.world).globalLight.cpy() // current global light - 3 -> WeatherMixer.getGlobalLightOfTime(INGAME.world, WorldTime.DAY_LENGTH / 2).cpy() // daylight at noon + 3 -> WeatherMixer.getGlobalLightOfTimeOfNoon().cpy() // daylight at noon 4 -> getSlowBreath(prop) 5 -> getPulsate(prop) else -> prop.baseLumCol diff --git a/src/net/torvald/terrarum/gameworld/WorldTime.kt b/src/net/torvald/terrarum/gameworld/WorldTime.kt index 16e8c9cb2..2b4441e3b 100644 --- a/src/net/torvald/terrarum/gameworld/WorldTime.kt +++ b/src/net/torvald/terrarum/gameworld/WorldTime.kt @@ -121,6 +121,17 @@ class WorldTime(initTime: Long = 0L) { inline val moonPhase: Double get() = (TIME_T.plus(1700000L) % LUNAR_CYCLE).toDouble() / LUNAR_CYCLE + fun getSolarElevationAt(ordinalDay: Int, second: Int): Double { + val TIME_T = DAY_LENGTH * ordinalDay + second + + val x = (TIME_T % YEAR_SECONDS).toDouble() / DAY_LENGTH + 15 // decimal days. One full day = 1.0 + val d = -23.44 * cos(TWO_PI * x / YEAR_DAYS) + + // 51.56 and 23.44 will make yearly min/max elevation to be 75deg + // -0.2504264: a number that makes y=min when x=0 (x=0 is midnight) + return 51.56 * sin(TWO_PI * (x - 0.2504264)) + d + } + val solarElevationDeg: Double get() { val x = (TIME_T % YEAR_SECONDS).toDouble() / DAY_LENGTH + 15 // decimal days. One full day = 1.0 diff --git a/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt b/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt index 6fc96180b..fec1bbf4d 100644 --- a/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt +++ b/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt @@ -287,7 +287,7 @@ class TitleScreen(batch: FlippingSpriteBatch) : IngameInstance(batch) { val forcedTime = 39693 // demoWorld.globalLight = WeatherMixer.globalLightNow - demoWorld.globalLight = WeatherMixer.getGlobalLightOfTime(demoWorld, forcedTime) + demoWorld.globalLight = WeatherMixer.getGlobalLightOfTimeOfNoon() demoWorld.updateWorldTime(delta) // WeatherMixer.update(delta, cameraPlayer, demoWorld) WeatherMixer.forceTimeAt = forcedTime diff --git a/src/net/torvald/terrarum/weather/WeatherMixer.kt b/src/net/torvald/terrarum/weather/WeatherMixer.kt index 9d320fc2b..c540752cb 100644 --- a/src/net/torvald/terrarum/weather/WeatherMixer.kt +++ b/src/net/torvald/terrarum/weather/WeatherMixer.kt @@ -161,9 +161,7 @@ internal object WeatherMixer : RNGConsumer { // we will not care for nextSkybox for now val timeNow = (forceTimeAt ?: world.worldTime.TIME_T.toInt()) % WorldTime.DAY_LENGTH - val skyboxColourMap = currentWeather.skyboxGradColourMap val daylightClut = currentWeather.daylightClut - // calculate global light val globalLight = getGradientColour2(daylightClut, world.worldTime.solarElevationDeg, timeNow) globalLightNow.set(globalLight) @@ -185,7 +183,10 @@ internal object WeatherMixer : RNGConsumer { gdxBlendNormalStraightAlpha() - val deg =world.worldTime.solarElevationDeg + val deg = if (forceTimeAt != null) + world.worldTime.getSolarElevationAt(world.worldTime.ordinalDay, forceTimeAt!!) + else + world.worldTime.solarElevationDeg val degThis = deg.floor() val degNext = degThis + if (timeNow < HALF_DAY) 1 else -1 // Skybox.get has internal coerceIn @@ -224,8 +225,11 @@ internal object WeatherMixer : RNGConsumer { /** * Get a GL of specific time */ - fun getGlobalLightOfTime(world: GameWorld, timeInSec: Int): Cvec = - getGradientColour(world, currentWeather.skyboxGradColourMap, 2, timeInSec) + fun getGlobalLightOfTimeOfNoon(): Cvec { + currentWeather.daylightClut.let { it.get(it.width - 1, 0) }.let { + return Cvec(it.r, it.g, it.b, it.a) + } + } fun getGradientColour(world: GameWorld, colorMap: GdxColorMap, row: Int, timeInSec: Int): Cvec { val dataPointDistance = WorldTime.DAY_LENGTH / colorMap.width