65 lines
2.4 KiB
GDScript
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
|