Files
dreamer-game/tests/flimmer.gd
2026-09-16 16:15:32 +02:00

65 lines
2.4 KiB
GDScript

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