scopedvr-map-editor/tests/test_terrain_stuecke.gd
slyphax 313500b988 Kern-Stand nachgezogen, Test für Terrain in Stücken, Loadout-Sync-Pfad
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 20:27:35 +01:00

93 lines
2.9 KiB
GDScript

extends SceneTree
## Editor-Test (headless): Terrain in Stücken zeigt dieselben Punkte wie das ganze
## Mesh, auch nach Pinselschritten mit Symmetrie.
## Ausführen: godot --headless --path . --script res://tests/test_terrain_stuecke.gd
var failures := 0
var checks := 0
func _initialize() -> void:
_run.call_deferred()
func _check(cond: bool, label: String) -> void:
checks += 1
if cond:
print(" ok: ", label)
else:
failures += 1
print(" FAIL: ", label)
func _ansicht(stuecke: bool) -> TerrainMeshView:
TerrainMeshView.stuecke_an = stuecke
var v := TerrainMeshView.new()
root.add_child(v)
return v
## Alle Stück-Punkte müssen zum ganzen Mesh gehören, Stückgrenzen ohne Lücke.
func _gleich(ganz: TerrainMeshView, teile: TerrainMeshView, res: int) -> bool:
var a: Array = (ganz._mi.mesh as ArrayMesh).surface_get_arrays(0)
var pos: PackedVector3Array = a[Mesh.ARRAY_VERTEX]
var nor: PackedVector3Array = a[Mesh.ARRAY_NORMAL] # kommt komprimiert zurück
var gesehen := 0
for s in teile._stuecke:
var arr: Array = s["arrays"]
var p: PackedVector3Array = arr[Mesh.ARRAY_VERTEX]
var n: PackedVector3Array = arr[Mesh.ARRAY_NORMAL]
var w: int = s["w"]
for i in p.size():
var x: int = int(s["x0"]) + i % w
var z: int = int(s["z0"]) + i / w
var ziel := z * res + x
if p[i].distance_to(pos[ziel]) > 0.001 or n[i].distance_to(nor[ziel]) > 0.01:
print(" Abweichung bei ", x, ",", z)
return false
gesehen += 1
return gesehen >= res * res
func _run() -> void:
var res := 129
var size := 512.0
var h := PackedFloat32Array()
h.resize(res * res)
for i in h.size():
h[i] = 4.0 * sin(float(i) * 0.013)
var mats := PackedByteArray()
mats.resize(res * res)
var ganz := _ansicht(false)
ganz.update_heights(h, res, size, size, mats)
var teile := _ansicht(true)
teile.update_heights(h, res, size, size, mats)
_check(teile._stuecke.size() == 16, "16 Stücke bei Raster 129")
_check(_gleich(ganz, teile, res), "Stücke zeigen dieselben Punkte wie das ganze Mesh")
_check(teile.triangle_count() == ganz.triangle_count(), "Gleiche Dreieckszahl")
# Zwei getrennte Pinselflecken, einer davon über eine Stückgrenze.
var flecken := [Rect2i(28, 28, 10, 10), Rect2i(100, 90, 6, 6)]
for r: Rect2i in flecken:
for z in range(r.position.y, r.end.y):
for x in range(r.position.x, r.end.x):
h[z * res + x] += 3.0
teile.markiere_hoehen(r)
TerrainMeshView.stuecke_an = false
ganz.update_heights(h)
TerrainMeshView.stuecke_an = true
teile.update_heights(h)
_check(_gleich(ganz, teile, res), "Nach Teil-Update wieder gleich, auch an Stückgrenzen")
TerrainMeshView.stuecke_an = true
teile.update_heights(h, 0, 0.0, 0.0, PackedByteArray(), Rect2i(0, 0, 4, 4))
_check(teile._dirty.is_empty(), "Mal-Schritt fasst die Punkte nicht an")
TerrainMeshView.stuecke_an = false
if failures == 0:
print("ALL OK: %d checks" % checks)
quit(0)
else:
print("FAILED: %d/%d checks" % [failures, checks])
quit(1)