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)