Relief-Nachreich (t_3ebe4086): relief_color klammaert Kanaele auf 0..1 — der Mesh-Speicher ARRAY_COLOR/RGBA8 clamp't genauso, der Helfer muss die Render-Wahrheit liefern, sonst liegt der Probe-Vergleich um >0.05 daneben. Live-Material-Test t_55ed041a erwartet jetzt dieselbe relief_color-Formel statt der alten 0.72..1.15-Konstanten. Suite: test_terrain 112/112, 11 Suiten ALL OK.

This commit is contained in:
Hermes (godot-vr) 2026-10-17 18:06:39 +00:00
parent ffb27645d4
commit d6a0fe2196
2 changed files with 12 additions and 4 deletions

View file

@ -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 lf := lerpf(LIGHT_LOW, LIGHT_HIGH, x * x * (3.0 - 2.0 * x))
var f := clampf(hf * lf, SHADE_MIN, SHADE_MAX) var f := clampf(hf * lf, SHADE_MIN, SHADE_MAX)
var base := MATERIAL_COLORS[m] as Color 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: func triangle_count() -> int:

View file

@ -424,8 +424,10 @@ func _test_live_material_colors() -> void:
for v in heights: for v in heights:
hmin = minf(hmin, v) hmin = minf(hmin, v)
hmax = maxf(hmax, v) hmax = maxf(hmax, v)
var shade := lerpf(0.72, 1.15, (heights[center] - hmin) / maxf(hmax - hmin, 0.0001)) # Karte t_3ebe4086: Shading = Material × Höhen-Kurve × Pseudo-Licht —
var expected := Color(0.78, 0.70, 0.45) * shade # Sand × Höhen-Shading # 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] var c := col[center]
_check(absf(c.r - expected.r) < 0.005 and absf(c.g - expected.g) < 0.005 _check(absf(c.r - expected.r) < 0.005 and absf(c.g - expected.g) < 0.005
and absf(c.b - expected.b) < 0.005, and absf(c.b - expected.b) < 0.005,
@ -478,7 +480,9 @@ func _test_live_material_colors() -> void:
flat.resize(res * res) flat.resize(res * res)
view2.call("update_heights", flat, res, size, size) # OHNE Schicht, Cache leer 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 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] var c2 := col2[center]
_check(absf(c2.r - grass_expected.r) < 0.005 and absf(c2.g - grass_expected.g) < 0.005 _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, and absf(c2.b - grass_expected.b) < 0.005,