extends SceneTree ## Render-Probe (Karte 25.10., Sly: „immer noch harte Kanten beim Malen“): ## 256-m-Karte (feines Raster 257 = 1 m), Sandpfad mit 2-m-Pinsel, top-down ## auf 40 m Ausschnitt. Misst die größte Helligkeits-Stufe zwischen ## Nachbarpixeln quer zur Kante — weich = kleine Stufen über mehrere Pixel. ## Start (BRAUCHT Rendering): godot --path . --rendering-driver opengl3 -s res://tests/probe_mal_weich_render.gd -- func _initialize() -> void: _run() func _run() -> void: await process_frame await process_frame var out := OS.get_cmdline_user_args()[0] if OS.get_cmdline_user_args().size() > 0 else "/tmp/mal_weich.png" var size := float(OS.get_environment("PROBE_SIZE")) if OS.get_environment("PROBE_SIZE") != "" else 256.0 var res := 129 var mres := SvmapIO.material_resolution_for(res, size, size) var heights := PackedFloat32Array() heights.resize(res * res) var mats := PackedByteArray() mats.resize(mres * mres) var mb := PackedByteArray() mb.resize(mres * mres) var mw := PackedByteArray() mw.resize(mres * mres) var weich := float(OS.get_environment("PROBE_WEICH")) if OS.get_environment("PROBE_WEICH") != "" else 0.0 var radius := float(OS.get_environment("PROBE_R")) if OS.get_environment("PROBE_R") != "" else 2.0 for i in 60: # schräger Pfad + Kurve var t := float(i) / 59.0 TerrainField.apply_material_brush_mix(mats, mb, mw, mres, size, size, -15.0 + 30.0 * t, -10.0 + 8.0 * sin(t * 3.0), radius, 1, weich) var view := Node3D.new() view.set_script(load("res://src/viewport/terrain_mesh.gd")) root.add_child(view) view.call("set_mix", mb, mw) view.call("update_heights", heights, res, size, size, mats) view.call("set_contours", false) var cam := Camera3D.new() root.add_child(cam) cam.projection = Camera3D.PROJECTION_ORTHOGONAL cam.size = 40.0 cam.position = Vector3(0.0, 50.0, -5.0 + 0.01) cam.look_at(Vector3(0, 0, -5.0), Vector3(0, 0, -1)) cam.current = true for i in 4: await process_frame await RenderingServer.frame_post_draw var img := root.get_texture().get_image() img.save_png(out) # Größte Nachbarpixel-Stufe (Luminanz) im Bild — harte Pixelkanten ≈ volle # Sand↔Gras-Differenz in EINEM Pixel, weich = über ~Pixel/Meter verteilt. var maxstep := 0.0 for y in range(0, img.get_height(), 2): for x in range(1, img.get_width()): var a := img.get_pixel(x - 1, y).get_luminance() var b := img.get_pixel(x, y).get_luminance() maxstep = maxf(maxstep, absf(a - b)) print("PROBE_MAXSTEP %.4f mres=%d px/m=%.1f -> %s" % [maxstep, mres, float(img.get_width()) / 40.0, out]) quit(0)