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