From 6db3baf6919dff0fc288819d0a02c9dbc7a9d623 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Fri, 30 Jun 2023 00:14:28 +0900 Subject: [PATCH] clearing up interpolation functions --- src/com/jme3/math/FastMath.java | 29 +++++++++++-------- .../terrarum/modulebasegame/TitleScreen.kt | 14 ++++----- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/src/com/jme3/math/FastMath.java b/src/com/jme3/math/FastMath.java index e68628dca..86ed76f4d 100644 --- a/src/com/jme3/math/FastMath.java +++ b/src/com/jme3/math/FastMath.java @@ -231,6 +231,10 @@ final public class FastMath { return (float) (((c4 * u + c3) * u + c2) * u + c1); } + public static float interpolateCatmullRom(float u, float p0, float p1, float p2, float p3) { + return interpolateCatmullRom(u, 0.5f, p0, p1, p2, p3); + } + /**Interpolate a spline between at least 4 control points following the Catmull-Rom equation. * here is the interpolation matrix * m = [ 0.0 1.0 0.0 0.0 ] @@ -316,24 +320,25 @@ final public class FastMath { public static float interpolateHermite(float scale, float p0, float p1, float p2, float p3) { - return interpolateHermite(scale, p0, p1, p2, p3, 0f, 0f); - } - public static float interpolateHermite(float scale, float p0, float p1, float p2, float p3, float tension, float bias) { +// return interpolateHermite(scale, p0, p1, p2, p3, 0f, 0f); float mu2 = scale * scale; float mu3 = mu2 * scale; + float biasTensionTerms = 0.5f;//(1f + bias) * (1f - tension) / 2f; - float m0 = (p1 - p0) * (1f + bias) * (1f - tension) / 2f; - m0 += (p2 - p1) * (1f + bias) * (1f - tension) / 2f; - float m1 = (p2 - p1) * (1f + bias) * (1f - tension) / 2f; - m1 += (p3 - p2) * (1f + bias) * (1f - tension) / 2f; + float m0 = (p1 - p0) * biasTensionTerms; + float mTemp = (p2 - p1) * biasTensionTerms; + m0 += mTemp; + float m1 = mTemp; + m1 += (p3 - p2) * biasTensionTerms; - float a0 = 2 * mu3 - 3 * mu2 + 1; - float a1 = mu3 - 2 * mu2 + scale; - float a2 = mu3 - mu2; - float a3 = -2 * mu3 + 3 * mu2; + float a0 = 2*mu3 - 3*mu2 + 1; + float a1 = 1*mu3 - 2*mu2 + scale; + float a2 = 1*mu3 - 1*mu2 + 0; + float a3 = -2*mu3 + 3*mu2 + 0; - return a0 * p1 + a1 * m0 + a2 * m1 + a3 * p2; + return a0*p1 + a1*m0 + a2*m1 + a3*p2; } + //public static float interpolateHermite(float scale, float p0, float p1, float p2, float p3, float tension, float bias) {} /** diff --git a/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt b/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt index 48379f011..bf127f234 100644 --- a/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt +++ b/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt @@ -81,7 +81,7 @@ class TitleScreen(batch: FlippingSpriteBatch) : IngameInstance(batch) { val xperc: Double = (x - xwstart) / xw // return FastMath.interpolateLinear(xperc.toFloat(), cameraNodes[indexThis fmod cameraNodes.size], cameraNodes[(indexThis + 1) fmod cameraNodes.size]).toDouble() - return FastMath.interpolateHermite(xperc.toFloat(), + return FastMath.interpolateCatmullRom(xperc.toFloat(), cameraNodes[(indexThis - 1) fmod cameraNodes.size], cameraNodes[(indexThis - 0) fmod cameraNodes.size], cameraNodes[(indexThis + 1) fmod cameraNodes.size], @@ -310,9 +310,9 @@ class TitleScreen(batch: FlippingSpriteBatch) : IngameInstance(batch) { drawLineOnWorld(x1.toFloat() + ww, y1.toFloat(), x2.toFloat() + ww, y2.toFloat()) } - private val baseSlopeCol = Color(0f, 1f, 1f, 1f) + private val baseSlopeCol = Color(0f, 0.9f, 0.85f, 1f) private val firstOrderSlopeCol = Color(0f, 0.4f, 0f, 1f) - private val secondOrderSlopeCol = Color(0.6f, 0.6f, 0.0f, 1f) + private val secondOrderSlopeCol = Color(1f, 0.3f, 0.6f, 1f) private val renderScreen = { delta: Float -> Gdx.graphics.setTitle(TerrarumIngame.getCanonicalTitle()) @@ -361,15 +361,12 @@ class TitleScreen(batch: FlippingSpriteBatch) : IngameInstance(batch) { drawLineOnWorld(px1L, py1L, px1C, py1C) drawLineOnWorld(px1C, py1C, px1R, py1R) - it.color = secondOrderSlopeCol - drawLineOnWorld(px2L, py2L, px2R, py2R) - - it.color = baseSlopeCol /*(1..cameraNodes.lastIndex + 16).forEach { index0 -> val x1 = (index0 - 1) * cameraNodeWidth * TILE_SIZEF; val x2 = (index0 - 0) * cameraNodeWidth * TILE_SIZEF val y1 = cameraNodes[(index0 - 1) fmod cameraNodes.size]; val y2 = cameraNodes[index0 fmod cameraNodes.size] drawLineOnWorld(x1, y1, x2, y2) }*/ + it.color = baseSlopeCol val points = (0..App.scr.width).map { x -> val worldX = (WorldCamera.x + x).toDouble() worldX to getPointAt(worldX) @@ -380,6 +377,9 @@ class TitleScreen(batch: FlippingSpriteBatch) : IngameInstance(batch) { } } + it.color = secondOrderSlopeCol + drawLineOnWorld(px2L, py2L, px2R, py2R) + } } }