skybox: taller grad window, smooth grad clamping

This commit is contained in:
minjaesong
2023-07-30 03:29:14 +09:00
parent 439cde09fc
commit 33a8112454
4 changed files with 46 additions and 8 deletions

View File

@@ -166,6 +166,19 @@ final public class FastMath {
return ((1f - scale) * startValue) + (scale * endValue); return ((1f - scale) * startValue) + (scale * endValue);
} }
public static double interpolateLinear(double scale, double startValue, double endValue) {
if (startValue == endValue) {
return startValue;
}
if (scale <= 0.0) {
return startValue;
}
if (scale >= 1.0) {
return endValue;
}
return ((1.0 - scale) * startValue) + (scale * endValue);
}
/** /**
* Linear interpolation from startValue to endValue by the given percent. * Linear interpolation from startValue to endValue by the given percent.
* Basically: ((1 - percent) * startValue) + (percent * endValue) * Basically: ((1 - percent) * startValue) + (percent * endValue)

View File

@@ -1,8 +1,10 @@
package net.torvald.terrarum.modulebasegame.clut package net.torvald.terrarum.modulebasegame.clut
import com.badlogic.gdx.graphics.Color
import com.badlogic.gdx.graphics.Pixmap import com.badlogic.gdx.graphics.Pixmap
import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.Texture
import com.badlogic.gdx.utils.Disposable import com.badlogic.gdx.utils.Disposable
import com.jme3.math.FastMath
import net.torvald.colourutil.CIEXYZ import net.torvald.colourutil.CIEXYZ
import net.torvald.colourutil.toColor import net.torvald.colourutil.toColor
import net.torvald.colourutil.toRGB import net.torvald.colourutil.toRGB
@@ -100,18 +102,35 @@ object Skybox : Disposable {
private fun polynomialDecay(p: Double, q: Int, x: Double): Double { private fun polynomialDecay(p: Double, q: Int, x: Double): Double {
val sign = if (q % 2 == 1) -1 else 1 val sign = if (q % 2 == 1) -1 else 1
val a1 = -1.0 / p val a1 = -1.0 / p
val a2 = -1.0 / (1.0 - p) val a2 = 1.0 / (1.0 - p)
val q = q.toDouble() val q = q.toDouble()
return if (x < p) return if (x < p)
sign * a1.pow(q - 1.0) * x.pow(q) + 1.0 sign * a1.pow(q - 1.0) * x.pow(q) + 1.0
else else
sign * a1.pow(q - 1.0) * (x - 1.0).pow(q) sign * a2.pow(q - 1.0) * (x - 1.0).pow(q)
}
private fun polynomialDecay2(p: Double, q: Int, x: Double): Double {
val sign = if (q % 2 == 1) 1 else -1
val a1 = -1.0 / p
val a2 = 1.0 / (1.0 - p)
val q = q.toDouble()
return if (x < p)
sign * a1.pow(q - 1.0) * x.pow(q)
else
sign * a2.pow(q - 1.0) * (x - 1.0).pow(q) + 1.0
} }
private fun superellipsoidDecay(p: Double, x: Double): Double { private fun superellipsoidDecay(p: Double, x: Double): Double {
return 1.0 - (1.0 - (1.0 - x).pow(1.0 / p)).pow(p) return 1.0 - (1.0 - (1.0 - x).pow(1.0 / p)).pow(p)
} }
private fun Double.coerceInSmoothly(low: Double, high: Double): Double {
val x = this.coerceIn(low, high)
val x2 = ((x - low) * (high - low).pow(-1.0))
return FastMath.interpolateLinear(polynomialDecay2(0.5, 2, x2), low, high)
}
private fun getTexturmaps(albedo: Double): Array<Texture> { private fun getTexturmaps(albedo: Double): Array<Texture> {
return Array(elevCnt * turbCnt) { return Array(elevCnt * turbCnt) {
@@ -124,14 +143,16 @@ object Skybox : Disposable {
// printdbg(this, "elev $elevationDeg turb $turbidity") // printdbg(this, "elev $elevationDeg turb $turbidity")
for (y in 0 until gradSize) { for (yp in 0 until gradSize) {
val yi = yp - 6
val xf = -elevationDeg / 90.0 val xf = -elevationDeg / 90.0
var yf = (y + 0.5) / gradSize.toDouble() var yf = (yi / 116.0).coerceInSmoothly(0.0, 0.95)
// experiments visualisation: https://www.desmos.com/calculator/5crifaekwa // experiments visualisation: https://www.desmos.com/calculator/5crifaekwa
// if (elevationDeg < 0) yf *= 1.0 - pow(xf, 0.333) // if (elevationDeg < 0) yf *= 1.0 - pow(xf, 0.333)
// if (elevationDeg < 0) yf *= -2.0 * asin(xf - 1.0) / PI // if (elevationDeg < 0) yf *= -2.0 * asin(xf - 1.0) / PI
if (elevationDeg < 0) yf *= superellipsoidDecay(1.0 / 3.0, xf) if (elevationDeg < 0) yf *= superellipsoidDecay(1.0 / 3.0, xf)
val theta = yf.mapCircle() * HALF_PI val theta = (yf.mapCircle() * HALF_PI)
// vertical angle, where 0 is zenith, ±90 is ground (which is odd) // vertical angle, where 0 is zenith, ±90 is ground (which is odd)
val xyz = CIEXYZ( val xyz = CIEXYZ(
@@ -142,8 +163,9 @@ object Skybox : Disposable {
val xyz2 = xyz.scaleToFit(elevationDeg) val xyz2 = xyz.scaleToFit(elevationDeg)
val rgb = xyz2.toRGB().toColor() val rgb = xyz2.toRGB().toColor()
// pixmap.setColor(if (yp in 17 until 17 + 94) Color.LIME else Color.CORAL)
pixmap.setColor(rgb) pixmap.setColor(rgb)
pixmap.drawPixel(0, y) pixmap.drawPixel(0, yp)
} }
val texture = Texture(pixmap).also { val texture = Texture(pixmap).also {

View File

@@ -208,7 +208,7 @@ class BasicDebugInfoWindow : UICanvas() {
App.fontSmallNumbers.draw(batch, "$SOL $soldegCol$soldegStr", gap + 7f*(sol), line(mvY)) App.fontSmallNumbers.draw(batch, "$SOL $soldegCol$soldegStr", gap + 7f*(sol), line(mvY))
App.fontSmallNumbers.draw(batch, "$TAU $turbCol$turbidity", gap + 7f*(sol), line(mvY + 1)) App.fontSmallNumbers.draw(batch, "$TAU $turbCol$turbidity", gap + 7f*(sol), line(mvY + 1))
App.fontSmallNumbers.draw(batch, "${ccG}p ${WeatherMixer.parallaxPos.toDouble().toIntAndFrac(1,2)}", gap + 7f*51, line(mvY))
try { try {
world?.let { world?.let {

View File

@@ -152,7 +152,9 @@ internal object WeatherMixer : RNGConsumer {
} }
var turbidity = 4.0; private set var turbidity = 4.0; private set
private var gH = 1.5f * App.scr.height private var gH = (4f/3f) * App.scr.height
internal var parallaxPos = 0f; private set
private val HALF_DAY = DAY_LENGTH / 2 private val HALF_DAY = DAY_LENGTH / 2
/** /**
@@ -187,6 +189,7 @@ internal object WeatherMixer : RNGConsumer {
-+ <- 0.0 = -+ <- 0.0 =
*/ */
val parallax = ((parallaxZeroPos - WorldCamera.gdxCamY.div(TILE_SIZEF)) / parallaxDomainSize).times(-1f).coerceIn(-1f, 1f) val parallax = ((parallaxZeroPos - WorldCamera.gdxCamY.div(TILE_SIZEF)) / parallaxDomainSize).times(-1f).coerceIn(-1f, 1f)
parallaxPos = parallax
// println(parallax) // parallax value works as intended. // println(parallax) // parallax value works as intended.
gdxBlendNormalStraightAlpha() gdxBlendNormalStraightAlpha()