From 4076e6d74e32fb27cbd9c9f0d13df4cf66625183 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Wed, 29 Apr 2020 08:48:06 +0900 Subject: [PATCH] more testing on skydome / font change --- .../terrarum-sans-bitmap/hangul_johab.tga | 2 +- build.gradle | 3 +- lib/TerrarumSansBitmap.jar | Bin 79147 -> 80342 bytes src/net/torvald/colourutil/CIELChabUtil.kt | 77 ++-- src/net/torvald/colourutil/CIELabUtil.kt | 126 +++--- src/net/torvald/colourutil/CIELuvUtil.kt | 178 ++++----- src/net/torvald/colourutil/CIEXYZUtil.kt | 373 +++++++++--------- src/net/torvald/colourutil/ColourTemp.kt | 3 +- src/net/torvald/colourutil/ColourUtil.kt | 1 - src/net/torvald/parametricsky/Application.kt | 62 ++- .../torvald/parametricsky/ArHosekSkyModel.kt | 21 +- .../parametricsky/datasets/DatasetSpectral.kt | 2 + .../modulebasegame/ui/UIVitalMetre.kt | 2 +- .../modulebasegame/worldgenerator/Worldgen.kt | 3 +- .../torvald/terrarum/tests/CIESpectralTest.kt | 18 + .../terrarum/tests/RGBtoXYZBenchmark.kt | 4 +- terrarum.iml | 10 - work_files/graphics/fonts/hangul_johab.psd | 4 +- work_files/skylight/XYZJCGT.pdf | 3 + 19 files changed, 468 insertions(+), 424 deletions(-) create mode 100644 work_files/skylight/XYZJCGT.pdf diff --git a/assets/graphics/fonts/terrarum-sans-bitmap/hangul_johab.tga b/assets/graphics/fonts/terrarum-sans-bitmap/hangul_johab.tga index 6392d2ac8..52b37cd6f 100644 --- a/assets/graphics/fonts/terrarum-sans-bitmap/hangul_johab.tga +++ b/assets/graphics/fonts/terrarum-sans-bitmap/hangul_johab.tga @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0a9b28e782cf441eef6f5ff70b3fe20a9b10aedab8fc74f6ca227e1a22a9d299 +oid sha256:38e4f5acdd752b95f3dc0fce9b33f063715c41342fd9bd4c98b5d005d47b1785 size 1578738 diff --git a/build.gradle b/build.gradle index ad592d7b1..f25fbb93c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.3.10' + ext.kotlin_version = '1.3.72' repositories { mavenCentral() @@ -27,6 +27,7 @@ repositories { } dependencies { + compile "org.jetbrains.kotlin:kotlinx-coroutines-core" compile "org.jetbrains.kotlin:kotlin-stdlib" compile fileTree(dir: 'lib', include: ['*.jar']) implementation 'org.junit:junit-bom:5.2.0' diff --git a/lib/TerrarumSansBitmap.jar b/lib/TerrarumSansBitmap.jar index ae9e28fa82b209445bddf4a620b4409de25d0d06..920abb1cabdfaf5097fdb3c6d34dd189f6c25ccc 100644 GIT binary patch delta 63034 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 RNWtI)M~A-u;4B3L`(Go;Lf!xX delta 61915 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

