From 69ebdbc5428522ed6de6d6f868a1cc6a70794904 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sat, 1 Feb 2025 20:51:40 +0900 Subject: [PATCH] fix: some NaNs that can be caused by scroll bars --- .../joise/module/TerrarumModuleCaveLayerClosureGrad.kt | 3 ++- src/com/sudoplay/joise/module/TerrarumModuleLavaFloorGrad.kt | 3 ++- src/net/torvald/terrarum/Terrarum.kt | 2 ++ src/net/torvald/terrarum/audio/dsp/Comp.kt | 4 ---- src/net/torvald/terrarum/gameactors/ActorWithBody.kt | 2 +- src/net/torvald/terrarum/gameworld/GameWorld.kt | 2 +- src/net/torvald/terrarum/modulebasegame/console/ExportMap2.kt | 2 +- .../modulebasegame/gameactors/FixtureSwingingDoorBase.kt | 4 ++-- .../torvald/terrarum/modulebasegame/ui/UIDebugInventron.kt | 2 +- src/net/torvald/terrarum/tests/WorldgenNoiseSandbox.kt | 3 ++- src/net/torvald/terrarum/ui/UIItemHorzSlider.kt | 4 ++-- src/net/torvald/terrarum/ui/UIItemVertSlider.kt | 4 ++-- src/net/torvald/terrarum/worlddrawer/BlocksDrawer.kt | 2 +- 13 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/com/sudoplay/joise/module/TerrarumModuleCaveLayerClosureGrad.kt b/src/com/sudoplay/joise/module/TerrarumModuleCaveLayerClosureGrad.kt index fb5ada5c3..c0af6175c 100644 --- a/src/com/sudoplay/joise/module/TerrarumModuleCaveLayerClosureGrad.kt +++ b/src/com/sudoplay/joise/module/TerrarumModuleCaveLayerClosureGrad.kt @@ -3,6 +3,7 @@ package com.sudoplay.joise.module import com.sudoplay.joise.ModuleInstanceMap import com.sudoplay.joise.ModuleMap import com.sudoplay.joise.ModulePropertyMap +import net.torvald.terrarum.ifNaN /** * Created by minjaesong on 2024-09-07. @@ -12,7 +13,7 @@ class TerrarumModuleCaveLayerClosureGrad : Module() { protected val l = ScalarParameter(3.0) - private fun Double.op() = Math.sqrt((-this + h.value - l.value) / l.value).let { if (it.isNaN()) 0.0 else it.coerceIn(0.0, 1.0) } + private fun Double.op() = Math.sqrt((-this + h.value - l.value) / l.value).ifNaN(0.0).coerceIn(0.0, 1.0) override fun get(x: Double, y: Double) = y.op() override fun get(x: Double, y: Double, z: Double) = y.op()/*.also { diff --git a/src/com/sudoplay/joise/module/TerrarumModuleLavaFloorGrad.kt b/src/com/sudoplay/joise/module/TerrarumModuleLavaFloorGrad.kt index 1f4a198d2..f20bcfabb 100644 --- a/src/com/sudoplay/joise/module/TerrarumModuleLavaFloorGrad.kt +++ b/src/com/sudoplay/joise/module/TerrarumModuleLavaFloorGrad.kt @@ -3,6 +3,7 @@ package com.sudoplay.joise.module import com.sudoplay.joise.ModuleInstanceMap import com.sudoplay.joise.ModuleMap import com.sudoplay.joise.ModulePropertyMap +import net.torvald.terrarum.ifNaN import net.torvald.terrarum.modulebasegame.worldgenerator.Worldgen.YHEIGHT_DIVISOR import net.torvald.terrarum.modulebasegame.worldgenerator.Worldgen.YHEIGHT_MAGIC @@ -19,7 +20,7 @@ class TerrarumModuleLavaFloorGrad : Module() { private fun undoYtransform(yp: Double): Double = yp + (3200 - YHEIGHT_MAGIC) * YHEIGHT_DIVISOR - private fun Double.op() = Math.sqrt((this - h.value + l.value) / l.value).let { if (it.isNaN()) 0.0 else it } + private fun Double.op() = Math.sqrt((this - h.value + l.value) / l.value).ifNaN(0.0) override fun get(x: Double, y: Double) = undoYtransform(y).op() override fun get(x: Double, y: Double, z: Double) = undoYtransform(y).op()/*.also { diff --git a/src/net/torvald/terrarum/Terrarum.kt b/src/net/torvald/terrarum/Terrarum.kt index ba12d17d1..b06585ae8 100644 --- a/src/net/torvald/terrarum/Terrarum.kt +++ b/src/net/torvald/terrarum/Terrarum.kt @@ -648,6 +648,8 @@ inline fun Boolean.toLong(shift: Int = 0) = if (this) 1L.shl(shift) else 0L inline fun Int.bitCount() = java.lang.Integer.bitCount(this) inline fun Long.bitCount() = java.lang.Long.bitCount(this) inline fun Double.signedSqrt() = this.abs().sqrt() * this.sign +inline fun Float.ifNaN(new: Float) = if (this.isNaN()) new else this +inline fun Double.ifNaN(new: Double) = if (this.isNaN()) new else this fun absMax(left: Double, right: Double): Double { diff --git a/src/net/torvald/terrarum/audio/dsp/Comp.kt b/src/net/torvald/terrarum/audio/dsp/Comp.kt index d6d895354..ae8d45573 100644 --- a/src/net/torvald/terrarum/audio/dsp/Comp.kt +++ b/src/net/torvald/terrarum/audio/dsp/Comp.kt @@ -136,9 +136,5 @@ class Comp( this.ratio = other.ratio } } - - private fun Double.unNaN(d: Double): Double { - return if (this.isNaN()) d else this - } } diff --git a/src/net/torvald/terrarum/gameactors/ActorWithBody.kt b/src/net/torvald/terrarum/gameactors/ActorWithBody.kt index 53204f1c7..c5d1fd75b 100644 --- a/src/net/torvald/terrarum/gameactors/ActorWithBody.kt +++ b/src/net/torvald/terrarum/gameactors/ActorWithBody.kt @@ -2298,7 +2298,7 @@ open class ActorWithBody : Actor { @Transient internal val HITBOX_COLOURS1 = Color(0xFFFF0088.toInt()) - fun isCloseEnough(a: Double, b: Double) = ((a / b).let { if (it.isNaN()) 0.0 else it } - 1).absoluteValue < PHYS_EPSILON_DIST + fun isCloseEnough(a: Double, b: Double) = ((a / b).ifNaN(0.0) - 1).absoluteValue < PHYS_EPSILON_DIST } diff --git a/src/net/torvald/terrarum/gameworld/GameWorld.kt b/src/net/torvald/terrarum/gameworld/GameWorld.kt index 32f8f2c85..c97ec9e35 100644 --- a/src/net/torvald/terrarum/gameworld/GameWorld.kt +++ b/src/net/torvald/terrarum/gameworld/GameWorld.kt @@ -891,7 +891,7 @@ open class GameWorld( if (fluidID == Block.NULL || fluidID == Block.NOT_GENERATED) fluidID = Fluid.NULL - return FluidInfo(fluidID, if (fill.isNaN()) 0f else fill) // hex FFFFFFFF (magic number for ungenerated tiles) is interpreted as Float.NaN + return FluidInfo(fluidID, fill.ifNaN(0f)) // hex FFFFFFFF (magic number for ungenerated tiles) is interpreted as Float.NaN } /*private fun fluidTypeToBlock(type: FluidType) = when (type.abs()) { diff --git a/src/net/torvald/terrarum/modulebasegame/console/ExportMap2.kt b/src/net/torvald/terrarum/modulebasegame/console/ExportMap2.kt index 59b4ba83a..22b91a30b 100644 --- a/src/net/torvald/terrarum/modulebasegame/console/ExportMap2.kt +++ b/src/net/torvald/terrarum/modulebasegame/console/ExportMap2.kt @@ -88,7 +88,7 @@ internal object ExportMap2 : ConsoleCommand { } private fun Iterable.normaliseNaN(default: Float = 0f): FloatArray { - return this.map { if (it.isNaN()) default else it }.toFloatArray() + return this.map { it.ifNaN(default) }.toFloatArray() } override fun execute(args: Array) { diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSwingingDoorBase.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSwingingDoorBase.kt index 024a5b164..29a68f077 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSwingingDoorBase.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSwingingDoorBase.kt @@ -340,11 +340,11 @@ open class FixtureSwingingDoorBase : FixtureBase { private fun ActorWithBody.movingTowardsRight(): Boolean { // return ((this.controllerV ?: Vector2()) + this.externalV).x >= PHYS_EPSILON_VELO - return (((this.controllerV?.x ?: 0.0) / this.externalV.x).let { if (it.isNaN()) 0.0 else it } - 1) >= PHYS_EPSILON_DIST + return (((this.controllerV?.x ?: 0.0) / this.externalV.x).ifNaN(0.0) - 1) >= PHYS_EPSILON_DIST } private fun ActorWithBody.movingTowardsLeft(): Boolean { // return ((this.controllerV ?: Vector2()) + this.externalV).x <= -PHYS_EPSILON_VELO - return (((this.controllerV?.x ?: 0.0) / this.externalV.x).let { if (it.isNaN()) 0.0 else it } - 1) <= PHYS_EPSILON_DIST + return (((this.controllerV?.x ?: 0.0) / this.externalV.x).ifNaN(0.0) - 1) <= PHYS_EPSILON_DIST } private fun ActorWithBody.notMoving(): Boolean { // return ((this.controllerV ?: Vector2()) + this.externalV).x.absoluteValue < PHYS_EPSILON_VELO diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIDebugInventron.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIDebugInventron.kt index 2142643c1..9e8618359 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIDebugInventron.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIDebugInventron.kt @@ -249,7 +249,7 @@ class UIDebugInventron : UICanvas( } private fun drawAnalysis(batch: SpriteBatch) { - val scroll = (analyserScroll.value * analysisTextBuffer.size.times(TEXT_LINE_HEIGHT).minus(analyserHeight - 3)).roundToInt().coerceAtLeast(0) + val scroll = (analyserScroll.value * analysisTextBuffer.size.times(TEXT_LINE_HEIGHT).minus(analyserHeight - 3)).ifNaN(0.0).roundToInt().coerceAtLeast(0) analysisTextBuffer.forEachIndexed { index, s -> App.fontGame.draw(batch, s, analyserPosX + 6, analyserPosY2 + 3 + index * TEXT_LINE_HEIGHT - scroll) } diff --git a/src/net/torvald/terrarum/tests/WorldgenNoiseSandbox.kt b/src/net/torvald/terrarum/tests/WorldgenNoiseSandbox.kt index 4620aa133..c46891cf6 100644 --- a/src/net/torvald/terrarum/tests/WorldgenNoiseSandbox.kt +++ b/src/net/torvald/terrarum/tests/WorldgenNoiseSandbox.kt @@ -23,6 +23,7 @@ import net.torvald.terrarum.FlippingSpriteBatch import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.concurrent.ThreadExecutor import net.torvald.terrarum.gameitems.ItemID +import net.torvald.terrarum.ifNaN import net.torvald.terrarum.inUse import net.torvald.terrarum.modulebasegame.worldgenerator.BiomegenParams import net.torvald.terrarum.modulebasegame.worldgenerator.TerragenParams @@ -516,7 +517,7 @@ internal class TerragenTest(val seed: Long, val params: TerragenParams) : NoiseM } private fun Double.toColour(): Int { - val d = if (this.isNaN()) 0.0 else this.absoluteValue + val d = this.ifNaN(0.0).absoluteValue val b = d.toFloat() val c = if (b >= 2f) diff --git a/src/net/torvald/terrarum/ui/UIItemHorzSlider.kt b/src/net/torvald/terrarum/ui/UIItemHorzSlider.kt index 6d1e60bf0..60e398313 100644 --- a/src/net/torvald/terrarum/ui/UIItemHorzSlider.kt +++ b/src/net/torvald/terrarum/ui/UIItemHorzSlider.kt @@ -42,9 +42,9 @@ class UIItemHorzSlider( // reset the scroll status handlePos = 0.0 this.value = 0.0 - field = value + field = value.coerceIn(12, width) - handleTravelDist = width - value + handleTravelDist = width - field } override val height = 24 diff --git a/src/net/torvald/terrarum/ui/UIItemVertSlider.kt b/src/net/torvald/terrarum/ui/UIItemVertSlider.kt index de94d7815..5cccb0b6d 100644 --- a/src/net/torvald/terrarum/ui/UIItemVertSlider.kt +++ b/src/net/torvald/terrarum/ui/UIItemVertSlider.kt @@ -35,9 +35,9 @@ class UIItemVertSlider( // reset the scroll status handlePos = 0.0 this.value = 0.0 - field = value + field = value.coerceIn(12, height) - handleTravelDist = height - value + handleTravelDist = height - field } companion object { diff --git a/src/net/torvald/terrarum/worlddrawer/BlocksDrawer.kt b/src/net/torvald/terrarum/worlddrawer/BlocksDrawer.kt index b1985c403..f27a88e81 100644 --- a/src/net/torvald/terrarum/worlddrawer/BlocksDrawer.kt +++ b/src/net/torvald/terrarum/worlddrawer/BlocksDrawer.kt @@ -517,7 +517,7 @@ internal object BlocksDrawer { .filter { it.startsWith("fluid@") }.sorted().firstOrNull() val fillThis = - world.layerFluids.unsafeGetTile1(wx, wy).second.let { if (it.isNaN()) 0f else it.coerceAtMost(1f) } + world.layerFluids.unsafeGetTile1(wx, wy).second.ifNaN(0f).coerceAtMost(1f) val tile = world.getTileFromTerrain(wx, wy)