58 lines
2.2 KiB
GDScript
58 lines
2.2 KiB
GDScript
extends SceneTree
|
|
const EffectPlayer = preload("res://fx/effect_player.gd")
|
|
var failures := 0
|
|
func check(ok: bool, label: String) -> void:
|
|
if not ok:
|
|
failures += 1
|
|
printerr("FAIL: " + label)
|
|
func _init() -> void:
|
|
call_deferred("run")
|
|
func run() -> void:
|
|
var fx := EffectPlayer.new()
|
|
fx.build({"particles": [{"particle": {"BillboardType": 3, "ColorOperationType": 4}}]})
|
|
var material: Material = fx._emitters[0].material_override
|
|
check(material is ShaderMaterial, "LIE no longer uses camera-facing StandardMaterial")
|
|
if material is ShaderMaterial:
|
|
check(material.get_shader_parameter("billboard_mode") == 4, "horizontal custom billboard selected")
|
|
if DisplayServer.get_name() != "headless":
|
|
await pixels(material)
|
|
fx.free()
|
|
print("effect_lie_test: failures=%d" % failures)
|
|
quit(1 if failures else 0)
|
|
func pixels(material: ShaderMaterial) -> void:
|
|
var viewport := SubViewport.new()
|
|
viewport.size = Vector2i(96, 96)
|
|
viewport.own_world_3d = true
|
|
viewport.render_target_update_mode = SubViewport.UPDATE_ALWAYS
|
|
root.add_child(viewport)
|
|
var environment := WorldEnvironment.new()
|
|
environment.environment = Environment.new()
|
|
environment.environment.background_mode = Environment.BG_COLOR
|
|
environment.environment.background_color = Color.BLACK
|
|
viewport.add_child(environment)
|
|
var image := Image.create(2, 2, false, Image.FORMAT_RGBA8)
|
|
image.fill(Color.WHITE)
|
|
material.set_shader_parameter("albedo_texture", ImageTexture.create_from_image(image))
|
|
var mesh := MeshInstance3D.new()
|
|
mesh.mesh = QuadMesh.new()
|
|
mesh.mesh.size = Vector2(1.5, 1.5)
|
|
mesh.material_override = material
|
|
viewport.add_child(mesh)
|
|
var camera := Camera3D.new()
|
|
camera.projection = Camera3D.PROJECTION_ORTHOGONAL
|
|
camera.size = 3
|
|
viewport.add_child(camera)
|
|
for top in [true, false]:
|
|
camera.position = Vector3(0, 3, 0) if top else Vector3(0, 0, 3)
|
|
camera.look_at(Vector3.ZERO, Vector3.FORWARD if top else Vector3.UP)
|
|
await process_frame
|
|
await RenderingServer.frame_post_draw
|
|
var pixels := viewport.get_texture().get_image()
|
|
var lit := 0
|
|
for y in 96:
|
|
for x in 96:
|
|
if pixels.get_pixel(x, y).r > 0.5: lit += 1
|
|
check(lit > 1500 if top else lit < 100, "horizontal quad visibility top=%s pixels=%d" % [top, lit])
|
|
viewport.free()
|
|
await process_frame
|