extends Node ## Flimmer-Probe: Szene anhalten, Kamera um Millimeter rücken, Bilder vergleichen. ## Deckungsgleiche Flächen (Z-Fighting) kippen dabei großflächig, echte Kanten ## wandern nur um Bruchteile eines Pixels. const GRENZE := 0.4 # Prozent veränderter Pixel, ab der es flimmert var main: Node3D func _ready() -> void: main = load("res://scenes/main.tscn").instantiate() add_child(main) await get_tree().process_frame main.ui.schliessen() Game.time_h = 12.0 var hs := Orte.center(DreamDB.PLACES, "hoersaal") main.player.global_position = hs + Vector3(1.0, 1.0, 2.0) var traum := await _messen() main.player.global_position = Vector3(0, 2.0, 20.0) var dorf := await _messen() main._erde() await get_tree().process_frame main.player.global_position = Vector3(0, 0.3, 12.0) var park := await _messen() var heim := "" for m in main.welt.humans: heim = str(m.data["heim"]) break main.player.global_position = Orte.center(HumanDB.PLACES, heim) + Vector3(0, 0.3, 0) var wohnung := await _messen() var schlimmste: float = [traum, dorf, park, wohnung].max() print("FLIMMERN %s hoersaal=%.2f%% dorf=%.2f%% park=%.2f%% wohnung=%.2f%%" % [ "OK" if schlimmste <= GRENZE else "ZU VIEL", traum, dorf, park, wohnung]) get_tree().quit(0 if schlimmste <= GRENZE else 1) ## Prozent der Pixel, die sich zwischen zwei Bildern bei winziger Kamerabewegung stark ändern. func _messen() -> float: for i in range(20): await get_tree().process_frame get_tree().paused = true var cam: Camera3D = main.player.cam var bilder: Array = [] for i in range(4): cam.position.x += 0.002 await RenderingServer.frame_post_draw await RenderingServer.frame_post_draw var img := get_viewport().get_texture().get_image() img.resize(img.get_width() / 2, img.get_height() / 2, Image.INTERPOLATE_NEAREST) bilder.append(img) cam.position.x -= 0.008 get_tree().paused = false var schlimm := 0.0 for k in range(1, bilder.size()): var a: Image = bilder[k - 1] var b: Image = bilder[k] var anders := 0 for y in range(0, a.get_height(), 2): for x in range(0, a.get_width(), 2): var ca := a.get_pixel(x, y) var cb := b.get_pixel(x, y) if absf(ca.r - cb.r) > 0.19 or absf(ca.g - cb.g) > 0.19 or absf(ca.b - cb.b) > 0.19: anders += 1 var anteil := 100.0 * float(anders) / float((a.get_width() / 2) * (a.get_height() / 2)) schlimm = maxf(schlimm, anteil) return schlimm