From 3b32242a2b6d0f5b424f96d6dfdc1770d169caa9 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Tue, 10 Oct 2023 18:16:35 +0900 Subject: [PATCH] tiling optimisation 2.2ms -> 1.7ms --- assets/graphics/fonts/7x13_Tamzen7x14b.tga | 2 +- assets/mods/basegame/blocks/273.tga | 3 + assets/mods/basegame/blocks/274.tga | 3 + assets/mods/basegame/blocks/275.tga | 3 + assets/mods/basegame/blocks/blocks.csv | 46 ++++---- .../torvald/terrarum/gameworld/BlockLayer.kt | 1 + .../terrarum/gameworld/BlockLayerI16.kt | 2 +- .../terrarum/gameworld/BlockLayerI16F16.kt | 13 ++- .../terrarum/gameworld/BlockLayerI16I8.kt | 22 +++- .../torvald/terrarum/gameworld/GameWorld.kt | 14 ++- .../terrarum/modulebasegame/TitleScreen.kt | 1 + .../terrarum/serialise/ReadSimpleWorld.kt | 2 + .../terrarum/ui/BasicDebugInfoWindow.kt | 3 +- .../terrarum/worlddrawer/BlocksDrawer.kt | 103 ++++++++++++++---- .../terrarum/worlddrawer/CreateTileAtlas.kt | 9 ++ src/shaders/tiling.frag | 6 +- 16 files changed, 177 insertions(+), 56 deletions(-) create mode 100644 assets/mods/basegame/blocks/273.tga create mode 100644 assets/mods/basegame/blocks/274.tga create mode 100644 assets/mods/basegame/blocks/275.tga diff --git a/assets/graphics/fonts/7x13_Tamzen7x14b.tga b/assets/graphics/fonts/7x13_Tamzen7x14b.tga index 51fc820fb..f52a7d81e 100644 --- a/assets/graphics/fonts/7x13_Tamzen7x14b.tga +++ b/assets/graphics/fonts/7x13_Tamzen7x14b.tga @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:03f7ed27112037dfa6fe00ced94f2a21d639dea13c837e0d93a675c54aa5a27c +oid sha256:8fb01c2b2c2cf356e7aa1e21728cb270167d85f3f681129e51c0a272802e75f5 size 93202 diff --git a/assets/mods/basegame/blocks/273.tga b/assets/mods/basegame/blocks/273.tga new file mode 100644 index 000000000..968ff73be --- /dev/null +++ b/assets/mods/basegame/blocks/273.tga @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:717d20e50da31888d9344ee306481693b55ec39a5ac936410f05c77063b6e9a9 +size 1042 diff --git a/assets/mods/basegame/blocks/274.tga b/assets/mods/basegame/blocks/274.tga new file mode 100644 index 000000000..f54e88903 --- /dev/null +++ b/assets/mods/basegame/blocks/274.tga @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:367447ba99ba7e45dc1033ce19592eb2394bb9359d924e1cf62df78b22097aa0 +size 1042 diff --git a/assets/mods/basegame/blocks/275.tga b/assets/mods/basegame/blocks/275.tga new file mode 100644 index 000000000..16cc9b5bb --- /dev/null +++ b/assets/mods/basegame/blocks/275.tga @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f8f142db820f66ee6acc64fea197ef04777316228330ed0924cf7b8b0dfd5da +size 1042 diff --git a/assets/mods/basegame/blocks/blocks.csv b/assets/mods/basegame/blocks/blocks.csv index dc66854f9..e121c4c4c 100644 --- a/assets/mods/basegame/blocks/blocks.csv +++ b/assets/mods/basegame/blocks/blocks.csv @@ -10,12 +10,12 @@ "32";"32";"32";"BLOCK_DIRT";"0.1252";"0.1252";"0.1252";"0.1252";"24";"1400";"DIRT";"1";"1";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"DIRT,NATURAL" "33";"32";"32";"BLOCK_GRASS";"0.1252";"0.1252";"0.1252";"0.1252";"24";"1400";"GRSS";"1";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"GRASS,NATURAL" "34";"34";"34";"BLOCK_GRASSWALL";"0.1252";"0.1252";"0.1252";"0.1252";"24";"1400";"GRSS";"1";"1";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"GRASS,NATURAL" -"35";"35";"35";"BLOCK_FOLIAGE_GREEN";"0.1252";"0.1252";"0.1252";"0.1252";"24";"1400";"GRSS";"1";"1";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LEAVES,NATURAL" -"36";"36";"36";"BLOCK_FOLIAGE_LIME";"0.1252";"0.1252";"0.1252";"0.1252";"24";"1400";"GRSS";"1";"1";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LEAVES,NATURAL" -"37";"37";"37";"BLOCK_FOLIAGE_GOLD";"0.1252";"0.1252";"0.1252";"0.1252";"24";"1400";"GRSS";"1";"1";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LEAVES,NATURAL" -"38";"38";"38";"BLOCK_FOLIAGE_RED";"0.1252";"0.1252";"0.1252";"0.1252";"24";"1400";"GRSS";"1";"1";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LEAVES,NATURAL" -"39";"39";"39";"BLOCK_FOLIAGE_ICEBLUE";"0.1252";"0.1252";"0.1252";"0.1252";"24";"1400";"GRSS";"1";"1";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LEAVES,NATURAL" -"40";"40";"40";"BLOCK_FOLIAGE_PURPLE";"0.1252";"0.1252";"0.1252";"0.1252";"24";"1400";"GRSS";"1";"1";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LEAVES,NATURAL" +#"35";"35";"35";"BLOCK_FOLIAGE_GREEN";"0.1252";"0.1252";"0.1252";"0.1252";"24";"1400";"GRSS";"1";"1";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LEAVES,NATURAL" +#"36";"36";"36";"BLOCK_FOLIAGE_LIME";"0.1252";"0.1252";"0.1252";"0.1252";"24";"1400";"GRSS";"1";"1";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LEAVES,NATURAL" +#"37";"37";"37";"BLOCK_FOLIAGE_GOLD";"0.1252";"0.1252";"0.1252";"0.1252";"24";"1400";"GRSS";"1";"1";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LEAVES,NATURAL" +#"38";"38";"38";"BLOCK_FOLIAGE_RED";"0.1252";"0.1252";"0.1252";"0.1252";"24";"1400";"GRSS";"1";"1";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LEAVES,NATURAL" +#"39";"39";"39";"BLOCK_FOLIAGE_ICEBLUE";"0.1252";"0.1252";"0.1252";"0.1252";"24";"1400";"GRSS";"1";"1";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LEAVES,NATURAL" +#"40";"40";"40";"BLOCK_FOLIAGE_PURPLE";"0.1252";"0.1252";"0.1252";"0.1252";"24";"1400";"GRSS";"1";"1";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LEAVES,NATURAL" "48";"48";"48";"BLOCK_PLANK_NORMAL";"0.1252";"0.1252";"0.1252";"0.1252";"16";"740";"WOOD";"1";"1";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"WOOD" "49";"49";"49";"BLOCK_PLANK_EBONY";"0.1252";"0.1252";"0.1252";"0.1252";"19";"1200";"WOOD";"1";"1";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"WOOD" "50";"50";"50";"BLOCK_PLANK_BIRCH";"0.1252";"0.1252";"0.1252";"0.1252";"15";"670";"WOOD";"1";"1";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"WOOD" @@ -32,23 +32,23 @@ "85";"85";"85";"BLOCK_SAND_GREEN";"0.1252";"0.1252";"0.1252";"0.1252";"24";"2400";"SAND";"1";"0";"0";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.06";"SAND,NATURAL,WARM" "96";"96";"96";"BLOCK_GRAVEL";"0.1252";"0.1252";"0.1252";"0.1252";"24";"2400";"GRVL";"1";"0";"0";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"GRAVEL,NATURAL" "97";"97";"97";"BLOCK_GRAVEL_GREY";"0.1252";"0.1252";"0.1252";"0.1252";"24";"2400";"GRVL";"1";"0";"0";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"GRAVEL,NATURAL" -"112";"112";"112";"BLOCK_ORE_MALACHITE";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"OORE";"1";"0";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"ORE,NATURAL" -"113";"113";"113";"BLOCK_ORE_HEMATITE";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"OORE";"1";"0";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"ORE,NATURAL" -"114";"114";"114";"BLOCK_ORE_NATURAL_GOLD";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"OORE";"1";"0";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"ORE,NATURAL" -"115";"115";"115";"BLOCK_ORE_COAL";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"OORE";"1";"0";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"ORE,NATURAL" -"116";"116";"116";"BLOCK_ORE_SPHALERITE";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"OORE";"1";"0";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"ORE,NATURAL" -"117";"117";"117";"BLOCK_ORE_RUTILE";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"OORE";"1";"0";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"ORE,NATURAL" -"128";"128";"128";"BLOCK_GEM_RUBY";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"OGEM";"1";"0";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"GEM,NATURAL" -"129";"129";"129";"BLOCK_GEM_EMERALD";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"OGEM";"1";"0";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"GEM,NATURAL" -"130";"130";"130";"BLOCK_GEM_SAPPHIRE";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"OGEM";"1";"0";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"GEM,NATURAL" -"131";"131";"131";"BLOCK_GEM_TOPAZ";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"OGEM";"1";"0";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"GEM,NATURAL" -"132";"132";"132";"BLOCK_GEM_DIAMOND";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"OGEM";"1";"0";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"GEM,NATURAL" -"133";"133";"133";"BLOCK_GEM_AMETHYST";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"OGEM";"1";"0";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"GEM,NATURAL" -"134";"134";"134";"BLOCK_GEM_QUARTZ";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"OGEM";"1";"0";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"GEM,NATURAL" +#"112";"112";"112";"BLOCK_ORE_MALACHITE";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"OORE";"1";"0";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"ORE,NATURAL" +#"113";"113";"113";"BLOCK_ORE_HEMATITE";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"OORE";"1";"0";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"ORE,NATURAL" +#"114";"114";"114";"BLOCK_ORE_NATURAL_GOLD";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"OORE";"1";"0";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"ORE,NATURAL" +#"115";"115";"115";"BLOCK_ORE_COAL";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"OORE";"1";"0";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"ORE,NATURAL" +#"116";"116";"116";"BLOCK_ORE_SPHALERITE";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"OORE";"1";"0";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"ORE,NATURAL" +#"117";"117";"117";"BLOCK_ORE_RUTILE";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"OORE";"1";"0";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"ORE,NATURAL" +#"128";"128";"128";"BLOCK_GEM_RUBY";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"OGEM";"1";"0";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"GEM,NATURAL" +#"129";"129";"129";"BLOCK_GEM_EMERALD";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"OGEM";"1";"0";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"GEM,NATURAL" +#"130";"130";"130";"BLOCK_GEM_SAPPHIRE";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"OGEM";"1";"0";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"GEM,NATURAL" +#"131";"131";"131";"BLOCK_GEM_TOPAZ";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"OGEM";"1";"0";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"GEM,NATURAL" +#"132";"132";"132";"BLOCK_GEM_DIAMOND";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"OGEM";"1";"0";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"GEM,NATURAL" +#"133";"133";"133";"BLOCK_GEM_AMETHYST";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"OGEM";"1";"0";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"GEM,NATURAL" +#"134";"134";"134";"BLOCK_GEM_QUARTZ";"0.1252";"0.1252";"0.1252";"0.1252";"48";"2400";"OGEM";"1";"0";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"GEM,NATURAL" "144";"144";"144";"BLOCK_SNOW";"0.1252";"0.1252";"0.1252";"0.1252";"24";"500";"SNOW";"1";"1";"N/A";"0";"4";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"SNOW,NATURAL,COLD" "145";"N/A";"N/A";"BLOCK_ICE_FRAGILE";"0.0508";"0.0508";"0.0508";"0.0508";"5";"930";"ICEI";"1";"0";"N/A";"0";"0";"4";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"ICE,NATURAL,FRAGILE,COLD" -"146";"146";"146";"BLOCK_ICE_NATURAL";"0.1016";"0.1016";"0.1016";"0.1016";"35";"930";"ICEI";"1";"1";"N/A";"0";"0";"4";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"ICE,NATURAL,COLD" -"147";"147";"147";"BLOCK_ICE_CLEAR_MAGICAL";"0.1252";"0.1252";"0.1252";"0.1252";"48";"3720";"ICEX";"1";"1";"N/A";"0";"0";"4";"0.0744";"0.1252";"0.2268";"0.0000";"N/A";"N/A";"0.0";"ICE,COLD" +#"146";"146";"146";"BLOCK_ICE_NATURAL";"0.1016";"0.1016";"0.1016";"0.1016";"35";"930";"ICEI";"1";"1";"N/A";"0";"0";"4";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"ICE,NATURAL,COLD" +#"147";"147";"147";"BLOCK_ICE_CLEAR_MAGICAL";"0.1252";"0.1252";"0.1252";"0.1252";"48";"3720";"ICEX";"1";"1";"N/A";"0";"0";"4";"0.0744";"0.1252";"0.2268";"0.0000";"N/A";"N/A";"0.0";"ICE,COLD" "148";"148";"148";"BLOCK_GLASS_CRUDE";"0.0876";"0.0424";"0.0876";"0.1252";"5";"2500";"GLAS";"1";"1";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"GLASS" "149";"149";"149";"BLOCK_GLASS_CLEAN";"0.0424";"0.0424";"0.0424";"0.0636";"5";"2203";"GLAS";"1";"1";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"GLASS" "160";"160";"160";"BLOCK_PLATFORM_STONE";"0.0312";"0.0312";"0.0312";"0.0312";"5";"2400";"ROCK";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"PLATFORM" @@ -57,9 +57,9 @@ "163";"163";"163";"BLOCK_PLATFORM_BIRCH";"0.0312";"0.0312";"0.0312";"0.0312";"5";"670";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"PLATFORM" "164";"164";"164";"BLOCK_PLATFORM_ROSEWOOD";"0.0312";"0.0312";"0.0312";"0.0312";"5";"900";"WOOD";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"PLATFORM" "176";"176";"176";"BLOCK_TORCH";"0.0312";"0.0312";"0.0312";"0.0312";"1";"800";"FXTR";"0";"0";"N/A";"1";"0";"16";"1.0000";"0.6372";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LIGHT" -"177";"177";"177";"BLOCK_TORCH_FROST";"0.0312";"0.0312";"0.0312";"0.0312";"1";"1100";"FXTR";"0";"0";"N/A";"1";"0";"16";"0.3048";"0.4848";"1.0000";"0.0000";"N/A";"N/A";"0.0";"LIGHT" +#"177";"177";"177";"BLOCK_TORCH_FROST";"0.0312";"0.0312";"0.0312";"0.0312";"1";"1100";"FXTR";"0";"0";"N/A";"1";"0";"16";"0.3048";"0.4848";"1.0000";"0.0000";"N/A";"N/A";"0.0";"LIGHT" "192";"176";"176";"BLOCK_TORCH";"0.0312";"0.0312";"0.0312";"0.0312";"1";"800";"FXTR";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LIGHT,UNLIT,INTERNAL" -"193";"177";"177";"BLOCK_TORCH_FROST";"0.0312";"0.0312";"0.0312";"0.0312";"1";"1100";"FXTR";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LIGHT,UNLIT,INTERNAL" +#"193";"177";"177";"BLOCK_TORCH_FROST";"0.0312";"0.0312";"0.0312";"0.0312";"1";"1100";"FXTR";"0";"0";"N/A";"0";"0";"16";"0.0000";"0.0000";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LIGHT,UNLIT,INTERNAL" "208";"208";"208";"BLOCK_ILLUMINATOR_WHITE";"0.0312";"0.0312";"0.0312";"0.0312";"1";"2500";"GLAS";"1";"1";"N/A";"0";"0";"16";"0.9270";"0.9414";"0.8519";"0.0000";"N/A";"N/A";"0.0";"LIGHT" "209";"209";"209";"BLOCK_ILLUMINATOR_YELLOW";"0.0312";"0.0312";"0.0312";"0.0312";"1";"2500";"GLAS";"1";"1";"N/A";"0";"0";"16";"1.0000";"0.8408";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LIGHT" "210";"210";"210";"BLOCK_ILLUMINATOR_ORANGE";"0.0312";"0.0312";"0.0312";"0.0312";"1";"2500";"GLAS";"1";"1";"N/A";"0";"0";"16";"1.0000";"0.5294";"0.0000";"0.0000";"N/A";"N/A";"0.0";"LIGHT" diff --git a/src/net/torvald/terrarum/gameworld/BlockLayer.kt b/src/net/torvald/terrarum/gameworld/BlockLayer.kt index 888518e61..e044d9710 100644 --- a/src/net/torvald/terrarum/gameworld/BlockLayer.kt +++ b/src/net/torvald/terrarum/gameworld/BlockLayer.kt @@ -10,5 +10,6 @@ interface BlockLayer : Disposable { val bytesPerBlock: Long fun unsafeToBytes(x: Int, y: Int): ByteArray fun unsafeSetTile(x: Int, y: Int, bytes: ByteArray) + fun unsafeGetTile(x: Int, y: Int): Int } \ No newline at end of file diff --git a/src/net/torvald/terrarum/gameworld/BlockLayerI16.kt b/src/net/torvald/terrarum/gameworld/BlockLayerI16.kt index e5fb97bd9..5fa644dee 100644 --- a/src/net/torvald/terrarum/gameworld/BlockLayerI16.kt +++ b/src/net/torvald/terrarum/gameworld/BlockLayerI16.kt @@ -59,7 +59,7 @@ open class BlockLayerI16(val width: Int, val height: Int) : BlockLayer { } } - internal fun unsafeGetTile(x: Int, y: Int): Int { + override fun unsafeGetTile(x: Int, y: Int): Int { val offset = BYTES_PER_BLOCK * (y * width + x) val lsb = ptr[offset] val msb = ptr[offset + 1] diff --git a/src/net/torvald/terrarum/gameworld/BlockLayerI16F16.kt b/src/net/torvald/terrarum/gameworld/BlockLayerI16F16.kt index 07f2dc120..75722209b 100644 --- a/src/net/torvald/terrarum/gameworld/BlockLayerI16F16.kt +++ b/src/net/torvald/terrarum/gameworld/BlockLayerI16F16.kt @@ -1,7 +1,6 @@ package net.torvald.terrarum.gameworld import net.torvald.terrarum.App -import net.torvald.terrarum.blockproperties.Fluid import net.torvald.terrarum.gameworld.WorldSimulator.FLUID_MIN_MASS import net.torvald.terrarum.serialise.toUint import net.torvald.unsafe.UnsafeHelper @@ -58,7 +57,17 @@ class BlockLayerI16F16(val width: Int, val height: Int) : BlockLayer { } } - internal fun unsafeGetTile(x: Int, y: Int): Pair { + override fun unsafeGetTile(x: Int, y: Int): Int { + val offset = BYTES_PER_BLOCK * (y * width + x) + val lsb = ptr[offset] + val msb = ptr[offset + 1] + val hbits = (ptr[offset + 2].toUint() or ptr[offset + 3].toUint().shl(8)).toShort() + val fill = Float16.toFloat(hbits) + + return lsb.toUint() + msb.toUint().shl(8) + } + + internal fun unsafeGetTile1(x: Int, y: Int): Pair { val offset = BYTES_PER_BLOCK * (y * width + x) val lsb = ptr[offset] val msb = ptr[offset + 1] diff --git a/src/net/torvald/terrarum/gameworld/BlockLayerI16I8.kt b/src/net/torvald/terrarum/gameworld/BlockLayerI16I8.kt index 5362d4173..c8271f17b 100644 --- a/src/net/torvald/terrarum/gameworld/BlockLayerI16I8.kt +++ b/src/net/torvald/terrarum/gameworld/BlockLayerI16I8.kt @@ -1,6 +1,5 @@ package net.torvald.terrarum.gameworld -import com.badlogic.gdx.utils.Disposable import net.torvald.terrarum.App import net.torvald.terrarum.serialise.toUint import net.torvald.unsafe.UnsafeHelper @@ -55,7 +54,16 @@ class BlockLayerI16I8 (val width: Int, val height: Int) : BlockLayer { } } - internal fun unsafeGetTile(x: Int, y: Int): Pair { + override fun unsafeGetTile(x: Int, y: Int): Int { + val offset = BYTES_PER_BLOCK * (y * width + x) + val lsb = ptr[offset] + val msb = ptr[offset + 1] + val placement = ptr[offset + 2] + + return lsb.toUint() + msb.toUint().shl(8) + } + + internal fun unsafeGetTile1(x: Int, y: Int): Pair { val offset = BYTES_PER_BLOCK * (y * width + x) val lsb = ptr[offset] val msb = ptr[offset + 1] @@ -94,6 +102,16 @@ class BlockLayerI16I8 (val width: Int, val height: Int) : BlockLayer { ptr[offset + 2] = bytes[2] } + internal fun unsafeSetTileKeepPlacement(x: Int, y: Int, tile: Int) { + val offset = BYTES_PER_BLOCK * (y * width + x) + + val lsb = tile.and(0xff).toByte() + val msb = tile.ushr(8).and(0xff).toByte() + + ptr[offset] = lsb + ptr[offset + 1] = msb + } + /** * @param blockOffset Offset in blocks. BlockOffset of 0x100 is equal to ```layerPtr + 0x200``` */ diff --git a/src/net/torvald/terrarum/gameworld/GameWorld.kt b/src/net/torvald/terrarum/gameworld/GameWorld.kt index 83a96657d..38b3aa33e 100644 --- a/src/net/torvald/terrarum/gameworld/GameWorld.kt +++ b/src/net/torvald/terrarum/gameworld/GameWorld.kt @@ -10,7 +10,6 @@ import net.torvald.terrarum.blockproperties.Fluid import net.torvald.terrarum.gameactors.ActorID import net.torvald.terrarum.gameitems.ItemID import net.torvald.terrarum.gameitems.isFluid -import net.torvald.terrarum.gameitems.isOre import net.torvald.terrarum.itemproperties.ItemRemapTable import net.torvald.terrarum.itemproperties.ItemTable import net.torvald.terrarum.modulebasegame.gameactors.IngamePlayer @@ -18,6 +17,7 @@ import net.torvald.terrarum.realestate.LandUtil import net.torvald.terrarum.utils.* import net.torvald.terrarum.weather.WeatherMixer import net.torvald.terrarum.weather.Weatherbox +import net.torvald.terrarum.worlddrawer.BlocksDrawer import net.torvald.util.SortedArrayList import org.dyn4j.geometry.Vector2 import java.util.* @@ -235,7 +235,7 @@ open class GameWorld( if (App.tileMaker != null) { App.tileMaker.tags.forEach { if (!forcedTileNumberToNames.contains(it.key)) { - printdbg(this, "tileNumber ${it.value.tileNumber} <-> tileName ${it.key}") + printdbg(this, "newworld tileNumber ${it.value.tileNumber} <-> tileName ${it.key}") tileNumberToNameMap[it.value.tileNumber.toLong()] = it.key tileNameToNumberMap[it.key] = it.value.tileNumber @@ -253,6 +253,8 @@ open class GameWorld( tileNumberToNameMap.clear() tileNameToNumberMap.clear() App.tileMaker.tags.forEach { + printdbg(this, "afterload tileNumber ${it.value.tileNumber} <-> tileName ${it.key}") + tileNumberToNameMap[it.value.tileNumber.toLong()] = it.key tileNameToNumberMap[it.key] = it.value.tileNumber } @@ -262,6 +264,7 @@ open class GameWorld( for (x in 0 until layerTerrain.width) { layerTerrain.unsafeSetTile(x, y, tileNameToNumberMap[oldTileNumberToNameMap[layerTerrain.unsafeGetTile(x, y).toLong()]]!!) layerWall.unsafeSetTile(x, y, tileNameToNumberMap[oldTileNumberToNameMap[layerWall.unsafeGetTile(x, y).toLong()]]!!) + layerOres.unsafeSetTileKeepPlacement(x, y, tileNameToNumberMap[oldTileNumberToNameMap[layerOres.unsafeGetTile(x, y).toLong()]]!!) } } @@ -272,6 +275,9 @@ open class GameWorld( tileNameToNumberMap[Block.UPDATE] = 2 fluidNumberToNameMap[0] = Fluid.NULL fluidNameToNumberMap[Fluid.NULL] = 0 + + + BlocksDrawer.rebuildInternalPrecalculations() } /** @@ -559,7 +565,7 @@ open class GameWorld( fun getTileFromOre(rawX: Int, rawY: Int): OrePlacement { val (x, y) = coerceXY(rawX, rawY) - val (tileNum, placement) = layerOres.unsafeGetTile(x, y) + val (tileNum, placement) = layerOres.unsafeGetTile1(x, y) val tileName = tileNumberToNameMap[tileNum.toLong()] return OrePlacement(tileName ?: Block.UPDATE, placement) } @@ -709,7 +715,7 @@ open class GameWorld( fun getFluid(x: Int, y: Int): FluidInfo { val (x, y) = coerceXY(x, y) - val (type, fill) = layerFluids.unsafeGetTile(x, y) + val (type, fill) = layerFluids.unsafeGetTile1(x, y) val fluidID = fluidNumberToNameMap[type.toLong()] ?: throw NullPointerException("No such fluid: $type") return FluidInfo(fluidID, fill) diff --git a/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt b/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt index f662a41a7..1d5bf269f 100644 --- a/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt +++ b/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt @@ -175,6 +175,7 @@ class TitleScreen(batch: FlippingSpriteBatch) : IngameInstance(batch) { printdbg(this, "Demo world not found, using empty world") } + demoWorld.renumberTilesAfterLoad() this.world = demoWorld // set initial time to summer diff --git a/src/net/torvald/terrarum/serialise/ReadSimpleWorld.kt b/src/net/torvald/terrarum/serialise/ReadSimpleWorld.kt index 0536549aa..9b47432a0 100644 --- a/src/net/torvald/terrarum/serialise/ReadSimpleWorld.kt +++ b/src/net/torvald/terrarum/serialise/ReadSimpleWorld.kt @@ -5,6 +5,7 @@ import net.torvald.terrarum.IngameInstance import net.torvald.terrarum.ItemCodex import net.torvald.terrarum.gameactors.Actor import net.torvald.terrarum.gameworld.BlockLayerI16F16 +import net.torvald.terrarum.gameworld.BlockLayerI16I8 import net.torvald.terrarum.gameworld.GameWorld import net.torvald.terrarum.gameworld.SimpleGameWorld import java.io.File @@ -24,6 +25,7 @@ object ReadSimpleWorld { world.tileNumberToNameMap.forEach { l, s -> world.tileNameToNumberMap[s] = l.toInt() } + world.layerOres = BlockLayerI16I8(world.width, world.height) world.layerFluids = BlockLayerI16F16(world.width, world.height) ItemCodex.loadFromSave(origin, world.dynamicToStaticTable, world.dynamicItemInventory) diff --git a/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt b/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt index 8d4a6f289..daa7ea8ef 100644 --- a/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt +++ b/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt @@ -64,6 +64,7 @@ class BasicDebugInfoWindow : UICanvas() { private val MASS = 0xD5.toChar() private val SOL = 0xD6.toChar() private val TAU = 0xD7.toChar() + private val ROCK=0xD8.toChar() private val HEIGHT = 0xC7.toChar() private val WIDTH = 0xCD.toChar() @@ -255,7 +256,7 @@ class BasicDebugInfoWindow : UICanvas() { App.fontSmallNumbers.draw(batch, "$ccO$TERRAIN$ccG$tileNum", gap + 7f*(tileCursX + 3), line(tileCursY)) App.fontSmallNumbers.draw(batch, "$ccO$WALL$ccG$wallNum", gap + 7f*(tileCursX + 3), line(tileCursY + 1)) // App.fontSmallNumbers.draw(batch, "$ccO$LIQUID$ccG${fluid.type.padEnd(3)}$ccO$BEAKER$ccG${fluid.amount.toIntAndFrac(2)}", gap + 7f*(tileCursX + 3), line(tileCursY + 2)) - App.fontSmallNumbers.draw(batch, "$ccO$LIQUID$ccG$oreNum", gap + 7f*(tileCursX + 3), line(tileCursY + 2)) + App.fontSmallNumbers.draw(batch, "$ccO$ROCK$ccG$oreNum", gap + 7f*(tileCursX + 3), line(tileCursY + 2)) App.fontSmallNumbers.draw(batch, "$ccO$WIRE$ccG$wireCount ${ccY}X$ccO$mouseTileX ${ccY}Y$ccO$mouseTileY", gap + 7f*(tileCursX + 3), line(tileCursY + 3)) App.fontSmallNumbers.draw(batch, "$ccR$rawR $ccG$rawG $ccB$rawB $ccW$rawA", gap + 7f*(tileCursX + 3), line(tileCursY + 4)) diff --git a/src/net/torvald/terrarum/worlddrawer/BlocksDrawer.kt b/src/net/torvald/terrarum/worlddrawer/BlocksDrawer.kt index a6bbbdf57..57218c710 100644 --- a/src/net/torvald/terrarum/worlddrawer/BlocksDrawer.kt +++ b/src/net/torvald/terrarum/worlddrawer/BlocksDrawer.kt @@ -14,8 +14,6 @@ import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.gamecontroller.KeyToggler import net.torvald.terrarum.gameitems.ItemID import net.torvald.terrarum.gameworld.GameWorld -import net.torvald.terrarum.gameworld.WorldSimulator -import net.torvald.terrarum.gameworld.WorldTime import net.torvald.terrarum.gameworld.fmod import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack import kotlin.math.roundToInt @@ -85,12 +83,12 @@ internal object BlocksDrawer { private lateinit var terrainTilesBuffer: Array private lateinit var wallTilesBuffer: Array + private lateinit var oreTilesBuffer: Array //private lateinit var wireTilesBuffer: Array private lateinit var fluidTilesBuffer: Array private lateinit var occlusionBuffer: Array private var tilesBuffer: Pixmap = Pixmap(1, 1, Pixmap.Format.RGBA8888) - private lateinit var tilesQuad: Mesh private val shader = App.loadShaderFromClasspath("shaders/default.vert", "shaders/tiling.frag") @@ -207,6 +205,7 @@ internal object BlocksDrawer { measureDebugTime("Renderer.Tiling") { drawTiles(WALL) drawTiles(TERRAIN) // regular tiles + drawTiles(ORES) drawTiles(FLUID) drawTiles(OCCLUSION) //drawTiles(WIRE) @@ -226,6 +225,7 @@ internal object BlocksDrawer { gdxBlendNormalStraightAlpha() renderUsingBuffer(TERRAIN, projectionMatrix, drawGlow) + renderUsingBuffer(ORES, projectionMatrix, drawGlow) renderUsingBuffer(FLUID, projectionMatrix, drawGlow) } @@ -259,6 +259,43 @@ internal object BlocksDrawer { OCCLUSION_TILE_NUM_BASE, CreateTileAtlas.RenderTag.CONNECT_SELF, CreateTileAtlas.RenderTag.MASK_47 ) + private lateinit var renderOnF3Only: Array + private lateinit var platformTiles: Array + private lateinit var wallStickerTiles: Array + private lateinit var connectMutualTiles: Array + private lateinit var connectSelfTiles: Array + + internal fun rebuildInternalPrecalculations() { + if (App.IS_DEVELOPMENT_BUILD) { + printdbg(this, "Current TileName to Number map:") + world.tileNameToNumberMap.forEach { id, num -> + println("$id -> $num") + } + println("================================") + } + + + renderOnF3Only = BlockCodex.blockProps.filter { (id, prop) -> + prop.isActorBlock && !prop.hasTag("DORENDER") && !id.startsWith("virt:") && id != Block.NULL + }.map { world.tileNameToNumberMap[it.key] ?: throw NullPointerException("No tilenumber for ${it.key} exists") }.sorted().toTypedArray() + + platformTiles = BlockCodex.blockProps.filter { (id, prop) -> + isPlatform(id) && !id.startsWith("virt:") && id != Block.NULL + }.map { world.tileNameToNumberMap[it.key] ?: throw NullPointerException("No tilenumber for ${it.key} exists") }.sorted().toTypedArray() + + wallStickerTiles = BlockCodex.blockProps.filter { (id, prop) -> + isWallSticker(id) && !id.startsWith("virt:") && id != Block.NULL + }.map { world.tileNameToNumberMap[it.key] ?: throw NullPointerException("No tilenumber for ${it.key} exists") }.sorted().toTypedArray() + + connectMutualTiles = BlockCodex.blockProps.filter { (id, prop) -> + isConnectMutual(id) && !id.startsWith("virt:") && id != Block.NULL + }.map { world.tileNameToNumberMap[it.key] ?: throw NullPointerException("No tilenumber for ${it.key} exists") }.sorted().toTypedArray() + + connectSelfTiles = BlockCodex.blockProps.filter { (id, prop) -> + isConnectSelf(id) && !id.startsWith("virt:") && id != Block.NULL + }.map { world.tileNameToNumberMap[it.key] ?: throw NullPointerException("No tilenumber for ${it.key} exists") }.sorted().toTypedArray() + } + /** * Autotiling; writes to buffer. Actual draw code must be called after this operation. * @@ -293,12 +330,14 @@ internal object BlocksDrawer { val bufferX = x - for_x_start val bufferY = y - for_y_start - val thisTile: ItemID = when (mode) { - WALL -> world.getTileFromWall(x, y) - TERRAIN -> world.getTileFromTerrain(x, y) - ORES -> world.getTileFromOre(x, y).item - FLUID -> "basegame:-1" // TODO need new wire storing format //world.getFluid(x, y).type.abs() - OCCLUSION -> "placeholder_occlusion" + val (wx, wy) = world.coerceXY(x, y) + + val thisTile: Int = when (mode) { + WALL -> world.layerWall.unsafeGetTile(wx, wy) + TERRAIN -> world.layerTerrain.unsafeGetTile(wx, wy) + ORES -> world.layerOres.unsafeGetTile(wx, wy)//.also { println(it) } + FLUID -> 0 // TODO need new wire storing format //world.getFluid(x, y).type.abs() + OCCLUSION -> 0 else -> throw IllegalArgumentException() } @@ -307,19 +346,22 @@ internal object BlocksDrawer { val nearbyTilesInfo = if (mode == OCCLUSION) { getNearbyTilesInfoFakeOcc(x, y) } + else if (mode == ORES) { + 0 + } /*else if (mode == FLUID) { getNearbyTilesInfoFluids(x, y) }*/ - else if (isPlatform(thisTile)) { + else if (platformTiles.binarySearch(thisTile) >= 0) { getNearbyTilesInfoPlatform(x, y) } - else if (isWallSticker(thisTile)) { + else if (wallStickerTiles.binarySearch(thisTile) >= 0) { getNearbyTilesInfoWallSticker(x, y) } - else if (isConnectMutual(thisTile)) { + else if (connectMutualTiles.binarySearch(thisTile) >= 0) { getNearbyTilesInfoConMutual(x, y, mode) } - else if (isConnectSelf(thisTile)) { + else if (connectSelfTiles.binarySearch(thisTile) >= 0) { getNearbyTilesInfoConSelf(x, y, mode, thisTile) } else { @@ -332,17 +374,16 @@ internal object BlocksDrawer { // App.tileMaker.fluidToTileNumber(world.getFluid(x, y)) // else renderTag.tileNumber - var tileNumber = if (thisTile == Block.AIR) 0 + var tileNumber = if (thisTile == 0) 0 // special case: actorblocks and F3 key - else if (BlockCodex.hasProp(thisTile) && BlockCodex[thisTile].isActorBlock && - !BlockCodex[thisTile].hasTag("DORENDER") && !KeyToggler.isOn(Keys.F3)) + else if (renderOnF3Only.binarySearch(thisTile) >= 0 && !KeyToggler.isOn(Keys.F3)) 0 // special case: fluids else if (mode == FLUID) tileNumberBase + connectLut47[nearbyTilesInfo] // special case: ores else if (mode == ORES) - tileNumberBase + world.getTileFromOre(x, y).tilePlacement + tileNumberBase + world.layerOres.unsafeGetTile1(wx, wy).second // rest of the cases: terrain and walls else tileNumberBase + when (renderTag.maskType) { CreateTileAtlas.RenderTag.MASK_NA -> 0 @@ -401,6 +442,27 @@ internal object BlocksDrawer { return ret } + private fun getNearbyTilesInfoConSelf(x: Int, y: Int, mode: Int, mark: Int): Int { + val layer = when (mode) { + TERRAIN -> world.layerTerrain + WALL -> world.layerWall + ORES -> world.layerOres + FLUID -> world.layerFluids + else -> throw IllegalArgumentException() + } + + val nearbyTiles = getNearbyTilesPos(x, y).map { layer.unsafeGetTile(x, y) } + + var ret = 0 + for (i in nearbyTiles.indices) { + if (nearbyTiles[i] == mark) { + ret += (1 shl i) // add 1, 2, 4, 8 for i = 0, 1, 2, 3 + } + } + + return ret + } + private fun getNearbyTilesInfoFakeOcc(x: Int, y: Int): Int { val eligible = BlockCodex[world.getTileFromWall(x, y)].isSolidForTileCnx && !BlockCodex[world.getTileFromTerrain(x, y)].isSolidForTileCnx val nearbyTiles = getNearbyTilesPos(x, y).map { @@ -544,6 +606,7 @@ internal object BlocksDrawer { val sourceBuffer = when(mode) { TERRAIN -> terrainTilesBuffer WALL -> wallTilesBuffer + ORES -> oreTilesBuffer //WIRE -> wireTilesBuffer FLUID -> fluidTilesBuffer OCCLUSION -> occlusionBuffer @@ -567,7 +630,7 @@ internal object BlocksDrawer { val tileAtlas = when (mode) { - TERRAIN, WALL, OCCLUSION -> tilesTerrain + TERRAIN, ORES, WALL, OCCLUSION -> tilesTerrain //WIRE -> tilesWire FLUID -> tilesFluid else -> throw IllegalArgumentException() @@ -575,13 +638,14 @@ internal object BlocksDrawer { val sourceBuffer = when(mode) { TERRAIN -> terrainTilesBuffer WALL -> wallTilesBuffer + ORES -> oreTilesBuffer //WIRE -> wireTilesBuffer FLUID -> fluidTilesBuffer OCCLUSION -> occlusionBuffer else -> throw IllegalArgumentException() } val vertexColour = when (mode) { - TERRAIN, /*WIRE,*/ FLUID, OCCLUSION -> Color.WHITE + TERRAIN, /*WIRE,*/ ORES, FLUID, OCCLUSION -> Color.WHITE WALL -> App.tileMaker.wallOverlayColour else -> throw IllegalArgumentException() } @@ -659,6 +723,7 @@ internal object BlocksDrawer { if (oldTH != tilesInHorizontal || oldTV != tilesInVertical) { terrainTilesBuffer = Array(tilesInVertical) { IntArray(tilesInHorizontal) } wallTilesBuffer = Array(tilesInVertical) { IntArray(tilesInHorizontal) } + oreTilesBuffer = Array(tilesInVertical) { IntArray(tilesInHorizontal) } fluidTilesBuffer = Array(tilesInVertical) { IntArray(tilesInHorizontal) } occlusionBuffer = Array(tilesInVertical) { IntArray(tilesInHorizontal) } diff --git a/src/net/torvald/terrarum/worlddrawer/CreateTileAtlas.kt b/src/net/torvald/terrarum/worlddrawer/CreateTileAtlas.kt index 34d09d851..1d7d9d47e 100644 --- a/src/net/torvald/terrarum/worlddrawer/CreateTileAtlas.kt +++ b/src/net/torvald/terrarum/worlddrawer/CreateTileAtlas.kt @@ -14,6 +14,7 @@ import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.blockproperties.Fluid import net.torvald.terrarum.gameitems.ItemID import net.torvald.terrarum.gameworld.GameWorld +import net.torvald.terrarum.utils.HashArray import net.torvald.terrarum.worlddrawer.CreateTileAtlas.AtlasSource.* import kotlin.math.roundToInt import kotlin.math.sqrt @@ -54,6 +55,7 @@ class CreateTileAtlas { lateinit var terrainTileColourMap: HashMap lateinit var tags: HashMap // TileID, RenderTag private set + lateinit var tagsByTileNum: HashArray; private set lateinit var itemSheetNumbers: HashMap // TileID, Int private set private val defaultRenderTag = RenderTag(3, RenderTag.CONNECT_SELF, RenderTag.MASK_NA) // 'update' block @@ -129,6 +131,7 @@ class CreateTileAtlas { operator fun invoke(updateExisting: Boolean = false) { if (updateExisting || !initialised) { tags = HashMap() + tagsByTileNum = HashArray() itemSheetNumbers = HashMap() atlasPrevernal = Pixmap(TILES_IN_X * TILE_SIZE, TILES_IN_X * TILE_SIZE, Pixmap.Format.RGBA8888).also { it.blending = Pixmap.Blending.None } @@ -296,6 +299,11 @@ class CreateTileAtlas { return tags.getOrDefault(blockID, defaultRenderTag) } + fun getRenderTag(tilenum: Int): RenderTag { + return tagsByTileNum.getOrDefault(tilenum.toLong(), defaultRenderTag) + } + + val nullTile = Pixmap(TILE_SIZE * 16, TILE_SIZE * 16, Pixmap.Format.RGBA8888) private fun fileToAtlantes(modname: String, matte: FileHandle, glow: FileHandle?, mode: String?) { @@ -370,6 +378,7 @@ class CreateTileAtlas { } tags[id] = RenderTag(atlasCursor, connectionType, maskType) + tagsByTileNum[atlasCursor.toLong()] = RenderTag(atlasCursor, connectionType, maskType) printdbg(this, "tileName ${id} ->> tileNumber ${atlasCursor}") } diff --git a/src/shaders/tiling.frag b/src/shaders/tiling.frag index 52ecb52b2..7bf333992 100644 --- a/src/shaders/tiling.frag +++ b/src/shaders/tiling.frag @@ -53,10 +53,10 @@ int _colToInt(vec4 color) { return int(color.b * 255) | (int(color.g * 255) << 8) | (int(color.r * 255) << 16) | (int(color.a * 255) << 24); } -// 0x0rggbb where int=0xaarrggbb -// return: [0..1048575] +// 0x00ggbb where int=0xaarrggbb +// return: [0..65535] int getTileFromColor(vec4 color) { - return _colToInt(color) & 0xFFFFF; + return _colToInt(color) & 0xFFFF; } // 0x00r00000 where int=0xaarrggbb