From 52ad8f0c463868f43a011106cfc93a22b9afeaef Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sat, 5 Aug 2023 17:20:35 +0900 Subject: [PATCH] improved skybox model --- assets/clut/skybox.png | 4 +- src/net/torvald/colourutil/CIEXYZUtil.kt | 10 +++++ src/net/torvald/parametricsky/Application.kt | 38 ++++++++++++------- .../clut/GenerateSkyboxTextureAtlas.kt | 2 +- src/net/torvald/terrarum/clut/Skybox.kt | 21 ++++++---- 5 files changed, 50 insertions(+), 25 deletions(-) diff --git a/assets/clut/skybox.png b/assets/clut/skybox.png index 7f2e81e21..8e0d6fce9 100644 --- a/assets/clut/skybox.png +++ b/assets/clut/skybox.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ee25e84e63f8ad63e8b3b1bd1005bb259220da8f068d22cb7e60c775ded9e565 -size 492946 +oid sha256:8e2222c513b927754c4ea04554677c4649c51e255763096026547a4c00d4fadf +size 488682 diff --git a/src/net/torvald/colourutil/CIEXYZUtil.kt b/src/net/torvald/colourutil/CIEXYZUtil.kt index 7a8acd972..2ae93a908 100644 --- a/src/net/torvald/colourutil/CIEXYZUtil.kt +++ b/src/net/torvald/colourutil/CIEXYZUtil.kt @@ -192,6 +192,16 @@ fun CIEXYZ.toColorRaw(): Color { return Color(rgb.r, rgb.g, rgb.b, rgb.alpha) } +fun CIEXYZ.toYXY(): CIEYXY { + val dot = this.X + this.Y + this.Z + return CIEYXY( + this.Y, + this.X / dot, + this.Y / dot, + this.alpha + ) +} + fun CIEYXY.toXYZ(): CIEXYZ { return CIEXYZ(x * yy / y, yy, (1f - x - y) * yy / y) } diff --git a/src/net/torvald/parametricsky/Application.kt b/src/net/torvald/parametricsky/Application.kt index a1c5d32c0..62902fa9f 100644 --- a/src/net/torvald/parametricsky/Application.kt +++ b/src/net/torvald/parametricsky/Application.kt @@ -12,16 +12,11 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch import net.torvald.unicode.EMDASH import net.torvald.colourutil.* import net.torvald.parametricsky.datasets.DatasetCIEXYZ -import net.torvald.parametricsky.datasets.DatasetRGB -import net.torvald.parametricsky.datasets.DatasetSpectral import net.torvald.terrarum.abs import net.torvald.terrarum.inUse import net.torvald.terrarum.modulebasegame.worldgenerator.HALF_PI -import net.torvald.terrarum.modulebasegame.worldgenerator.TWO_PI import java.awt.BorderLayout import java.awt.Dimension -import java.awt.FlowLayout -import java.awt.GridLayout import java.lang.Math.pow import javax.swing.* import kotlin.math.* @@ -94,7 +89,16 @@ class Application(val WIDTH: Int, val HEIGHT: Int) : Game() { if (turbidity <= 0) throw IllegalStateException() // we need to use different model-state to accommodate different albedo for each spectral band but oh well... - genTexLoop(model) + genTexLoop(model, elevation) +// println("$elevation\t${ymaxDisp.text}\t${ymaxDisp2.text}") + + + /*for (elev in -75..75) { + val elevation = Math.toRadians(elev.toDouble()) + val model = ArHosekSkyModel.arhosek_xyz_skymodelstate_alloc_init(turbidity, albedo, elevation.abs()) + genTexLoop(model, elevation) + println("$elev\t${ymaxDisp.text}\t${ymaxDisp2.text}") + }*/ val tex = Texture(oneScreen) @@ -142,14 +146,20 @@ class Application(val WIDTH: Int, val HEIGHT: Int) : Game() { ) } else { - val elevation1 = -Math.toDegrees(elevation) - val elevation2 = -Math.toDegrees(elevation) / 28.5 - val scale = (1f - (1f - 1f / 1.8.pow(elevation1)) * 0.97f).toFloat() - val scale2 = (1.0 - (elevation2.pow(E) / E.pow(elevation2))*0.8).toFloat() + // maths model: https://www.desmos.com/calculator/cwi7iyzygg + + val x = -Math.toDegrees(elevation).toFloat() +// val elevation2 = -Math.toDegrees(elevation) / 28.5 + val p = 3.5f + val q = 7.5f + val s = -0.2f + val f = (1f - (1f - 1f / 1.8f.pow(x)) * 0.97f).toFloat() +// val g = (1.0 - (elevation2.pow(E) / E.pow(elevation2))*0.8).toFloat() + val h = ((x / q).pow(p) + 1f).pow(s) CIEXYZ( - this.X.scaleFun() * scale * scale2, - this.Y.scaleFun() * scale * scale2, - this.Z.scaleFun() * scale * scale2, + this.X.scaleFun() * f * h, + this.Y.scaleFun() * f * h, + this.Z.scaleFun() * f * h, this.alpha ) } @@ -161,7 +171,7 @@ class Application(val WIDTH: Int, val HEIGHT: Int) : Game() { * Generated texture is as if you took the panorama picture of sky: up 70deg to horizon, east-south-west; * with sun not moving (sun is at exact south, sun's height is adjustable) */ - private fun genTexLoop(state: ArHosekSkyModelState) { + private fun genTexLoop(state: ArHosekSkyModelState, elevation: Double) { fun normaliseY(y: Double): Float { var v = y.coerceAtLeast(0.0) diff --git a/src/net/torvald/terrarum/clut/GenerateSkyboxTextureAtlas.kt b/src/net/torvald/terrarum/clut/GenerateSkyboxTextureAtlas.kt index a604a7403..51d97cc6a 100644 --- a/src/net/torvald/terrarum/clut/GenerateSkyboxTextureAtlas.kt +++ b/src/net/torvald/terrarum/clut/GenerateSkyboxTextureAtlas.kt @@ -93,7 +93,7 @@ fun main() { println("Atlas generation done!") - File("./assets/mods/basegame/weathers/main_skybox.tga").writeBytes(bytes) + File("./assets/clut/skybox.tga").writeBytes(bytes) } private val bytesLut = arrayOf(2,1,0,3,2,1,0,3) // For some reason BGRA order is what makes it work \ No newline at end of file diff --git a/src/net/torvald/terrarum/clut/Skybox.kt b/src/net/torvald/terrarum/clut/Skybox.kt index d8bc16b6c..c39f2c478 100644 --- a/src/net/torvald/terrarum/clut/Skybox.kt +++ b/src/net/torvald/terrarum/clut/Skybox.kt @@ -88,15 +88,20 @@ object Skybox : Disposable { ) } else { - val deg1 = (-elevationDeg / elevMax).pow(0.93).times(-elevMax) - val elevation1 = -deg1 - val elevation2 = -deg1 / 28.5 - val scale = (1f - (1f - 1f / 1.8.pow(elevation1)) * 0.97f).toFloat() - val scale2 = (1.0 - (elevation2.pow(E) / E.pow(elevation2))*0.8).toFloat() + // maths model: https://www.desmos.com/calculator/cwi7iyzygg + + val x = -elevationDeg.toFloat() +// val elevation2 = elevationDeg.toFloat() / 28.5f + val p = 3.5f + val q = 7.5f + val s = -0.2f + val f = (1f - (1f - 1f / 1.8f.pow(x)) * 0.97f).toFloat() +// val g = (1.0 - (elevation2.pow(E) / E.pow(elevation2))*0.8).toFloat() + val h = ((x / q).pow(p) + 1f).pow(s) CIEXYZ( - this.X.scaleFun() * scale * scale2, - this.Y.scaleFun() * scale * scale2, - this.Z.scaleFun() * scale * scale2, + this.X.scaleFun() * f * h, + this.Y.scaleFun() * f * h, + this.Z.scaleFun() * f * h, this.alpha ) }