extends SceneTree const SANDBOX_STAGE: PackedScene = preload("res://scenes/stage/sandbox_stage.tscn") const PROP_EDITOR_SCENE: PackedScene = preload("res://scenes/editors/prop/prop_editor.tscn") const STAGE_WALL_PANEL: Script = preload("res://scripts/stage/scenery/stage_wall_panel.gd") const STAGE_SCENERY_ARTWORK: Script = preload("res://scripts/stage/scenery/stage_scenery_artwork.gd") func _initialize() -> void: call_deferred("_capture_scenes") func _capture_scenes() -> void: root.size = Vector2i(1280, 720) var stage: SandboxStage = SANDBOX_STAGE.instantiate() as SandboxStage root.add_child(stage) await _wait_for_render_frames(3) var loaded: bool = stage.call("_load_scene_from_path", "res://content/stages/starters/town_street.scene", false) print("VISUAL town_street_loaded=", loaded) stage.call("_on_grid_toggled", false) await _wait_for_render_frames(4) await _save_viewport_image("res://tests/phase19_visual_town_street.png") loaded = stage.call("_load_scene_from_path", "res://content/stages/starters/living_room.scene", false) print("VISUAL living_room_loaded=", loaded) stage.call("_on_grid_toggled", false) await _wait_for_render_frames(4) await _save_viewport_image("res://tests/phase19_visual_living_room.png") loaded = stage.call("_load_scene_from_path", "res://content/stages/starters/blank.scene", false) print("VISUAL blank_loaded=", loaded) stage.call("_on_grid_toggled", false) await _wait_for_render_frames(2) var world: Node2D = stage.get_node("World") as Node2D var camera: Camera2D = stage.get_node("Camera2D") as Camera2D camera.position = Vector2(0.0, -180.0) camera.zoom = Vector2(0.72, 0.72) var sky_view: StageSkyView = stage.get("_sky_view") as StageSkyView sky_view.set_sky(&"sky_sunset") var brick_wall: StageWallPanel = STAGE_WALL_PANEL.new() as StageWallPanel brick_wall.position = Vector2(-430.0, -220.0) brick_wall.configure(Vector2(390.0, 290.0), &"finish_wall_brick", Color.WHITE) world.add_child(brick_wall) var spawner: StageSpawner = stage.get("_spawner") as StageSpawner var grass: TerrainBlock = spawner.spawn_terrain_asset("ground", Vector2(120.0, 18.0)) grass.set_finish(&"finish_ground_grass") var tree: StageSceneryArtwork = STAGE_SCENERY_ARTWORK.new() as StageSceneryArtwork tree.name = "ApprovedTreeArtwork" tree.position = Vector2(-140.0, -150.0) tree.display_name = "Tree" tree.set_depth(&"near") var tree_loaded: bool = tree.load_visual("res://content/props/art_tree-v2.prop") world.add_child(tree) var missing: StageSceneryArtwork = STAGE_SCENERY_ARTWORK.new() as StageSceneryArtwork missing.name = "MissingArtworkExample" missing.position = Vector2(100.0, -145.0) missing.configure_missing("res://content/props/phase19_missing_art_demo.prop", "Tree", Rect2(Vector2(-52.0, -72.0), Vector2(104.0, 144.0)), &"near") world.add_child(missing) print("VISUAL approved_tree_loaded=", tree_loaded, " missing_marker=", missing.missing) stage.call("_enter_scenery_edit_mode") (stage.get("_selection") as StageSelection).select_only(missing) stage.call("_refresh_scenery_inspector") await _wait_for_render_frames(5) await _save_viewport_image("res://tests/phase19_visual_finishes_and_repair.png") var scenery_controller: StageSceneryController = stage.get("_scenery_controller") as StageSceneryController if scenery_controller.begin_single_transform(missing, &"move", missing.global_position): stage.call("_refresh_scenery_capture_bar") await _wait_for_render_frames(3) await _save_viewport_image("res://tests/phase19_visual_scenery_drag_cancel.png") scenery_controller.cancel_single_transform() stage.call("_refresh_scenery_capture_bar") missing.queue_free() camera.position = Vector2(0.0, -270.0) tree.position = Vector2(-140.0, -95.0) (stage.get("_selection") as StageSelection).select_only(tree) stage.call("_refresh_scenery_inspector") await _wait_for_render_frames(4) await _save_viewport_image("res://tests/phase19_visual_scenery_selected_size.png") var tree_bounds: Rect2 = tree.get_visual_world_bounds() if scenery_controller.begin_single_transform(tree, &"resize", tree_bounds.position, tree_bounds.position): stage.call("_refresh_scenery_capture_bar") await _wait_for_render_frames(3) await _save_viewport_image("res://tests/phase19_visual_scenery_resize_cancel.png") scenery_controller.cancel_single_transform() stage.call("_refresh_scenery_capture_bar") var browser: StageAssetBrowser = stage.get("_asset_browser") as StageAssetBrowser stage.call("_load_scene_from_path", "res://content/stages/starters/blank.scene", false) (stage.get("_selection") as StageSelection).clear_selection() stage.call("_exit_scenery_edit_mode") stage.call("_on_grid_toggled", true) scenery_controller.begin_wall(&"finish_wall_brick", Vector2(-180.0, -100.0)) await _wait_for_render_frames(3) await _save_viewport_image("res://tests/phase19_visual_wall_panel_preview.png") scenery_controller.exit_tool() stage.call("_on_grid_toggled", false) await _wait_for_render_frames(3) var background_entries: Array[Dictionary] = browser.call("_scenery_background_entries") as Array[Dictionary] var selector: AssetSelector = browser.get_selector() selector.open("scenery", background_entries, "sky_sunset") selector.call("_set_gallery_tab", "backgrounds") await _wait_for_render_frames(4) await _save_viewport_image("res://tests/phase19_visual_background_gallery.png") stage.queue_free() await process_frame await process_frame var prop_editor: PropEditor = PROP_EDITOR_SCENE.instantiate() as PropEditor root.add_child(prop_editor) await _wait_for_render_frames(3) var prop_canvas: PropCanvas = prop_editor.get("_canvas") as PropCanvas var fireplace_file: FileAccess = FileAccess.open("res://content/props/art_fireplace_mantel-v2.prop", FileAccess.READ) if fireplace_file != null: prop_editor.call("_apply_json_data", fireplace_file.get_as_text()) await _wait_for_render_frames(3) prop_editor.call("_on_size_for_stage_pressed") await _wait_for_render_frames(3) await _save_viewport_image("res://tests/phase19_visual_size_for_stage_entry.png") prop_editor.call("_finish_stage_size_preview", false) prop_canvas.set_shape_data([{ "shape_type": "polygon", "points": PackedVector2Array([Vector2(-50.0, -200.0), Vector2(50.0, -200.0), Vector2(50.0, 0.0), Vector2(-50.0, 0.0)]), "fill_color": "#9D6A4A", "outline_color": "#2D2532", "outline_width": 4.0, "closed": true, }]) prop_editor.call("_on_size_for_stage_pressed") prop_editor.call("_choose_stage_size", 1.0) await _wait_for_render_frames(4) await _save_viewport_image("res://tests/phase19_visual_size_for_stage.png") prop_editor.queue_free() await process_frame quit(0) func _wait_for_render_frames(count: int) -> void: for _frame: int in count: await process_frame await RenderingServer.frame_post_draw func _save_viewport_image(path: String) -> void: await RenderingServer.frame_post_draw var image: Image = root.get_texture().get_image() var error: Error = image.save_png(ProjectSettings.globalize_path(path)) print("VISUAL capture path=", path, " size=", image.get_size(), " error=", error)