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,