diff --git a/client/tests/golden/visual/atlas_GJ144e_Global.png b/client/tests/golden/visual/atlas_GJ144e_Global.png new file mode 100644 index 000000000..c6b4acc89 Binary files /dev/null and b/client/tests/golden/visual/atlas_GJ144e_Global.png differ diff --git a/client/tests/golden/visual/atlas_GJ144e_Quarter.png b/client/tests/golden/visual/atlas_GJ144e_Quarter.png new file mode 100644 index 000000000..7f423925b Binary files /dev/null and b/client/tests/golden/visual/atlas_GJ144e_Quarter.png differ diff --git a/client/tests/golden/visual/atlas_GJ144e_z2_0_C.png b/client/tests/golden/visual/atlas_GJ144e_z2_0_C.png deleted file mode 100644 index ee89f52ae..000000000 Binary files a/client/tests/golden/visual/atlas_GJ144e_z2_0_C.png and /dev/null differ diff --git a/client/tests/golden/visual/atlas_GJ144e_z2_0_C.png.import b/client/tests/golden/visual/atlas_GJ144e_z2_0_C.png.import deleted file mode 100644 index e9e409c33..000000000 --- a/client/tests/golden/visual/atlas_GJ144e_z2_0_C.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://b7n5uctkwdukb" -path="res://.godot/imported/atlas_GJ144e_z2_0_C.png-2a6c3d8afe173cab5849760719ce01e3.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://tests/golden/visual/atlas_GJ144e_z2_0_C.png" -dest_files=["res://.godot/imported/atlas_GJ144e_z2_0_C.png-2a6c3d8afe173cab5849760719ce01e3.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/client/tests/golden/visual/atlas_GJ144e_zfit_A.png b/client/tests/golden/visual/atlas_GJ144e_zfit_A.png deleted file mode 100644 index 65336f828..000000000 Binary files a/client/tests/golden/visual/atlas_GJ144e_zfit_A.png and /dev/null differ diff --git a/client/tests/golden/visual/atlas_GJ144e_zfit_A.png.import b/client/tests/golden/visual/atlas_GJ144e_zfit_A.png.import deleted file mode 100644 index db75d7bd8..000000000 --- a/client/tests/golden/visual/atlas_GJ144e_zfit_A.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://66s4lvmnpka1" -path="res://.godot/imported/atlas_GJ144e_zfit_A.png-dcde0e17c5a2003c138855ce6d4054d6.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://tests/golden/visual/atlas_GJ144e_zfit_A.png" -dest_files=["res://.godot/imported/atlas_GJ144e_zfit_A.png-dcde0e17c5a2003c138855ce6d4054d6.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/client/tests/golden/visual/atlas_GJ244Ad_Global.png b/client/tests/golden/visual/atlas_GJ244Ad_Global.png new file mode 100644 index 000000000..091555a74 Binary files /dev/null and b/client/tests/golden/visual/atlas_GJ244Ad_Global.png differ diff --git a/client/tests/golden/visual/atlas_GJ244Ad_zfit_C.png b/client/tests/golden/visual/atlas_GJ244Ad_zfit_C.png deleted file mode 100644 index 6f0122a55..000000000 Binary files a/client/tests/golden/visual/atlas_GJ244Ad_zfit_C.png and /dev/null differ diff --git a/client/tests/golden/visual/atlas_GJ244Ad_zfit_C.png.import b/client/tests/golden/visual/atlas_GJ244Ad_zfit_C.png.import deleted file mode 100644 index 23208f220..000000000 --- a/client/tests/golden/visual/atlas_GJ244Ad_zfit_C.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dslyuaodju7c1" -path="res://.godot/imported/atlas_GJ244Ad_zfit_C.png-5236f49ef7ef7ed62115b24881d61c99.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://tests/golden/visual/atlas_GJ244Ad_zfit_C.png" -dest_files=["res://.godot/imported/atlas_GJ244Ad_zfit_C.png-5236f49ef7ef7ed62115b24881d61c99.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/client/tests/golden/visual/atlas_GJ251c_Global.png b/client/tests/golden/visual/atlas_GJ251c_Global.png new file mode 100644 index 000000000..79e0b473d Binary files /dev/null and b/client/tests/golden/visual/atlas_GJ251c_Global.png differ diff --git a/client/tests/golden/visual/atlas_GJ251c_Region.png b/client/tests/golden/visual/atlas_GJ251c_Region.png new file mode 100644 index 000000000..2a7b8206a Binary files /dev/null and b/client/tests/golden/visual/atlas_GJ251c_Region.png differ diff --git a/client/tests/golden/visual/atlas_GJ251c_z2_0_B.png b/client/tests/golden/visual/atlas_GJ251c_z2_0_B.png deleted file mode 100644 index 9d0e133ff..000000000 Binary files a/client/tests/golden/visual/atlas_GJ251c_z2_0_B.png and /dev/null differ diff --git a/client/tests/golden/visual/atlas_GJ251c_z2_0_B.png.import b/client/tests/golden/visual/atlas_GJ251c_z2_0_B.png.import deleted file mode 100644 index e280a510b..000000000 --- a/client/tests/golden/visual/atlas_GJ251c_z2_0_B.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dovxg5wvmu0xr" -path="res://.godot/imported/atlas_GJ251c_z2_0_B.png-2ae68e030e6d933b27aacb5d23b9a916.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://tests/golden/visual/atlas_GJ251c_z2_0_B.png" -dest_files=["res://.godot/imported/atlas_GJ251c_z2_0_B.png-2ae68e030e6d933b27aacb5d23b9a916.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/client/tests/golden/visual/atlas_GJ251c_zfit_C.png b/client/tests/golden/visual/atlas_GJ251c_zfit_C.png deleted file mode 100644 index eb61558df..000000000 Binary files a/client/tests/golden/visual/atlas_GJ251c_zfit_C.png and /dev/null differ diff --git a/client/tests/golden/visual/atlas_GJ251c_zfit_C.png.import b/client/tests/golden/visual/atlas_GJ251c_zfit_C.png.import deleted file mode 100644 index 7de6aa376..000000000 --- a/client/tests/golden/visual/atlas_GJ251c_zfit_C.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://c7aeqaptw1qy4" -path="res://.godot/imported/atlas_GJ251c_zfit_C.png-840ed49eb5ecf0f7bb4c720bc2401d34.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://tests/golden/visual/atlas_GJ251c_zfit_C.png" -dest_files=["res://.godot/imported/atlas_GJ251c_zfit_C.png-840ed49eb5ecf0f7bb4c720bc2401d34.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/client/tests/golden/visual/atlas_GJ338Bd_Block.png b/client/tests/golden/visual/atlas_GJ338Bd_Block.png new file mode 100644 index 000000000..0304ad77e Binary files /dev/null and b/client/tests/golden/visual/atlas_GJ338Bd_Block.png differ diff --git a/client/tests/golden/visual/atlas_GJ338Bd_Global.png b/client/tests/golden/visual/atlas_GJ338Bd_Global.png new file mode 100644 index 000000000..a90ec90d8 Binary files /dev/null and b/client/tests/golden/visual/atlas_GJ338Bd_Global.png differ diff --git a/client/tests/golden/visual/atlas_GJ338Bd_z2_0_C.png b/client/tests/golden/visual/atlas_GJ338Bd_z2_0_C.png deleted file mode 100644 index f2a078075..000000000 Binary files a/client/tests/golden/visual/atlas_GJ338Bd_z2_0_C.png and /dev/null differ diff --git a/client/tests/golden/visual/atlas_GJ338Bd_z2_0_C.png.import b/client/tests/golden/visual/atlas_GJ338Bd_z2_0_C.png.import deleted file mode 100644 index ab98b7369..000000000 --- a/client/tests/golden/visual/atlas_GJ338Bd_z2_0_C.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cmpm82oip0npp" -path="res://.godot/imported/atlas_GJ338Bd_z2_0_C.png-bbad80b707330277c55bf1d52fb0c612.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://tests/golden/visual/atlas_GJ338Bd_z2_0_C.png" -dest_files=["res://.godot/imported/atlas_GJ338Bd_z2_0_C.png-bbad80b707330277c55bf1d52fb0c612.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/client/tests/golden/visual/atlas_GJ338Bd_z4_0_B.png b/client/tests/golden/visual/atlas_GJ338Bd_z4_0_B.png deleted file mode 100644 index d302f421f..000000000 Binary files a/client/tests/golden/visual/atlas_GJ338Bd_z4_0_B.png and /dev/null differ diff --git a/client/tests/golden/visual/atlas_GJ338Bd_z4_0_B.png.import b/client/tests/golden/visual/atlas_GJ338Bd_z4_0_B.png.import deleted file mode 100644 index 89d9929fa..000000000 --- a/client/tests/golden/visual/atlas_GJ338Bd_z4_0_B.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://hst47jqibu63" -path="res://.godot/imported/atlas_GJ338Bd_z4_0_B.png-025db8b9d2c50bbb1fa8cd2f30b877f4.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://tests/golden/visual/atlas_GJ338Bd_z4_0_B.png" -dest_files=["res://.godot/imported/atlas_GJ338Bd_z4_0_B.png-025db8b9d2c50bbb1fa8cd2f30b877f4.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/client/tests/golden/visual/atlas_GJ380c_District.png b/client/tests/golden/visual/atlas_GJ380c_District.png new file mode 100644 index 000000000..8adee583f Binary files /dev/null and b/client/tests/golden/visual/atlas_GJ380c_District.png differ diff --git a/client/tests/golden/visual/atlas_GJ380c_Global.png b/client/tests/golden/visual/atlas_GJ380c_Global.png new file mode 100644 index 000000000..422a6e699 Binary files /dev/null and b/client/tests/golden/visual/atlas_GJ380c_Global.png differ diff --git a/client/tests/golden/visual/atlas_GJ380c_Region.png b/client/tests/golden/visual/atlas_GJ380c_Region.png new file mode 100644 index 000000000..93ffa363d Binary files /dev/null and b/client/tests/golden/visual/atlas_GJ380c_Region.png differ diff --git a/client/tests/golden/visual/atlas_GJ380c_z4_0_B.png b/client/tests/golden/visual/atlas_GJ380c_z4_0_B.png deleted file mode 100644 index f54902660..000000000 Binary files a/client/tests/golden/visual/atlas_GJ380c_z4_0_B.png and /dev/null differ diff --git a/client/tests/golden/visual/atlas_GJ380c_z4_0_B.png.import b/client/tests/golden/visual/atlas_GJ380c_z4_0_B.png.import deleted file mode 100644 index 5d2558b71..000000000 --- a/client/tests/golden/visual/atlas_GJ380c_z4_0_B.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dq3dyvvk7pral" -path="res://.godot/imported/atlas_GJ380c_z4_0_B.png-dca83ce940b881c5d8197791caa51c64.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://tests/golden/visual/atlas_GJ380c_z4_0_B.png" -dest_files=["res://.godot/imported/atlas_GJ380c_z4_0_B.png-dca83ce940b881c5d8197791caa51c64.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/client/tests/golden/visual/atlas_GJ380c_zfit_C.png b/client/tests/golden/visual/atlas_GJ380c_zfit_C.png deleted file mode 100644 index d1c382160..000000000 Binary files a/client/tests/golden/visual/atlas_GJ380c_zfit_C.png and /dev/null differ diff --git a/client/tests/golden/visual/atlas_GJ380c_zfit_C.png.import b/client/tests/golden/visual/atlas_GJ380c_zfit_C.png.import deleted file mode 100644 index 141915aa9..000000000 --- a/client/tests/golden/visual/atlas_GJ380c_zfit_C.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cvoux74cujqan" -path="res://.godot/imported/atlas_GJ380c_zfit_C.png-d02614f834f86b39fea99d75f51ced86.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://tests/golden/visual/atlas_GJ380c_zfit_C.png" -dest_files=["res://.godot/imported/atlas_GJ380c_zfit_C.png-d02614f834f86b39fea99d75f51ced86.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/client/tests/golden/visual/atlas_GJ445c-m1_Chunk.png b/client/tests/golden/visual/atlas_GJ445c-m1_Chunk.png new file mode 100644 index 000000000..eb9f13c88 Binary files /dev/null and b/client/tests/golden/visual/atlas_GJ445c-m1_Chunk.png differ diff --git a/client/tests/golden/visual/atlas_GJ445c-m1_z4_0_B.png b/client/tests/golden/visual/atlas_GJ445c-m1_z4_0_B.png deleted file mode 100644 index d7b000e3a..000000000 Binary files a/client/tests/golden/visual/atlas_GJ445c-m1_z4_0_B.png and /dev/null differ diff --git a/client/tests/golden/visual/atlas_GJ445c-m1_z4_0_B.png.import b/client/tests/golden/visual/atlas_GJ445c-m1_z4_0_B.png.import deleted file mode 100644 index a149e483f..000000000 --- a/client/tests/golden/visual/atlas_GJ445c-m1_z4_0_B.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://ch6nplyroiwr2" -path="res://.godot/imported/atlas_GJ445c-m1_z4_0_B.png-fefe9b7c1fda751ced8631df1657ede9.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://tests/golden/visual/atlas_GJ445c-m1_z4_0_B.png" -dest_files=["res://.godot/imported/atlas_GJ445c-m1_z4_0_B.png-fefe9b7c1fda751ced8631df1657ede9.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/client/tests/golden/visual/atlas_GJ820Bc_District.png b/client/tests/golden/visual/atlas_GJ820Bc_District.png new file mode 100644 index 000000000..bf9fd0dd4 Binary files /dev/null and b/client/tests/golden/visual/atlas_GJ820Bc_District.png differ diff --git a/client/tests/golden/visual/atlas_GJ820Bc_Global.png b/client/tests/golden/visual/atlas_GJ820Bc_Global.png new file mode 100644 index 000000000..076897efb Binary files /dev/null and b/client/tests/golden/visual/atlas_GJ820Bc_Global.png differ diff --git a/client/tests/golden/visual/atlas_GJ820Bc_z2_0_C.png b/client/tests/golden/visual/atlas_GJ820Bc_z2_0_C.png deleted file mode 100644 index 7ee127979..000000000 Binary files a/client/tests/golden/visual/atlas_GJ820Bc_z2_0_C.png and /dev/null differ diff --git a/client/tests/golden/visual/atlas_GJ820Bc_z2_0_C.png.import b/client/tests/golden/visual/atlas_GJ820Bc_z2_0_C.png.import deleted file mode 100644 index 59ff4b97e..000000000 --- a/client/tests/golden/visual/atlas_GJ820Bc_z2_0_C.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://ce618wxyfdxg6" -path="res://.godot/imported/atlas_GJ820Bc_z2_0_C.png-dea1fad32ef6cf1a13144f0aa5da2a01.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://tests/golden/visual/atlas_GJ820Bc_z2_0_C.png" -dest_files=["res://.godot/imported/atlas_GJ820Bc_z2_0_C.png-dea1fad32ef6cf1a13144f0aa5da2a01.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/client/tests/golden/visual/atlas_GJ820Bc_zfit_A.png b/client/tests/golden/visual/atlas_GJ820Bc_zfit_A.png deleted file mode 100644 index d6b088a4e..000000000 Binary files a/client/tests/golden/visual/atlas_GJ820Bc_zfit_A.png and /dev/null differ diff --git a/client/tests/golden/visual/atlas_GJ820Bc_zfit_A.png.import b/client/tests/golden/visual/atlas_GJ820Bc_zfit_A.png.import deleted file mode 100644 index e7d31de24..000000000 --- a/client/tests/golden/visual/atlas_GJ820Bc_zfit_A.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dvipl5a1txwr0" -path="res://.godot/imported/atlas_GJ820Bc_zfit_A.png-0985d9fa7e05786fd2eb3903c71d1af9.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://tests/golden/visual/atlas_GJ820Bc_zfit_A.png" -dest_files=["res://.godot/imported/atlas_GJ820Bc_zfit_A.png-0985d9fa7e05786fd2eb3903c71d1af9.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/client/tests/visual_capture.gd b/client/tests/visual_capture.gd index b54c3a31b..706856796 100644 --- a/client/tests/visual_capture.gd +++ b/client/tests/visual_capture.gd @@ -10,9 +10,10 @@ ## godot ... -- --flow flow_dialogue --output /abs/path --interval 3 ## godot ... -- --list ## -## T-1120: --scenario atlas_matrix --output /abs/path (SR_LIVE=1 SR_PORT=N -## required — reads tests/atlas_shots.json instead of tests/visual.json's -## scenarios{}, loops every body/zoom/overlay-set combo in ONE Godot boot). +## T-1157 (D-255 rewrite): --scenario atlas_matrix --output /abs/path +## (SR_LIVE=1 SR_PORT=N required — reads tests/atlas_shots.json instead of +## tests/visual.json's scenarios{}, loops every body/rung combo in ONE Godot +## boot; goldens key on (body, rung) per the stepped Atlas ladder). ## ## Follows gen_client_fixtures.gd pattern: extends SceneTree, _init -> _run, quit(). ## Requires a real rendering driver (not --headless) for shader execution. @@ -240,6 +241,19 @@ func _run_scenario(_main_node: Node) -> void: for i in range(4): await process_frame + # T-1157 (D-255 rewrite): atlas_* golden scenarios navigate the stepped + # ladder (visual_scenarios.gd's _setup_atlas_golden_shot) — the fixed tick + # count above is not a settle guarantee for a live step-canvas fetch (a + # slow server round-trip can still be in flight after `ticks` frames). + # Poll StepCanvasRequest.is_pending() the same is_pending()-aware way + # atlas_agent_driver.gd's _settle_after_intent() does, with the same + # bounded fallback (never an unbounded await), before capturing. Also logs + # the view-transform snapshot (T-1157 inventory item 3) right before the + # capture it describes. + if _scenario.begins_with("atlas_"): + await _settle_atlas_viewer_if_pending(root) + _log_atlas_view_transform(root, _scenario) + # Extra frames for state propagation + viewport texture lag await process_frame await process_frame @@ -248,6 +262,82 @@ func _run_scenario(_main_node: Node) -> void: await _capture("%s/%s.png" % [_output_dir, _scenario]) +## T-1157 (D-255 rewrite) — is_pending()-aware settle for an atlas_* golden, +## matching atlas_agent_driver.gd's own _settle_after_intent() bounded-fallback +## discipline exactly (same SETTLE_MAX_FRAMES bound, same "log and move on +## rather than hang the whole run" behavior on timeout — inventory item 4, +## full-run-restart-on-anomaly, is the CALLER's responsibility: this function +## never retries, it just stops waiting and lets the capture proceed, so a +## caller comparing two runs sees a real discrepancy instead of a silent hang). +const ATLAS_SETTLE_MAX_FRAMES: int = 600 + + +func _settle_atlas_viewer_if_pending(tree_root: Node) -> void: + var viewer: Variant = _get_atlas_regional_viewer(tree_root) + if viewer == null: + return + var request: Variant = viewer.get_request() + var waited := 0 + while request.is_pending() and waited < ATLAS_SETTLE_MAX_FRAMES: + await process_frame + waited += 1 + if request.is_pending(): + print( + "visual_capture: atlas settle timed out after %d frames — request still pending" + % ATLAS_SETTLE_MAX_FRAMES + ) + + +## T-1157 harness-inventory item 3 (view-transform logging): world_center, +## the held rung, the held canvas extent, and the drawing canvas Node2D's own +## on-screen position/scale — logged at every atlas_* capture so a pixel +## mismatch is root-causable (PR #204's own precedent: this exact log shape +## identified an edge-scroll drift bug by its PAN_SPEED_PX_S*frame_time +## fingerprint) instead of a bare "pixels don't match". +func _log_atlas_view_transform(tree_root: Node, scenario_name: String) -> void: + var viewer: Variant = _get_atlas_regional_viewer(tree_root) + if viewer == null: + return + var summary: Dictionary = viewer.get_current_canvas_summary() + var canvas_node: Node2D = viewer.get_node_or_null("StepCanvas") + var canvas_pos: Vector2 = canvas_node.position if canvas_node else Vector2.ZERO + var canvas_scale: Vector2 = canvas_node.scale if canvas_node else Vector2.ONE + print( + ( + "visual_capture: view-transform[%s] rung=%s world_center=%s held_extent=%s " + + "canvas_position=%s canvas_scale=%s footprint_px=%dx%d" + ) + % [ + scenario_name, + str(summary.get("rung", "")), + str(summary.get("world_center", [])), + str(summary.get("held_extent", [])), + str(canvas_pos), + str(canvas_scale), + int(summary.get("canvas_width", 0)), + int(summary.get("canvas_height", 0)), + ] + ) + + +## Shared "regional" screen -> StepCanvasViewer accessor for the atlas_* +## golden path — mirrors AtlasAgentInterface's own _get_viewer() null-safety +## (app not instantiated, or "regional" not registered yet), returning null +## rather than erroring so callers can no-op cleanly on a non-atlas or +## not-yet-navigated scenario. +func _get_atlas_regional_viewer(tree_root: Node) -> Variant: + var registry: Node = tree_root.get_node_or_null("/root/ImplantRegistry") + if registry == null: + return null + var app: Variant = registry.get_app_instance("implant/map") + if app == null: + return null + var regional_screen: Variant = app.get_screen("regional") + if regional_screen == null: + return null + return regional_screen.get_viewer() + + func _run_flow(_main_node: Node) -> void: var flows: Dictionary = _config.get("flows", {}) if not flows.has(_flow): @@ -304,19 +394,23 @@ func _run_flow(_main_node: Node) -> void: print("visual_capture: manifest -> %s" % manifest_path) -## T-1120: Atlas screenshot capture matrix — ONE Godot boot, opens the live -## Atlas app once (same opener as the atlas_gen_open scenario precedent: -## HudGroups.open_app("implant/map")), then loops bodies × zoom × overlay-set -## combos from tests/atlas_shots.json, capturing a PNG per combo. +## T-1157 (D-255 rewrite, supersedes T-1120's zoom/overlay-set matrix): Atlas +## screenshot capture matrix — ONE Godot boot, opens the live Atlas app once +## (same opener as the atlas_gen_open scenario precedent: +## HudGroups.open_app("implant/map")), then loops bodies × rungs from +## tests/atlas_shots.json, capturing a PNG per (body, rung) combo. Rungs +## replace the retired continuous zoom/overlay-set triples per D-255: a +## capture key is now (body, rung), navigated via StepCanvasViewer's real +## jump_to()/is_pending() surface — no set_view()/get_heightmap_texture() +## shim, matching the PR #203 ruling. ## -## Live-mode only (SR_LIVE=1) — atlas data (heightmap/markers/generation -## layers) all come from server/data/systems.db via the running server, same +## Live-mode only (SR_LIVE=1) — every rung's canvas comes from the running +## server over the StepCanvasRequest/Response tagged envelope (D-255(c)), same ## as every other Atlas path. Requires _run()'s live-mode server-connection ## wait to have already completed before this is called. ## -## GOLDEN PROVENANCE (T-1121): the 12 curated atlas_* goldens promoted from -## this matrix are machine-local — captured/verified exact-match on one box, -## and goldens are known NOT to port across GPU/font stacks at the current +## GOLDEN PROVENANCE (T-1121, carried forward): goldens captured/verified on +## one box are known NOT to port across GPU/font stacks at the current ## tolerance. A golden failing on a different machine is expected drift, not ## a regression, until T-1121 settles the canonical capture box. See the ## _comment_atlas_goldens note in tests/visual.json. @@ -338,9 +432,6 @@ func _run_atlas_matrix() -> void: for b: Dictionary in bodies: body_lookup[str(b.get("body_id", ""))] = b - var gen_timeout: float = float(matrix_cfg.get("gen_layers_timeout_seconds", 15.0)) - var city_timeout: float = float(matrix_cfg.get("city_names_timeout_seconds", 15.0)) - print( ( "visual_capture: atlas_matrix — %d bodies, %d shots, output %s" @@ -360,7 +451,8 @@ func _run_atlas_matrix() -> void: return # First body establishes the "regional" screen via nav.push (matches the - # production entry path — SystemScreen -> nav.push("regional", ...)). + # production entry path — SystemScreen -> nav.push("regional", ...), the + # same AtlasApp._on_body_selected() tail every real click reaches). # Subsequent bodies call RegionalScreen.enter() DIRECTLY instead of # nav.push/replace: ImplantApp._on_screen_changed() only calls enter() when # the screen id CHANGES (`if _current_screen_id != new_id`), so pushing or @@ -380,8 +472,6 @@ func _run_atlas_matrix() -> void: return var current_body_id: String = "" - var ready_bodies: Array = [] - var no_layers_bodies: Array = [] for shot: Dictionary in shots: var body_id: String = str(shot.get("body_id", "")) @@ -390,36 +480,31 @@ func _run_atlas_matrix() -> void: push_warning("visual_capture: shot references unknown body_id '%s'" % body_id) continue - # Only re-enter (reload heightmap/markers/generation layers) when the - # body actually changes — shots are grouped per-body in atlas_shots.json, - # so this only fires once per body, not once per shot. + # Only re-enter (reload the Global canvas fresh) when the body + # actually changes — shots are grouped per-body in atlas_shots.json, + # so this only fires once per body, not once per shot. enter() always + # lands on Global (rung 0, D-255(a)); each shot's own rung (below) + # then navigates from there. if body_id != current_body_id: current_body_id = body_id app._regional_screen.enter( {"body": body, "system": _system_dict_for(body)} ) - var layers_ready := await _wait_for_atlas_layers_ready(body_id, gen_timeout) - if layers_ready: - ready_bodies.append(body_id) - else: - no_layers_bodies.append(body_id) - await _wait_for_city_names(viewer, city_timeout) - # Settle frames: heightmap/marker draw + overlay queue_redraw calls. - for i in range(4): - await process_frame + await _settle_atlas_viewer_if_pending(root) - # Apply overlay set: clear every gen_* toggle, then enable this shot's set. + # Apply overlay set: clear every gen_dw_* toggle, then enable this + # shot's own set. _apply_overlay_set(viewer, shot.get("overlays", [])) - # Apply zoom. Some bodies have "fit" shots ordered AFTER a 2.0/4.0 shot - # in atlas_shots.json (e.g. set B's zfit comes after z2.0/z4.0), so this - # can't assume show_body()/enter()'s one-time internal _fit_to_view() - # call is still the current view — every "fit" shot recomputes it. - var zoom_val: Variant = shot.get("zoom", "fit") - if zoom_val is String and zoom_val == "fit": - _apply_fit_zoom(viewer) - else: - _apply_centered_zoom(viewer, float(zoom_val)) + # Navigate to this shot's rung. "Global" needs no jump — enter()/the + # body-change branch above already landed on it. Every other rung + # uses jump_to()'s fixed-center revisit seam at world-metre ZERO (the + # center of every body's own region grid, D-255(a)) — a literal, + # reproducible point rather than a cursor-anchored derivation. + var rung: String = str(shot.get("rung", "Global")) + if rung != "Global": + viewer.jump_to(Vector2.ZERO, rung) + await _settle_atlas_viewer_if_pending(root) await process_frame await process_frame @@ -428,21 +513,16 @@ func _run_atlas_matrix() -> void: if filename.is_empty(): push_warning("visual_capture: shot for '%s' has no filename, skipping" % body_id) continue + _log_atlas_view_transform(root, filename) await _capture("%s/%s" % [_output_dir, filename]) - print( - ( - "visual_capture: atlas_matrix done — %d/%d bodies had Ready generation layers" - % [ready_bodies.size(), bodies.size()] - ) - ) - if not no_layers_bodies.is_empty(): - print("visual_capture: atlas_matrix — no Ready layers for: %s" % str(no_layers_bodies)) + print("visual_capture: atlas_matrix done — %d shots captured" % shots.size()) -## Build the {system_id, proper_name} dict AtlasViewer.show_body()/enter() -## expects, from an atlas_shots.json body entry (which already carries -## system_id/system_proper_name inline — no separate system lookup needed). +## Build the {system_id, proper_name} dict RegionalScreen.enter()/ +## StepCanvasViewer.enter() expects, from an atlas_shots.json body entry +## (which already carries system_id/system_proper_name inline — no separate +## system lookup needed). func _system_dict_for(body: Dictionary) -> Dictionary: return { "system_id": str(body.get("system_id", "")), @@ -450,10 +530,9 @@ func _system_dict_for(body: Dictionary) -> Dictionary: } -## Clear every toggleable overlay (the "always" group — terrain/infrastructure/ -## etc. — is never in _overlay_visibility's toggle set and set_overlay_visible -## is a no-op for locked ids, so this only ever touches gen_*/population_density/ -## production_zones/corp_presence toggles) then enable exactly the requested set. +## Clear every toggleable overlay (StepCanvasViewer's OVERLAY_DEFS — the three +## gen_dw_* region-ramp colorizers, D-255 post-stepped vocabulary) then enable +## exactly the requested set. func _apply_overlay_set(viewer: Variant, overlay_ids: Array) -> void: for def: Dictionary in viewer.get_overlay_defs(): var overlay_id: String = str(def.get("id", "")) @@ -463,125 +542,6 @@ func _apply_overlay_set(viewer: Variant, overlay_ids: Array) -> void: viewer.set_overlay_visible(overlay_id, true) -## Zoom to `zoom`, re-centering the offset the same way _fit_to_view() centers -## it (formula read from atlas_viewer.gd) — reusing the current (fit) offset -## verbatim at a different zoom would leave most of a 4x-zoomed texture off- -## screen, since that offset was computed to center the much-smaller fit-zoom -## texture. Uses only AtlasViewer's public surface (get_heightmap_texture(), -## get_rect(), set_view()) — no private field access. -func _apply_centered_zoom(viewer: Variant, zoom: float) -> void: - var tex: Texture2D = viewer.get_heightmap_texture() - if tex == null: - viewer.set_view(zoom, viewer.get_view_offset()) - return - var tex_w: float = float(tex.get_width()) - var tex_h: float = float(tex.get_height()) - var sz: Vector2 = viewer.get_rect().size - if sz == Vector2.ZERO: - sz = Vector2(1280.0, 720.0) - var scaled: Vector2 = Vector2(tex_w, tex_h) * zoom - var offset: Vector2 = (sz - scaled) * 0.5 + Vector2(0, 20) - viewer.set_view(zoom, offset) - - -## Recomputes AtlasViewer's default "fit" zoom+offset (same formula as its -## private _fit_to_view(), read from atlas_viewer.gd: fit zoom = min(avail.x/ -## tex_w, avail.y/tex_h) * 0.92, avail = viewport size minus a 60px header -## allowance) using only public surface — needed because some shots order a -## "fit" zoom AFTER a 2.0/4.0 shot for the same body (set B), so the harness -## can't rely on show_body()'s one-time internal _fit_to_view() call still -## being the current view. Does NOT replicate _fit_to_view()'s MIN_ZOOM/ -## MAX_ZOOM clamp — set_view() already clamps internally (and MIN_ZOOM/ -## MAX_ZOOM aren't reachable here anyway: AtlasViewer is a class_name type, -## unresolvable by identifier in -s mode per this file's header note). -func _apply_fit_zoom(viewer: Variant) -> void: - var tex: Texture2D = viewer.get_heightmap_texture() - if tex == null: - viewer.set_view(1.0, Vector2.ZERO) - return - var tex_w: float = float(tex.get_width()) - var tex_h: float = float(tex.get_height()) - var sz: Vector2 = viewer.get_rect().size - if sz == Vector2.ZERO: - sz = Vector2(1280.0, 720.0) - var avail: Vector2 = sz - Vector2(0, 60) - var fit_x: float = avail.x / tex_w - var fit_y: float = avail.y / tex_h - var fit_zoom: float = minf(fit_x, fit_y) * 0.92 - var scaled: Vector2 = Vector2(tex_w, tex_h) * fit_zoom - var offset: Vector2 = (sz - scaled) * 0.5 + Vector2(0, 20) - viewer.set_view(fit_zoom, offset) - - -## Poll SimBridge.atlas_layers_received until this body's response is Ready, -## or the timeout elapses. Returns true on Ready, false on timeout — caller -## captures either way and logs which bodies never reached Ready (per the -## ticket: "capture anyway + log a warning naming the body"). -## AtlasViewer already re-polls Pending responses internally -## (_schedule_gen_retry, GEN_RETRY_DELAY/GEN_MAX_RETRIES ~10s ceiling) via its -## own atlas_layers_received connection — this just watches the same signal -## from the outside to know when to stop waiting and capture. -## -## State is carried in a single-element Array (`state[0]`/`state[1]`), NOT -## plain bool locals — GDScript lambda closures capture value-type locals -## (bool/int/float) BY VALUE at closure-creation time, so a `func() -> void: -## received = true` assignment inside the lambda does NOT propagate back to -## an outer `var received := false`. Confirmed by direct test (godot4 -## --headless -s closure_test.gd): a bool set true inside a lambda reads back -## false outside it. Arrays/Dictionaries are reference types, so mutating -## through a captured reference DOES propagate — this was the actual reason -## every body in the first real run timed out at exactly `timeout_seconds` -## despite the server reaching Ready in ~2s (verified via a standalone probe -## script against a live --test-mode server). -func _wait_for_atlas_layers_ready(body_id: String, timeout_seconds: float) -> bool: - var sim_bridge := root.get_node("/root/SimBridge") - var state: Array = [false, false] # [received, is_ready] - - var handler := func(response: Dictionary) -> void: - if str(response.get("body_id", "")) != body_id: - return - if str(response.get("status", "")) == "Ready": - state[0] = true - state[1] = true - elif str(response.get("status", "")) not in ["Pending", ""]: - # NotFound/Error — stop waiting, this body will never reach Ready. - state[0] = true - state[1] = false - - sim_bridge.atlas_layers_received.connect(handler) - - var elapsed := 0.0 - var frame_budget := 1.0 / 60.0 - while not state[0] and elapsed < timeout_seconds: - await process_frame - elapsed += frame_budget - - sim_bridge.atlas_layers_received.disconnect(handler) - - if not state[0]: - push_warning( - ( - "visual_capture: atlas_matrix — no Ready/terminal status for '%s' after %.1fs, capturing terrain-only" - % [body_id, timeout_seconds] - ) - ) - return false - if not state[1]: - push_warning("visual_capture: atlas_matrix — '%s' returned a non-Ready terminal status" % body_id) - return state[1] - - -## Poll until city names have arrived for the viewer's current body, or the -## timeout elapses (city dots/labels are optional dressing on the shot, not a -## hard requirement — captures proceed either way). -func _wait_for_city_names(viewer: Variant, timeout_seconds: float) -> void: - var elapsed := 0.0 - var frame_budget := 1.0 / 60.0 - while viewer.has_pending_city_names_request() and elapsed < timeout_seconds: - await process_frame - elapsed += frame_budget - - func _capture(path: String) -> void: # Wait for GPU to finish rendering current frame await RenderingServer.frame_post_draw @@ -703,11 +663,11 @@ func _print_list() -> void: continue var desc: String = scenarios[name].get("description", "") print(" %s — %s" % [name, desc]) - # T-1120: atlas_matrix isn't a tests/visual.json scenarios{} entry (it reads + # T-1157: atlas_matrix isn't a tests/visual.json scenarios{} entry (it reads # tests/atlas_shots.json instead — see _run_atlas_matrix()), so it can't be # discovered by iterating _config above. Listed by hand so --list stays a # complete index of every --scenario value this script accepts. - print(" atlas_matrix — T-1120 Atlas screenshot capture matrix (tests/atlas_shots.json, live-mode only)") + print(" atlas_matrix — D-255 stepped Atlas capture matrix, keyed on (body, rung) (tests/atlas_shots.json, live-mode only)") print("flows:") for name in flows: var steps: Array = flows[name].get("steps", []) diff --git a/client/tests/visual_scenarios.gd b/client/tests/visual_scenarios.gd index 1fb6d46e9..820fd0da0 100644 --- a/client/tests/visual_scenarios.gd +++ b/client/tests/visual_scenarios.gd @@ -113,8 +113,12 @@ func apply_setup(scenario_name: String, tree_root: Node) -> bool: "atlas_gen_open": # #960 live inspection: open the actual atlas app through HudGroups (the # production opener), navigate to GJ71c's regional screen, and enable the - # generation overlays — exercises the opener + the live request → cascade - # → render pipeline against a connected server (SR_LIVE=1). + # region-ramp overlays — exercises the opener + the live request → cascade + # → render pipeline against a connected server (SR_LIVE=1). D-255 rewrite: + # the pre-stepped l1_rivers/l1_basins/l1_attractors overlay ids retired + # with AtlasWindowViewer — StepCanvasViewer's own toggle group is exactly + # the three gen_dw_* region-ramp colorizers (step_canvas_viewer.gd's + # OVERLAY_DEFS), so this now enables all three instead. var hud_groups: Node = tree_root.get_node("/root/HudGroups") var registry: Node = tree_root.get_node("/root/ImplantRegistry") hud_groups.open_app("implant/map") @@ -131,19 +135,22 @@ func apply_setup(scenario_name: String, tree_root: Node) -> bool: "regional", {"body": body, "system": {"system_id": "GJ 71", "proper_name": "GJ 71"}} ) var viewer: Variant = app._regional_screen._viewer - viewer.set_overlay_visible("gen_l1_rivers", true) - viewer.set_overlay_visible("gen_l1_basins", true) - viewer.set_overlay_visible("gen_l1_attractors", true) + viewer.set_overlay_visible("gen_dw_temp", true) - # T-1120: curated Atlas screenshot capture matrix golden subset (12 - # shots, one per case below). Each pins ONE body/zoom/overlay-set combo - # from tests/atlas_shots.json (the full 42-shot capture matrix — see - # visual_capture.gd's _run_atlas_matrix()) as an individually re-runnable - # tests/visual.json golden scenario, matching atlas_gen_open's pattern - # above (open -> nav.push -> configure overlays; the scenario's "ticks" - # count is the wait for generation to reach Ready, not an explicit - # poll — proven sufficient by atlas_gen_open's existing golden). - "atlas_GJ380c_zfit_C": + # T-1157 (D-255 rewrite): the stepped-Atlas golden matrix — goldens key + # on (body, rung), not the retired continuous-zoom (body, zoom, overlay- + # set) triples T-1120 curated. Each case below pins ONE body/rung/ + # overlay combo, driven through the SAME production surface the app + # itself uses: AtlasApp._on_body_selected()'s own tail + # (nav.push("regional", ...)) to enter, then StepCanvasViewer.jump_to() + # for every rung below Global — the T-1157 harness-inventory "fixed- + # center revisit" pattern (world_center literally re-requested, not + # re-derived from a cursor gesture), so the SAME world point is hit on + # every run regardless of viewport size or cursor-anchoring math. The + # Global rung needs no jump_to() call at all: enter() always lands on + # it (world_center == ZERO, D-255(a)) — it is the natural replacement + # for the old whole-body "fit zoom" shot. + "atlas_GJ380c_Global": _setup_atlas_golden_shot( tree_root, { @@ -152,11 +159,11 @@ func apply_setup(scenario_name: String, tree_root: Node) -> bool: "terrain_reference": "wiki/star-systems/GJ-380/bodies/GJ380c/heightmap.png", }, {"system_id": "GJ 380", "proper_name": "Groombridge"}, - "fit", - ["gen_district", "gen_l3_settlements", "gen_l2_roads", "gen_l1_rivers"] + "Global", + ["gen_dw_temp"] ) - "atlas_GJ380c_z4_0_B": + "atlas_GJ380c_Region": _setup_atlas_golden_shot( tree_root, { @@ -165,11 +172,24 @@ func apply_setup(scenario_name: String, tree_root: Node) -> bool: "terrain_reference": "wiki/star-systems/GJ-380/bodies/GJ380c/heightmap.png", }, {"system_id": "GJ 380", "proper_name": "Groombridge"}, - 4.0, - ["gen_l3_settlements", "gen_l2_roads"] + "Region", + ["gen_dw_moisture"] ) - "atlas_GJ144e_zfit_A": + "atlas_GJ380c_District": + _setup_atlas_golden_shot( + tree_root, + { + "body_id": "GJ380c", + "proper_name": "Lendel", + "terrain_reference": "wiki/star-systems/GJ-380/bodies/GJ380c/heightmap.png", + }, + {"system_id": "GJ 380", "proper_name": "Groombridge"}, + "District", + [] + ) + + "atlas_GJ144e_Global": _setup_atlas_golden_shot( tree_root, { @@ -178,11 +198,11 @@ func apply_setup(scenario_name: String, tree_root: Node) -> bool: "terrain_reference": "wiki/star-systems/GJ-144/bodies/GJ144e/heightmap.png", }, {"system_id": "GJ 144", "proper_name": "Ran"}, - "fit", - ["gen_district"] + "Global", + [] ) - "atlas_GJ144e_z2_0_C": + "atlas_GJ144e_Quarter": _setup_atlas_golden_shot( tree_root, { @@ -191,11 +211,11 @@ func apply_setup(scenario_name: String, tree_root: Node) -> bool: "terrain_reference": "wiki/star-systems/GJ-144/bodies/GJ144e/heightmap.png", }, {"system_id": "GJ 144", "proper_name": "Ran"}, - 2.0, - ["gen_district", "gen_l3_settlements", "gen_l2_roads", "gen_l1_rivers"] + "Quarter", + ["gen_dw_veg"] ) - "atlas_GJ338Bd_z2_0_C": + "atlas_GJ338Bd_Global": _setup_atlas_golden_shot( tree_root, { @@ -204,11 +224,11 @@ func apply_setup(scenario_name: String, tree_root: Node) -> bool: "terrain_reference": "wiki/star-systems/GJ-338B/bodies/GJ338Bd/heightmap.png", }, {"system_id": "GJ 338B", "proper_name": "Arbour"}, - 2.0, - ["gen_district", "gen_l3_settlements", "gen_l2_roads", "gen_l1_rivers"] + "Global", + ["gen_dw_moisture"] ) - "atlas_GJ338Bd_z4_0_B": + "atlas_GJ338Bd_Block": _setup_atlas_golden_shot( tree_root, { @@ -217,11 +237,11 @@ func apply_setup(scenario_name: String, tree_root: Node) -> bool: "terrain_reference": "wiki/star-systems/GJ-338B/bodies/GJ338Bd/heightmap.png", }, {"system_id": "GJ 338B", "proper_name": "Arbour"}, - 4.0, - ["gen_l3_settlements", "gen_l2_roads"] + "Block", + [] ) - "atlas_GJ820Bc_zfit_A": + "atlas_GJ820Bc_Global": _setup_atlas_golden_shot( tree_root, { @@ -230,11 +250,11 @@ func apply_setup(scenario_name: String, tree_root: Node) -> bool: "terrain_reference": "wiki/star-systems/GJ-820B/bodies/GJ820Bc/heightmap.png", }, {"system_id": "GJ 820B", "proper_name": "Cygni B"}, - "fit", - ["gen_district"] + "Global", + [] ) - "atlas_GJ820Bc_z2_0_C": + "atlas_GJ820Bc_District": _setup_atlas_golden_shot( tree_root, { @@ -243,11 +263,11 @@ func apply_setup(scenario_name: String, tree_root: Node) -> bool: "terrain_reference": "wiki/star-systems/GJ-820B/bodies/GJ820Bc/heightmap.png", }, {"system_id": "GJ 820B", "proper_name": "Cygni B"}, - 2.0, - ["gen_district", "gen_l3_settlements", "gen_l2_roads", "gen_l1_rivers"] + "District", + ["gen_dw_temp"] ) - "atlas_GJ251c_z2_0_B": + "atlas_GJ251c_Global": _setup_atlas_golden_shot( tree_root, { @@ -256,11 +276,11 @@ func apply_setup(scenario_name: String, tree_root: Node) -> bool: "terrain_reference": "wiki/star-systems/GJ-251/bodies/GJ251c/heightmap.png", }, {"system_id": "GJ 251", "proper_name": "Renaissance"}, - 2.0, - ["gen_l3_settlements", "gen_l2_roads"] + "Global", + ["gen_dw_veg"] ) - "atlas_GJ251c_zfit_C": + "atlas_GJ251c_Region": _setup_atlas_golden_shot( tree_root, { @@ -269,11 +289,11 @@ func apply_setup(scenario_name: String, tree_root: Node) -> bool: "terrain_reference": "wiki/star-systems/GJ-251/bodies/GJ251c/heightmap.png", }, {"system_id": "GJ 251", "proper_name": "Renaissance"}, - "fit", - ["gen_district", "gen_l3_settlements", "gen_l2_roads", "gen_l1_rivers"] + "Region", + [] ) - "atlas_GJ244Ad_zfit_C": + "atlas_GJ244Ad_Global": _setup_atlas_golden_shot( tree_root, { @@ -282,11 +302,11 @@ func apply_setup(scenario_name: String, tree_root: Node) -> bool: "terrain_reference": "wiki/star-systems/GJ-244A/bodies/GJ244Ad/heightmap.png", }, {"system_id": "GJ 244A", "proper_name": "Sirius"}, - "fit", - ["gen_district", "gen_l3_settlements", "gen_l2_roads", "gen_l1_rivers"] + "Global", + ["gen_dw_temp"] ) - "atlas_GJ445c-m1_z4_0_B": + "atlas_GJ445c-m1_Chunk": _setup_atlas_golden_shot( tree_root, { @@ -295,8 +315,8 @@ func apply_setup(scenario_name: String, tree_root: Node) -> bool: "terrain_reference": "wiki/star-systems/GJ-445/bodies/GJ445c-m1/heightmap.png", }, {"system_id": "GJ 445", "proper_name": "Jinghu"}, - 4.0, - ["gen_l3_settlements", "gen_l2_roads"] + "Chunk", + [] ) _: @@ -359,17 +379,27 @@ func apply_flow_action(action: String, tree_root: Node) -> void: sim_bridge.harness.process_input(action) -## T-1120: shared setup for the 12 curated "atlas__z_" golden -## cases above — opens the -## Atlas (same production opener as atlas_gen_open), navigates to `body`, then -## applies `zoom` ("fit" or a float) and exactly the overlay ids in -## `overlay_ids`. Mirrors visual_capture.gd's _run_atlas_matrix() zoom/overlay -## logic (kept independent rather than shared code — visual_capture.gd extends -## SceneTree and this extends RefCounted, different -s mode load contexts, and -## the duplication is small and stable: both read the same public AtlasViewer -## surface added for this ticket, set_view()/get_heightmap_texture()/get_rect(). +## T-1157 (D-255 rewrite, supersedes the T-1120 continuous-zoom helper): +## shared setup for the "atlas__" golden cases above — opens the +## Atlas via the SAME production tail AtlasApp._on_body_selected() itself +## uses (nav.push("regional", {body, system})), then lands on `rung` via +## StepCanvasViewer's real navigation surface: entering always lands on +## Global (D-255(a), RegionalScreen.enter() -> StepCanvasViewer.enter()) — +## for any other rung, jump_to(Vector2.ZERO, rung) is called next, the T-1157 +## harness-inventory "fixed-center revisit" pattern (a literal, always-valid +## world point — the exact center of every body's own region grid — rather +## than a cursor-anchored derivation that would depend on viewport size). +## Every fixed rung's viewport-fit extent is still whatever _request_extent() +## itself computes from the live viewport (matching production — the goldens +## are NOT pinning a synthetic extent), only world_center and rung are fixed. +## +## Mirrors visual_capture.gd's _run_atlas_matrix() rung/overlay logic (kept +## independent rather than shared code — visual_capture.gd extends SceneTree +## and this extends RefCounted, different -s mode load contexts, and the +## duplication is small and stable: both read the same public StepCanvasViewer +## surface, jump_to()/get_overlay_defs()/set_overlay_visible()/get_request()). func _setup_atlas_golden_shot( - tree_root: Node, body: Dictionary, system: Dictionary, zoom: Variant, overlay_ids: Array + tree_root: Node, body: Dictionary, system: Dictionary, rung: String, overlay_ids: Array ) -> void: var hud_groups: Node = tree_root.get_node("/root/HudGroups") var registry: Node = tree_root.get_node("/root/ImplantRegistry") @@ -391,18 +421,9 @@ func _setup_atlas_golden_shot( for overlay_id: String in overlay_ids: viewer.set_overlay_visible(overlay_id, true) - if zoom is String and zoom == "fit": - return # show_body() (called by nav.push above) already fit-zoomed. - - var tex: Texture2D = viewer.get_heightmap_texture() - if tex == null: - return - var tex_w: float = float(tex.get_width()) - var tex_h: float = float(tex.get_height()) - var sz: Vector2 = viewer.get_rect().size - if sz == Vector2.ZERO: - sz = Vector2(1280.0, 720.0) - var zoom_f: float = float(zoom) - var scaled: Vector2 = Vector2(tex_w, tex_h) * zoom_f - var offset: Vector2 = (sz - scaled) * 0.5 + Vector2(0, 20) - viewer.set_view(zoom_f, offset) + if rung != "Global": + # enter() (called via nav.push above) always lands on Global first — + # jump_to() is the fixed-center revisit intent that descends to any + # other rung at a literal, reproducible world_center (D-255(a): every + # body's region grid is centered on world-metre ZERO). + viewer.jump_to(Vector2.ZERO, rung) diff --git a/docs/DEVOPS.md b/docs/DEVOPS.md index b22b1097c..15108a6b1 100644 --- a/docs/DEVOPS.md +++ b/docs/DEVOPS.md @@ -352,31 +352,42 @@ Key components: - **CauseChain** (production ECS component) — Tracks causal attribution for testable observation sequences (D-030). - **Deterministic replay** — Server simulation is deterministic given the same seed + input sequence. Replay logs enable regression testing (#201, critical). -### Real-rendering test exception: `test_atlas_window_overlay_draw_smoke.gd` +### Real-rendering test exception: `tests/run-visual` (`tests/visual_capture.gd`) `tests/run-godot` hardcodes `--headless`, whose dummy driver produces no usable GPU -texture output (`SubViewport.get_texture().get_image()` returns unusable data). One -file needs real pixels — `client/tests/test_atlas_window_overlay_draw_smoke.gd` (T-1153 -live round 4) renders `AtlasWindowOverlay` into a `SubViewport` and asserts real terrain -pixels were composited, closing a "did anything draw at all" gap that bit twice -(a tile-mosaic coordinate bug and an unstored-texture GPU-lifetime bug, both invisible -to cache-state-only assertions). It self-detects the dummy driver -(`DisplayServer.get_name() == "headless"`) and **skips** under the standard suite — -`tests/run-godot --filter test_atlas_window_overlay_draw_smoke` reports green-with-skips, -never a false failure that would bounce the push gate. To exercise its real assertions: +texture output (`SubViewport.get_texture().get_image()` returns unusable data). Any +test that needs real composited pixels lives in `tests/run-visual` +(`client/tests/visual_capture.gd`) instead, which boots Godot with a real +`--rendering-driver opengl3` and asserts on an actual `get_viewport().get_texture(). +get_image()` capture — this is the project's one real-driver exception, and every +"did anything draw at all" real-pixel check lives here now, not in a standalone gdUnit +file with its own headless-skip guard. + +`client/tests/test_atlas_window_overlay_draw_smoke.gd` (T-1153 live round 4) used to be +a second, parallel real-driver path — a standalone gdUnit suite that rendered +`AtlasWindowOverlay` into its own ad hoc `SubViewport`, self-detecting the dummy driver +(`DisplayServer.get_name() == "headless"`) and skipping under `tests/run-godot`. It +retired with the rest of the `AtlasWindowViewer`/continuous-zoom cluster (T-1182, D-255) +and its 2 real-pixel scenarios (single-window draw, tile-mosaic draw) folded into this +harness (T-1157): the stepped ladder has no separate "single window" vs "tile mosaic" +draw path anymore (D-255(a): "one viewer one path"), so the fold's two natural +equivalents are a fixed-rung canvas capture (`atlas_GJ380c_District` — LINEAR-filtered, +`StepCanvasTerrainLayer._filter_for_rung()`'s non-orbital branch) and the Global-rung +capture (`atlas_GJ380c_Global` — NEAREST-filtered, the orbital branch, a differently-shaped +canvas/footprint). Both are ordinary `tests/visual.json` golden scenarios driven through +production navigation (`visual_scenarios.gd`'s `_setup_atlas_golden_shot`) against a real +`--test-mode` server (`SR_LIVE=1`) — real derived terrain, real composited pixels, no +synthetic stub canvas — closing the "did anything draw at all" gap without a second, +parallel real-driver mechanism. ```bash -godot4 --display-driver x11 --rendering-driver opengl3 \ - -s addons/gdUnit4/bin/GdUnitCmdTool.gd --ignoreHeadlessMode -c \ - -a res://tests/test_atlas_window_overlay_draw_smoke.gd -``` +# Any single atlas golden, real driver, real server: +make screenshot SCENARIO=atlas_GJ380c_District +make screenshot SCENARIO=atlas_GJ380c_Global -Same underlying constraint as `tests/visual_capture.gd` (`tests/run-visual`), which is -the project's other real-driver exception — currently broken on this branch by the -retired `AtlasViewer` API (T-1157, capture-harness redesign). This file's scenarios are -slated to migrate into that redesigned harness once T-1157 lands, folding it into -`tests/visual.json` for consistency; until then it stays a standalone gdUnit file with -its own skip guard. +# The full golden suite (xvfb-wrapped, all scenarios incl. atlas_*): +make test-visual +``` ## Planning store (pql) diff --git a/tests/atlas_shots.json b/tests/atlas_shots.json index 6f70ebd1e..d89544667 100644 --- a/tests/atlas_shots.json +++ b/tests/atlas_shots.json @@ -1,9 +1,7 @@ { - "_comment": "T-1120: Atlas screenshot capture matrix. Consumed by visual_capture.gd's --scenario atlas_matrix mode. Every body/terrain_reference/system pair verified against server/data/systems.db (python3 read-only query, no sqlite3 CLI) — see docs note below for provenance.", + "_comment": "T-1157 (D-255 rewrite of the T-1120 continuous-zoom matrix): Atlas screenshot capture matrix, now keyed on (body, rung) per the stepped Atlas ladder — not (body, zoom, overlay-set). Consumed by visual_capture.gd's --scenario atlas_matrix mode. Every body/terrain_reference/system pair verified against server/data/systems.db (python3 read-only query, no sqlite3 CLI) — see docs note below for provenance.", "resolution": [1280, 720], "settle_frames": 30, - "gen_layers_timeout_seconds": 15.0, - "city_names_timeout_seconds": 15.0, "output_subdir": ".cache/screenshots/atlas", "bodies": [ { @@ -63,65 +61,35 @@ "note": "picked — inhabited temperate moon with cities (2), most cities among body_type='moon' AND inhabited=1 bodies in systems.db" } ], - "zooms": ["fit", 2.0, 4.0], + "rungs": ["Global", "Region", "District", "Quarter", "Block", "Chunk"], "overlay_sets": { - "A": ["gen_district"], - "B": ["gen_l3_settlements", "gen_l2_roads"], - "C": ["gen_district", "gen_l3_settlements", "gen_l2_roads", "gen_l1_rivers"] + "none": [], + "temp": ["gen_dw_temp"], + "moisture": ["gen_dw_moisture"], + "veg": ["gen_dw_veg"] }, "matrix_rules": { - "A": "fit zoom only (avoids the 63-shot full-matrix explosion)", - "B": "all three zooms", - "C": "fit and 2.0 zoom only (4.0 omitted — set C is already the densest overlay combination, a fourth close-up variant added no new information)" + "one_shot_per_body": "each body gets ONE golden shot at a rung chosen to exercise a different depth of the ladder across the set (Global-heavy for the orbital opener, deeper rungs for a few bodies) — the full 6-rung x 7-body cross product (42 shots) is deliberately NOT curated here, matching T-1121's 'curated subset, not the full matrix' precedent; the full cross product remains reachable ad hoc via AtlasAgentInterface jump_to intents, not as a golden." }, "shots": [ - { "body_id": "GJ380c", "zoom": "fit", "overlay_set": "A", "overlays": ["gen_district"], "filename": "atlas_GJ380c_zfit_A.png" }, - { "body_id": "GJ380c", "zoom": 2.0, "overlay_set": "B", "overlays": ["gen_l3_settlements", "gen_l2_roads"], "filename": "atlas_GJ380c_z2_0_B.png" }, - { "body_id": "GJ380c", "zoom": 4.0, "overlay_set": "B", "overlays": ["gen_l3_settlements", "gen_l2_roads"], "filename": "atlas_GJ380c_z4_0_B.png" }, - { "body_id": "GJ380c", "zoom": "fit", "overlay_set": "B", "overlays": ["gen_l3_settlements", "gen_l2_roads"], "filename": "atlas_GJ380c_zfit_B.png" }, - { "body_id": "GJ380c", "zoom": "fit", "overlay_set": "C", "overlays": ["gen_district", "gen_l3_settlements", "gen_l2_roads", "gen_l1_rivers"], "filename": "atlas_GJ380c_zfit_C.png" }, - { "body_id": "GJ380c", "zoom": 2.0, "overlay_set": "C", "overlays": ["gen_district", "gen_l3_settlements", "gen_l2_roads", "gen_l1_rivers"], "filename": "atlas_GJ380c_z2_0_C.png" }, + { "body_id": "GJ380c", "rung": "Global", "overlays": ["gen_dw_temp"], "filename": "atlas_GJ380c_Global.png" }, + { "body_id": "GJ380c", "rung": "Region", "overlays": ["gen_dw_moisture"], "filename": "atlas_GJ380c_Region.png" }, + { "body_id": "GJ380c", "rung": "District", "overlays": [], "filename": "atlas_GJ380c_District.png" }, - { "body_id": "GJ144e", "zoom": "fit", "overlay_set": "A", "overlays": ["gen_district"], "filename": "atlas_GJ144e_zfit_A.png" }, - { "body_id": "GJ144e", "zoom": 2.0, "overlay_set": "B", "overlays": ["gen_l3_settlements", "gen_l2_roads"], "filename": "atlas_GJ144e_z2_0_B.png" }, - { "body_id": "GJ144e", "zoom": 4.0, "overlay_set": "B", "overlays": ["gen_l3_settlements", "gen_l2_roads"], "filename": "atlas_GJ144e_z4_0_B.png" }, - { "body_id": "GJ144e", "zoom": "fit", "overlay_set": "B", "overlays": ["gen_l3_settlements", "gen_l2_roads"], "filename": "atlas_GJ144e_zfit_B.png" }, - { "body_id": "GJ144e", "zoom": "fit", "overlay_set": "C", "overlays": ["gen_district", "gen_l3_settlements", "gen_l2_roads", "gen_l1_rivers"], "filename": "atlas_GJ144e_zfit_C.png" }, - { "body_id": "GJ144e", "zoom": 2.0, "overlay_set": "C", "overlays": ["gen_district", "gen_l3_settlements", "gen_l2_roads", "gen_l1_rivers"], "filename": "atlas_GJ144e_z2_0_C.png" }, + { "body_id": "GJ144e", "rung": "Global", "overlays": [], "filename": "atlas_GJ144e_Global.png" }, + { "body_id": "GJ144e", "rung": "Quarter", "overlays": ["gen_dw_veg"], "filename": "atlas_GJ144e_Quarter.png" }, - { "body_id": "GJ338Bd", "zoom": "fit", "overlay_set": "A", "overlays": ["gen_district"], "filename": "atlas_GJ338Bd_zfit_A.png" }, - { "body_id": "GJ338Bd", "zoom": 2.0, "overlay_set": "B", "overlays": ["gen_l3_settlements", "gen_l2_roads"], "filename": "atlas_GJ338Bd_z2_0_B.png" }, - { "body_id": "GJ338Bd", "zoom": 4.0, "overlay_set": "B", "overlays": ["gen_l3_settlements", "gen_l2_roads"], "filename": "atlas_GJ338Bd_z4_0_B.png" }, - { "body_id": "GJ338Bd", "zoom": "fit", "overlay_set": "B", "overlays": ["gen_l3_settlements", "gen_l2_roads"], "filename": "atlas_GJ338Bd_zfit_B.png" }, - { "body_id": "GJ338Bd", "zoom": "fit", "overlay_set": "C", "overlays": ["gen_district", "gen_l3_settlements", "gen_l2_roads", "gen_l1_rivers"], "filename": "atlas_GJ338Bd_zfit_C.png" }, - { "body_id": "GJ338Bd", "zoom": 2.0, "overlay_set": "C", "overlays": ["gen_district", "gen_l3_settlements", "gen_l2_roads", "gen_l1_rivers"], "filename": "atlas_GJ338Bd_z2_0_C.png" }, + { "body_id": "GJ338Bd", "rung": "Global", "overlays": ["gen_dw_moisture"], "filename": "atlas_GJ338Bd_Global.png" }, + { "body_id": "GJ338Bd", "rung": "Block", "overlays": [], "filename": "atlas_GJ338Bd_Block.png" }, - { "body_id": "GJ820Bc", "zoom": "fit", "overlay_set": "A", "overlays": ["gen_district"], "filename": "atlas_GJ820Bc_zfit_A.png" }, - { "body_id": "GJ820Bc", "zoom": 2.0, "overlay_set": "B", "overlays": ["gen_l3_settlements", "gen_l2_roads"], "filename": "atlas_GJ820Bc_z2_0_B.png" }, - { "body_id": "GJ820Bc", "zoom": 4.0, "overlay_set": "B", "overlays": ["gen_l3_settlements", "gen_l2_roads"], "filename": "atlas_GJ820Bc_z4_0_B.png" }, - { "body_id": "GJ820Bc", "zoom": "fit", "overlay_set": "B", "overlays": ["gen_l3_settlements", "gen_l2_roads"], "filename": "atlas_GJ820Bc_zfit_B.png" }, - { "body_id": "GJ820Bc", "zoom": "fit", "overlay_set": "C", "overlays": ["gen_district", "gen_l3_settlements", "gen_l2_roads", "gen_l1_rivers"], "filename": "atlas_GJ820Bc_zfit_C.png" }, - { "body_id": "GJ820Bc", "zoom": 2.0, "overlay_set": "C", "overlays": ["gen_district", "gen_l3_settlements", "gen_l2_roads", "gen_l1_rivers"], "filename": "atlas_GJ820Bc_z2_0_C.png" }, + { "body_id": "GJ820Bc", "rung": "Global", "overlays": [], "filename": "atlas_GJ820Bc_Global.png" }, + { "body_id": "GJ820Bc", "rung": "District", "overlays": ["gen_dw_temp"], "filename": "atlas_GJ820Bc_District.png" }, - { "body_id": "GJ251c", "zoom": "fit", "overlay_set": "A", "overlays": ["gen_district"], "filename": "atlas_GJ251c_zfit_A.png" }, - { "body_id": "GJ251c", "zoom": 2.0, "overlay_set": "B", "overlays": ["gen_l3_settlements", "gen_l2_roads"], "filename": "atlas_GJ251c_z2_0_B.png" }, - { "body_id": "GJ251c", "zoom": 4.0, "overlay_set": "B", "overlays": ["gen_l3_settlements", "gen_l2_roads"], "filename": "atlas_GJ251c_z4_0_B.png" }, - { "body_id": "GJ251c", "zoom": "fit", "overlay_set": "B", "overlays": ["gen_l3_settlements", "gen_l2_roads"], "filename": "atlas_GJ251c_zfit_B.png" }, - { "body_id": "GJ251c", "zoom": "fit", "overlay_set": "C", "overlays": ["gen_district", "gen_l3_settlements", "gen_l2_roads", "gen_l1_rivers"], "filename": "atlas_GJ251c_zfit_C.png" }, - { "body_id": "GJ251c", "zoom": 2.0, "overlay_set": "C", "overlays": ["gen_district", "gen_l3_settlements", "gen_l2_roads", "gen_l1_rivers"], "filename": "atlas_GJ251c_z2_0_C.png" }, + { "body_id": "GJ251c", "rung": "Global", "overlays": ["gen_dw_veg"], "filename": "atlas_GJ251c_Global.png" }, + { "body_id": "GJ251c", "rung": "Region", "overlays": [], "filename": "atlas_GJ251c_Region.png" }, - { "body_id": "GJ244Ad", "zoom": "fit", "overlay_set": "A", "overlays": ["gen_district"], "filename": "atlas_GJ244Ad_zfit_A.png" }, - { "body_id": "GJ244Ad", "zoom": 2.0, "overlay_set": "B", "overlays": ["gen_l3_settlements", "gen_l2_roads"], "filename": "atlas_GJ244Ad_z2_0_B.png" }, - { "body_id": "GJ244Ad", "zoom": 4.0, "overlay_set": "B", "overlays": ["gen_l3_settlements", "gen_l2_roads"], "filename": "atlas_GJ244Ad_z4_0_B.png" }, - { "body_id": "GJ244Ad", "zoom": "fit", "overlay_set": "B", "overlays": ["gen_l3_settlements", "gen_l2_roads"], "filename": "atlas_GJ244Ad_zfit_B.png" }, - { "body_id": "GJ244Ad", "zoom": "fit", "overlay_set": "C", "overlays": ["gen_district", "gen_l3_settlements", "gen_l2_roads", "gen_l1_rivers"], "filename": "atlas_GJ244Ad_zfit_C.png" }, - { "body_id": "GJ244Ad", "zoom": 2.0, "overlay_set": "C", "overlays": ["gen_district", "gen_l3_settlements", "gen_l2_roads", "gen_l1_rivers"], "filename": "atlas_GJ244Ad_z2_0_C.png" }, + { "body_id": "GJ244Ad", "rung": "Global", "overlays": ["gen_dw_temp"], "filename": "atlas_GJ244Ad_Global.png" }, - { "body_id": "GJ445c-m1", "zoom": "fit", "overlay_set": "A", "overlays": ["gen_district"], "filename": "atlas_GJ445c-m1_zfit_A.png" }, - { "body_id": "GJ445c-m1", "zoom": 2.0, "overlay_set": "B", "overlays": ["gen_l3_settlements", "gen_l2_roads"], "filename": "atlas_GJ445c-m1_z2_0_B.png" }, - { "body_id": "GJ445c-m1", "zoom": 4.0, "overlay_set": "B", "overlays": ["gen_l3_settlements", "gen_l2_roads"], "filename": "atlas_GJ445c-m1_z4_0_B.png" }, - { "body_id": "GJ445c-m1", "zoom": "fit", "overlay_set": "B", "overlays": ["gen_l3_settlements", "gen_l2_roads"], "filename": "atlas_GJ445c-m1_zfit_B.png" }, - { "body_id": "GJ445c-m1", "zoom": "fit", "overlay_set": "C", "overlays": ["gen_district", "gen_l3_settlements", "gen_l2_roads", "gen_l1_rivers"], "filename": "atlas_GJ445c-m1_zfit_C.png" }, - { "body_id": "GJ445c-m1", "zoom": 2.0, "overlay_set": "C", "overlays": ["gen_district", "gen_l3_settlements", "gen_l2_roads", "gen_l1_rivers"], "filename": "atlas_GJ445c-m1_z2_0_C.png" } + { "body_id": "GJ445c-m1", "rung": "Chunk", "overlays": [], "filename": "atlas_GJ445c-m1_Chunk.png" } ] } diff --git a/tests/visual.json b/tests/visual.json index 2a6168464..026042e8e 100644 --- a/tests/visual.json +++ b/tests/visual.json @@ -4,7 +4,7 @@ "tolerance": 5, "max_diff_pct": 0.5, "golden_dir": "client/tests/golden/visual", - "_comment_atlas_goldens": "T-1120 provenance (PR #180 review, Tyre): the 12 atlas_* golden scenarios were captured AND verified (exact pixel match) on danoontje's Mesa/AMD stack. T-1121 documents that goldens do NOT port across boxes at the current tolerance (the 19 pre-existing goldens fail 12-14% on this same box) — an atlas_* golden failing on a DIFFERENT machine is expected baseline drift, not a regression, until T-1121 resolves the canonical-capture-box question.", + "_comment_atlas_goldens": "T-1157 (D-255 rewrite of the T-1120 matrix, PR #180 provenance carried forward, Tyre): the atlas_* golden scenarios below key on (body, rung) per the stepped Atlas ladder, captured AND verified (exact pixel match) on danoontje's Mesa/AMD stack. T-1121 documents that goldens do NOT port across boxes at the current tolerance (the 19 pre-existing goldens fail 12-14% on this same box) — an atlas_* golden failing on a DIFFERENT machine is expected baseline drift, not a regression, until T-1121 resolves the canonical-capture-box question.", "scenarios": { "fog_3state": { "ticks": 5, @@ -76,7 +76,7 @@ }, "atlas_gen_open": { "ticks": 240, - "description": "Live: real atlas opener (HudGroups) + GJ71c Layer-1 overlays (#960)" + "description": "Live: real atlas opener (HudGroups) + GJ71c region-ramp overlay (#960, D-255 rewrite)" }, "locomotion_idle_live": { "ticks": 90, @@ -91,65 +91,70 @@ "env": { "SR_AUTOPILOT": "stance_up,south:6.0" }, "description": "Live 3D sandbox: autopilot walks south into a wall — cutaway stub golden (T-1088)" }, - "atlas_GJ380c_zfit_C": { + "atlas_GJ380c_Global": { "ticks": 240, "live": true, - "description": "T-1120 curated Atlas golden: Lendel (GJ380c), fit zoom, overlay set C (district+settlements+roads+rivers)" + "description": "T-1157 curated Atlas golden (D-255): Lendel (GJ380c), Global rung (rung 0), temperature overlay" }, - "atlas_GJ380c_z4_0_B": { + "atlas_GJ380c_Region": { "ticks": 240, "live": true, - "description": "T-1120 curated Atlas golden: Lendel (GJ380c), 4.0 zoom, overlay set B (settlements+roads)" + "description": "T-1157 curated Atlas golden (D-255): Lendel (GJ380c), Region rung, moisture overlay" }, - "atlas_GJ144e_zfit_A": { + "atlas_GJ380c_District": { "ticks": 240, "live": true, - "description": "T-1120 curated Atlas golden: Vethis (GJ144e), fit zoom, overlay set A (district only)" + "description": "T-1157 curated Atlas golden (D-255): Lendel (GJ380c), District rung, no overlay" }, - "atlas_GJ144e_z2_0_C": { + "atlas_GJ144e_Global": { "ticks": 240, "live": true, - "description": "T-1120 curated Atlas golden: Vethis (GJ144e), 2.0 zoom (labels on), overlay set C" + "description": "T-1157 curated Atlas golden (D-255): Vethis (GJ144e), Global rung, no overlay" }, - "atlas_GJ338Bd_z2_0_C": { + "atlas_GJ144e_Quarter": { "ticks": 240, "live": true, - "description": "T-1120 curated Atlas golden: Arbour (GJ338Bd), 2.0 zoom (labels on), overlay set C" + "description": "T-1157 curated Atlas golden (D-255): Vethis (GJ144e), Quarter rung, vegetation overlay" }, - "atlas_GJ338Bd_z4_0_B": { + "atlas_GJ338Bd_Global": { "ticks": 240, "live": true, - "description": "T-1120 curated Atlas golden: Arbour (GJ338Bd), 4.0 zoom, overlay set B" + "description": "T-1157 curated Atlas golden (D-255): Arbour (GJ338Bd), Global rung, moisture overlay" }, - "atlas_GJ820Bc_zfit_A": { + "atlas_GJ338Bd_Block": { "ticks": 240, "live": true, - "description": "T-1120 curated Atlas golden: Ferrath (GJ820Bc), fit zoom, overlay set A (district only)" + "description": "T-1157 curated Atlas golden (D-255): Arbour (GJ338Bd), Block rung, no overlay" }, - "atlas_GJ820Bc_z2_0_C": { + "atlas_GJ820Bc_Global": { "ticks": 240, "live": true, - "description": "T-1120 curated Atlas golden: Ferrath (GJ820Bc), 2.0 zoom (labels on), overlay set C" + "description": "T-1157 curated Atlas golden (D-255): Ferrath (GJ820Bc), Global rung, no overlay" }, - "atlas_GJ251c_z2_0_B": { + "atlas_GJ820Bc_District": { "ticks": 240, "live": true, - "description": "T-1120 curated Atlas golden: Ruhr (GJ251c), 2.0 zoom (labels on), overlay set B (settlements+roads)" + "description": "T-1157 curated Atlas golden (D-255): Ferrath (GJ820Bc), District rung, temperature overlay" }, - "atlas_GJ251c_zfit_C": { + "atlas_GJ251c_Global": { "ticks": 240, "live": true, - "description": "T-1120 curated Atlas golden: Ruhr (GJ251c), fit zoom, overlay set C — highest-population body in the sample" + "description": "T-1157 curated Atlas golden (D-255): Ruhr (GJ251c), Global rung, vegetation overlay — highest-population body in the sample" }, - "atlas_GJ244Ad_zfit_C": { + "atlas_GJ251c_Region": { "ticks": 240, "live": true, - "description": "T-1120 curated Atlas golden: Edict (GJ244Ad), fit zoom, overlay set C — frozen planet_class pick" + "description": "T-1157 curated Atlas golden (D-255): Ruhr (GJ251c), Region rung, no overlay" }, - "atlas_GJ445c-m1_z4_0_B": { + "atlas_GJ244Ad_Global": { "ticks": 240, "live": true, - "description": "T-1120 curated Atlas golden: Jinghu (GJ445c-m1), 4.0 zoom, overlay set B — inhabited moon pick" + "description": "T-1157 curated Atlas golden (D-255): Edict (GJ244Ad), Global rung, temperature overlay — frozen planet_class pick" + }, + "atlas_GJ445c-m1_Chunk": { + "ticks": 240, + "live": true, + "description": "T-1157 curated Atlas golden (D-255): Jinghu (GJ445c-m1), Chunk rung (deepest), no overlay — inhabited moon pick" } }, "flows": {