update
This commit is contained in:
64
tests/flimmer.gd
Normal file
64
tests/flimmer.gd
Normal file
@@ -0,0 +1,64 @@
|
||||
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
|
||||
Reference in New Issue
Block a user