diff --git a/README.md b/README.md index 295c4d2..69e84f5 100644 --- a/README.md +++ b/README.md @@ -112,7 +112,11 @@ whole footway network — so most of the detail is real Brisbane, not invented: - **Brisbane colour**: red busway asphalt, jacaranda-purple canopy on ~1 in 5 street trees, Queenslander weatherboard + corrugated iron on `building=house` footprints, fictional shop-fascia signs above awnings and rooftop billboards - (FLUX gibberish lettering on purpose — no real brands). + in three designs (FLUX gibberish lettering on purpose — no real brands). +- **Traffic signals** from `highway=traffic_signals` — pole, mast arm and two + lantern heads, with emissive lenses so they read as lit in a shaded canyon. +- **Power poles + sagging wires** down one side of residential streets, the + single most Australian thing a suburban street can have. - **Southbank landmarks** (hardcoded per level id): the Wheel of Brisbane placed off its mapped ticket office, and the Grand Arbour's curling steel tendrils + bougainvillea following the actual mapped footway. @@ -125,9 +129,15 @@ Variation is seeded off OSM ids, so rebuilds are reproducible. ### Textures -`assets/textures/` is FLUX-generated (Cloudflare Workers AI). Regenerate the -whole set with `tools/gen_textures.sh` or one with -`tools/gen_textures.sh `; creds are read from `.env`, never printed. +`assets/textures/` is FLUX-generated. Regenerate the whole set with +`tools/gen_textures.sh` or one with `tools/gen_textures.sh `; creds are +read from `.env`, never printed. + +Cloudflare Workers AI first, then the **local MODELBEAST farm** as an automatic +fallback ([flux_local.py](tools/flux_local.py), operator `flux_local`). This is +not optional nicety: Cloudflare's free tier is 10,000 neurons/day and one full +set regen exhausts it, after which every call 429s. The fallback is transparent +— `gen_textures.sh` output looks identical either way. Two things worth knowing before you re-prompt: diff --git a/assets/textures/billboard_ad.jpg b/assets/textures/billboard_ad.jpg index 75fe266..302fcdf 100644 Binary files a/assets/textures/billboard_ad.jpg and b/assets/textures/billboard_ad.jpg differ diff --git a/assets/textures/billboard_ad2.jpg b/assets/textures/billboard_ad2.jpg new file mode 100644 index 0000000..fcd51b5 Binary files /dev/null and b/assets/textures/billboard_ad2.jpg differ diff --git a/assets/textures/billboard_ad2.jpg.import b/assets/textures/billboard_ad2.jpg.import new file mode 100644 index 0000000..88044bf --- /dev/null +++ b/assets/textures/billboard_ad2.jpg.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cmfey5fennj01" +path="res://.godot/imported/billboard_ad2.jpg-9d24b02593fd210ec6d51b3075f5a4d6.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/textures/billboard_ad2.jpg" +dest_files=["res://.godot/imported/billboard_ad2.jpg-9d24b02593fd210ec6d51b3075f5a4d6.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/assets/textures/billboard_ad3.jpg b/assets/textures/billboard_ad3.jpg new file mode 100644 index 0000000..8aed5f0 Binary files /dev/null and b/assets/textures/billboard_ad3.jpg differ diff --git a/assets/textures/billboard_ad3.jpg.import b/assets/textures/billboard_ad3.jpg.import new file mode 100644 index 0000000..8aaa514 --- /dev/null +++ b/assets/textures/billboard_ad3.jpg.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bpnkph1x70xrd" +path="res://.godot/imported/billboard_ad3.jpg-5e527b9f5bdba2fbba43891d4f051600.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/textures/billboard_ad3.jpg" +dest_files=["res://.godot/imported/billboard_ad3.jpg-5e527b9f5bdba2fbba43891d4f051600.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/levels/albert_parklands/level.glb b/levels/albert_parklands/level.glb index 8948990..71ea6bc 100644 Binary files a/levels/albert_parklands/level.glb and b/levels/albert_parklands/level.glb differ diff --git a/levels/albert_parklands/level_billboard_ad.jpg b/levels/albert_parklands/level_billboard_ad.jpg index 75fe266..302fcdf 100644 Binary files a/levels/albert_parklands/level_billboard_ad.jpg and b/levels/albert_parklands/level_billboard_ad.jpg differ diff --git a/levels/albert_parklands/level_billboard_ad.jpg.import b/levels/albert_parklands/level_billboard_ad.jpg.import index 55c03ce..e8aab85 100644 --- a/levels/albert_parklands/level_billboard_ad.jpg.import +++ b/levels/albert_parklands/level_billboard_ad.jpg.import @@ -2,13 +2,13 @@ importer="texture" type="CompressedTexture2D" -uid="uid://cwk1rxn6jf68u" +uid="uid://dvoatwlj5nvdo" path="res://.godot/imported/level_billboard_ad.jpg-bcda2b636601c16f47aff7bf72b26997.ctex" metadata={ "vram_texture": false } generator_parameters={ -"md5": "12ec63926f38d27666816f31e162a17e" +"md5": "5f8c3c138d0015a36f7939ed07d448d6" } [deps] diff --git a/levels/albert_parklands/level_billboard_ad2.jpg b/levels/albert_parklands/level_billboard_ad2.jpg new file mode 100644 index 0000000..fcd51b5 Binary files /dev/null and b/levels/albert_parklands/level_billboard_ad2.jpg differ diff --git a/levels/albert_parklands/level_billboard_ad2.jpg.import b/levels/albert_parklands/level_billboard_ad2.jpg.import new file mode 100644 index 0000000..f20e617 --- /dev/null +++ b/levels/albert_parklands/level_billboard_ad2.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://6yawymgv6kyk" +path="res://.godot/imported/level_billboard_ad2.jpg-5b94709b3b458d7312b183687eaf4dc9.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "6c5a71b34b1df4b677d4e45bc19bfd6a" +} + +[deps] + +source_file="res://levels/albert_parklands/level_billboard_ad2.jpg" +dest_files=["res://.godot/imported/level_billboard_ad2.jpg-5b94709b3b458d7312b183687eaf4dc9.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=true +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/levels/albert_parklands/level_billboard_ad3.jpg b/levels/albert_parklands/level_billboard_ad3.jpg new file mode 100644 index 0000000..8aed5f0 Binary files /dev/null and b/levels/albert_parklands/level_billboard_ad3.jpg differ diff --git a/levels/albert_parklands/level_billboard_ad3.jpg.import b/levels/albert_parklands/level_billboard_ad3.jpg.import new file mode 100644 index 0000000..018829a --- /dev/null +++ b/levels/albert_parklands/level_billboard_ad3.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bo1kb7vutlcu" +path="res://.godot/imported/level_billboard_ad3.jpg-d5f33fda7a4ed00bbe1bfe3b5884eeb5.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "91e97464e5959aab2873019597cd6a55" +} + +[deps] + +source_file="res://levels/albert_parklands/level_billboard_ad3.jpg" +dest_files=["res://.godot/imported/level_billboard_ad3.jpg-d5f33fda7a4ed00bbe1bfe3b5884eeb5.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=true +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/levels/kangaroo_point/level.glb b/levels/kangaroo_point/level.glb index e2b8d95..77a4606 100644 Binary files a/levels/kangaroo_point/level.glb and b/levels/kangaroo_point/level.glb differ diff --git a/levels/kangaroo_point/level_billboard_ad.jpg b/levels/kangaroo_point/level_billboard_ad.jpg index 75fe266..302fcdf 100644 Binary files a/levels/kangaroo_point/level_billboard_ad.jpg and b/levels/kangaroo_point/level_billboard_ad.jpg differ diff --git a/levels/kangaroo_point/level_billboard_ad.jpg.import b/levels/kangaroo_point/level_billboard_ad.jpg.import index 49eb767..fd95777 100644 --- a/levels/kangaroo_point/level_billboard_ad.jpg.import +++ b/levels/kangaroo_point/level_billboard_ad.jpg.import @@ -2,13 +2,13 @@ importer="texture" type="CompressedTexture2D" -uid="uid://yd1138j75em6" +uid="uid://c1p88oweivvd0" path="res://.godot/imported/level_billboard_ad.jpg-fcbe479fbde4d682932abdf36af92924.ctex" metadata={ "vram_texture": false } generator_parameters={ -"md5": "12ec63926f38d27666816f31e162a17e" +"md5": "5f8c3c138d0015a36f7939ed07d448d6" } [deps] diff --git a/levels/kangaroo_point/level_billboard_ad3.jpg b/levels/kangaroo_point/level_billboard_ad3.jpg new file mode 100644 index 0000000..8aed5f0 Binary files /dev/null and b/levels/kangaroo_point/level_billboard_ad3.jpg differ diff --git a/levels/kangaroo_point/level_billboard_ad3.jpg.import b/levels/kangaroo_point/level_billboard_ad3.jpg.import new file mode 100644 index 0000000..f38cf6b --- /dev/null +++ b/levels/kangaroo_point/level_billboard_ad3.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c6n2k33ptpqly" +path="res://.godot/imported/level_billboard_ad3.jpg-6f9361dcfd720f30bf3a01b78a9e54da.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "91e97464e5959aab2873019597cd6a55" +} + +[deps] + +source_file="res://levels/kangaroo_point/level_billboard_ad3.jpg" +dest_files=["res://.godot/imported/level_billboard_ad3.jpg-6f9361dcfd720f30bf3a01b78a9e54da.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=true +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/levels/queen_st_mall/level.glb b/levels/queen_st_mall/level.glb index 524b190..c88a645 100644 Binary files a/levels/queen_st_mall/level.glb and b/levels/queen_st_mall/level.glb differ diff --git a/levels/queen_st_mall/level_billboard_ad.jpg b/levels/queen_st_mall/level_billboard_ad.jpg index 75fe266..302fcdf 100644 Binary files a/levels/queen_st_mall/level_billboard_ad.jpg and b/levels/queen_st_mall/level_billboard_ad.jpg differ diff --git a/levels/queen_st_mall/level_billboard_ad.jpg.import b/levels/queen_st_mall/level_billboard_ad.jpg.import index df8069c..4dd90b4 100644 --- a/levels/queen_st_mall/level_billboard_ad.jpg.import +++ b/levels/queen_st_mall/level_billboard_ad.jpg.import @@ -2,13 +2,13 @@ importer="texture" type="CompressedTexture2D" -uid="uid://dogxmy0et8bqr" +uid="uid://ddeqj1rclysaj" path="res://.godot/imported/level_billboard_ad.jpg-3eb075babf385fcbe0dcbc71e131abe8.ctex" metadata={ "vram_texture": false } generator_parameters={ -"md5": "12ec63926f38d27666816f31e162a17e" +"md5": "5f8c3c138d0015a36f7939ed07d448d6" } [deps] diff --git a/levels/queen_st_mall/level_billboard_ad2.jpg b/levels/queen_st_mall/level_billboard_ad2.jpg new file mode 100644 index 0000000..fcd51b5 Binary files /dev/null and b/levels/queen_st_mall/level_billboard_ad2.jpg differ diff --git a/levels/queen_st_mall/level_billboard_ad2.jpg.import b/levels/queen_st_mall/level_billboard_ad2.jpg.import new file mode 100644 index 0000000..c8961f2 --- /dev/null +++ b/levels/queen_st_mall/level_billboard_ad2.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b3f1tdhxyby6o" +path="res://.godot/imported/level_billboard_ad2.jpg-368f5089a910ed2133f77847bcd7536b.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "6c5a71b34b1df4b677d4e45bc19bfd6a" +} + +[deps] + +source_file="res://levels/queen_st_mall/level_billboard_ad2.jpg" +dest_files=["res://.godot/imported/level_billboard_ad2.jpg-368f5089a910ed2133f77847bcd7536b.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=true +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/levels/queen_st_mall/level_billboard_ad3.jpg b/levels/queen_st_mall/level_billboard_ad3.jpg new file mode 100644 index 0000000..8aed5f0 Binary files /dev/null and b/levels/queen_st_mall/level_billboard_ad3.jpg differ diff --git a/levels/queen_st_mall/level_billboard_ad3.jpg.import b/levels/queen_st_mall/level_billboard_ad3.jpg.import new file mode 100644 index 0000000..448b85d --- /dev/null +++ b/levels/queen_st_mall/level_billboard_ad3.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://br1rc064j6wi8" +path="res://.godot/imported/level_billboard_ad3.jpg-cb7db7d77329455744c23a250d59862d.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "91e97464e5959aab2873019597cd6a55" +} + +[deps] + +source_file="res://levels/queen_st_mall/level_billboard_ad3.jpg" +dest_files=["res://.godot/imported/level_billboard_ad3.jpg-cb7db7d77329455744c23a250d59862d.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=true +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/levels/southbank/level.glb b/levels/southbank/level.glb index d424d70..b261965 100644 Binary files a/levels/southbank/level.glb and b/levels/southbank/level.glb differ diff --git a/levels/southbank/level_asphalt.jpg b/levels/southbank/level_asphalt.jpg new file mode 100644 index 0000000..488f4b4 Binary files /dev/null and b/levels/southbank/level_asphalt.jpg differ diff --git a/levels/southbank/level_asphalt.jpg.import b/levels/southbank/level_asphalt.jpg.import new file mode 100644 index 0000000..0e8e317 --- /dev/null +++ b/levels/southbank/level_asphalt.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://xbuxk6njawtx" +path="res://.godot/imported/level_asphalt.jpg-b793b32bb8f5247e53fce396641569e9.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "6d4e58bce08ad885d626807f4870dd6b" +} + +[deps] + +source_file="res://levels/southbank/level_asphalt.jpg" +dest_files=["res://.godot/imported/level_asphalt.jpg-b793b32bb8f5247e53fce396641569e9.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=true +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/levels/southbank/level_asphalt_red.jpg b/levels/southbank/level_asphalt_red.jpg new file mode 100644 index 0000000..28f8927 Binary files /dev/null and b/levels/southbank/level_asphalt_red.jpg differ diff --git a/levels/southbank/level_asphalt_red.jpg.import b/levels/southbank/level_asphalt_red.jpg.import new file mode 100644 index 0000000..3196c0d --- /dev/null +++ b/levels/southbank/level_asphalt_red.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bcvrg416uodsp" +path="res://.godot/imported/level_asphalt_red.jpg-c84646ba033fab43b55971cc483fdf5e.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "05ff78831b5d0c22db19341c04ef220f" +} + +[deps] + +source_file="res://levels/southbank/level_asphalt_red.jpg" +dest_files=["res://.godot/imported/level_asphalt_red.jpg-c84646ba033fab43b55971cc483fdf5e.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=true +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/levels/southbank/level_awning_cream.jpg b/levels/southbank/level_awning_cream.jpg new file mode 100644 index 0000000..ee8e490 Binary files /dev/null and b/levels/southbank/level_awning_cream.jpg differ diff --git a/levels/southbank/level_awning_cream.jpg.import b/levels/southbank/level_awning_cream.jpg.import new file mode 100644 index 0000000..59c5076 --- /dev/null +++ b/levels/southbank/level_awning_cream.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c4y4y1vvhotel" +path="res://.godot/imported/level_awning_cream.jpg-1f54f2ed5f94143870440abdd2bf1b50.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "fd6eadc50ee05328df123d962ebcc1a2" +} + +[deps] + +source_file="res://levels/southbank/level_awning_cream.jpg" +dest_files=["res://.godot/imported/level_awning_cream.jpg-1f54f2ed5f94143870440abdd2bf1b50.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=true +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/levels/southbank/level_awning_green.jpg b/levels/southbank/level_awning_green.jpg new file mode 100644 index 0000000..2acf8e8 Binary files /dev/null and b/levels/southbank/level_awning_green.jpg differ diff --git a/levels/southbank/level_awning_green.jpg.import b/levels/southbank/level_awning_green.jpg.import new file mode 100644 index 0000000..e6c1fd9 --- /dev/null +++ b/levels/southbank/level_awning_green.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dcn8vgn5t8dww" +path="res://.godot/imported/level_awning_green.jpg-a6b5e981f542b7712ca244914c1ba768.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "5f02e613fa470f9c1aae51f038c294a8" +} + +[deps] + +source_file="res://levels/southbank/level_awning_green.jpg" +dest_files=["res://.godot/imported/level_awning_green.jpg-a6b5e981f542b7712ca244914c1ba768.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=true +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/levels/southbank/level_awning_grey.jpg b/levels/southbank/level_awning_grey.jpg new file mode 100644 index 0000000..bc89374 Binary files /dev/null and b/levels/southbank/level_awning_grey.jpg differ diff --git a/levels/southbank/level_awning_grey.jpg.import b/levels/southbank/level_awning_grey.jpg.import new file mode 100644 index 0000000..6671a25 --- /dev/null +++ b/levels/southbank/level_awning_grey.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d1him1eivg1ng" +path="res://.godot/imported/level_awning_grey.jpg-ca518de50fca2dd30a9b68e9bf3f0f6e.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "3dbfb0d5f478755a1370246878836a74" +} + +[deps] + +source_file="res://levels/southbank/level_awning_grey.jpg" +dest_files=["res://.godot/imported/level_awning_grey.jpg-ca518de50fca2dd30a9b68e9bf3f0f6e.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=true +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/levels/southbank/level_bark.jpg b/levels/southbank/level_bark.jpg new file mode 100644 index 0000000..b79bb22 Binary files /dev/null and b/levels/southbank/level_bark.jpg differ diff --git a/levels/southbank/level_bark.jpg.import b/levels/southbank/level_bark.jpg.import new file mode 100644 index 0000000..d4e8343 --- /dev/null +++ b/levels/southbank/level_bark.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dnliqjrguulhk" +path="res://.godot/imported/level_bark.jpg-2d8cacbf88dd2468f52958a8c64805c0.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "21804a334d55f3bdba9fe0ac964afcd4" +} + +[deps] + +source_file="res://levels/southbank/level_bark.jpg" +dest_files=["res://.godot/imported/level_bark.jpg-2d8cacbf88dd2468f52958a8c64805c0.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=true +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/levels/southbank/level_billboard_ad.jpg b/levels/southbank/level_billboard_ad.jpg new file mode 100644 index 0000000..302fcdf Binary files /dev/null and b/levels/southbank/level_billboard_ad.jpg differ diff --git a/levels/southbank/level_billboard_ad.jpg.import b/levels/southbank/level_billboard_ad.jpg.import new file mode 100644 index 0000000..ab3ecb4 --- /dev/null +++ b/levels/southbank/level_billboard_ad.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://vu564hsxbsdt" +path="res://.godot/imported/level_billboard_ad.jpg-ee4b6ad2cd39e58410c1a32f2b4f4041.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "5f8c3c138d0015a36f7939ed07d448d6" +} + +[deps] + +source_file="res://levels/southbank/level_billboard_ad.jpg" +dest_files=["res://.godot/imported/level_billboard_ad.jpg-ee4b6ad2cd39e58410c1a32f2b4f4041.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=true +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/levels/southbank/level_billboard_ad2.jpg b/levels/southbank/level_billboard_ad2.jpg new file mode 100644 index 0000000..fcd51b5 Binary files /dev/null and b/levels/southbank/level_billboard_ad2.jpg differ diff --git a/levels/southbank/level_billboard_ad2.jpg.import b/levels/southbank/level_billboard_ad2.jpg.import new file mode 100644 index 0000000..7634714 --- /dev/null +++ b/levels/southbank/level_billboard_ad2.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://boybyipprq742" +path="res://.godot/imported/level_billboard_ad2.jpg-14bde3dc90099a398a05e939d1dbee0d.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "6c5a71b34b1df4b677d4e45bc19bfd6a" +} + +[deps] + +source_file="res://levels/southbank/level_billboard_ad2.jpg" +dest_files=["res://.godot/imported/level_billboard_ad2.jpg-14bde3dc90099a398a05e939d1dbee0d.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=true +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/levels/southbank/level_billboard_ad3.jpg b/levels/southbank/level_billboard_ad3.jpg new file mode 100644 index 0000000..8aed5f0 Binary files /dev/null and b/levels/southbank/level_billboard_ad3.jpg differ diff --git a/levels/southbank/level_billboard_ad3.jpg.import b/levels/southbank/level_billboard_ad3.jpg.import new file mode 100644 index 0000000..bc99347 --- /dev/null +++ b/levels/southbank/level_billboard_ad3.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dn1q273i1dgyv" +path="res://.godot/imported/level_billboard_ad3.jpg-b2afbee966378c7ee074cfc681ad4a43.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "91e97464e5959aab2873019597cd6a55" +} + +[deps] + +source_file="res://levels/southbank/level_billboard_ad3.jpg" +dest_files=["res://.godot/imported/level_billboard_ad3.jpg-b2afbee966378c7ee074cfc681ad4a43.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=true +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/levels/southbank/level_bougainvillea.jpg b/levels/southbank/level_bougainvillea.jpg new file mode 100644 index 0000000..511292a Binary files /dev/null and b/levels/southbank/level_bougainvillea.jpg differ diff --git a/levels/southbank/level_bougainvillea.jpg.import b/levels/southbank/level_bougainvillea.jpg.import new file mode 100644 index 0000000..9a6a8fa --- /dev/null +++ b/levels/southbank/level_bougainvillea.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d0d2l41yby0s7" +path="res://.godot/imported/level_bougainvillea.jpg-31f07db7ee28fa23a9de942581cc7380.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "fd00871abdefb313b4e325089c4f666d" +} + +[deps] + +source_file="res://levels/southbank/level_bougainvillea.jpg" +dest_files=["res://.godot/imported/level_bougainvillea.jpg-31f07db7ee28fa23a9de942581cc7380.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=true +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/levels/southbank/level_concrete_ground.jpg b/levels/southbank/level_concrete_ground.jpg new file mode 100644 index 0000000..c7d0746 Binary files /dev/null and b/levels/southbank/level_concrete_ground.jpg differ diff --git a/levels/southbank/level_concrete_ground.jpg.import b/levels/southbank/level_concrete_ground.jpg.import new file mode 100644 index 0000000..9fad7df --- /dev/null +++ b/levels/southbank/level_concrete_ground.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dj2j8hb30rpo0" +path="res://.godot/imported/level_concrete_ground.jpg-bd2b53d43b87aa4c3e50860a7b180a0d.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "da8e49ed928188692e8b27f94880d0f0" +} + +[deps] + +source_file="res://levels/southbank/level_concrete_ground.jpg" +dest_files=["res://.godot/imported/level_concrete_ground.jpg-bd2b53d43b87aa4c3e50860a7b180a0d.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=true +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/levels/southbank/level_corrugated_iron.jpg b/levels/southbank/level_corrugated_iron.jpg new file mode 100644 index 0000000..fbdd449 Binary files /dev/null and b/levels/southbank/level_corrugated_iron.jpg differ diff --git a/levels/southbank/level_corrugated_iron.jpg.import b/levels/southbank/level_corrugated_iron.jpg.import new file mode 100644 index 0000000..87dd88f --- /dev/null +++ b/levels/southbank/level_corrugated_iron.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ddbfr7l7q5sw2" +path="res://.godot/imported/level_corrugated_iron.jpg-a8d5ad070b0b1f2020f14214c0bacd51.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "90b5c35c3d8df5a3d52f28ff88c16c1b" +} + +[deps] + +source_file="res://levels/southbank/level_corrugated_iron.jpg" +dest_files=["res://.godot/imported/level_corrugated_iron.jpg-a8d5ad070b0b1f2020f14214c0bacd51.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=true +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/levels/southbank/level_facade_brick.jpg b/levels/southbank/level_facade_brick.jpg new file mode 100644 index 0000000..3635f16 Binary files /dev/null and b/levels/southbank/level_facade_brick.jpg differ diff --git a/levels/southbank/level_facade_brick.jpg.import b/levels/southbank/level_facade_brick.jpg.import new file mode 100644 index 0000000..d471af6 --- /dev/null +++ b/levels/southbank/level_facade_brick.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://uy0r61512roo" +path="res://.godot/imported/level_facade_brick.jpg-414eb4097e7647c48311bc9245f6a8dc.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "9bbc1f659c3ae0f8ff50415e0e25b0a0" +} + +[deps] + +source_file="res://levels/southbank/level_facade_brick.jpg" +dest_files=["res://.godot/imported/level_facade_brick.jpg-414eb4097e7647c48311bc9245f6a8dc.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=true +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/levels/southbank/level_facade_concrete.jpg b/levels/southbank/level_facade_concrete.jpg new file mode 100644 index 0000000..e29cb95 Binary files /dev/null and b/levels/southbank/level_facade_concrete.jpg differ diff --git a/levels/southbank/level_facade_concrete.jpg.import b/levels/southbank/level_facade_concrete.jpg.import new file mode 100644 index 0000000..3897613 --- /dev/null +++ b/levels/southbank/level_facade_concrete.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cb8u61dtrs5nv" +path="res://.godot/imported/level_facade_concrete.jpg-8a6dd7665a26ab818b7ca82d1fed9e40.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "01abc5a72c9b0db9fa03d6a8187d657e" +} + +[deps] + +source_file="res://levels/southbank/level_facade_concrete.jpg" +dest_files=["res://.godot/imported/level_facade_concrete.jpg-8a6dd7665a26ab818b7ca82d1fed9e40.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=true +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/levels/southbank/level_facade_deco.jpg b/levels/southbank/level_facade_deco.jpg new file mode 100644 index 0000000..0980e33 Binary files /dev/null and b/levels/southbank/level_facade_deco.jpg differ diff --git a/levels/southbank/level_facade_deco.jpg.import b/levels/southbank/level_facade_deco.jpg.import new file mode 100644 index 0000000..9245d3f --- /dev/null +++ b/levels/southbank/level_facade_deco.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://3tsolrcprym7" +path="res://.godot/imported/level_facade_deco.jpg-1824deda6d4a2cd84e7f5f4ce43325e6.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "ada93740d168d1ff3a8c4613a7859fc4" +} + +[deps] + +source_file="res://levels/southbank/level_facade_deco.jpg" +dest_files=["res://.godot/imported/level_facade_deco.jpg-1824deda6d4a2cd84e7f5f4ce43325e6.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=true +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/levels/southbank/level_facade_glass.jpg b/levels/southbank/level_facade_glass.jpg new file mode 100644 index 0000000..d0882db Binary files /dev/null and b/levels/southbank/level_facade_glass.jpg differ diff --git a/levels/southbank/level_facade_glass.jpg.import b/levels/southbank/level_facade_glass.jpg.import new file mode 100644 index 0000000..131da18 --- /dev/null +++ b/levels/southbank/level_facade_glass.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://df4adklewgv4f" +path="res://.godot/imported/level_facade_glass.jpg-bd0b5599e4534fb1beee1f6030e87f02.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "1e88904ab07ea05ef51b0ad5ef8a5176" +} + +[deps] + +source_file="res://levels/southbank/level_facade_glass.jpg" +dest_files=["res://.godot/imported/level_facade_glass.jpg-bd0b5599e4534fb1beee1f6030e87f02.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=true +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/levels/southbank/level_facade_glass2.jpg b/levels/southbank/level_facade_glass2.jpg new file mode 100644 index 0000000..bb732ab Binary files /dev/null and b/levels/southbank/level_facade_glass2.jpg differ diff --git a/levels/southbank/level_facade_glass2.jpg.import b/levels/southbank/level_facade_glass2.jpg.import new file mode 100644 index 0000000..fc4087b --- /dev/null +++ b/levels/southbank/level_facade_glass2.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dmttoqxpp2rwu" +path="res://.godot/imported/level_facade_glass2.jpg-b33c493108ef3432bb60593c1f408d7f.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "09bf1228d59ce8eb5075472ecfafa796" +} + +[deps] + +source_file="res://levels/southbank/level_facade_glass2.jpg" +dest_files=["res://.godot/imported/level_facade_glass2.jpg-b33c493108ef3432bb60593c1f408d7f.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=true +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/levels/southbank/level_facade_heritage.jpg b/levels/southbank/level_facade_heritage.jpg new file mode 100644 index 0000000..f1c496b Binary files /dev/null and b/levels/southbank/level_facade_heritage.jpg differ diff --git a/levels/southbank/level_facade_heritage.jpg.import b/levels/southbank/level_facade_heritage.jpg.import new file mode 100644 index 0000000..80a4e26 --- /dev/null +++ b/levels/southbank/level_facade_heritage.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bubmct5qoaw8q" +path="res://.godot/imported/level_facade_heritage.jpg-c0a3bebaf42567b83c820573a8263c1b.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "ba9e1709cb12bd8fdb4a19289f624abe" +} + +[deps] + +source_file="res://levels/southbank/level_facade_heritage.jpg" +dest_files=["res://.godot/imported/level_facade_heritage.jpg-c0a3bebaf42567b83c820573a8263c1b.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=true +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/levels/southbank/level_foliage.jpg b/levels/southbank/level_foliage.jpg new file mode 100644 index 0000000..600d981 Binary files /dev/null and b/levels/southbank/level_foliage.jpg differ diff --git a/levels/southbank/level_foliage.jpg.import b/levels/southbank/level_foliage.jpg.import new file mode 100644 index 0000000..afe2214 --- /dev/null +++ b/levels/southbank/level_foliage.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cyro5oajkn4tw" +path="res://.godot/imported/level_foliage.jpg-b022780453b81b5ebb1de0efd642101f.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "ab3257b92ff0b75b17ceb374a6bfe480" +} + +[deps] + +source_file="res://levels/southbank/level_foliage.jpg" +dest_files=["res://.godot/imported/level_foliage.jpg-b022780453b81b5ebb1de0efd642101f.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=true +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/levels/southbank/level_foliage_jacaranda.jpg b/levels/southbank/level_foliage_jacaranda.jpg new file mode 100644 index 0000000..1135317 Binary files /dev/null and b/levels/southbank/level_foliage_jacaranda.jpg differ diff --git a/levels/southbank/level_foliage_jacaranda.jpg.import b/levels/southbank/level_foliage_jacaranda.jpg.import new file mode 100644 index 0000000..a772924 --- /dev/null +++ b/levels/southbank/level_foliage_jacaranda.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ck2ixlo4cqrqs" +path="res://.godot/imported/level_foliage_jacaranda.jpg-0040a339ea1d7ca0f8d2e2da04936529.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "03eaf7e7939cd60d6eeae70a412aaa2a" +} + +[deps] + +source_file="res://levels/southbank/level_foliage_jacaranda.jpg" +dest_files=["res://.godot/imported/level_foliage_jacaranda.jpg-0040a339ea1d7ca0f8d2e2da04936529.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=true +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/levels/southbank/level_footpath.jpg b/levels/southbank/level_footpath.jpg new file mode 100644 index 0000000..f4fb7ba Binary files /dev/null and b/levels/southbank/level_footpath.jpg differ diff --git a/levels/southbank/level_footpath.jpg.import b/levels/southbank/level_footpath.jpg.import new file mode 100644 index 0000000..70a4ae7 --- /dev/null +++ b/levels/southbank/level_footpath.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://5h6jpuxuse4i" +path="res://.godot/imported/level_footpath.jpg-fb905c3a25591d70461cb0d2fbf5db81.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "7cbdf662fc4a640b776d7b1845d41e45" +} + +[deps] + +source_file="res://levels/southbank/level_footpath.jpg" +dest_files=["res://.godot/imported/level_footpath.jpg-fb905c3a25591d70461cb0d2fbf5db81.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=true +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/levels/southbank/level_grass.jpg b/levels/southbank/level_grass.jpg new file mode 100644 index 0000000..f5ac6c5 Binary files /dev/null and b/levels/southbank/level_grass.jpg differ diff --git a/levels/southbank/level_grass.jpg.import b/levels/southbank/level_grass.jpg.import new file mode 100644 index 0000000..f43ed35 --- /dev/null +++ b/levels/southbank/level_grass.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dsgo1ci7jxm5b" +path="res://.godot/imported/level_grass.jpg-e747c7c3bfa74c3e8e81903abb92ca39.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "01321994e4e9a94eb2f15dbe2978140b" +} + +[deps] + +source_file="res://levels/southbank/level_grass.jpg" +dest_files=["res://.godot/imported/level_grass.jpg-e747c7c3bfa74c3e8e81903abb92ca39.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=true +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/levels/southbank/level_panel_white.jpg b/levels/southbank/level_panel_white.jpg new file mode 100644 index 0000000..86db047 Binary files /dev/null and b/levels/southbank/level_panel_white.jpg differ diff --git a/levels/southbank/level_panel_white.jpg.import b/levels/southbank/level_panel_white.jpg.import new file mode 100644 index 0000000..76e7219 --- /dev/null +++ b/levels/southbank/level_panel_white.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bqx6tu8yake1i" +path="res://.godot/imported/level_panel_white.jpg-2629a0e35c4ace6764ce91a39f364e2b.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "cfedf8ba4acf1158ff462ccfa8722c45" +} + +[deps] + +source_file="res://levels/southbank/level_panel_white.jpg" +dest_files=["res://.godot/imported/level_panel_white.jpg-2629a0e35c4ace6764ce91a39f364e2b.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=true +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/levels/southbank/level_pavers.jpg b/levels/southbank/level_pavers.jpg new file mode 100644 index 0000000..37c942e Binary files /dev/null and b/levels/southbank/level_pavers.jpg differ diff --git a/levels/southbank/level_pavers.jpg.import b/levels/southbank/level_pavers.jpg.import new file mode 100644 index 0000000..5c83b36 --- /dev/null +++ b/levels/southbank/level_pavers.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://f52a4rvffofu" +path="res://.godot/imported/level_pavers.jpg-1330d2adc892acadea0e48e320586e6f.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "b1bbbe65052bf830311c774d65b64bc9" +} + +[deps] + +source_file="res://levels/southbank/level_pavers.jpg" +dest_files=["res://.godot/imported/level_pavers.jpg-1330d2adc892acadea0e48e320586e6f.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=true +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/levels/southbank/level_planter.jpg b/levels/southbank/level_planter.jpg new file mode 100644 index 0000000..7eb2e19 Binary files /dev/null and b/levels/southbank/level_planter.jpg differ diff --git a/levels/southbank/level_planter.jpg.import b/levels/southbank/level_planter.jpg.import new file mode 100644 index 0000000..903ddbc --- /dev/null +++ b/levels/southbank/level_planter.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dgv38qnasvojg" +path="res://.godot/imported/level_planter.jpg-bcdf313aab632ef006b623b7664f2710.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "a2c7fc1915b10d99f4cb35a41d3de89e" +} + +[deps] + +source_file="res://levels/southbank/level_planter.jpg" +dest_files=["res://.godot/imported/level_planter.jpg-bcdf313aab632ef006b623b7664f2710.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=true +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/levels/southbank/level_rock.jpg b/levels/southbank/level_rock.jpg new file mode 100644 index 0000000..13d7d4e Binary files /dev/null and b/levels/southbank/level_rock.jpg differ diff --git a/levels/southbank/level_rock.jpg.import b/levels/southbank/level_rock.jpg.import new file mode 100644 index 0000000..3a12573 --- /dev/null +++ b/levels/southbank/level_rock.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cu5fyhp1re4vg" +path="res://.godot/imported/level_rock.jpg-9890b8975d8ee215157e6f269b2ef3d2.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "c0b75b793fd4409b9c53ae92b3095cf5" +} + +[deps] + +source_file="res://levels/southbank/level_rock.jpg" +dest_files=["res://.godot/imported/level_rock.jpg-9890b8975d8ee215157e6f269b2ef3d2.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=true +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/levels/southbank/level_roof_deck.jpg b/levels/southbank/level_roof_deck.jpg new file mode 100644 index 0000000..1e80376 Binary files /dev/null and b/levels/southbank/level_roof_deck.jpg differ diff --git a/levels/southbank/level_roof_deck.jpg.import b/levels/southbank/level_roof_deck.jpg.import new file mode 100644 index 0000000..14e3249 --- /dev/null +++ b/levels/southbank/level_roof_deck.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ckb3fe7c4obuh" +path="res://.godot/imported/level_roof_deck.jpg-e6fa3bcc18553c26bf2562200ca3005b.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "abefe2c913e535b8e45c15c2fd64c035" +} + +[deps] + +source_file="res://levels/southbank/level_roof_deck.jpg" +dest_files=["res://.godot/imported/level_roof_deck.jpg-e6fa3bcc18553c26bf2562200ca3005b.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=true +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/levels/southbank/level_sandstone.jpg b/levels/southbank/level_sandstone.jpg new file mode 100644 index 0000000..5d77cc4 Binary files /dev/null and b/levels/southbank/level_sandstone.jpg differ diff --git a/levels/southbank/level_sandstone.jpg.import b/levels/southbank/level_sandstone.jpg.import new file mode 100644 index 0000000..84fbfe5 --- /dev/null +++ b/levels/southbank/level_sandstone.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://lblfmi2q6ub6" +path="res://.godot/imported/level_sandstone.jpg-ed52e26cd48d1c33bcd861f24c56be65.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "4542fecfd809fc8ba6d5ffe37023980e" +} + +[deps] + +source_file="res://levels/southbank/level_sandstone.jpg" +dest_files=["res://.godot/imported/level_sandstone.jpg-ed52e26cd48d1c33bcd861f24c56be65.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=true +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/levels/southbank/level_shopfront.jpg b/levels/southbank/level_shopfront.jpg new file mode 100644 index 0000000..070ea5d Binary files /dev/null and b/levels/southbank/level_shopfront.jpg differ diff --git a/levels/southbank/level_shopfront.jpg.import b/levels/southbank/level_shopfront.jpg.import new file mode 100644 index 0000000..27a9cb3 --- /dev/null +++ b/levels/southbank/level_shopfront.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bgv0treorwk7a" +path="res://.godot/imported/level_shopfront.jpg-3015c86a7f8b5776c0f8cf7f891176d6.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "54365d23c4a16f4093874e323505f747" +} + +[deps] + +source_file="res://levels/southbank/level_shopfront.jpg" +dest_files=["res://.godot/imported/level_shopfront.jpg-3015c86a7f8b5776c0f8cf7f891176d6.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=true +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/levels/southbank/level_signage_strip.jpg b/levels/southbank/level_signage_strip.jpg new file mode 100644 index 0000000..6085145 Binary files /dev/null and b/levels/southbank/level_signage_strip.jpg differ diff --git a/levels/southbank/level_signage_strip.jpg.import b/levels/southbank/level_signage_strip.jpg.import new file mode 100644 index 0000000..2a9e080 --- /dev/null +++ b/levels/southbank/level_signage_strip.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dj7vpegy5aooa" +path="res://.godot/imported/level_signage_strip.jpg-6369d3b48e9b07a0a687d28c173f6e62.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "7bac04c3f15d3c6e34263659e61d8fe9" +} + +[deps] + +source_file="res://levels/southbank/level_signage_strip.jpg" +dest_files=["res://.godot/imported/level_signage_strip.jpg-6369d3b48e9b07a0a687d28c173f6e62.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=true +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/levels/southbank/level_steel.jpg b/levels/southbank/level_steel.jpg new file mode 100644 index 0000000..c3a953c Binary files /dev/null and b/levels/southbank/level_steel.jpg differ diff --git a/levels/southbank/level_steel.jpg.import b/levels/southbank/level_steel.jpg.import new file mode 100644 index 0000000..fb33e5a --- /dev/null +++ b/levels/southbank/level_steel.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d16qlav2av8p5" +path="res://.godot/imported/level_steel.jpg-3314104468b4c592a2550a468515d3a2.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "c89cb67b55ae73418f6c5eae7ee0f6ca" +} + +[deps] + +source_file="res://levels/southbank/level_steel.jpg" +dest_files=["res://.godot/imported/level_steel.jpg-3314104468b4c592a2550a468515d3a2.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=true +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/levels/southbank/level_water.jpg b/levels/southbank/level_water.jpg new file mode 100644 index 0000000..abcba62 Binary files /dev/null and b/levels/southbank/level_water.jpg differ diff --git a/levels/southbank/level_water.jpg.import b/levels/southbank/level_water.jpg.import new file mode 100644 index 0000000..41e4f1e --- /dev/null +++ b/levels/southbank/level_water.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://pfflsno1557t" +path="res://.godot/imported/level_water.jpg-d28915b84ac8cf257bdf892067b17e66.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "5c09ce05f3ec08d64ff6edccd71fef85" +} + +[deps] + +source_file="res://levels/southbank/level_water.jpg" +dest_files=["res://.godot/imported/level_water.jpg-d28915b84ac8cf257bdf892067b17e66.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=true +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/levels/southbank/level_weatherboard.jpg b/levels/southbank/level_weatherboard.jpg new file mode 100644 index 0000000..3bcb92c Binary files /dev/null and b/levels/southbank/level_weatherboard.jpg differ diff --git a/levels/southbank/level_weatherboard.jpg.import b/levels/southbank/level_weatherboard.jpg.import new file mode 100644 index 0000000..96973d6 --- /dev/null +++ b/levels/southbank/level_weatherboard.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ba0rkg4gekgay" +path="res://.godot/imported/level_weatherboard.jpg-61492a472720548401045bf71427ab04.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "e5db9671305f92ee42582305566d2591" +} + +[deps] + +source_file="res://levels/southbank/level_weatherboard.jpg" +dest_files=["res://.godot/imported/level_weatherboard.jpg-61492a472720548401045bf71427ab04.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=true +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/levels/story_bridge/level.glb b/levels/story_bridge/level.glb index 06102c3..2617eb4 100644 Binary files a/levels/story_bridge/level.glb and b/levels/story_bridge/level.glb differ diff --git a/levels/story_bridge/level_billboard_ad.jpg b/levels/story_bridge/level_billboard_ad.jpg index 75fe266..302fcdf 100644 Binary files a/levels/story_bridge/level_billboard_ad.jpg and b/levels/story_bridge/level_billboard_ad.jpg differ diff --git a/levels/story_bridge/level_billboard_ad.jpg.import b/levels/story_bridge/level_billboard_ad.jpg.import index cb5473d..ce8c9f5 100644 --- a/levels/story_bridge/level_billboard_ad.jpg.import +++ b/levels/story_bridge/level_billboard_ad.jpg.import @@ -2,13 +2,13 @@ importer="texture" type="CompressedTexture2D" -uid="uid://dc7a2u67l8v31" +uid="uid://8o4yre3dljvb" path="res://.godot/imported/level_billboard_ad.jpg-22cd6a16e70a5b1c0e6a2e8fcddb8868.ctex" metadata={ "vram_texture": false } generator_parameters={ -"md5": "12ec63926f38d27666816f31e162a17e" +"md5": "5f8c3c138d0015a36f7939ed07d448d6" } [deps] diff --git a/levels/story_bridge/level_billboard_ad2.jpg b/levels/story_bridge/level_billboard_ad2.jpg new file mode 100644 index 0000000..fcd51b5 Binary files /dev/null and b/levels/story_bridge/level_billboard_ad2.jpg differ diff --git a/levels/story_bridge/level_billboard_ad2.jpg.import b/levels/story_bridge/level_billboard_ad2.jpg.import new file mode 100644 index 0000000..0ebb110 --- /dev/null +++ b/levels/story_bridge/level_billboard_ad2.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cqxj7vsqrl3ki" +path="res://.godot/imported/level_billboard_ad2.jpg-0e9d4200555edd6f6c03c3f596d38459.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "6c5a71b34b1df4b677d4e45bc19bfd6a" +} + +[deps] + +source_file="res://levels/story_bridge/level_billboard_ad2.jpg" +dest_files=["res://.godot/imported/level_billboard_ad2.jpg-0e9d4200555edd6f6c03c3f596d38459.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=true +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/levels/story_bridge/level_billboard_ad3.jpg b/levels/story_bridge/level_billboard_ad3.jpg new file mode 100644 index 0000000..8aed5f0 Binary files /dev/null and b/levels/story_bridge/level_billboard_ad3.jpg differ diff --git a/levels/story_bridge/level_billboard_ad3.jpg.import b/levels/story_bridge/level_billboard_ad3.jpg.import new file mode 100644 index 0000000..650b6d2 --- /dev/null +++ b/levels/story_bridge/level_billboard_ad3.jpg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b8k2jedqow0v6" +path="res://.godot/imported/level_billboard_ad3.jpg-aa191b85d667f4b0e05e8987bf2886f2.ctex" +metadata={ +"vram_texture": false +} +generator_parameters={ +"md5": "91e97464e5959aab2873019597cd6a55" +} + +[deps] + +source_file="res://levels/story_bridge/level_billboard_ad3.jpg" +dest_files=["res://.godot/imported/level_billboard_ad3.jpg-aa191b85d667f4b0e05e8987bf2886f2.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=true +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/shot_kp.png.import b/shot_kp.png.import new file mode 100644 index 0000000..2ee280f --- /dev/null +++ b/shot_kp.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bvti3upsy17mh" +path="res://.godot/imported/shot_kp.png-38a7ee1a2c8da54f618e19705f30821f.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://shot_kp.png" +dest_files=["res://.godot/imported/shot_kp.png-38a7ee1a2c8da54f618e19705f30821f.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/shot_kp2.png.import b/shot_kp2.png.import new file mode 100644 index 0000000..1cf50b8 --- /dev/null +++ b/shot_kp2.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bflslcdy1e4vi" +path="res://.godot/imported/shot_kp2.png-e7a65557575e8977229d43997986ddec.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://shot_kp2.png" +dest_files=["res://.godot/imported/shot_kp2.png-e7a65557575e8977229d43997986ddec.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/shot_signals.png.import b/shot_signals.png.import new file mode 100644 index 0000000..c4da4cb --- /dev/null +++ b/shot_signals.png.import @@ -0,0 +1,40 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cekys4ivgu4h8" +path="res://.godot/imported/shot_signals.png-63a3c63abf5322b610cd10df0b3df2ad.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://shot_signals.png" +dest_files=["res://.godot/imported/shot_signals.png-63a3c63abf5322b610cd10df0b3df2ad.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/src/game.gd b/src/game.gd index cd846a3..d7b787d 100644 --- a/src/game.gd +++ b/src/game.gd @@ -28,6 +28,7 @@ const OUTRUN_START_D := 12.0 # pull alongside within this, at speed, to trigger var jstate := "" # junction: "run" -> "settle" -> "done" var breaker_used := false +var spinners: Array[Node3D] = [] # ferris wheels etc, turned in _process var outrun_rival: Rival = null var outrun_t := 0.0 var outrun_cd := 0.0 # cooldown so a finished outrun doesn't instantly re-arm @@ -56,6 +57,17 @@ func _ready() -> void: add_child(level) if mode != "junction": # junctions are deterministic puzzles: keep them clear _spawn_smashables(level) + for w in level.find_children("wheel_of_brisbane*", "MeshInstance3D", true, false): + # The GLB bakes world coords into the mesh, so the node origin is the + # level's, not the wheel's. Hang it off a pivot at its own AABB centre. + var mi := w as MeshInstance3D + var pivot := Node3D.new() + level.add_child(pivot) + pivot.global_position = mi.global_transform * mi.get_aabb().get_center() + var keep := mi.global_transform + mi.reparent(pivot, false) + mi.global_transform = keep + spinners.append(pivot) for p in level.find_children("*", "Path3D", true, false): race_path = p if String(p.name).begins_with("Race"): @@ -576,6 +588,8 @@ func _process(delta: float) -> void: if over and mode in ["crash", "junction"] and Input.is_action_just_pressed("reset"): get_tree().reload_current_scene() return + for sp in spinners: + sp.rotate_x(delta * 0.09) # a full turn takes ~70 s, same as the real one var target := car.global_position + car.global_basis * Vector3(0, 2.4, 6.0) cam.global_position = cam.global_position.lerp(target, 1.0 - exp(-5.0 * delta)) cam.look_at(car.global_position + Vector3.UP * 1.2) diff --git a/tools/build_level_osm.py b/tools/build_level_osm.py index 9c6fe6a..336ddb4 100644 --- a/tools/build_level_osm.py +++ b/tools/build_level_osm.py @@ -71,10 +71,14 @@ def tex_material(name, img, rough=0.85, metal=0.0): mat.node_tree.links.new(tex.outputs["Color"], bsdf.inputs["Base Color"]) return mat -def flat_material(name, rgba, rough=0.85, metal=0.0): +def flat_material(name, rgba, rough=0.85, metal=0.0, emit=0.0): mat = bpy.data.materials.new(name) mat.use_nodes = True - _finish(mat, rough, metal).inputs["Base Color"].default_value = rgba + bsdf = _finish(mat, rough, metal) + bsdf.inputs["Base Color"].default_value = rgba + if emit: # signal lenses read as lit even in a shaded street canyon + bsdf.inputs["Emission Color"].default_value = rgba + bsdf.inputs["Emission Strength"].default_value = emit return mat M_GLASS = tex_material("facade_glass", "facade_glass.jpg", 0.28, 0.15) @@ -109,7 +113,14 @@ M_CORRO = tex_material("corrugated_iron", "corrugated_iron.jpg", 0.55, 0.4) M_DECO = tex_material("facade_deco", "facade_deco.jpg") M_GLASS2 = tex_material("facade_glass2", "facade_glass2.jpg", 0.32, 0.12) M_SIGN = tex_material("signage_strip", "signage_strip.jpg", 0.7) -M_BILL = tex_material("billboard_ad", "billboard_ad.jpg", 0.7) +BILLBOARDS = [tex_material("billboard_ad", "billboard_ad.jpg", 0.7), + tex_material("billboard_ad2", "billboard_ad2.jpg", 0.7), + tex_material("billboard_ad3", "billboard_ad3.jpg", 0.7)] +M_LENS_R = flat_material("lens_red", (0.95, 0.10, 0.06, 1), 0.35, emit=2.5) +M_LENS_A = flat_material("lens_amber", (0.98, 0.62, 0.05, 1), 0.35, emit=2.0) +M_LENS_G = flat_material("lens_green", (0.10, 0.90, 0.35, 1), 0.35, emit=2.2) +M_WIRE = flat_material("wire", (0.09, 0.09, 0.10, 1), 0.7) +M_POLE = flat_material("powerpole", (0.36, 0.28, 0.19, 1), 0.9) FACADES = (M_BRICK, M_CONC, M_HERIT, M_SAND, M_DECO) QLD_TAGS = ("house", "detached", "terrace", "bungalow", "semidetached_house", "residential") @@ -303,6 +314,37 @@ def add_bin(bm, x, y, rng): def add_bollard(bm, x, y, rng): cone(bm, (x, y, 0.45), 0.10, 0.09, 0.9, 6) +def add_signal(bm, lens, x, y, rng): + """Aussie traffic signal: pole, lantern head, mast arm with a second head. + Lenses go in their own bmesh so they can be emissive.""" + h = 3.9 + cone(bm, (x, y, h / 2), 0.10, 0.08, h, 6) + a = rng.random() * math.tau + d = Vector((math.cos(a), math.sin(a), 0)) + p = Vector((-d.y, d.x, 0)) + for at, top in ((Vector((x, y, 0)) + p * 0.22, h - 0.15), + (Vector((x, y, 0)) + d * 3.6, h + 0.55)): + # lantern housing + three stacked lenses + beam(bm, at + Vector((0, 0, top - 1.0)), at + Vector((0, 0, top)), 0.34, 0.34) + for i, m in enumerate((0, 1, 2)): + c = at + Vector((0, 0, top - 0.22 - i * 0.32)) + # must clear beam()'s 0.05 m minimum length or the lens silently vanishes + beam(lens, c + d * 0.15, c + d * 0.28, 0.20, 0.20, m) + beam(bm, Vector((x, y, h + 0.4)), Vector((x, y, h + 0.4)) + d * 3.6, 0.13, 0.13) # mast arm + +def add_power_pole(bm, wire_bm, x, y, prev, rng): + """Timber power pole with a crossarm; wires sag to the previous pole.""" + h = 8.6 + cone(bm, (x, y, h / 2), 0.19, 0.13, h, 6) + beam(bm, (x - 0.95, y, h - 0.5), (x + 0.95, y, h - 0.5), 0.11, 0.11) + tops = [Vector((x - 0.8, y, h - 0.38)), Vector((x, y, h - 0.05)), Vector((x + 0.8, y, h - 0.38))] + if prev is not None: + for a, b in zip(prev, tops): + mid = (a + b) / 2 - Vector((0, 0, (a - b).length * 0.045)) # catenary sag + beam(wire_bm, a, mid, 0.045, 0.045) + beam(wire_bm, mid, b, 0.045, 0.045) + return tops + def add_shelter(bm, glassbm, x, y, rng): a = rng.random() * math.tau d = Vector((math.cos(a), math.sin(a), 0)) @@ -344,7 +386,8 @@ def add_canopy(bm, at, fwd): d = json.load(open(src)) counts = dict.fromkeys( - ("bld", "road", "path", "park", "planter", "water", "cliff", "tree", "prop", "cross"), 0) + ("bld", "road", "path", "park", "planter", "water", "cliff", "tree", "prop", + "cross", "signal", "pole"), 0) GREEN_LEISURE = ("park", "recreation_ground", "pitch", "playground", "golf_course", "nature_reserve") GREEN_LANDUSE = ("grass", "recreation_ground", "village_green", "meadow", "forest") PLANTER_LEISURE = ("garden",) @@ -359,7 +402,10 @@ fol_bm, frond_bm, trunk_bm = bmesh.new(), bmesh.new(), bmesh.new() prop_bm, glass_bm = bmesh.new(), bmesh.new() awn_bm, path_bm, line_bm = bmesh.new(), bmesh.new(), bmesh.new() road_bm = {"road": bmesh.new(), "mall": bmesh.new(), "bus": bmesh.new()} # batched: 385 road objects was 385 draw calls -sign_bm, bill_bm, jac_bm = bmesh.new(), bmesh.new(), bmesh.new() +sign_bm, jac_bm = bmesh.new(), bmesh.new() +bill_bm = [bmesh.new(), bmesh.new(), bmesh.new()] # one per ad design +sig_bm, lens_bm = bmesh.new(), bmesh.new() +pole_bm, wire_bm = bmesh.new(), bmesh.new() pp_spots, wb_spots = [], [] # (x, y, yaw): parked-car / wheelie-bin markers for game.gd to fill PP_CAP, WB_CAP = 70, 40 PARK_STREETS = ("residential", "tertiary", "secondary", "unclassified") @@ -379,6 +425,9 @@ for e in d["elements"]: elif kind == "bus_stop": add_shelter(prop_bm, glass_bm, px, py, rng) counts["prop"] += 1 + elif kind == "traffic_signals": + add_signal(sig_bm, lens_bm, px, py, rng) + counts["signal"] += 1 elif kind in PROPS and PROPS[kind]: PROPS[kind](prop_bm, px, py, rng) counts["prop"] += 1 @@ -451,8 +500,9 @@ for e in d["elements"]: half = min(4.0, eL * 0.35) a = Vector((mx - ux * half, my - uy * half, h + 2.6)) b = Vector((mx + ux * half, my + uy * half, h + 2.6)) - beam(bill_bm, a, b, 0.25, 3.0) - beam(bill_bm, Vector((mx, my, h)), Vector((mx, my, h + 1.4)), 0.3, 0.3) + bb = bill_bm[e["id"] % 3] + beam(bb, a, b, 0.25, 3.0) + beam(bb, Vector((mx, my, h)), Vector((mx, my, h + 1.4)), 0.3, 0.3) # street awning over the footpath -- not every shop has one, and a whole # street at one height in one colour reads as a painted stripe @@ -566,6 +616,26 @@ for e in d["elements"]: rkey = "mall" if hw == "pedestrian" else ("bus" if hw == "busway" else "road") ribbon(road_bm[rkey], pts, wide / 2, 0.03) counts["road"] += 1 + if hw in ("residential", "unclassified"): + # timber power poles down one side with sagging wires -- the single + # most Australian thing a suburban street can have + prev = None + acc = 20.0 + side = 1 if (e["id"] % 2) else -1 + for i in range(len(pts) - 1): + (x1, y1), (x2, y2) = pts[i], pts[i + 1] + segL = math.hypot(x2 - x1, y2 - y1) + if segL < 0.5: + continue + ux, uy = (x2 - x1) / segL, (y2 - y1) / segL + while acc < segL: + off = (wide / 2 + 2.6) * side + px_, py_ = x1 + ux * acc - uy * off, y1 + uy * acc + ux * off + prev = add_power_pole(pole_bm, wire_bm, px_, py_, prev, rng) + counts["pole"] += 1 + acc += 38.0 + acc -= segL + if hw in PARK_STREETS: # kerbside parallel parking + the odd wheelie bin on the footpath acc = 14.0 @@ -638,7 +708,12 @@ add_obj("trees_jacaranda", jac_bm, [M_JAC], 0.9, smooth=True) add_obj("trees_fronds", frond_bm, [M_FOLIAGE], 0.9) add_obj("trees_trunks", trunk_bm, [M_BARK], 0.7, smooth=True) add_obj("shop_signs", sign_bm, [M_SIGN], 5.5) -add_obj("billboards", bill_bm, [M_BILL], 8.0) +for i, bb in enumerate(bill_bm): + add_obj("billboards_%d" % i, bb, [BILLBOARDS[i]], 8.0) +add_obj("signals", sig_bm, [M_DARK], 1.4) +add_obj("signal_lenses", lens_bm, [M_LENS_R, M_LENS_A, M_LENS_G], 1.0) +add_obj("power_poles", pole_bm, [M_POLE], 1.6) +add_obj("power_wires", wire_bm, [M_WIRE], 4.0) add_obj("props", prop_bm, [M_DARK], 1.6) add_obj("prop_glass", glass_bm, [M_GLASS], 3.0) add_obj("awnings", awn_bm, AWNINGS, 3.0) diff --git a/tools/crop_poster.py b/tools/crop_poster.py new file mode 100644 index 0000000..6b6cf1e --- /dev/null +++ b/tools/crop_poster.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python3 +"""Trim a generated billboard down to just its poster face. + +Usage: crop_poster.py [more.jpg ...] + +FLUX renders a billboard *in situ* -- sky, support pole, sometimes a wall -- +however hard the prompt asks for the poster alone. Mapped onto a flat panel +that bakes sky into the sign. The poster is always the saturated part and the +surroundings are always washed out, so trim rows/columns whose mean saturation +falls below a fraction of the image's peak. Survives regeneration, unlike a +hand-measured crop box. +""" +import sys +from PIL import Image + +FLOOR = 0.42 # keep bands at >=42% of peak row/col saturation +MIN_KEEP = 0.35 # never crop away more than 65% of a dimension + + +def band_keep(profile): + peak = max(profile) or 1 + thresh = peak * FLOOR + idx = [i for i, v in enumerate(profile) if v >= thresh] + if not idx: + return 0, len(profile) + lo, hi = idx[0], idx[-1] + 1 + if (hi - lo) < len(profile) * MIN_KEEP: # suspiciously tight -> leave it alone + return 0, len(profile) + return lo, hi + + +def crop(path): + im = Image.open(path).convert("RGB") + sat = im.convert("HSV").split()[1] + w, h = im.size + px = sat.load() + cols = [sum(px[x, y] for y in range(0, h, 4)) for x in range(w)] + rows = [sum(px[x, y] for x in range(0, w, 4)) for y in range(h)] + x0, x1 = band_keep(cols) + y0, y1 = band_keep(rows) + out = im.crop((x0, y0, x1, y1)).resize((w, h), Image.LANCZOS) + out.save(path, quality=90) + print("%s: kept x %d-%d, y %d-%d of %dx%d" % (path.split("/")[-1], x0, x1, y0, y1, w, h)) + + +for p in sys.argv[1:]: + crop(p) diff --git a/tools/flux_local.py b/tools/flux_local.py new file mode 100644 index 0000000..efd99bc --- /dev/null +++ b/tools/flux_local.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python3 +"""Generate a texture on the local MODELBEAST farm (operator: flux_local). + +Usage: flux_local.py "" [size_px] [target_luma] + +The fallback for tools/flux_texture.sh when Cloudflare Workers AI returns 429 -- +its free tier is 10,000 neurons/day and a full texture-set regen burns through +it. Same output contract: a downscaled, luma-clamped jpg at . + +Queue + token per ~/.claude/skills/fleet/SKILL.md. The token is read from disk +and never printed. Job log JSON carries raw control chars, hence the scrub. +""" +import json +import os +import re +import sys +import time +import urllib.request + +HOST = os.environ.get("MB_HOST", "http://100.89.131.57:8777") +ENVS = ["~/Documents/fluxgod-work/.env", "~/Documents/backnforth/.env"] + + +def token(): + for p in ENVS: + p = os.path.expanduser(p) + if not os.path.exists(p): + continue + for line in open(p): + if line.startswith("MB_TOKEN"): + return line.split("=", 1)[1].strip().strip("'\"") + sys.exit("no MB_TOKEN found on disk") + + +def call(path, tok, data=None): + req = urllib.request.Request( + HOST + path, + data=json.dumps(data).encode() if data is not None else None, + headers={"Authorization": "Bearer " + tok, "Content-Type": "application/json"}, + ) + raw = urllib.request.urlopen(req, timeout=60).read().decode("utf-8", "replace") + return json.loads(re.sub(r"[\x00-\x1f]", "", raw)) + + +def main(): + prompt, out = sys.argv[1], sys.argv[2] + size = int(sys.argv[3]) if len(sys.argv) > 3 else 512 + luma = float(sys.argv[4]) if len(sys.argv) > 4 else 0.0 + tok = token() + + gen = max(size, 768) # generate at >=768 then downscale, same as the CF path + job = call("/api/jobs", tok, {"operator": "flux_local", "params": { + "prompt": prompt, "width": gen, "height": gen, "steps": 6}}) + jid = job["id"] + for _ in range(120): + time.sleep(3) + st = call("/api/jobs/%s" % jid, tok) + if st["status"] in ("done", "error"): + break + else: + sys.exit("timed out waiting on job %s" % jid) + if st["status"] != "done": + sys.exit("job %s failed: %s" % (jid, (st.get("error") or "")[:200])) + + assets = call("/api/assets?limit=40", tok) + rows = assets if isinstance(assets, list) else assets.get("assets", assets.get("items", [])) + mine = [a for a in rows if a.get("parent_job") == jid] + if not mine: + sys.exit("job %s produced no asset" % jid) + + req = urllib.request.Request("%s/api/assets/%s/file" % (HOST, mine[0]["id"]), + headers={"Authorization": "Bearer " + tok}) + blob = urllib.request.urlopen(req, timeout=120).read() + tmp = out + ".src" + open(tmp, "wb").write(blob) + + from PIL import Image, ImageStat + im = Image.open(tmp).convert("RGB").resize((size, size), Image.LANCZOS) + if luma: + mean = ImageStat.Stat(im.convert("L")).mean[0] + if mean > luma: + im = im.point(lambda v, k=luma / mean: int(v * k)) + im.save(out, quality=88) + os.remove(tmp) + print("OK %s (local)" % out) + + +if __name__ == "__main__": + main() diff --git a/tools/flux_texture.sh b/tools/flux_texture.sh index f7224ee..1bc422b 100755 --- a/tools/flux_texture.sh +++ b/tools/flux_texture.sh @@ -28,9 +28,12 @@ HTTP=$(curl -s -w '%{http_code}' -o "$RESP" --max-time 120 \ -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \ -d "$(python3 -c 'import json,sys; print(json.dumps({"prompt": sys.argv[1], "steps": 6}))' "$PROMPT")") if [ "$HTTP" != "200" ]; then - echo "HTTP $HTTP: $(python3 -c 'import json,sys; d=json.load(open(sys.argv[1])); print(d.get("errors"))' "$RESP" 2>/dev/null | head -c 200)" + ERR="$(python3 -c 'import json,sys; d=json.load(open(sys.argv[1])); print(d.get("errors"))' "$RESP" 2>/dev/null | head -c 200)" rm -f "$RESP" - exit 1 + # Cloudflare's free tier is 10,000 neurons/day and a full set regen eats it. + # Fall back to the local MODELBEAST farm rather than failing the texture. + echo "cloudflare HTTP $HTTP ($ERR) -- falling back to local FLUX" >&2 + exec python3 "$(dirname "$0")/flux_local.py" "$PROMPT" "$OUT" "$SIZE" "$LUMA" fi python3 - "$RESP" "$OUT" <<'EOF' import base64, json, sys diff --git a/tools/gen_textures.sh b/tools/gen_textures.sh index 359b361..c066803 100755 --- a/tools/gen_textures.sh +++ b/tools/gen_textures.sh @@ -42,7 +42,9 @@ corrugated_iron|512|seamless tiling texture of weathered galvanised corrugated i facade_deco|768|seamless tiling texture of a 1930s art deco sandstone and cream masonry building facade, tall narrow windows with decorative vertical piers and stepped mouldings, flat frontal view, even lighting|repeating pattern of cream art deco building front with vertical window bays and stepped stone details, frontal view, even light|175 facade_glass2|768|seamless tiling texture of a modern apartment tower facade, grid of floor to ceiling glass balconies with white frames and occasional teal glass panels, flat frontal view, even lighting|repeating grid of apartment building glass balconies with white frames, some teal panels, frontal view|0 signage_strip|768|seamless tiling texture, a long horizontal row of colourful fictional retail shop fascia signs in different colours and invented gibberish brand lettering, australian strip mall style, each sign a different colour block, flat frontal view, even lighting|repeating strip of varied colourful shop sign panels with made up unreadable lettering, frontal view, even light|0 -billboard_ad|768|single large fictional advertising billboard poster design, bold colourful retro soft drink advertisement with invented gibberish brand name lettering and a sunburst, flat frontal view, even lighting|colourful fictional poster advertisement with made up unreadable brand lettering, bold shapes, flat view|0 +billboard_ad|768|single large fictional advertising billboard poster, bold colourful retro soft drink advertisement with invented gibberish brand name lettering and a sunburst, flat frontal view, even lighting|colourful fictional poster advertisement with made up unreadable brand lettering, bold shapes, flat view|0 +billboard_ad2|768|single large fictional advertising billboard poster, 1980s Australian beer advertisement style, bold blue and gold blocks with invented gibberish brand lettering, flat frontal view, even lighting|fictional poster ad with blue and gold blocks and made up unreadable lettering, flat frontal view|0 +billboard_ad3|768|single large fictional advertising billboard poster, bright red and cream used car yard sale advertisement with invented gibberish lettering and starburst price tags, flat frontal view, even lighting|fictional red and cream sale poster with made up unreadable lettering and starbursts, flat frontal view|0 EOF ) diff --git a/tools/osm_xml_to_json.py b/tools/osm_xml_to_json.py index 1f1ce26..c914ee2 100644 --- a/tools/osm_xml_to_json.py +++ b/tools/osm_xml_to_json.py @@ -15,7 +15,7 @@ import xml.etree.ElementTree as ET # node tags the level builder turns into props -- everything else is dropped FURNITURE = { "natural": ("tree",), - "highway": ("street_lamp", "bus_stop"), + "highway": ("street_lamp", "bus_stop", "traffic_signals", "give_way", "stop"), "amenity": ("bench", "waste_basket", "drinking_water", "bicycle_parking", "post_box"), "barrier": ("bollard",), "tourism": ("artwork",),