{v`KEgZZkJ# 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 diff --git a/src/net/torvald/colourutil/CIELChabUtil.kt b/src/net/torvald/colourutil/CIELChabUtil.kt index 7c36342fc..27a8c841e 100644 --- a/src/net/torvald/colourutil/CIELChabUtil.kt +++ b/src/net/torvald/colourutil/CIELChabUtil.kt @@ -2,12 +2,6 @@ package net.torvald.colourutil import com.badlogic.gdx.graphics.Color import com.jme3.math.FastMath -import net.torvald.colourutil.CIELChabUtil.toLCh -import net.torvald.colourutil.CIELChabUtil.toLab -import net.torvald.colourutil.CIELabUtil.toLab -import net.torvald.colourutil.CIEXYZUtil.toXYZ -import net.torvald.colourutil.CIEXYZUtil.toColor -import net.torvald.colourutil.CIELabUtil.toXYZ /** * Cylindrical modification of CIELab colour space * @@ -16,47 +10,46 @@ import net.torvald.colourutil.CIELabUtil.toXYZ * Created by minjaesong on 2016-09-01. */ -object CIELChabUtil { - /** Sweet LCh_ab linear gradient */ - fun getGradient(scale: Float, fromCol: Color, toCol: Color): Color { - val from = fromCol.toLCh() - val to = toCol.toLCh() - val newL = FastMath.interpolateLinear(scale, from.L, to.L) - val newC = FastMath.interpolateLinear(scale, from.C, to.C) - val newAlpha = FastMath.interpolateLinear(scale, from.alpha, to.alpha) - val newH: Float +/** Sweet LCh_ab linear gradient */ +fun cielch_getGradient(scale: Float, fromCol: Color, toCol: Color): Color { + val from = fromCol.toLCh() + val to = toCol.toLCh() + val newL = FastMath.interpolateLinear(scale, from.L, to.L) + val newC = FastMath.interpolateLinear(scale, from.C, to.C) + val newAlpha = FastMath.interpolateLinear(scale, from.alpha, to.alpha) + val newH: Float - if ((from.h - to.h).abs() == FastMath.PI) // exact opposite colour - return CIELabUtil.getGradient(scale, fromCol, toCol) - else if ((from.h - to.h).abs() > FastMath.PI) // reflex angle - newH = FastMath.interpolateLinear(scale, from.h, to.h + FastMath.TWO_PI) - else - newH = FastMath.interpolateLinear(scale, from.h, to.h) + if ((from.h - to.h).abs() == FastMath.PI) // exact opposite colour + return cielab_getGradient(scale, fromCol, toCol) + else if ((from.h - to.h).abs() > FastMath.PI) // reflex angle + newH = FastMath.interpolateLinear(scale, from.h, to.h + FastMath.TWO_PI) + else + newH = FastMath.interpolateLinear(scale, from.h, to.h) - return CIELCh(newL, newC, newH, newAlpha).toColor() - } - - fun CIELab.toLCh(): CIELCh { - val c = (a.sqr() + b.sqr()).sqrt() - val h = FastMath.atan2(b, a) - - return CIELCh(L, c, h, alpha) - } - - fun CIELCh.toLab(): CIELab { - val a = C * FastMath.cos(h) - val b = C * FastMath.sin(h) - - return CIELab(L, a, b, alpha) - } - - private fun Float.sqr() = this * this - private fun Float.sqrt() = Math.sqrt(this.toDouble()).toFloat() - - private fun Float.abs() = FastMath.abs(this) + return CIELCh(newL, newC, newH, newAlpha).toColor() } +fun CIELab.toLCh(): CIELCh { + val c = (a.sqr() + b.sqr()).sqrt() + val h = FastMath.atan2(b, a) + + return CIELCh(L, c, h, alpha) +} + +fun CIELCh.toLab(): CIELab { + val a = C * FastMath.cos(h) + val b = C * FastMath.sin(h) + + return CIELab(L, a, b, alpha) +} + +private fun Float.sqr() = this * this +private fun Float.sqrt() = Math.sqrt(this.toDouble()).toFloat() + +private fun Float.abs() = FastMath.abs(this) + + fun Color.toLCh() = this.toXYZ().toLab().toLCh() fun CIELCh.toColor() = this.toLab().toXYZ().toColor() diff --git a/src/net/torvald/colourutil/CIELabUtil.kt b/src/net/torvald/colourutil/CIELabUtil.kt index fcb52b67a..a4538bfc5 100644 --- a/src/net/torvald/colourutil/CIELabUtil.kt +++ b/src/net/torvald/colourutil/CIELabUtil.kt @@ -2,11 +2,6 @@ package net.torvald.colourutil import com.badlogic.gdx.graphics.Color import com.jme3.math.FastMath -import net.torvald.colourutil.CIELabUtil.toLab -import net.torvald.colourutil.CIEXYZUtil.toColor -import net.torvald.colourutil.CIEXYZUtil.toRGB -import net.torvald.colourutil.CIEXYZUtil.toXYZ -import net.torvald.colourutil.CIELabUtil.toXYZ /** * A modification of CIEXYZ that is useful for surface colours @@ -23,70 +18,69 @@ import net.torvald.colourutil.CIELabUtil.toXYZ * * Created by minjaesong on 2016-09-01. */ -object CIELabUtil { - fun Color.brighterLab(scale: Float): Color { - val brighten = scale + 1f +fun Color.brighterLab(scale: Float): Color { + val brighten = scale + 1f - val lab = this.toLab() - lab.L *= brighten - return lab.toColor() - } - - fun Color.darkerLab(scale: Float): Color { - val darken = 1f - scale - - val lab = this.toLab() - lab.L *= darken - return lab.toColor() - } - - /** Tend to have more natural (or less saturated) colour */ - fun getGradient(scale: Float, fromCol: Color, toCol: Color): Color { - val from = fromCol.toLab() - val to = toCol.toLab() - val newL = FastMath.interpolateLinear(scale, from.L, to.L) - val newA = FastMath.interpolateLinear(scale, from.a, to.a) - val newB = FastMath.interpolateLinear(scale, from.b, to.b) - val newAlpha = FastMath.interpolateLinear(scale, from.alpha, to.alpha) - - return CIELab(newL, newA, newB, newAlpha).toColor() - } - - fun CIEXYZ.toLab(): CIELab { - val x = pivotXYZ(X / D65.X) - val y = pivotXYZ(Y / D65.Y) - val z = pivotXYZ(Z / D65.Z) - - val L = Math.max(0f, 116 * y - 16) - val a = 500 * (x - y) - val b = 200 * (y - z) - - return CIELab(L, a, b, alpha) - } - - fun CIELab.toXYZ(): CIEXYZ { - val y = L.plus(16).div(116f) - val x = a / 500f + y - val z = y - b / 200f - - val x3 = x.cube() - val z3 = z.cube() - - return CIEXYZ( - D65.X * if (x3 > epsilon) x3 else (x - 16f / 116f) / 7.787f, - D65.Y * if (L > kappa * epsilon) (L.plus(16f) / 116f).cube() else L / kappa, - D65.Z * if (z3 > epsilon) z3 else (z - 16f / 116f) / 7.787f, - alpha - ) - } - - private fun pivotXYZ(n: Float) = if (n > epsilon) n.cbrt() else (kappa * n + 16f) / 116f - - private fun Float.cbrt() = FastMath.pow(this, 1f / 3f) - private fun Float.cube() = this * this * this - private fun Float.powerOf(exp: Float) = FastMath.pow(this, exp) + val lab = this.toLab() + lab.L *= brighten + return lab.toColor() } +fun Color.darkerLab(scale: Float): Color { + val darken = 1f - scale + + val lab = this.toLab() + lab.L *= darken + return lab.toColor() +} + +/** Tend to have more natural (or less saturated) colour */ +fun cielab_getGradient(scale: Float, fromCol: Color, toCol: Color): Color { + val from = fromCol.toLab() + val to = toCol.toLab() + val newL = FastMath.interpolateLinear(scale, from.L, to.L) + val newA = FastMath.interpolateLinear(scale, from.a, to.a) + val newB = FastMath.interpolateLinear(scale, from.b, to.b) + val newAlpha = FastMath.interpolateLinear(scale, from.alpha, to.alpha) + + return CIELab(newL, newA, newB, newAlpha).toColor() +} + +fun CIEXYZ.toLab(): CIELab { + val x = pivotXYZ(X / D65.X) + val y = pivotXYZ(Y / D65.Y) + val z = pivotXYZ(Z / D65.Z) + + val L = Math.max(0f, 116 * y - 16) + val a = 500 * (x - y) + val b = 200 * (y - z) + + return CIELab(L, a, b, alpha) +} + +fun CIELab.toXYZ(): CIEXYZ { + val y = L.plus(16).div(116f) + val x = a / 500f + y + val z = y - b / 200f + + val x3 = x.cube() + val z3 = z.cube() + + return CIEXYZ( + D65.X * if (x3 > epsilon) x3 else (x - 16f / 116f) / 7.787f, + D65.Y * if (L > kappa * epsilon) (L.plus(16f) / 116f).cube() else L / kappa, + D65.Z * if (z3 > epsilon) z3 else (z - 16f / 116f) / 7.787f, + alpha + ) +} + +private fun pivotXYZ(n: Float) = if (n > epsilon) n.cbrt() else (kappa * n + 16f) / 116f + +private fun Float.cbrt() = FastMath.pow(this, 1f / 3f) +private fun Float.cube() = this * this * this +private fun Float.powerOf(exp: Float) = FastMath.pow(this, exp) + + fun Color.toLab() = this.toXYZ().toLab() fun RGB.toLab() = this.toXYZ().toLab() fun CIELab.toColor() = this.toXYZ().toColor() diff --git a/src/net/torvald/colourutil/CIELuvUtil.kt b/src/net/torvald/colourutil/CIELuvUtil.kt index ab61ac33b..08cb966d0 100644 --- a/src/net/torvald/colourutil/CIELuvUtil.kt +++ b/src/net/torvald/colourutil/CIELuvUtil.kt @@ -2,11 +2,6 @@ package net.torvald.colourutil import com.jme3.math.FastMath import com.badlogic.gdx.graphics.Color -import net.torvald.colourutil.CIEXYZUtil.toColor -import net.torvald.colourutil.CIEXYZUtil.toRGB -import net.torvald.colourutil.CIEXYZUtil.toXYZ -import net.torvald.colourutil.CIELuvUtil.toLuv -import net.torvald.colourutil.CIELuvUtil.toXYZ /** * A modification of CIEXYZ that is useful for additive mixtures of lights. @@ -18,97 +13,96 @@ import net.torvald.colourutil.CIELuvUtil.toXYZ * * Created by minjaesong on 2016-09-06. */ -object CIELuvUtil { - fun Color.brighterLuv(scale: Float): Color { - val brighten = scale + 1f +fun Color.brighterLuv(scale: Float): Color { + val brighten = scale + 1f - val luv = this.toLuv() - luv.L *= brighten - return luv.toColor() - } - - fun Color.darkerLuv(scale: Float): Color { - val darken = 1f - scale - - val luv = this.toLuv() - luv.L *= darken - return luv.toColor() - } - - /** Tend to have more vivid (or saturated) colour */ - fun getGradient(scale: Float, fromCol: Color, toCol: Color): Color { - val from = fromCol.toLuv() - val to = toCol.toLuv() - val newL = FastMath.interpolateLinear(scale, from.L, to.L) - val newU = FastMath.interpolateLinear(scale, from.u, to.u) - val newV = FastMath.interpolateLinear(scale, from.v, to.v) - val newAlpha = FastMath.interpolateLinear(scale, from.alpha, to.alpha) - - return CIELab(newL, newU, newV, newAlpha).toColor() - } - - /** - * Alpha value will be overwritten to 1.0 - */ - infix fun Color.additiveLuv(other: Color): Color { - val rgb = RGB(r, g, b) additiveLuv RGB(other.r, other.g, other.b) - return Color(rgb.r, rgb.g, rgb.b, a) - } - - /** - * Alpha value will be overwritten to 1.0 - */ - infix fun RGB.additiveLuv(other: RGB): RGB { - val thisLuv = this.toXYZ().toLuv() - val otherLuv = other.toXYZ().toLuv() - - val newL = 1f - (1f - thisLuv.L) * (1 - otherLuv.L) - val newU = thisLuv.u.times(otherLuv.L / newL) + otherLuv.u.times(otherLuv.L).times(1f - thisLuv.L).div(newL) - val newV = thisLuv.v.times(otherLuv.L / newL) + otherLuv.v.times(otherLuv.L).times(1f - thisLuv.L).div(newL) - - return CIELuv(newL, newU, newV).toRGB() - } - - fun CIEXYZ.toLuv(): CIELuv { - val yRef = Y / D65.Y - val uPrime = 4f * X / (X + 15f * Y + 3f * Z) - val vPrime = 9f * Y / (X + 15f * Y + 3f * Z) - val uRefPrime = 4f * D65.X / (D65.X + 15f * D65.Y + 3f * D65.Z) - val vRefPrime = 9f * D65.Y / (D65.X + 15f * D65.Y + 3f * D65.Z) - - val L = if (yRef > epsilon) - 116f * yRef.cbrt() - 16f - else - kappa * yRef - - val u = 13f * L * (uPrime - uRefPrime) - val v = 13f * L * (vPrime - vRefPrime) - - return CIELuv(L, u, v, alpha) - } - - fun CIELuv.toXYZ(): CIEXYZ { - val Y = if (L > kappa * epsilon) - L.plus(16f).div(116f).cube() - else - L.div(kappa) - val uRef = 4f * D65.X / (D65.X + 15f * D65.Y + 3f * D65.Z) - val vRef = 9f * D65.Y / (D65.X + 15f * D65.Y + 3f * D65.Z) - val a = (1f / 3f) * (52.times(L) / u.plus(13 * L * uRef)).minus(1f) - val b = -5f * Y - val c = -1f / 3f - val d = Y * (39f.times(L) / v.plus(13f * L * vRef)).minus(5f) - val X = (d - b) / (a - c) - val Z = X * a + b - - return CIEXYZ(X, Y, Z, alpha) - } - - private fun Float.cbrt() = FastMath.pow(this, 1f / 3f) - private fun Float.cube() = this * this * this + val luv = this.toLuv() + luv.L *= brighten + return luv.toColor() } +fun Color.darkerLuv(scale: Float): Color { + val darken = 1f - scale + + val luv = this.toLuv() + luv.L *= darken + return luv.toColor() +} + +/** Tend to have more vivid (or saturated) colour */ +fun cieluv_getGradient(scale: Float, fromCol: Color, toCol: Color): Color { + val from = fromCol.toLuv() + val to = toCol.toLuv() + val newL = FastMath.interpolateLinear(scale, from.L, to.L) + val newU = FastMath.interpolateLinear(scale, from.u, to.u) + val newV = FastMath.interpolateLinear(scale, from.v, to.v) + val newAlpha = FastMath.interpolateLinear(scale, from.alpha, to.alpha) + + return CIELab(newL, newU, newV, newAlpha).toColor() +} + +/** + * Alpha value will be overwritten to 1.0 + */ +infix fun Color.additiveLuv(other: Color): Color { + val rgb = RGB(r, g, b) additiveLuv RGB(other.r, other.g, other.b) + return Color(rgb.r, rgb.g, rgb.b, a) +} + +/** + * Alpha value will be overwritten to 1.0 + */ +infix fun RGB.additiveLuv(other: RGB): RGB { + val thisLuv = this.toXYZ().toLuv() + val otherLuv = other.toXYZ().toLuv() + + val newL = 1f - (1f - thisLuv.L) * (1 - otherLuv.L) + val newU = thisLuv.u.times(otherLuv.L / newL) + otherLuv.u.times(otherLuv.L).times(1f - thisLuv.L).div(newL) + val newV = thisLuv.v.times(otherLuv.L / newL) + otherLuv.v.times(otherLuv.L).times(1f - thisLuv.L).div(newL) + + return CIELuv(newL, newU, newV).toRGB() +} + +fun CIEXYZ.toLuv(): CIELuv { + val yRef = Y / D65.Y + val uPrime = 4f * X / (X + 15f * Y + 3f * Z) + val vPrime = 9f * Y / (X + 15f * Y + 3f * Z) + val uRefPrime = 4f * D65.X / (D65.X + 15f * D65.Y + 3f * D65.Z) + val vRefPrime = 9f * D65.Y / (D65.X + 15f * D65.Y + 3f * D65.Z) + + val L = if (yRef > epsilon) + 116f * yRef.cbrt() - 16f + else + kappa * yRef + + val u = 13f * L * (uPrime - uRefPrime) + val v = 13f * L * (vPrime - vRefPrime) + + return CIELuv(L, u, v, alpha) +} + +fun CIELuv.toXYZ(): CIEXYZ { + val Y = if (L > kappa * epsilon) + L.plus(16f).div(116f).cube() + else + L.div(kappa) + val uRef = 4f * D65.X / (D65.X + 15f * D65.Y + 3f * D65.Z) + val vRef = 9f * D65.Y / (D65.X + 15f * D65.Y + 3f * D65.Z) + val a = (1f / 3f) * (52.times(L) / u.plus(13 * L * uRef)).minus(1f) + val b = -5f * Y + val c = -1f / 3f + val d = Y * (39f.times(L) / v.plus(13f * L * vRef)).minus(5f) + val X = (d - b) / (a - c) + val Z = X * a + b + + return CIEXYZ(X, Y, Z, alpha) +} + +private fun Float.cbrt() = FastMath.pow(this, 1f / 3f) +private fun Float.cube() = this * this * this + + fun Color.toLuv() = this.toXYZ().toLuv() fun CIELuv.toRGB() = this.toXYZ().toRGB() fun CIELuv.toColor() = this.toXYZ().toColor() diff --git a/src/net/torvald/colourutil/CIEXYZUtil.kt b/src/net/torvald/colourutil/CIEXYZUtil.kt index ec9637bb3..5825a3de2 100644 --- a/src/net/torvald/colourutil/CIEXYZUtil.kt +++ b/src/net/torvald/colourutil/CIEXYZUtil.kt @@ -2,224 +2,225 @@ package net.torvald.colourutil import com.badlogic.gdx.graphics.Color import com.jme3.math.FastMath +import net.torvald.gdx.graphics.Cvec /** * Created by minjaesong on 2017-01-12. */ -object CIEXYZUtil { - /** - * 0..255 -> 0.0..1.0 - */ - private val rgbLinLUT = FloatArray(256) { - val step = it / 255f +/** + * 0..255 -> 0.0..1.0 + */ +private val rgbLinLUT = FloatArray(256) { + val step = it / 255f - if (step > 0.04045f) - ((step + 0.055f) / 1.055f).powerOf(2.4f) - else step / 12.92f - } + if (step > 0.04045f) + ((step + 0.055f) / 1.055f).powerOf(2.4f) + else step / 12.92f +} - /** - * 0..255 -> 0.0..1.0 - */ - private val rgbUnLinLUT = FloatArray(256) { - val step = it / 255f +/** + * 0..255 -> 0.0..1.0 + */ +private val rgbUnLinLUT = FloatArray(256) { + val step = it / 255f - if (step > 0.0031308f) - 1.055f * step.powerOf(1f / 2.4f) - 0.055f - else - step * 12.92f - } + if (step > 0.0031308f) + 1.055f * step.powerOf(1f / 2.4f) - 0.055f + else + step * 12.92f +} - private val rgbToXyzLut_XR = FloatArray(256) { 0.4124564f * (it / 255f) } +private val rgbToXyzLut_XR = FloatArray(256) { 0.4124564f * (it / 255f) } +fun Color.brighterXYZ(scale: Float): Color { + val xyz = this.toXYZ() + xyz.X = xyz.X.times(1f + scale).clampOne() + xyz.Y = xyz.Y.times(1f + scale).clampOne() + xyz.Z = xyz.Z.times(1f + scale).clampOne() + return xyz.toColor() +} +fun Color.darkerXYZ(scale: Float): Color { + val xyz = this.toXYZ() + xyz.X = xyz.X.times(1f - scale).clampOne() + xyz.Y = xyz.Y.times(1f - scale).clampOne() + xyz.Z = xyz.Z.times(1f - scale).clampOne() + return xyz.toColor() +} +/*@Deprecated("Use one in CIELAB or CIELUV; CIEXYZ is not perceptually uniform") +fun getGradient(scale: Float, fromCol: Color, toCol: Color): Color { + val from = fromCol.toXYZ() + val to = toCol.toXYZ() + val newX = FastMath.interpolateLinear(scale, from.X, to.X) + val newY = FastMath.interpolateLinear(scale, from.Y, to.Y) + val newZ = FastMath.interpolateLinear(scale, from.Z, to.Z) + val newAlpha = FastMath.interpolateLinear(scale, from.alpha, to.alpha) - fun Color.brighterXYZ(scale: Float): Color { - val xyz = this.toXYZ() - xyz.X = xyz.X.times(1f + scale).clampOne() - xyz.Y = xyz.Y.times(1f + scale).clampOne() - xyz.Z = xyz.Z.times(1f + scale).clampOne() - return xyz.toColor() - } + return CIEXYZ(newX, newY, newZ, newAlpha).toColor() +}*/ - fun Color.darkerXYZ(scale: Float): Color { - val xyz = this.toXYZ() - xyz.X = xyz.X.times(1f - scale).clampOne() - xyz.Y = xyz.Y.times(1f - scale).clampOne() - xyz.Z = xyz.Z.times(1f - scale).clampOne() - return xyz.toColor() - } +fun Color.toXYZ(): CIEXYZ = RGB(this).toXYZ() - /*@Deprecated("Use one in CIELAB or CIELUV; CIEXYZ is not perceptually uniform") - fun getGradient(scale: Float, fromCol: Color, toCol: Color): Color { - val from = fromCol.toXYZ() - val to = toCol.toXYZ() - val newX = FastMath.interpolateLinear(scale, from.X, to.X) - val newY = FastMath.interpolateLinear(scale, from.Y, to.Y) - val newZ = FastMath.interpolateLinear(scale, from.Z, to.Z) - val newAlpha = FastMath.interpolateLinear(scale, from.alpha, to.alpha) - - return CIEXYZ(newX, newY, newZ, newAlpha).toColor() - }*/ - - fun Color.toXYZ(): CIEXYZ = RGB(this).toXYZ() - - /** - * "Linearise" the sRGB triads. This use lookup table to speed up calculation. - * Integer values (1/255, 2/255, .. , 254/255, 255/255) are accurate but any values in between are - * linearly interpolated and thus slightly less accurate. Visually there's little-to-no difference, - * but may not optimal for rigorous maths. - */ - fun RGB.linearise(): RGB { - val out = floatArrayOf(0f, 0f, 0f) - for (i in 0..2) { - val value = when (i) { - 0 -> this.r - 1 -> this.g - 2 -> this.b - else -> throw InternalError("Fuck you") - } - val step = value.clampOne() * 255f // 0.0 .. 255.0 - val intStep = step.toInt() // 0 .. 255 - val NeXTSTEP = minOf(intStep + 1, 255) // 1 .. 255 - - out[i] = interpolateLinear(step - intStep, rgbLinLUT[intStep], rgbLinLUT[NeXTSTEP]) +/** + * "Linearise" the sRGB triads. This use lookup table to speed up calculation. + * Integer values (1/255, 2/255, .. , 254/255, 255/255) are accurate but any values in between are + * linearly interpolated and thus slightly less accurate. Visually there's little-to-no difference, + * but may not optimal for rigorous maths. + */ +/*fun RGB.linearise(): RGB { + val out = floatArrayOf(0f, 0f, 0f) + for (i in 0..2) { + val value = when (i) { + 0 -> this.r + 1 -> this.g + 2 -> this.b + else -> throw InternalError("Fuck you") } + val step = value.clampOne() * 255f // 0.0 .. 255.0 + val intStep = step.toInt() // 0 .. 255 + val NeXTSTEP = minOf(intStep + 1, 255) // 1 .. 255 - - return RGB(out[0], out[1], out[2], alpha) + out[i] = interpolateLinear(step - intStep, rgbLinLUT[intStep], rgbLinLUT[NeXTSTEP]) } - /** Suitable for rigorous maths but slower */ - fun RGB.lineariseSuper(): RGB { - val newR = if (r > 0.04045f) - ((r + 0.055f) / 1.055f).powerOf(2.4f) - else r / 12.92f - val newG = if (g > 0.04045f) - ((g + 0.055f) / 1.055f).powerOf(2.4f) - else g / 12.92f - val newB = if (b > 0.04045f) - ((b + 0.055f) / 1.055f).powerOf(2.4f) - else b / 12.92f + + return RGB(out[0], out[1], out[2], alpha) +}*/ + +/** Suitable for rigorous maths but slower */ +fun RGB.linearise(): RGB { + val newR = if (r > 0.04045f) + ((r + 0.055f) / 1.055f).powerOf(2.4f) + else r / 12.92f + val newG = if (g > 0.04045f) + ((g + 0.055f) / 1.055f).powerOf(2.4f) + else g / 12.92f + val newB = if (b > 0.04045f) + ((b + 0.055f) / 1.055f).powerOf(2.4f) + else b / 12.92f - return RGB(newR, newG, newB, alpha) - } + return RGB(newR, newG, newB, alpha) +} - /** - * "Un-linearise" the RGB triads. That is, codes the linear RGB into sRGB. This use lookup table to speed up calculation. - * Integer values (1/255, 2/255, .. , 254/255, 255/255) are accurate but any values in between are - * linearly interpolated and thus slightly less accurate. Visually there's little-to-no difference, - * but may not optimal for rigorous maths. - */ - fun RGB.unLinearise(): RGB { - val out = floatArrayOf(0f, 0f, 0f) - for (i in 0..2) { - val value = when (i) { - 0 -> this.r - 1 -> this.g - 2 -> this.b - else -> throw InternalError("Fuck you") - } - val step = value.clampOne() * 255f // 0.0 .. 255.0 - val intStep = step.toInt() // 0 .. 255 - val NeXTSTEP = minOf(intStep + 1, 255) // 1 .. 255 - - out[i] = interpolateLinear(step - intStep, rgbUnLinLUT[intStep], rgbUnLinLUT[NeXTSTEP]) +/** + * "Un-linearise" the RGB triads. That is, codes the linear RGB into sRGB. This use lookup table to speed up calculation. + * Integer values (1/255, 2/255, .. , 254/255, 255/255) are accurate but any values in between are + * linearly interpolated and thus slightly less accurate. Visually there's little-to-no difference, + * but may not optimal for rigorous maths. + */ +/*fun RGB.unLinearise(): RGB { + val out = floatArrayOf(0f, 0f, 0f) + for (i in 0..2) { + val value = when (i) { + 0 -> this.r + 1 -> this.g + 2 -> this.b + else -> throw InternalError("Fuck you") } + val step = value.clampOne() * 255f // 0.0 .. 255.0 + val intStep = step.toInt() // 0 .. 255 + val NeXTSTEP = minOf(intStep + 1, 255) // 1 .. 255 - - return RGB(out[0], out[1], out[2], alpha) + out[i] = interpolateLinear(step - intStep, rgbUnLinLUT[intStep], rgbUnLinLUT[NeXTSTEP]) } - /** Suitable for rigorous maths but slower */ - fun RGB.unLineariseSuper(): RGB { - val newR = if (r > 0.0031308f) - 1.055f * r.powerOf(1f / 2.4f) - 0.055f - else - r * 12.92f - val newG = if (g > 0.0031308f) - 1.055f * g.powerOf(1f / 2.4f) - 0.055f - else - g * 12.92f - val newB = if (b > 0.0031308f) - 1.055f * b.powerOf(1f / 2.4f) - 0.055f - else - b * 12.92f + + return RGB(out[0], out[1], out[2], alpha) +}*/ + +/** Suitable for rigorous maths but slower */ +fun RGB.unLinearise(): RGB { + val newR = if (r > 0.0031308f) + 1.055f * r.powerOf(1f / 2.4f) - 0.055f + else + r * 12.92f + val newG = if (g > 0.0031308f) + 1.055f * g.powerOf(1f / 2.4f) - 0.055f + else + g * 12.92f + val newB = if (b > 0.0031308f) + 1.055f * b.powerOf(1f / 2.4f) - 0.055f + else + b * 12.92f - return RGB(newR, newG, newB, alpha) + return RGB(newR, newG, newB, alpha) +} + +fun RGB.toXYZ(): CIEXYZ { + val new = this.linearise() + + val x = 0.4124564f * new.r + 0.3575761f * new.g + 0.1804375f * new.b + val y = 0.2126729f * new.r + 0.7151522f * new.g + 0.0721750f * new.b + val z = 0.0193339f * new.r + 0.1191920f * new.g + 0.9503041f * new.b + + return CIEXYZ(x, y, z, alpha) +} + +fun RGB.toColor() = Color(r, g, b, alpha) +fun RGB.toCvec() = Cvec(r, g, b, alpha) + +fun CIEXYZ.toRGB(): RGB { + val r = 3.2404542f * X - 1.5371385f * Y - 0.4985314f * Z + val g = -0.9692660f * X + 1.8760108f * Y + 0.0415560f * Z + val b = 0.0556434f * X - 0.2040259f * Y + 1.0572252f * Z + + return RGB(r, g, b, alpha).unLinearise() +} + +fun CIEXYZ.toRGBRaw(): RGB { + val r = 3.2404542f * X - 1.5371385f * Y - 0.4985314f * Z + val g = -0.9692660f * X + 1.8760108f * Y + 0.0415560f * Z + val b = 0.0556434f * X - 0.2040259f * Y + 1.0572252f * Z + + return RGB(r, g, b, alpha) +} + +fun CIEXYZ.toColor(): Color { + val rgb = this.toRGB() + return Color(rgb.r, rgb.g, rgb.b, rgb.alpha) +} + +fun CIEXYZ.mul(scalar: Float) = CIEXYZ(this.X * scalar, this.Y * scalar, this.Z * scalar, this.alpha) + +fun CIEXYZ.toColorRaw(): Color { + val rgb = this.toRGBRaw() + return Color(rgb.r, rgb.g, rgb.b, rgb.alpha) +} + +fun CIEYXY.toXYZ(): CIEXYZ { + return CIEXYZ(x * yy / y, yy, (1f - x - y) * yy / y) +} + +fun colourTempToXYZ(temp: Float, Y: Float): CIEXYZ { + val x = if (temp < 7000) + -4607000000f / FastMath.pow(temp, 3f) + 2967800f / FastMath.pow(temp, 2f) + 99.11f / temp + 0.244063f + else + -2006400000f / FastMath.pow(temp, 3f) + 1901800f / FastMath.pow(temp, 2f) + 247.48f / temp + 0.237040f + + val y = -3f * FastMath.pow(x, 2f) + 2.870f * x - 0.275f + + return CIEXYZ(x * Y / y, Y, (1 - x - y) * Y / y) +} + +private fun Float.powerOf(exp: Float) = FastMath.pow(this, exp) +private fun Float.clampOne() = if (this > 1f) 1f else if (this < 0f) 0f else this + +private fun interpolateLinear(scale: Float, startValue: Float, endValue: Float): Float { + if (startValue == endValue) { + return startValue } - - fun RGB.toXYZ(): CIEXYZ { - val new = this.linearise() - - val x = 0.4124564f * new.r + 0.3575761f * new.g + 0.1804375f * new.b - val y = 0.2126729f * new.r + 0.7151522f * new.g + 0.0721750f * new.b - val z = 0.0193339f * new.r + 0.1191920f * new.g + 0.9503041f * new.b - - return CIEXYZ(x, y, z, alpha) + if (scale <= 0f) { + return startValue } - - fun CIEXYZ.toRGB(): RGB { - val r = 3.2404542f * X - 1.5371385f * Y - 0.4985314f * Z - val g = -0.9692660f * X + 1.8760108f * Y + 0.0415560f * Z - val b = 0.0556434f * X - 0.2040259f * Y + 1.0572252f * Z - - return RGB(r, g, b, alpha).unLinearise() - } - - fun CIEXYZ.toRGBRaw(): RGB { - val r = 3.2404542f * X - 1.5371385f * Y - 0.4985314f * Z - val g = -0.9692660f * X + 1.8760108f * Y + 0.0415560f * Z - val b = 0.0556434f * X - 0.2040259f * Y + 1.0572252f * Z - - return RGB(r, g, b, alpha) - } - - fun CIEXYZ.toColor(): Color { - val rgb = this.toRGB() - return Color(rgb.r, rgb.g, rgb.b, rgb.alpha) - } - - fun CIEXYZ.toColorRaw(): Color { - val rgb = this.toRGBRaw() - return Color(rgb.r, rgb.g, rgb.b, rgb.alpha) - } - - fun CIEYXY.toXYZ(): CIEXYZ { - return CIEXYZ(x * yy / y, yy, (1f - x - y) * yy / y) - } - - fun colourTempToXYZ(temp: Float, Y: Float): CIEXYZ { - val x = if (temp < 7000) - -4607000000f / FastMath.pow(temp, 3f) + 2967800f / FastMath.pow(temp, 2f) + 99.11f / temp + 0.244063f - else - -2006400000f / FastMath.pow(temp, 3f) + 1901800f / FastMath.pow(temp, 2f) + 247.48f / temp + 0.237040f - - val y = -3f * FastMath.pow(x, 2f) + 2.870f * x - 0.275f - - return CIEXYZ(x * Y / y, Y, (1 - x - y) * Y / y) - } - - private fun Float.powerOf(exp: Float) = FastMath.pow(this, exp) - private fun Float.clampOne() = if (this > 1f) 1f else if (this < 0f) 0f else this - - private fun interpolateLinear(scale: Float, startValue: Float, endValue: Float): Float { - if (startValue == endValue) { - return startValue - } - if (scale <= 0f) { - return startValue - } - return if (scale >= 1f) { - endValue - } - else (1f - scale) * startValue + scale * endValue + return if (scale >= 1f) { + endValue } + else (1f - scale) * startValue + scale * endValue } diff --git a/src/net/torvald/colourutil/ColourTemp.kt b/src/net/torvald/colourutil/ColourTemp.kt index c8a6f5a76..5dabfb965 100644 --- a/src/net/torvald/colourutil/ColourTemp.kt +++ b/src/net/torvald/colourutil/ColourTemp.kt @@ -1,7 +1,6 @@ package net.torvald.colourutil import com.badlogic.gdx.graphics.Color -import net.torvald.colourutil.CIEXYZUtil.toColor import net.torvald.terrarum.GdxColorMap import net.torvald.terrarum.ModMgr @@ -24,5 +23,5 @@ object ColourTemp { /** returns CIExyY-based colour converted to slick.color * @param CIE_Y 0.0 - 1.0+ */ operator fun invoke(temp: Float, CIE_Y: Float): Color = - CIEXYZUtil.colourTempToXYZ(temp, CIE_Y).toColor() + colourTempToXYZ(temp, CIE_Y).toColor() } \ No newline at end of file diff --git a/src/net/torvald/colourutil/ColourUtil.kt b/src/net/torvald/colourutil/ColourUtil.kt index 4aa45bf7e..ad8229652 100644 --- a/src/net/torvald/colourutil/ColourUtil.kt +++ b/src/net/torvald/colourutil/ColourUtil.kt @@ -2,7 +2,6 @@ package net.torvald.colourutil import com.badlogic.gdx.graphics.Color import com.jme3.math.FastMath -import net.torvald.colourutil.CIEXYZUtil.linearise /** * Created by minjaesong on 2016-07-26. diff --git a/src/net/torvald/parametricsky/Application.kt b/src/net/torvald/parametricsky/Application.kt index 4003047e1..a5747faa0 100644 --- a/src/net/torvald/parametricsky/Application.kt +++ b/src/net/torvald/parametricsky/Application.kt @@ -5,16 +5,22 @@ import com.badlogic.gdx.Gdx import com.badlogic.gdx.Screen import com.badlogic.gdx.backends.lwjgl.LwjglApplication import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration +import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.Pixmap import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.graphics.g2d.SpriteBatch import net.torvald.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.inUse +import net.torvald.terrarum.modulebasegame.worldgenerator.HALF_PI +import net.torvald.terrarum.modulebasegame.worldgenerator.TWO_PI import java.awt.Dimension import javax.swing.* +import kotlin.math.PI +import kotlin.math.pow const val WIDTH = 1200 @@ -50,8 +56,9 @@ class Application : Game() { private lateinit var testTex: Texture var turbidity = 5.0 - var albedo = 0.0 + var albedo = 0.1 var elevation = 0.0 + var scalefactor = 1f override fun getScreen(): Screen { return super.getScreen() @@ -64,12 +71,14 @@ class Application : Game() { override fun render() { Gdx.graphics.setTitle("Daylight Model $EMDASH F: ${Gdx.graphics.framesPerSecond}") + if (turbidity <= 0) throw IllegalStateException() + // we need to use different modelstate to accomodate different albedo for each spectral band but oh well... genTexLoop(ArHosekSkyModel.arhosek_xyz_skymodelstate_alloc_init(turbidity, albedo, elevation)) val tex = Texture(oneScreen) - tex.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear) + tex.setFilter(Texture.TextureFilter.Nearest, Texture.TextureFilter.Nearest) batch.inUse { batch.draw(tex, 0f, 0f, WIDTH.toFloat(), HEIGHT.toFloat()) @@ -94,8 +103,8 @@ class Application : Game() { oneScreen.dispose() } - val outTexWidth = 32 - val outTexHeight = 16 + val outTexWidth = 256 + val outTexHeight = 256 /** * Generated texture is as if you took the panorama picture of sky: up 70deg to horizon, east-south-west; @@ -112,6 +121,28 @@ class Application : Game() { } + for (y in 0 until oneScreen.height) { + for (x in 0 until oneScreen.width) { + val gamma = (x / oneScreen.width.toDouble()) * TWO_PI // 0deg..360deg + val theta = (1.0 - (y / oneScreen.height.toDouble())) * HALF_PI // 90deg..0deg + + val xyz = CIEXYZ( + ArHosekSkyModel.arhosek_tristim_skymodel_radiance(state, theta, gamma, 0).toFloat().times(scalefactor / 10f), + ArHosekSkyModel.arhosek_tristim_skymodel_radiance(state, theta, gamma, 1).toFloat().times(scalefactor / 10f), + ArHosekSkyModel.arhosek_tristim_skymodel_radiance(state, theta, gamma, 2).toFloat().times(scalefactor / 10f) + ) + val rgb = xyz.toRGB().toColor() + rgb.a = 1f + + oneScreen.setColor(rgb) + oneScreen.drawPixel(x, y) + + //println("x: ${xyz.X}, y: ${xyz.Y}, z: ${xyz.Z}") + } + + } + + //System.exit(0) } /** @@ -190,14 +221,21 @@ class Application : Game() { val mainPanel = JPanel() - val turbidityControl = JSpinner(SpinnerNumberModel(5, 1, 10, 1)) - val albedoControl = JSpinner(SpinnerNumberModel(0.3, 0.0, 1.0, 0.05)) - val elevationControl = JSpinner(SpinnerNumberModel(45, 0, 90, 5)) + val turbidityControl = JSpinner(SpinnerNumberModel(5.0, 1.0, 10.0, 0.1)) + val albedoControl = JSpinner(SpinnerNumberModel(0.1, 0.0, 1.0, 0.05)) + val elevationControl = JSpinner(SpinnerNumberModel(0.0, 0.0, 90.0, 0.5)) + val scalefactorControl = JSpinner(SpinnerNumberModel(1.0, 0.0, 2.0, 0.01)) init { val turbidityPanel = JPanel() val albedoPanel = JPanel() val elevationPanel = JPanel() + val scalefactorPanel = JPanel() + + turbidityControl.preferredSize = Dimension(45, 18) + albedoControl.preferredSize = Dimension(45, 18) + elevationControl.preferredSize = Dimension(45, 18) + scalefactorControl.preferredSize = Dimension(45, 18) turbidityPanel.add(JLabel("Turbidity")) turbidityPanel.add(turbidityControl) @@ -208,9 +246,13 @@ class Application : Game() { elevationPanel.add(JLabel("Elevation")) elevationPanel.add(elevationControl) + scalefactorPanel.add(JLabel("Scaling Factor")) + scalefactorPanel.add(scalefactorControl) + mainPanel.add(turbidityPanel) mainPanel.add(albedoPanel) mainPanel.add(elevationPanel) + mainPanel.add(scalefactorPanel) this.isVisible = true this.defaultCloseOperation = WindowConstants.EXIT_ON_CLOSE @@ -228,7 +270,11 @@ class Application : Game() { } elevationControl.addChangeListener { - app.elevation = Math.toRadians((elevationControl.value as Int).toDouble()) + app.elevation = Math.toRadians(elevationControl.value as Double) + } + + scalefactorControl.addChangeListener { + app.scalefactor = (scalefactorControl.value as Double).toFloat() } } diff --git a/src/net/torvald/parametricsky/ArHosekSkyModel.kt b/src/net/torvald/parametricsky/ArHosekSkyModel.kt index 81d4809b1..16e4348f0 100644 --- a/src/net/torvald/parametricsky/ArHosekSkyModel.kt +++ b/src/net/torvald/parametricsky/ArHosekSkyModel.kt @@ -160,8 +160,10 @@ object ArHosekSkyModel { // internal definitions private class DoubleArrayPtr(val arr: DoubleArray, var ptrOffset: Int) { + init { + if (ptrOffset < 0) throw IllegalArgumentException("Negative ptrOffset: $ptrOffset") + } operator fun get(i: Int) = arr[ptrOffset + i] - } private class DoubleArrayArrayPtr(var arr: Array, var ptrOffset: Int) { @@ -185,6 +187,8 @@ object ArHosekSkyModel { albedo: Double, solar_elevation: Double ) { + if (turbidity < 1) throw IllegalArgumentException("Turbidity must be equal to or greater than 1 (got $turbidity)") + var elev_matrix: DoubleArrayPtr val int_turbidity = turbidity.toInt() @@ -193,7 +197,6 @@ object ArHosekSkyModel { val solar_elevation = pow(solar_elevation / (MATH_PI / 2.0), (1.0 / 3.0)) // alb 0 low turb - elev_matrix = DoubleArrayPtr(dataset, 9 * 6 * (int_turbidity - 1)) @@ -672,13 +675,13 @@ object ArHosekSkyModel { state.configs[channel], theta, gamma - ) * state.radiances[channel]; + ) * state.radiances[channel] } private const val pieces = 45 private const val order = 4 - fun arhosekskymodel_sr_internal( + private fun arhosekskymodel_sr_internal( state: ArHosekSkyModelState, turbidity: Int, wl: Int, @@ -686,7 +689,7 @@ object ArHosekSkyModel { ): Double { var pos = (pow(2.0 * elevation / MATH_PI, 1.0 / 3.0) * pieces).toInt() // floor - if (pos > 44) pos = 44; + if (pos > 44) pos = 44 val break_x = pow((pos.toDouble() / pieces.toDouble()), 3.0) * (MATH_PI * 0.5) @@ -773,7 +776,7 @@ object ArHosekSkyModel { val singamma = sin(gamma) var sc2 = 1.0 - ar2 * singamma * singamma if (sc2 < 0.0) sc2 = 0.0 - var sampleCosine = sqrt (sc2); + var sampleCosine = sqrt(sc2) // The following will be improved in future versions of the model: // here, we directly use fitted 5th order polynomials provided by the @@ -791,9 +794,9 @@ object ArHosekSkyModel { ldCoefficient[4] * pow(sampleCosine, 4.0) + ldCoefficient[5] * pow(sampleCosine, 5.0) - direct_radiance *= darkeningFactor; + direct_radiance *= darkeningFactor - return direct_radiance; + return direct_radiance } fun arhosekskymodel_solar_radiance( @@ -816,7 +819,7 @@ object ArHosekSkyModel { wavelength ) - return direct_radiance + inscattered_radiance; + return direct_radiance + inscattered_radiance } } diff --git a/src/net/torvald/parametricsky/datasets/DatasetSpectral.kt b/src/net/torvald/parametricsky/datasets/DatasetSpectral.kt index aae1c87d6..1a39e2dd5 100644 --- a/src/net/torvald/parametricsky/datasets/DatasetSpectral.kt +++ b/src/net/torvald/parametricsky/datasets/DatasetSpectral.kt @@ -194,6 +194,8 @@ object DatasetSpectral { solarDataset720 ) + val waves = floatArrayOf(320f, 360f, 400f, 440f, 480f, 520f, 560f, 600f, 640f, 680f, 720f) + val limbDarkeningDataset320 = doubleArrayOf(0.087657, 0.767174, 0.658123, -1.02953, 0.703297, -0.186735) val limbDarkeningDataset360 = doubleArrayOf(0.122953, 1.01278, 0.238687, -1.12208, 1.17087, -0.424947) diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIVitalMetre.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIVitalMetre.kt index cae77879a..f00a250cc 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIVitalMetre.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIVitalMetre.kt @@ -4,7 +4,7 @@ import com.badlogic.gdx.graphics.Camera import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.jme3.math.FastMath -import net.torvald.colourutil.CIELabUtil.darkerLab +import net.torvald.colourutil.darkerLab import net.torvald.terrarum.AppLoader import net.torvald.terrarum.Second import net.torvald.terrarum.modulebasegame.gameactors.ActorHumanoid diff --git a/src/net/torvald/terrarum/modulebasegame/worldgenerator/Worldgen.kt b/src/net/torvald/terrarum/modulebasegame/worldgenerator/Worldgen.kt index 1b45e353d..e7710deb1 100644 --- a/src/net/torvald/terrarum/modulebasegame/worldgenerator/Worldgen.kt +++ b/src/net/torvald/terrarum/modulebasegame/worldgenerator/Worldgen.kt @@ -86,4 +86,5 @@ infix fun Long.shake(other: Long): Long { return s0 + s1 } -val TWO_PI = Math.PI * 2.0 \ No newline at end of file +val TWO_PI = Math.PI * 2.0 +val HALF_PI = Math.PI / 2.0 diff --git a/src/net/torvald/terrarum/tests/CIESpectralTest.kt b/src/net/torvald/terrarum/tests/CIESpectralTest.kt index 778b5d791..44dbffe25 100644 --- a/src/net/torvald/terrarum/tests/CIESpectralTest.kt +++ b/src/net/torvald/terrarum/tests/CIESpectralTest.kt @@ -1,2 +1,20 @@ package net.torvald.terrarum.tests +import net.torvald.colourutil.CIEXYZ +import net.torvald.colourutil.getXYZUsingIntegral +import net.torvald.colourutil.toRGB +import net.torvald.colourutil.toRGBRaw + +fun main() { + val waves = floatArrayOf(485f,495f,505f,515f,525f,535f,545f,555f,565f) + val samples = floatArrayOf( 0f,0.2f,0.5f,1f, 1f, 1f,0.5f,0.2f,0f) + + val xyz = getXYZUsingIntegral(waves, samples) + val srgb = xyz.toRGB() + + println(xyz) + println(srgb) + + + println(CIEXYZ(100f/3f, 100f/3f, 100f/3f).toRGB()) +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/tests/RGBtoXYZBenchmark.kt b/src/net/torvald/terrarum/tests/RGBtoXYZBenchmark.kt index 0256609d8..989373c10 100644 --- a/src/net/torvald/terrarum/tests/RGBtoXYZBenchmark.kt +++ b/src/net/torvald/terrarum/tests/RGBtoXYZBenchmark.kt @@ -1,10 +1,10 @@ package net.torvald.terrarum.tests -import net.torvald.colourutil.CIEXYZUtil.linearise -import net.torvald.colourutil.CIEXYZUtil.unLinearise import net.torvald.colourutil.ColourUtil.getLuminosity import net.torvald.colourutil.ColourUtil.getLuminosityQuick import net.torvald.colourutil.RGB +import net.torvald.colourutil.linearise +import net.torvald.colourutil.unLinearise import net.torvald.random.HQRNG import kotlin.system.measureNanoTime diff --git a/terrarum.iml b/terrarum.iml index 340c5d357..2664b041f 100644 --- a/terrarum.iml +++ b/terrarum.iml @@ -1,15 +1,5 @@ - - - - - - - - - diff --git a/work_files/graphics/fonts/hangul_johab.psd b/work_files/graphics/fonts/hangul_johab.psd index 2df55429a..3a5b5e6d0 100644 --- a/work_files/graphics/fonts/hangul_johab.psd +++ b/work_files/graphics/fonts/hangul_johab.psd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:19a9456ae47bfccd9237508d828b4459e1552549fb3418ffebe9b703f5a00b45 -size 764644 +oid sha256:5a20baaa461566ac126e4baa05620aacf32d78ce3c03255fcaee1fb57be0388a +size 766840 diff --git a/work_files/skylight/XYZJCGT.pdf b/work_files/skylight/XYZJCGT.pdf new file mode 100644 index 000000000..3c5111477 --- /dev/null +++ b/work_files/skylight/XYZJCGT.pdf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a18ab875014b4b9520f96b44d4a966a9abf1b5f54d4e33f77be009eced32bb8c +size 1266511