From d6a0fe21961d9d4ada71e75e4427df98237fb18f Mon Sep 17 00:00:00 2001 From: "Hermes (godot-vr)" Date: Sat, 17 Oct 2026 18:06:39 +0000 Subject: [PATCH] =?UTF-8?q?Relief-Nachreich=20(t=5F3ebe4086):=20relief=5Fc?= =?UTF-8?q?olor=20klammaert=20Kanaele=20auf=200..1=20=E2=80=94=20der=20Mes?= =?UTF-8?q?h-Speicher=20ARRAY=5FCOLOR/RGBA8=20clamp't=20genauso,=20der=20H?= =?UTF-8?q?elfer=20muss=20die=20Render-Wahrheit=20liefern,=20sonst=20liegt?= =?UTF-8?q?=20der=20Probe-Vergleich=20um=20>0.05=20daneben.=20Live-Materia?= =?UTF-8?q?l-Test=20t=5F55ed041a=20erwartet=20jetzt=20dieselbe=20relief=5F?= =?UTF-8?q?color-Formel=20statt=20der=20alten=200.72..1.15-Konstanten.=20S?= =?UTF-8?q?uite:=20test=5Fterrain=20112/112,=2011=20Suiten=20ALL=20OK.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/viewport/terrain_mesh.gd | 6 +++++- tests/test_terrain.gd | 10 +++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/viewport/terrain_mesh.gd b/src/viewport/terrain_mesh.gd index ce6dbb3..286cded 100644 --- a/src/viewport/terrain_mesh.gd +++ b/src/viewport/terrain_mesh.gd @@ -267,7 +267,11 @@ static func relief_color(mat_id: int, h: float, hmin: float, hmax: float, var lf := lerpf(LIGHT_LOW, LIGHT_HIGH, x * x * (3.0 - 2.0 * x)) var f := clampf(hf * lf, SHADE_MIN, SHADE_MAX) var base := MATERIAL_COLORS[m] as Color - return Color(base.r * f, base.g * f, base.b * f, 1.0) + # Kanäle auf 0..1 klemmen: der Mesh-Speicher (ARRAY_COLOR, RGBA8) clamp't + # genauso — der Helfer muss die RENDER-Wahrheit liefern (Probe-Vergleich), + # nicht die unbehandelte Mathematik. + return Color(clampf(base.r * f, 0.0, 1.0), clampf(base.g * f, 0.0, 1.0), + clampf(base.b * f, 0.0, 1.0), 1.0) func triangle_count() -> int: diff --git a/tests/test_terrain.gd b/tests/test_terrain.gd index d2f200c..c55d6c3 100644 --- a/tests/test_terrain.gd +++ b/tests/test_terrain.gd @@ -424,8 +424,10 @@ func _test_live_material_colors() -> void: for v in heights: hmin = minf(hmin, v) hmax = maxf(hmax, v) - var shade := lerpf(0.72, 1.15, (heights[center] - hmin) / maxf(hmax - hmin, 0.0001)) - var expected := Color(0.78, 0.70, 0.45) * shade # Sand × Höhen-Shading + # Karte t_3ebe4086: Shading = Material × Höhen-Kurve × Pseudo-Licht — + # die Erwartung kommt aus derselben relief_color()-Formel wie das Mesh. + var nrm: PackedVector3Array = (view.get("_mi").mesh.surface_get_arrays(0))[Mesh.ARRAY_NORMAL] + var expected := _relief_color(1, heights[center], hmin, hmax, nrm[center]) # Sand var c := col[center] _check(absf(c.r - expected.r) < 0.005 and absf(c.g - expected.g) < 0.005 and absf(c.b - expected.b) < 0.005, @@ -478,7 +480,9 @@ func _test_live_material_colors() -> void: flat.resize(res * res) view2.call("update_heights", flat, res, size, size) # OHNE Schicht, Cache leer var col2: PackedColorArray = (view2.get("_mi").mesh.surface_get_arrays(0))[Mesh.ARRAY_COLOR] - var grass_expected := Color(0.30, 0.45, 0.22) * 0.72 # flach: t=0 → shade=SHADING_LOW + # Karte t_3ebe4086: flach = t 0 (S-Kurve → SHADING_LOW) × Normale UP → + # Erwartung aus derselben relief_color()-Formel wie das Mesh. + var grass_expected := _relief_color(0, 0.0, 0.0, 0.0, Vector3.UP) var c2 := col2[center] _check(absf(c2.r - grass_expected.r) < 0.005 and absf(c2.g - grass_expected.g) < 0.005 and absf(c2.b - grass_expected.b) < 0.005,