diff --git a/Cargo.lock b/Cargo.lock index eb393e60..9967ed9f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -18,6 +18,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a13739d7177fbd22bb0ed28badfff9f372f8bef46c863db4e1c6248f6b223b6e" +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "adler32" version = "1.2.0" @@ -53,7 +59,7 @@ dependencies = [ "alsa-sys", "bitflags", "libc", - "nix", + "nix 0.23.1", ] [[package]] @@ -84,6 +90,15 @@ dependencies = [ "log", ] +[[package]] +name = "android_system_properties" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7ed72e1635e121ca3e79420540282af22da58be50de153d36f81ddc6b83aa9e" +dependencies = [ + "libc", +] + [[package]] name = "ansi_term" version = "0.12.1" @@ -116,9 +131,9 @@ checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" [[package]] name = "ash" -version = "0.34.0+1.2.203" +version = "0.37.0+1.3.209" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0f780da53d0063880d45554306489f09dd8d1bda47688b4a57bc579119356df" +checksum = "006ca68e0f2b03f22d6fa9f2860f85aed430d257fec20f8879b2145e7c7ae1a6" dependencies = [ "libloading", ] @@ -160,12 +175,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" -[[package]] -name = "base-x" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc19a4937b4fbd3fe3379793130e42060d10627a360f2127802b10b87e7baf74" - [[package]] name = "base64" version = "0.13.0" @@ -174,30 +183,18 @@ checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" [[package]] name = "bevy" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fce306d40a111309ee61d4626efbafccdd46bb80657122c38061fa7264c08e4" +checksum = "55f08528a4e59d607460513a823b40f602d013c1a00f57b824f1075d5d48c3cd" dependencies = [ "bevy_internal", ] -[[package]] -name = "bevy-crevice-derive" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "191a752a01c3402deb24320acf42288bf822e5d22f19ae1d903797f02e9b0c33" -dependencies = [ - "bevy_macro_utils", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "bevy_animation" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c087569c34b168dd988e8b3409ce273661b4a58c3c534d0e381950589f59f68e" +checksum = "e243169af495ad616ff701247c0d3e40078a26ed8de231cf9e54bde6b3c4bb45" dependencies = [ "bevy_app", "bevy_asset", @@ -206,19 +203,21 @@ dependencies = [ "bevy_hierarchy", "bevy_math", "bevy_reflect", + "bevy_time", "bevy_transform", "bevy_utils", ] [[package]] name = "bevy_app" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32660ae99fa3498ca379de28b7e2f447e6531b0e432bf200901efeec075553c1" +checksum = "53d26d6ffdf493609d2fedc1018a2ef0cb4d8e48f6d3bcea56fa2df81867e464" dependencies = [ "bevy_derive", "bevy_ecs", "bevy_reflect", + "bevy_tasks", "bevy_utils", "wasm-bindgen", "web-sys", @@ -226,9 +225,9 @@ dependencies = [ [[package]] name = "bevy_asset" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2afd395240087924ba49c8cae2b00d007aeb1db53ee726a543b1e90dce2d3ab" +checksum = "3d8fb95306d5f18fa70df40632cd984993aeb71e91ce059ae99699098a4f9ce9" dependencies = [ "anyhow", "bevy_app", @@ -240,11 +239,11 @@ dependencies = [ "bevy_utils", "crossbeam-channel", "downcast-rs", + "fastrand", "js-sys", "ndk-glue 0.5.2", "notify", - "parking_lot", - "rand", + "parking_lot 0.12.1", "serde", "thiserror", "wasm-bindgen", @@ -254,9 +253,9 @@ dependencies = [ [[package]] name = "bevy_audio" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73a1c827ae837b62868539040176fb6d4daecf24983b98a0284d158e52cd21d5" +checksum = "eee08ac575397ce17477dd291862bafa15226334bdfb82c02bbc3d10bad7bdb8" dependencies = [ "anyhow", "bevy_app", @@ -264,18 +263,17 @@ dependencies = [ "bevy_ecs", "bevy_reflect", "bevy_utils", - "parking_lot", + "parking_lot 0.12.1", "rodio", ] [[package]] name = "bevy_core" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12c0f8614b6014671ab60bacb8bf681373d08b0bb15633b8ef72b895cf966d29" +checksum = "c6712146d54fff9e1865362e9f39a7b63c7b037ddb72a3d7bb05b959213fb61e" dependencies = [ "bevy_app", - "bevy_derive", "bevy_ecs", "bevy_math", "bevy_reflect", @@ -286,35 +284,27 @@ dependencies = [ [[package]] name = "bevy_core_pipeline" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74d570bc9310196190910a5b1ffd8c8c35bd6b73f918d0651ae3c3d4e57be9a7" +checksum = "080bb00399b6d7697e505f871d67c6de8b52eb06b47b0cda2be80c2396805983" dependencies = [ "bevy_app", "bevy_asset", - "bevy_core", + "bevy_derive", "bevy_ecs", + "bevy_reflect", "bevy_render", + "bevy_transform", "bevy_utils", -] - -[[package]] -name = "bevy_crevice" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da0a284fb26c02cb96ef4d5bbf4de5fad7e1a901730035a61813bf64e28482e" -dependencies = [ - "bevy-crevice-derive", - "bytemuck", - "glam", - "mint", + "radsort", + "serde", ] [[package]] name = "bevy_derive" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6abddf2ed415f31d28a9bf9ab3c0bc857e98a722858d38dba65bdda481f8d714" +checksum = "a4b8f0786d1fc7e0d35297917be463db3d0886f7bd8d4221ca3d565502579ffb" dependencies = [ "bevy_macro_utils", "quote", @@ -323,25 +313,26 @@ dependencies = [ [[package]] name = "bevy_diagnostic" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ebf72ea058cfc379756e9da7de6861174e1860504f41e3e5a46d5b1c35d6644" +checksum = "adab74ee5375fbf5d2b1d3da41de8d1491a8a706d17441b5e31214b65349d692" dependencies = [ "bevy_app", - "bevy_core", "bevy_ecs", "bevy_log", + "bevy_time", "bevy_utils", ] [[package]] name = "bevy_ecs" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79e67dd06b14e787d2026fe6e2b63f67482afcc62284f20ea2784d8b0662e95f" +checksum = "a5643dc27b7d6778e3a66c8e0f6ad1fd33309aa2fa61d935f360ccc85b7be6a2" dependencies = [ "async-channel", "bevy_ecs_macros", + "bevy_ptr", "bevy_reflect", "bevy_tasks", "bevy_utils", @@ -349,7 +340,7 @@ dependencies = [ "fixedbitset", "fxhash", "serde", - "thiserror", + "thread_local", ] [[package]] @@ -380,9 +371,9 @@ dependencies = [ [[package]] name = "bevy_ecs_macros" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718923a491490bd81074492d61fc08134f9c62a29ba8666818cd7a6630421246" +checksum = "a5f2f12677f8725d40930d0a19652f007fe0ef5ac38e23817cfc4930c61f5680" dependencies = [ "bevy_macro_utils", "proc-macro2", @@ -392,21 +383,30 @@ dependencies = [ [[package]] name = "bevy_ecs_tilemap" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c68fefad7aa09f9833d198c0fd1d9ebe58bf9ab3abf91cf912e4f5585227fb82" +checksum = "5ef56c77808aa1fc7379ce538bd9a1e4048794203b4f591f2d06131fc613a1cc" dependencies = [ "bevy", - "bytemuck", "log", "regex", ] +[[package]] +name = "bevy_encase_derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a767adc36ce1fc917a736843b026d4de7069d90ed5e669c852481ef69fd5aa" +dependencies = [ + "bevy_macro_utils", + "encase_derive_impl", +] + [[package]] name = "bevy_gilrs" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15b164983e8057a1a730412a7c26ccc540d9ce76d2c6ab68edd258a0baeb1762" +checksum = "963940426127533164af2a556971a03c493143c0afb95afadb4a070b6ab8c3df" dependencies = [ "bevy_app", "bevy_ecs", @@ -417,9 +417,9 @@ dependencies = [ [[package]] name = "bevy_gltf" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e07bda7721091c1a683343d466132dc69dec65aa83d8c9e328a2fb3431f03be" +checksum = "150cc6782c4472600c2ade5d78c6ce481c992690f0499e63765aba752d7e0f04" dependencies = [ "anyhow", "base64", @@ -427,6 +427,7 @@ dependencies = [ "bevy_app", "bevy_asset", "bevy_core", + "bevy_core_pipeline", "bevy_ecs", "bevy_hierarchy", "bevy_log", @@ -435,6 +436,7 @@ dependencies = [ "bevy_reflect", "bevy_render", "bevy_scene", + "bevy_tasks", "bevy_transform", "bevy_utils", "gltf", @@ -444,9 +446,9 @@ dependencies = [ [[package]] name = "bevy_hierarchy" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f407f152f35541a099484200afe3b0ca09ce625469e8233dcdc264d6f88e01a" +checksum = "8e2e4c20d7c843cd26ef3c5d7b4c20e3e32c275943e2437ecaca1cfd6cfe3b30" dependencies = [ "bevy_app", "bevy_ecs", @@ -457,9 +459,9 @@ dependencies = [ [[package]] name = "bevy_input" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4ec4f6e38ef1b41ff68ec7badd6afc5c9699191e61e511c4abee91a5888afc" +checksum = "a11c70573fb4d4c056ba32cfa553daa7e6e1245cb876ccfbe322640928b7ee1c" dependencies = [ "bevy_app", "bevy_ecs", @@ -469,9 +471,9 @@ dependencies = [ [[package]] name = "bevy_internal" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d518a8e5f526a9537fc8408a284caec7af22b23c3b23c0dee08bacc0930e2f1a" +checksum = "0d603b597772130782eab6e604706cbb764fb037f9cf0a1904b6f342845b6f44" dependencies = [ "bevy_animation", "bevy_app", @@ -489,12 +491,14 @@ dependencies = [ "bevy_log", "bevy_math", "bevy_pbr", + "bevy_ptr", "bevy_reflect", "bevy_render", "bevy_scene", "bevy_sprite", "bevy_tasks", "bevy_text", + "bevy_time", "bevy_transform", "bevy_ui", "bevy_utils", @@ -505,9 +509,9 @@ dependencies = [ [[package]] name = "bevy_log" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943ec496720ded2ff62b292d8e5fc845817a504915f41b7c5fd12b1380300f75" +checksum = "8cafb12fc84734236e36f407ab62c72d5d4279fa4777e40a95d7cc973cbabcd1" dependencies = [ "android_log-sys", "bevy_app", @@ -520,34 +524,41 @@ dependencies = [ [[package]] name = "bevy_macro_utils" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7ddfc33a99547e36718e56e414541e461c74ec318ff987a1e9f4ff46d0dacbb" +checksum = "4d081af83b701e16cad209255ba6b383744dfa49efa99eb6505989f293305ab3" dependencies = [ - "cargo-manifest", "quote", "syn", + "toml", ] [[package]] name = "bevy_math" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20288df0f70ff258bbaffaf55209f1271a7436438591bbffc3d81e4d84b423f2" +checksum = "db5394e86c5708d3aa506c6e98ec4ed2a4083a7a018c6693d9ac0e77ebfabfc2" +dependencies = [ + "glam", +] + +[[package]] +name = "bevy_mikktspace" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40b299a61175a6f7e7398f83cd5b50920fd8bad4df674e614ad94f25f8426509" dependencies = [ - "bevy_reflect", "glam", ] [[package]] name = "bevy_pbr" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06adee54840f18cfeda7af4cdc57608644fa840be076a562353f896bfdb9c694" +checksum = "ed9a81bbd02f5e0a57899a41aec37d9cb14965e1e4d510547f3f680323d05c0f" dependencies = [ "bevy_app", "bevy_asset", - "bevy_core", "bevy_core_pipeline", "bevy_ecs", "bevy_math", @@ -558,20 +569,29 @@ dependencies = [ "bevy_window", "bitflags", "bytemuck", + "radsort", ] +[[package]] +name = "bevy_ptr" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d92d5679e89602a18682a37846573dcd1979410179e14204280460ba9fb8713a" + [[package]] name = "bevy_reflect" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d0793107bc4b7c6bd04232d739fc8d70aa5fb313bfad6e850f91f79b2557eed" +checksum = "08798e67f2d4e6898ef117d8c99cf3b50a8eebc8da4159e6dad2657a0fbe9a4e" dependencies = [ + "bevy_ptr", "bevy_reflect_derive", "bevy_utils", "downcast-rs", "erased-serde", "glam", - "parking_lot", + "once_cell", + "parking_lot 0.12.1", "serde", "smallvec", "thiserror", @@ -579,9 +599,9 @@ dependencies = [ [[package]] name = "bevy_reflect_derive" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81c88de8067d19dfde31662ee78e3ee6971e2df27715799f91b515b37a636677" +checksum = "19209a7f0238053802b7de04e6724bd90d4ed7d90e87101dbd1b64cca64ff694" dependencies = [ "bevy_macro_utils", "proc-macro2", @@ -592,19 +612,24 @@ dependencies = [ [[package]] name = "bevy_render" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a358da8255b704153913c3499b3693fa5cfe13a48725ac6e76b043fa5633bc8" +checksum = "bb49530388ef17cff3fb8bd5e47372fb3cfeb4befc73e3036f6462ac20f049ef" dependencies = [ "anyhow", "bevy_app", "bevy_asset", "bevy_core", - "bevy_crevice", "bevy_derive", "bevy_ecs", + "bevy_encase_derive", + "bevy_hierarchy", + "bevy_log", "bevy_math", + "bevy_mikktspace", "bevy_reflect", + "bevy_render_macros", + "bevy_time", "bevy_transform", "bevy_utils", "bevy_window", @@ -612,32 +637,49 @@ dependencies = [ "codespan-reporting", "copyless", "downcast-rs", + "encase", "futures-lite", "hex", "hexasphere", "image", "naga", "once_cell", - "parking_lot", + "parking_lot 0.12.1", "regex", "serde", "smallvec", "thiserror", + "thread_local", "wgpu", ] +[[package]] +name = "bevy_render_macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7d0b7a51fa819c20c64f43856c5aaea40f853050bbb09b9ba3672e5ff2688a5" +dependencies = [ + "bevy_macro_utils", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "bevy_scene" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ea240f2ffce9f58a5601cc5ead24111f577dc4c656452839eb1fdf4b7a28529" +checksum = "0064d73ebb0de39901478b493604a1a6d448fd337b66803004c60f41f1fa6c37" dependencies = [ "anyhow", "bevy_app", "bevy_asset", + "bevy_derive", "bevy_ecs", "bevy_hierarchy", "bevy_reflect", + "bevy_render", + "bevy_transform", "bevy_utils", "ron", "serde", @@ -647,13 +689,12 @@ dependencies = [ [[package]] name = "bevy_sprite" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fcecfbc623410137d85a71a295ff7c16604b7be24529c9ea4b9a9881d7a142b" +checksum = "1f83dfe8897d6c0d9d5ce3818d49a13e58ae2b9b9ecf4f4bb85aa31bb0678f68" dependencies = [ "bevy_app", "bevy_asset", - "bevy_core", "bevy_core_pipeline", "bevy_ecs", "bevy_log", @@ -665,6 +706,7 @@ dependencies = [ "bitflags", "bytemuck", "copyless", + "fixedbitset", "guillotiere", "rectangle-pack", "serde", @@ -673,29 +715,29 @@ dependencies = [ [[package]] name = "bevy_tasks" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2b0f0b86c8f78c53a2d4c669522f45e725ed9d9c3d734f54ec30876494e04e" +checksum = "ff874c91a36eaac3ef957c6f3b590fb71332d9d136671cc858847d56fe9f80a3" dependencies = [ "async-channel", "async-executor", "event-listener", "futures-lite", "num_cpus", + "once_cell", "wasm-bindgen-futures", ] [[package]] name = "bevy_text" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a206112de011fd6baebaf476af69d87f4e38a1314b65e3c872060830d7c0b9fa" +checksum = "ef05a788c2c04aaa5db95b22a8f0fff0d3a0b08a7bcd1a71f050a628b38eec6e" dependencies = [ "ab_glyph", "anyhow", "bevy_app", "bevy_asset", - "bevy_core", "bevy_ecs", "bevy_math", "bevy_reflect", @@ -709,11 +751,24 @@ dependencies = [ "thiserror", ] +[[package]] +name = "bevy_time" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74ec681d641371df81d7bfbcb0eea725ed873f38a094f34b5f7b436f0889e77c" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_reflect", + "bevy_utils", + "crossbeam-channel", +] + [[package]] name = "bevy_transform" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2f7a77900fb23f24ca312c1f8df3eb47a45161326f41e9b4ef05b039793503" +checksum = "42e1528e35f30bede46a50ee4134f150efc01f5c1002c340b3b2e6a0bfcb8aa5" dependencies = [ "bevy_app", "bevy_ecs", @@ -724,13 +779,12 @@ dependencies = [ [[package]] name = "bevy_ui" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c65e79658d8a3d4da087a6fb8b229cfe1455cda2c4e8e6305b3b44fb46fb1d30" +checksum = "ac181a7b637da61fad72981ff9d2e5b899283ca7d54b2b7ea49c431121331c53" dependencies = [ "bevy_app", "bevy_asset", - "bevy_core", "bevy_core_pipeline", "bevy_derive", "bevy_ecs", @@ -748,19 +802,18 @@ dependencies = [ "bytemuck", "serde", "smallvec", - "stretch", + "taffy", ] [[package]] name = "bevy_utils" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f354c584812996febd48cc885f36b23004b49d6680e73fc95a69a2bb17a48e5" +checksum = "8bda6dada53e546845887ae7357eec57b8d547ef71627b716b33839b4a98b687" dependencies = [ "ahash", - "bevy_derive", "getrandom", - "hashbrown", + "hashbrown 0.12.3", "instant", "tracing", "uuid", @@ -768,12 +821,13 @@ dependencies = [ [[package]] name = "bevy_window" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04fe33d177e10b2984fa90c1d19496fc6f6e7b36d4442699d359e2b4b507873d" +checksum = "a3bdc3a220a9bb2fad9bd30d5f44c6645725398fe1bc588fc87abf09f092696e" dependencies = [ "bevy_app", "bevy_ecs", + "bevy_input", "bevy_math", "bevy_utils", "raw-window-handle", @@ -782,9 +836,9 @@ dependencies = [ [[package]] name = "bevy_winit" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7c0e3b94cc73907f8a9f82945ca006a39ed2ab401aca0974b47a007a468509f" +checksum = "57537a56ac4f4e1ffcad95227bcab37cd17b51770dacff82374a2d88be376322" dependencies = [ "approx", "bevy_app", @@ -793,6 +847,7 @@ dependencies = [ "bevy_math", "bevy_utils", "bevy_window", + "crossbeam-channel", "raw-window-handle", "wasm-bindgen", "web-sys", @@ -889,17 +944,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c" -[[package]] -name = "cargo-manifest" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af6d65c7592744998c67947ec771c62687c76f00179a83ffd563c0482046bb98" -dependencies = [ - "serde", - "serde_derive", - "toml", -] - [[package]] name = "cc" version = "1.0.73" @@ -1030,20 +1074,16 @@ dependencies = [ ] [[package]] -name = "copyless" -version = "0.1.5" +name = "const_panic" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2df960f5d869b2dd8532793fde43eb5427cceb126c929747a26823ab0eeb536" +checksum = "9c0358e41e90e443c69b2b2811f6ec9892c228b93620634cf4344fe89967fa9f" [[package]] -name = "core-foundation" -version = "0.6.4" +name = "copyless" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25b9e03f145fd4f2bf705e07b900cd41fc636598fe5dc452fd0db1441c3f496d" -dependencies = [ - "core-foundation-sys 0.6.2", - "libc", -] +checksum = "a2df960f5d869b2dd8532793fde43eb5427cceb126c929747a26823ab0eeb536" [[package]] name = "core-foundation" @@ -1065,12 +1105,6 @@ dependencies = [ "libc", ] -[[package]] -name = "core-foundation-sys" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b" - [[package]] name = "core-foundation-sys" version = "0.7.0" @@ -1165,13 +1199,13 @@ dependencies = [ "js-sys", "lazy_static", "libc", - "mach 0.3.2", + "mach", "ndk 0.6.0", "ndk-glue 0.6.2", - "nix", + "nix 0.23.1", "oboe", - "parking_lot", - "stdweb 0.1.3", + "parking_lot 0.11.2", + "stdweb", "thiserror", "wasm-bindgen", "web-sys", @@ -1189,9 +1223,9 @@ dependencies = [ [[package]] name = "crossbeam" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae5588f6b3c3cb05239e90bd110f257254aecd01e4635400391aeae07497845" +checksum = "2801af0d36612ae591caa9568261fddce32ce6e08a7275ea334a06a4ad021a2c" dependencies = [ "cfg-if 1.0.0", "crossbeam-channel", @@ -1213,9 +1247,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" +checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" dependencies = [ "cfg-if 1.0.0", "crossbeam-epoch", @@ -1224,23 +1258,23 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.8" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1145cf131a2c6ba0615079ab6a638f7e1973ac9c2634fcbeaaad6114246efe8c" +checksum = "045ebe27666471bb549370b4b0b3e51b07f56325befa4284db65fc89c02511b1" dependencies = [ "autocfg", "cfg-if 1.0.0", "crossbeam-utils", - "lazy_static", "memoffset", + "once_cell", "scopeguard", ] [[package]] name = "crossbeam-queue" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f25d8400f4a7a5778f0e4e52384a48cbd9b5c495d110786187fc750075277a2" +checksum = "1cd42583b04998a5363558e5f9291ee5a5ff6b49944332103f251e7479a82aa7" dependencies = [ "cfg-if 1.0.0", "crossbeam-utils", @@ -1264,9 +1298,9 @@ checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" [[package]] name = "d3d12" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2daefd788d1e96e0a9d66dee4b828b883509bc3ea9ce30665f04c3246372690c" +checksum = "827914e1f53b1e0e025ecd3d967a7836b7bcb54520f90e21ef8df7b4d88a2759" dependencies = [ "bitflags", "libloading", @@ -1310,20 +1344,13 @@ dependencies = [ [[package]] name = "deflate" -version = "0.8.6" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73770f8e1fe7d64df17ca66ad28994a0a623ea497fa69486e14984e715c5d174" +checksum = "c86f7e25f518f4b81808a2cf1c50996a61f5c2eb394b2393bd87f2a4780a432f" dependencies = [ "adler32", - "byteorder", ] -[[package]] -name = "discard" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" - [[package]] name = "dispatch" version = "0.2.0" @@ -1338,9 +1365,9 @@ checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" [[package]] name = "duplicate" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a2535fcf1437c9de0d91a3921351c474258abdb6440cd03bb5a7cf0547e7214" +checksum = "a0a4be4cd710e92098de6ad258e6e7c24af11c29c5142f3c6f2a545652480ff8" dependencies = [ "heck", "proc-macro-error", @@ -1348,9 +1375,41 @@ dependencies = [ [[package]] name = "either" -version = "1.6.1" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f107b87b6afc2a64fd13cac55fe06d6c8859f12d4b14cbcdd2c67d0976781be" + +[[package]] +name = "encase" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a516181e9a36e8982cb37933c5e7dba638c42938cacde46ee4e5b4156f881b9" +dependencies = [ + "const_panic", + "encase_derive", + "glam", + "thiserror", +] + +[[package]] +name = "encase_derive" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5b802412eea315f29f2bb2da3a5963cd6121f56eaa06aebcdc0c54eea578f22" +dependencies = [ + "encase_derive_impl", +] + +[[package]] +name = "encase_derive_impl" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +checksum = "0f2f4de457d974f548d2c2a16f709ebd81013579e543bd1a9b19ced88132c2cf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "env_logger" @@ -1494,9 +1553,9 @@ dependencies = [ [[package]] name = "gilrs" -version = "0.8.2" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1550c8bdebc993576e343d600a954654708a9a1182396ee1e805d6fe60c72909" +checksum = "1d6ba7c37bf8ea7ba0c3e3795dfa1a7771b1e47c4bb417c4d27c7b338d79685f" dependencies = [ "fnv", "gilrs-core", @@ -1507,33 +1566,32 @@ dependencies = [ [[package]] name = "gilrs-core" -version = "0.3.2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c7262ce1e88429c9b1d847820c9d2ba00adafc955218393d9c0861d5aaab88" +checksum = "96a8d94a7fc5afd27e894e08a4cfe5a49237f85bcc7140e90721bad3399c7d02" dependencies = [ - "core-foundation 0.6.4", + "core-foundation 0.9.3", "io-kit-sys", "js-sys", "libc", "libudev-sys", "log", - "nix", + "nix 0.24.2", "rusty-xinput", - "stdweb 0.4.20", "uuid", "vec_map", + "wasm-bindgen", "web-sys", "winapi", ] [[package]] name = "glam" -version = "0.20.5" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43e957e744be03f5801a55472f593d43fabdebf25a4585db250f04d86b1675f" +checksum = "518faa5064866338b013ff9b2350dc318e14cc4fcd6cb8206d7e7c9886c98815" dependencies = [ "bytemuck", - "mint", "serde", ] @@ -1628,7 +1686,7 @@ checksum = "a538f217be4d405ff4719a283ca68323cc2384003eca5baaa87501e821c81dda" dependencies = [ "bitflags", "gpu-descriptor-types", - "hashbrown", + "hashbrown 0.11.2", ] [[package]] @@ -1650,11 +1708,40 @@ dependencies = [ "svg_fmt", ] +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hash32-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59d2aba832b60be25c1b169146b27c64115470981b128ed84c8db18c1b03c6ff" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "hashbrown" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ "ahash", "serde", @@ -1677,9 +1764,9 @@ dependencies = [ [[package]] name = "heron" -version = "3.0.0" +version = "4.0.0-alpha.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45f23a4c500926d8dc9ec59cc6ae3c17f006bc4f7d2cc13f8d6ef993a8ba7867" +checksum = "d7747ff2cea42946d786cf31d4c72ecc67b76d32ef6e65fea4c0c084a76f4122" dependencies = [ "bevy", "cfg_aliases", @@ -1690,9 +1777,9 @@ dependencies = [ [[package]] name = "heron_core" -version = "3.0.0" +version = "4.0.0-alpha.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5159c19d52d452251e2377294f3a34534fe9293eadc3bb2b4ba18fe3ff9d10d" +checksum = "88e954c7956d81a0e4c2764d21c2b311a270233cb923aa41e1a10364b5f4f247" dependencies = [ "bevy", "cfg_aliases", @@ -1702,9 +1789,9 @@ dependencies = [ [[package]] name = "heron_macros" -version = "3.0.0" +version = "4.0.0-alpha.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146314054f01fc7c1a345dcc4dfedc7e3a792e845ce1c6d21c7c26f5383bd98b" +checksum = "3505c4abe5732be0ca34384814b01d840ae7931f9202ae134c890e3a61ff720d" dependencies = [ "quote", "syn", @@ -1712,9 +1799,9 @@ dependencies = [ [[package]] name = "heron_rapier" -version = "3.0.0" +version = "4.0.0-alpha.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdba166504110706edc3a1c614f4e6cba9ba001cd4569afc9afb44ea557b472d" +checksum = "81494f0f72447cca454b66880a0da5d93f1fa1f08b2a8326284b2609d67d77bd" dependencies = [ "bevy", "cfg_aliases", @@ -1732,12 +1819,12 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hexasphere" -version = "7.0.0" +version = "7.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04ab9d20ba513ff1582a7d885e91839f62cf28bef7c56b1b0428ca787315979b" +checksum = "9652f2ed7ee9c6374a061039f60fc6e25d7adac7fa10f83365669af3b24b0bf0" dependencies = [ "glam", - "lazy_static", + "once_cell", ] [[package]] @@ -1754,15 +1841,14 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "image" -version = "0.23.14" +version = "0.24.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1" +checksum = "7e30ca2ecf7666107ff827a8e481de6a132a9b687ed3bb20bb1c144a36c00964" dependencies = [ "bytemuck", "byteorder", "color_quant", - "num-iter", - "num-rational 0.3.2", + "num-rational", "num-traits", "png", "scoped_threadpool", @@ -1775,7 +1861,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" dependencies = [ "autocfg", - "hashbrown", + "hashbrown 0.11.2", ] [[package]] @@ -1824,12 +1910,12 @@ dependencies = [ [[package]] name = "io-kit-sys" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f21dcc74995dd4cd090b147e79789f8d65959cbfb5f0b118002db869ea3bd0a0" +checksum = "7789f7f3c9686f96164f5109d69152de759e76e284f736bd57661c6df5091919" dependencies = [ - "core-foundation-sys 0.6.2", - "mach 0.2.3", + "core-foundation-sys 0.8.3", + "mach", ] [[package]] @@ -1869,9 +1955,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.57" +version = "0.3.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671a26f820db17c2a2750743f1dd03bafd15b98c9f30c7c2628c024c05d73397" +checksum = "258451ab10b34f8af53416d1fdab72c22e805f0c92a1136d59470ec0b11138b2" dependencies = [ "wasm-bindgen", ] @@ -1884,6 +1970,7 @@ checksum = "8c2352bd1d0bceb871cb9d40f24360c8133c11d7486b68b5381c1dd1a32015e3" dependencies = [ "libc", "libloading", + "pkg-config", ] [[package]] @@ -1931,9 +2018,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.124" +version = "0.2.127" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a41fed9d98f27ab1c6d161da622a4fa35e8a54a8adc24bbf3ddd0ef70b0e50" +checksum = "505e71a4706fa491e9b1b55f51b95d4037d0821ee40131190475f692b35b009b" [[package]] name = "libloading" @@ -1947,9 +2034,9 @@ dependencies = [ [[package]] name = "libm" -version = "0.1.4" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" +checksum = "c7ce35d4899fa3c0558d4f5082c98927789a01024270711cf113999b66ced65a" [[package]] name = "libudev-sys" @@ -1980,15 +2067,6 @@ dependencies = [ "cfg-if 1.0.0", ] -[[package]] -name = "mach" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86dd2487cdfea56def77b88438a2c915fb45113c5319bfe7e14306ca4cd0b0e1" -dependencies = [ - "libc", -] - [[package]] name = "mach" version = "0.3.2" @@ -2042,9 +2120,9 @@ dependencies = [ [[package]] name = "metal" -version = "0.23.1" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0514f491f4cc03632ab399ee01e2c1c1b12d3e1cf2d667c1ff5f87d6dcd2084" +checksum = "de11355d1f6781482d027a3b4d4de7825dcedb197bf573e0596d00008402d060" dependencies = [ "bitflags", "block", @@ -2062,30 +2140,11 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435" -dependencies = [ - "adler32", -] - -[[package]] -name = "mint" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e53debba6bda7a793e5f99b8dacf19e626084f525f7829104ba9898f367d85ff" - -[[package]] -name = "mio" -version = "0.7.14" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc" +checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc" dependencies = [ - "libc", - "log", - "miow", - "ntapi", - "winapi", + "adler", ] [[package]] @@ -2113,9 +2172,9 @@ dependencies = [ [[package]] name = "naga" -version = "0.8.5" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3012f2dbcc79e8e0b5825a4836a7106a75dd9b2fe42c528163be0f572538c705" +checksum = "5f50357e1167a3ab92d6b3c7f4bf5f7fd13fde3f4b28bf0d5ea07b5100fdb6c0" dependencies = [ "bit-set", "bitflags", @@ -2128,20 +2187,22 @@ dependencies = [ "pp-rs", "rustc-hash", "spirv", + "termcolor", "thiserror", + "unicode-xid", ] [[package]] name = "nalgebra" -version = "0.29.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d506eb7e08d6329505faa8a3a00a5dcc6de9f76e0c77e4b75763ae3c770831ff" +checksum = "e9e0a04ce089f9401aac565c740ed30c46291260f27d4911fdbaa6ca65fa3044" dependencies = [ "approx", "matrixmultiply", "nalgebra-macros", "num-complex", - "num-rational 0.4.0", + "num-rational", "num-traits", "simba", "typenum", @@ -2262,6 +2323,17 @@ dependencies = [ "memoffset", ] +[[package]] +name = "nix" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "195cdbc1741b8134346d515b3a56a1c94b0912758009cfd53f99ea0f57b065fc" +dependencies = [ + "bitflags", + "cfg-if 1.0.0", + "libc", +] + [[package]] name = "nom" version = "7.1.1" @@ -2274,9 +2346,9 @@ dependencies = [ [[package]] name = "notify" -version = "5.0.0-pre.11" +version = "5.0.0-pre.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c614e7ed2b1cf82ec99aeffd8cf6225ef5021b9951148eb161393c394855032c" +checksum = "553f9844ad0b0824605c20fb55a661679782680410abfb1a8144c2e7e437e7a7" dependencies = [ "bitflags", "crossbeam-channel", @@ -2285,7 +2357,7 @@ dependencies = [ "inotify", "kqueue", "libc", - "mio 0.7.14", + "mio", "walkdir", "winapi", ] @@ -2301,9 +2373,9 @@ dependencies = [ [[package]] name = "num-complex" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26873667bbbb7c5182d4a37c1add32cdf09f841af72da53318fdb81543c15085" +checksum = "7ae39348c8bc5fbd7f40c727a9925f03517afd2ab27d46702108b6a7e5414c19" dependencies = [ "num-traits", ] @@ -2329,28 +2401,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-iter" -version = "0.1.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-rational" version = "0.4.0" @@ -2369,6 +2419,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" dependencies = [ "autocfg", + "libm", ] [[package]] @@ -2455,9 +2506,15 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.10.0" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18a6dbe30758c9f83eb00cbea4ac95966305f5a7772f3f42ebfc7fc7eddbd8e1" + +[[package]] +name = "optional" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" +checksum = "978aa494585d3ca4ad74929863093e87cac9790d81fe7aba2b3dc2890643a0fc" [[package]] name = "owned_ttf_parser" @@ -2482,7 +2539,17 @@ checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" dependencies = [ "instant", "lock_api", - "parking_lot_core", + "parking_lot_core 0.8.5", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core 0.9.3", ] [[package]] @@ -2499,11 +2566,24 @@ dependencies = [ "winapi", ] +[[package]] +name = "parking_lot_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "redox_syscall", + "smallvec", + "windows-sys", +] + [[package]] name = "parry2d" -version = "0.7.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e03714e76fd6708c1fa3fc4f58a66dabd723bb87865548657a037beaf9a8eea" +checksum = "2841cebc29aaf7c69058b242742853d9b106c5245ed946090a75d941d23a6f5e" dependencies = [ "approx", "arrayvec", @@ -2517,13 +2597,14 @@ dependencies = [ "simba", "slab", "smallvec", + "spade", ] [[package]] name = "paste" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c520e05135d6e763148b6426a837e239041653ba7becd2e538c076c738025fc" +checksum = "9423e2b32f7a043629287a536f21951e8c6a82482d0acb1eeebfc90bc2225b22" [[package]] name = "peeking_take_while" @@ -2561,9 +2642,9 @@ checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" [[package]] name = "png" -version = "0.16.8" +version = "0.17.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3287920cb847dee3de33d301c463fba14dda99db24214ddf93f83d3021f4c6" +checksum = "dc38c0ad57efb786dd57b9864e5b18bae478c00c824dc55a38bbc9da95dde3ba" dependencies = [ "bitflags", "crc32fast", @@ -2644,6 +2725,12 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "radsort" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17fd96390ed3feda12e1dfe2645ed587e0bea749e319333f104a33ff62f77a0b" + [[package]] name = "rand" version = "0.8.5" @@ -2682,9 +2769,9 @@ checksum = "63e935c45e09cc6dcf00d2f0b2d630a58f4095320223d47fc68918722f0538b6" [[package]] name = "rapier2d" -version = "0.11.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c45d2910dbd279941b71ef9d20da877a0eada21f8117fcac70941e458100ea86" +checksum = "43f7f18a9281f4c4176754437a768e1b7124ce5729060c8743db670f7ebb3c43" dependencies = [ "approx", "arrayvec", @@ -2692,7 +2779,6 @@ dependencies = [ "bitflags", "crossbeam", "downcast-rs", - "instant", "nalgebra", "num-derive", "num-traits", @@ -2763,6 +2849,12 @@ version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1382d1f0a252c4bf97dc20d979a2fdd05b024acd7c2ed0f7595d7817666a157" +[[package]] +name = "robust" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5864e7ef1a6b7bcf1d6ca3f655e65e724ed3b52546a0d0a663c991522f552ea" + [[package]] name = "rodio" version = "0.15.0" @@ -2790,15 +2882,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver", -] - [[package]] name = "rusty-xinput" version = "1.2.0" @@ -2846,21 +2929,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - [[package]] name = "serde" version = "1.0.136" @@ -2892,21 +2960,6 @@ dependencies = [ "serde", ] -[[package]] -name = "sha1" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770" -dependencies = [ - "sha1_smol", -] - -[[package]] -name = "sha1_smol" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" - [[package]] name = "sharded-slab" version = "0.1.4" @@ -2924,9 +2977,9 @@ checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" [[package]] name = "simba" -version = "0.6.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0b7840f121a46d63066ee7a99fc81dcabbc6105e437cae43528cea199b5a05f" +checksum = "c48e45e5961033db030b56ad67aef22e9c908c493a6e8348c0a0f6b93433cd77" dependencies = [ "approx", "num-complex", @@ -2959,6 +3012,18 @@ dependencies = [ "serde", ] +[[package]] +name = "spade" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "333b8c21ebd9a45c5e955f3d7a1f0c4a2214847dd7e8e1abb69f34ec9b88882d" +dependencies = [ + "num-traits", + "optional", + "robust", + "smallvec", +] + [[package]] name = "spirv" version = "0.2.0+1.5.4" @@ -2975,67 +3040,6 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef5430c8e36b713e13b48a9f709cc21e046723fe44ce34587b73a830203b533e" -[[package]] -name = "stdweb" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" -dependencies = [ - "discard", - "rustc_version", - "serde", - "serde_json", - "stdweb-derive", - "stdweb-internal-macros", - "stdweb-internal-runtime", - "wasm-bindgen", -] - -[[package]] -name = "stdweb-derive" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" -dependencies = [ - "proc-macro2", - "quote", - "serde", - "serde_derive", - "syn", -] - -[[package]] -name = "stdweb-internal-macros" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" -dependencies = [ - "base-x", - "proc-macro2", - "quote", - "serde", - "serde_derive", - "serde_json", - "sha1", - "syn", -] - -[[package]] -name = "stdweb-internal-runtime" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" - -[[package]] -name = "stretch" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0dc6d20ce137f302edf90f9cd3d278866fd7fb139efca6f246161222ad6d87" -dependencies = [ - "lazy_static", - "libm", -] - [[package]] name = "strsim" version = "0.10.0" @@ -3059,6 +3063,19 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "taffy" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec27dea659b100d489dffa57cf0efc6d7bfefb119af817b92cc14006c0b214e3" +dependencies = [ + "arrayvec", + "hash32", + "hash32-derive", + "num-traits", + "typenum", +] + [[package]] name = "termcolor" version = "1.1.3" @@ -3118,7 +3135,6 @@ version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" dependencies = [ - "indexmap", "serde", ] @@ -3215,15 +3231,15 @@ checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" [[package]] name = "unicode-xid" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" [[package]] name = "uuid" -version = "0.8.2" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +checksum = "dd6469f4314d5f1ffec476e05f17cc9a78bc7a27a6a857842170bdf8d6f98d2f" dependencies = [ "getrandom", "serde", @@ -3278,9 +3294,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.80" +version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad" +checksum = "fc7652e3f6c4706c8d9cd54832c4a4ccb9b5336e2c3bd154d5cccfbf1c1f5f7d" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -3288,13 +3304,13 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.80" +version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4" +checksum = "662cd44805586bd52971b9586b1df85cdbbd9112e4ef4d8f41559c334dc6ac3f" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", "syn", @@ -3303,9 +3319,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.30" +version = "0.4.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f741de44b75e14c35df886aff5f1eb73aa114fa5d4d00dcd37b5e01259bf3b2" +checksum = "fa76fb221a1f8acddf5b54ace85912606980ad661ac7a503b4570ffd3a624dad" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -3315,9 +3331,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.80" +version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5" +checksum = "b260f13d3012071dfb1512849c033b1925038373aea48ced3012c09df952c602" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3325,9 +3341,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.80" +version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b" +checksum = "5be8e654bdd9b79216c2929ab90721aa82faf65c48cdf08bdc4e7f51357b80da" dependencies = [ "proc-macro2", "quote", @@ -3338,15 +3354,15 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.80" +version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744" +checksum = "6598dd0bd3c7d51095ff6531a5b23e02acdc81804e30d8f07afb77b7215a140a" [[package]] name = "web-sys" -version = "0.3.57" +version = "0.3.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283" +checksum = "ed055ab27f941423197eb86b2035720b1a3ce40504df082cac2ecc6ed73335a1" dependencies = [ "js-sys", "wasm-bindgen", @@ -3354,15 +3370,15 @@ dependencies = [ [[package]] name = "wgpu" -version = "0.12.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97cd781ff044d6d697b632a2e212032c2e957d1afaa21dbf58069cbb8f78567" +checksum = "277e967bf8b7820a76852645a6bce8bbd31c32fda2042e82d8e3ea75fda8892d" dependencies = [ "arrayvec", "js-sys", "log", "naga", - "parking_lot", + "parking_lot 0.12.1", "raw-window-handle", "smallvec", "wasm-bindgen", @@ -3375,11 +3391,12 @@ dependencies = [ [[package]] name = "wgpu-core" -version = "0.12.2" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4688c000eb841ca55f7b35db659b78d6e1cd77d7caf8fb929f4e181f754047d" +checksum = "89b92788dec9d0c1bed849a1b83f01b2ee12819bf04a79c90f68e4173f7b5ba2" dependencies = [ "arrayvec", + "bit-vec", "bitflags", "cfg_aliases", "codespan-reporting", @@ -3387,21 +3404,23 @@ dependencies = [ "fxhash", "log", "naga", - "parking_lot", + "parking_lot 0.12.1", "profiling", "raw-window-handle", "smallvec", "thiserror", + "web-sys", "wgpu-hal", "wgpu-types", ] [[package]] name = "wgpu-hal" -version = "0.12.5" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d684ea6a34974a2fc19f1dfd183d11a62e22d75c4f187a574bb1224df8e056c2" +checksum = "20cbdfc3d0637dba3d5536b93adef3d26023a0b96f0e1ee5ee9560a401d9f646" dependencies = [ + "android_system_properties", "arrayvec", "ash", "bit-set", @@ -3422,7 +3441,7 @@ dependencies = [ "metal", "naga", "objc", - "parking_lot", + "parking_lot 0.12.1", "profiling", "range-alloc", "raw-window-handle", @@ -3436,9 +3455,9 @@ dependencies = [ [[package]] name = "wgpu-types" -version = "0.12.0" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "549533d9e1cdd4b4cda7718d33ff500fc4c34b5467b71d76b547ae0324f3b2a2" +checksum = "1f762cbc08e1a51389859cf9c199c7aef544789cf3510889aab12c607f701604" dependencies = [ "bitflags", ] @@ -3484,6 +3503,49 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-sys" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" + [[package]] name = "winit" version = "0.26.1" @@ -3500,12 +3562,12 @@ dependencies = [ "lazy_static", "libc", "log", - "mio 0.8.2", + "mio", "ndk 0.5.0", "ndk-glue 0.5.2", "ndk-sys 0.2.2", "objc", - "parking_lot", + "parking_lot 0.11.2", "percent-encoding", "raw-window-handle", "wasm-bindgen", diff --git a/Cargo.toml b/Cargo.toml index 38a824f4..2f8d8a3e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,18 +12,18 @@ exclude = ["assets/*", "repo/*", "scripts/*"] [dependencies] bevy_ecs_ldtk_macros = { version = "0.3", optional = true, path = "macros" } -bevy_ecs_tilemap = "0.6" -bevy = { version = "0.7", default-features = false } +bevy_ecs_tilemap = { version = "0.7.0" } +bevy = { version = "0.8", default-features = false, features = ["bevy_sprite"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -regex = "1.5" +regex = "1" hex = "0.4" anyhow = "1.0" thiserror = "1.0" [dev-dependencies] -bevy = "0.7" -heron = { version = "3.0", features = ["2d"] } +bevy = "0.8" +heron = { version = "4.0.0-alpha.4", features = ["2d"] } rand = "0.8" [features] diff --git a/README.md b/README.md index ce136cf5..33e8bd4f 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ fn main() { } fn setup(mut commands: Commands, asset_server: Res) { - commands.spawn_bundle(OrthographicCameraBundle::new_2d()); + commands.spawn_bundle(Camera2dBundle::default()); commands.spawn_bundle(LdtkWorldBundle { ldtk_handle: asset_server.load("my_project.ldtk"), diff --git a/examples/basic.rs b/examples/basic.rs index 659220cb..b0a65372 100644 --- a/examples/basic.rs +++ b/examples/basic.rs @@ -1,8 +1,9 @@ -use bevy::prelude::*; +use bevy::{prelude::*, render::texture::ImageSettings}; use bevy_ecs_ldtk::prelude::*; fn main() { App::new() + .insert_resource(ImageSettings::default_nearest()) // prevents blurry sprites .add_plugins(DefaultPlugins) .add_plugin(LdtkPlugin) .add_startup_system(setup) @@ -12,7 +13,7 @@ fn main() { } fn setup(mut commands: Commands, asset_server: Res) { - commands.spawn_bundle(OrthographicCameraBundle::new_2d()); + commands.spawn_bundle(Camera2dBundle::default()); commands.spawn_bundle(LdtkWorldBundle { ldtk_handle: asset_server.load("my_project.ldtk"), diff --git a/examples/field_instances.rs b/examples/field_instances.rs index c64e50c9..eebbdcc0 100644 --- a/examples/field_instances.rs +++ b/examples/field_instances.rs @@ -12,7 +12,7 @@ fn main() { } fn setup(mut commands: Commands, asset_server: Res) { - commands.spawn_bundle(OrthographicCameraBundle::new_2d()); + commands.spawn_bundle(Camera2dBundle::default()); asset_server.watch_for_changes().unwrap(); diff --git a/examples/level_set.rs b/examples/level_set.rs index 16ce8bae..fac5647b 100644 --- a/examples/level_set.rs +++ b/examples/level_set.rs @@ -38,7 +38,7 @@ const LEVEL_IIDS: [&str; 8] = [ ]; fn setup(mut commands: Commands, asset_server: Res) { - commands.spawn_bundle(OrthographicCameraBundle::new_2d()); + commands.spawn_bundle(Camera2dBundle::default()); let iids: HashSet = LEVEL_IIDS.into_iter().map(|s| s.to_string()).collect(); diff --git a/examples/platformer/main.rs b/examples/platformer/main.rs index 1897bb44..d5a5ab7f 100644 --- a/examples/platformer/main.rs +++ b/examples/platformer/main.rs @@ -1,7 +1,7 @@ // This example shows off a more in-depth implementation of a game with `bevy_ecs_ldtk`. // Please run with `--release`. -use bevy::prelude::*; +use bevy::{prelude::*, render::texture::ImageSettings}; use bevy_ecs_ldtk::prelude::*; use heron::prelude::*; @@ -11,6 +11,7 @@ mod systems; fn main() { App::new() + .insert_resource(ImageSettings::default_nearest()) // prevents blurry sprites .add_plugins(DefaultPlugins) .add_plugin(LdtkPlugin) .add_plugin(PhysicsPlugin::default()) diff --git a/examples/platformer/systems.rs b/examples/platformer/systems.rs index 958f3dc1..6a5341dd 100644 --- a/examples/platformer/systems.rs +++ b/examples/platformer/systems.rs @@ -7,7 +7,7 @@ use std::collections::{HashMap, HashSet}; use heron::prelude::*; pub fn setup(mut commands: Commands, asset_server: Res) { - let camera = OrthographicCameraBundle::new_2d(); + let camera = Camera2dBundle::default(); commands.spawn_bundle(camera); asset_server.watch_for_changes().unwrap(); @@ -105,16 +105,31 @@ pub fn spawn_wall_collision( right: i32, } - // consider where the walls are + /// A simple rectangle type representing a wall of any size + #[derive(Copy, Clone, Eq, PartialEq, Debug, Default, Hash)] + struct Rect { + left: i32, + right: i32, + top: i32, + bottom: i32, + } + + // Consider where the walls are // storing them as GridCoords in a HashSet for quick, easy lookup + // + // The key of this map will be the entity of the level the wall belongs to. + // This has two consequences in the resulting collision entities: + // 1. it forces the walls to be split along level boundaries + // 2. it lets us easily add the collision entities as children of the appropriate level entity let mut level_to_wall_locations: HashMap> = HashMap::new(); - wall_query.for_each(|(&grid_coords, &Parent(parent))| { - // the intgrid tiles' direct parents will be bevy_ecs_tilemap chunks, not the level - // To get the level, you need their grandparents, which is where parent_query comes in - if let Ok(&Parent(level_entity)) = parent_query.get(parent) { + wall_query.for_each(|(&grid_coords, parent)| { + // An intgrid tile's direct parent will be a layer entity, not the level entity + // To get the level entity, you need the tile's grandparent. + // This is where parent_query comes in. + if let Ok(grandparent) = parent_query.get(parent.get()) { level_to_wall_locations - .entry(level_entity) + .entry(grandparent.get()) .or_insert(HashSet::new()) .insert(grid_coords); } @@ -165,15 +180,15 @@ pub fn spawn_wall_collision( } // combine "plates" into rectangles across multiple rows - let mut wall_rects: Vec> = Vec::new(); - let mut previous_rects: HashMap> = HashMap::new(); + let mut wall_rects: Vec = Vec::new(); + let mut previous_rects: HashMap = HashMap::new(); // an extra empty row so the algorithm "terminates" the rects that touch the top // edge plate_stack.push(Vec::new()); for (y, row) in plate_stack.iter().enumerate() { - let mut current_rects: HashMap> = HashMap::new(); + let mut current_rects: HashMap = HashMap::new(); for plate in row { if let Some(previous_rect) = previous_rects.remove(plate) { current_rects.insert( @@ -201,38 +216,41 @@ pub fn spawn_wall_collision( previous_rects = current_rects; } - // spawn colliders for every rectangle - for wall_rect in wall_rects { - commands - .spawn() - .insert(CollisionShape::Cuboid { - half_extends: Vec3::new( - (wall_rect.right as f32 - wall_rect.left as f32 + 1.) - * grid_size as f32 + commands.entity(level_entity).with_children(|level| { + // Spawn colliders for every rectangle.. + // Making the collider a child of the level serves two purposes: + // 1. Adjusts the transforms to be relative to the level for free + // 2. the colliders will be despawned automatically when levels unload + for wall_rect in wall_rects { + level + .spawn() + .insert(CollisionShape::Cuboid { + half_extends: Vec3::new( + (wall_rect.right as f32 - wall_rect.left as f32 + 1.) + * grid_size as f32 + / 2., + (wall_rect.top as f32 - wall_rect.bottom as f32 + 1.) + * grid_size as f32 + / 2., + 0., + ), + border_radius: None, + }) + .insert(RigidBody::Static) + .insert(PhysicMaterial { + friction: 0.1, + ..Default::default() + }) + .insert(Transform::from_xyz( + (wall_rect.left + wall_rect.right + 1) as f32 * grid_size as f32 / 2., - (wall_rect.top as f32 - wall_rect.bottom as f32 + 1.) - * grid_size as f32 + (wall_rect.bottom + wall_rect.top + 1) as f32 * grid_size as f32 / 2., 0., - ), - border_radius: None, - }) - .insert(RigidBody::Static) - .insert(PhysicMaterial { - friction: 0.1, - ..Default::default() - }) - .insert(Transform::from_xyz( - (wall_rect.left + wall_rect.right + 1) as f32 * grid_size as f32 / 2., - (wall_rect.bottom + wall_rect.top + 1) as f32 * grid_size as f32 / 2., - 0., - )) - .insert(GlobalTransform::default()) - // Making the collider a child of the level serves two purposes: - // 1. Adjusts the transforms to be relative to the level for free - // 2. the colliders will be despawned automatically when levels unload - .insert(Parent(level_entity)); - } + )) + .insert(GlobalTransform::default()); + } + }); } }); } @@ -407,18 +425,19 @@ pub fn update_level_selection( ) { for (level_handle, level_transform) in level_query.iter() { if let Some(ldtk_level) = ldtk_levels.get(level_handle) { - let level_bounds = Rect { - bottom: level_transform.translation.y, - top: level_transform.translation.y + ldtk_level.level.px_hei as f32, - left: level_transform.translation.x, - right: level_transform.translation.x + ldtk_level.level.px_wid as f32, + let level_bounds = bevy::sprite::Rect { + min: Vec2::new(level_transform.translation.x, level_transform.translation.y), + max: Vec2::new( + level_transform.translation.x + ldtk_level.level.px_wid as f32, + level_transform.translation.y + ldtk_level.level.px_hei as f32, + ), }; for player_transform in player_query.iter() { - if player_transform.translation.x < level_bounds.right - && player_transform.translation.x > level_bounds.left - && player_transform.translation.y < level_bounds.top - && player_transform.translation.y > level_bounds.bottom + if player_transform.translation.x < level_bounds.max.x + && player_transform.translation.x > level_bounds.min.x + && player_transform.translation.y < level_bounds.max.y + && player_transform.translation.y > level_bounds.min.y && !level_selection.is_match(&0, &ldtk_level.level) { *level_selection = LevelSelection::Iid(ldtk_level.level.iid.clone()); diff --git a/examples/traitless.rs b/examples/traitless.rs index c17cdf11..32c40002 100644 --- a/examples/traitless.rs +++ b/examples/traitless.rs @@ -1,11 +1,12 @@ // Roughly equivalent to the "basic" example, except it doesn't use the LdtkEntity convenience // trait. As a result, you can run this example with --no-default-features -use bevy::prelude::*; +use bevy::{prelude::*, render::texture::ImageSettings}; use bevy_ecs_ldtk::prelude::*; fn main() { App::new() + .insert_resource(ImageSettings::default_nearest()) // prevents blurry sprites .add_plugins(DefaultPlugins) .add_plugin(LdtkPlugin) .add_startup_system(setup) @@ -15,7 +16,7 @@ fn main() { } fn setup(mut commands: Commands, asset_server: Res) { - commands.spawn_bundle(OrthographicCameraBundle::new_2d()); + commands.spawn_bundle(Camera2dBundle::default()); commands.spawn_bundle(LdtkWorldBundle { ldtk_handle: asset_server.load("my_project.ldtk"), diff --git a/macros/src/ldtk_entity.rs b/macros/src/ldtk_entity.rs index 64c87718..6ff5a8ba 100644 --- a/macros/src/ldtk_entity.rs +++ b/macros/src/ldtk_entity.rs @@ -222,6 +222,7 @@ fn expand_sprite_sheet_bundle_attribute( asset_server.load(#asset_path).into(), bevy::prelude::Vec2::new(#tile_width, #tile_height), #columns, #rows, bevy::prelude::Vec2::splat(#padding), + Vec2::ZERO, ) ), sprite: bevy::prelude::TextureAtlasSprite { diff --git a/src/app/ldtk_int_cell.rs b/src/app/ldtk_int_cell.rs index d28a290d..a914acf0 100644 --- a/src/app/ldtk_int_cell.rs +++ b/src/app/ldtk_int_cell.rs @@ -134,7 +134,7 @@ pub trait LdtkIntCell { /// Note: whether or not the entity is registered to the app, the plugin will insert [Transform], /// [GlobalTransform], and [Parent] components to the entity **after** this bundle is inserted. /// So, any custom implementations of these components within this trait will be overwritten. - /// Furthermore, a [bevy_ecs_tilemap::TileBundle] will be inserted **before** this bundle, so + /// Furthermore, a [bevy_ecs_tilemap::tiles::TileBundle] will be inserted **before** this bundle, so /// be careful not to overwrite the components provided by that bundle. fn bundle_int_cell(int_grid_cell: IntGridCell, layer_instance: &LayerInstance) -> Self; } diff --git a/src/components.rs b/src/components.rs index 6fe30891..fe1c79fb 100644 --- a/src/components.rs +++ b/src/components.rs @@ -1,6 +1,7 @@ //! [Component]s and [Bundle]s used by the plugin. -pub use crate::ldtk::{EntityInstance, LayerInstance, Type}; +pub use crate::ldtk::EntityInstance; +use crate::ldtk::{LayerInstance, Type}; use bevy::prelude::*; use std::{ @@ -16,10 +17,7 @@ use crate::{ utils::ldtk_grid_coords_to_grid_coords, }; -use bevy_ecs_tilemap::{TileBundle, TileBundleTrait, TileParent, TilePos}; - -#[allow(unused_imports)] -use bevy_ecs_tilemap::Map; +use bevy_ecs_tilemap::tiles::{TileBundle, TilePos}; /// [Component] added to any `IntGrid` tile by default. /// @@ -118,15 +116,15 @@ impl From for IVec2 { impl From for GridCoords { fn from(tile_pos: TilePos) -> Self { GridCoords { - x: tile_pos.0 as i32, - y: tile_pos.1 as i32, + x: tile_pos.x as i32, + y: tile_pos.y as i32, } } } impl From for TilePos { fn from(grid_coords: GridCoords) -> Self { - TilePos(grid_coords.x as u32, grid_coords.y as u32) + TilePos::new(grid_coords.x as u32, grid_coords.y as u32) } } @@ -315,23 +313,13 @@ impl From<&LayerInstance> for LayerMetadata { } } -#[derive(Clone, Default, Bundle)] +#[derive(Copy, Clone, Debug, Default, Bundle)] pub(crate) struct TileGridBundle { #[bundle] pub tile_bundle: TileBundle, pub grid_coords: GridCoords, } -impl TileBundleTrait for TileGridBundle { - fn get_tile_pos_mut(&mut self) -> &mut TilePos { - self.tile_bundle.get_tile_pos_mut() - } - - fn get_tile_parent(&mut self) -> &mut TileParent { - self.tile_bundle.get_tile_parent() - } -} - #[derive(Clone, Default, Bundle)] pub(crate) struct IntGridCellBundle { pub int_grid_cell: IntGridCell, @@ -347,13 +335,21 @@ pub(crate) struct EntityInstanceBundle { /// After the ldtk file is done loading, the levels you've chosen with [LevelSelection] or /// [LevelSet] will begin to spawn. /// Each level is its own entity, with the [LdtkWorldBundle] as its parent. -/// Each level has `Handle`, [Map], [Transform], and [GlobalTransform] components. -/// Finally, all tiles and entities in the level are spawned as children to the level unless marked -/// by a [Worldly] component. +/// Each level has a `Handle` component. +/// +/// All non-Entity layers (IntGrid, Tile, and AutoTile) will also spawn as their own entities. +/// Each layer's parent will be the level entity. +/// Each layer will have a [LayerMetadata] component, and are [bevy_ecs_tilemap::TilemapBundle]s. +/// Each tile in these layers will have the layer entity as its parent. +/// +/// For Entity layers, all LDtk entities in the level are spawned as children to the level entity, +/// unless marked by a [Worldly] component. #[derive(Clone, Default, Bundle)] pub struct LdtkWorldBundle { pub ldtk_handle: Handle, pub level_set: LevelSet, pub transform: Transform, pub global_transform: GlobalTransform, + pub visibility: Visibility, + pub computed_visibility: ComputedVisibility, } diff --git a/src/level.rs b/src/level.rs index 65019d42..ea7743b4 100644 --- a/src/level.rs +++ b/src/level.rs @@ -8,7 +8,7 @@ use crate::{ assets::{LdtkLevel, TilesetMap}, components::*, ldtk::{ - EntityDefinition, EnumTagValue, LayerDefinition, LevelBackgroundPosition, + EntityDefinition, EnumTagValue, LayerDefinition, LayerInstance, LevelBackgroundPosition, TileCustomMetadata, TileInstance, TilesetDefinition, Type, }, resources::{IntGridRendering, LdtkSettings, LevelBackground}, @@ -17,13 +17,17 @@ use crate::{ }; use bevy::{prelude::*, render::render_resource::*, sprite}; -use bevy_ecs_tilemap::prelude::*; +use bevy_ecs_tilemap::{ + map::{ + TilemapGridSize, TilemapId, TilemapSize, TilemapSpacing, TilemapTexture, TilemapTileSize, + }, + tiles::{TileBundle, TileColor, TilePos, TileStorage}, + TilemapBundle, +}; use std::collections::{HashMap, HashSet}; use thiserror::Error; -const CHUNK_SIZE: ChunkSize = ChunkSize(32, 32); - #[derive(Error, Debug)] enum BackgroundImageError { #[error("background image handle not loaded into the image assets store")] @@ -121,52 +125,60 @@ fn insert_metadata_to_tile( metadata_inserted } -fn transform_bundle_for_tiles( +fn spatial_bundle_for_tiles( grid_coords: GridCoords, grid_size: i32, layer_scale: Vec3, - parent: Entity, -) -> (Transform, GlobalTransform, Parent) { +) -> SpatialBundle { let mut translation = grid_coords_to_translation_centered(grid_coords, IVec2::splat(grid_size)).extend(0.); - translation /= layer_scale; - ( - Transform::from_translation(translation), - GlobalTransform::default(), - Parent(parent), - ) + SpatialBundle { + transform: Transform::from_translation(translation), + ..default() + } +} + +fn insert_spatial_bundle_for_layer_tiles( + commands: &mut Commands, + storage: &TileStorage, + size: &TilemapSize, + grid_size: i32, + layer_scale: Vec3, + tilemap_id: TilemapId, +) { + for x in 0..size.x { + for y in 0..size.y { + let tile_pos = TilePos { x, y }; + let tile_entity = storage.get(&tile_pos); + + if let Some(tile_entity) = tile_entity { + let spatial_bundle = + spatial_bundle_for_tiles(tile_pos.into(), grid_size, layer_scale); + + commands.entity(tile_entity).insert_bundle(spatial_bundle); + commands.entity(tilemap_id.0).add_child(tile_entity); + } + } + } } #[allow(clippy::too_many_arguments)] -fn insert_metadata_for_layer( +fn insert_tile_metadata_for_layer( commands: &mut Commands, - layer_builder: &mut LayerBuilder, + tile_storage: &TileStorage, grid_tiles: &[TileInstance], layer_instance: &LayerInstance, metadata_map: &HashMap, enum_tags_map: &HashMap, - layer_scale: Vec3, - layer_entity: Entity, ) { for tile in grid_tiles { let grid_coords = tile_to_grid_coords(tile, layer_instance.c_hei, layer_instance.grid_size); - let tile_entity = layer_builder - .get_tile_entity(commands, grid_coords.into()) - .unwrap(); + let tile_entity = tile_storage.get(&grid_coords.into()).unwrap(); - if insert_metadata_to_tile(commands, tile, tile_entity, metadata_map, enum_tags_map) { - commands - .entity(tile_entity) - .insert_bundle(transform_bundle_for_tiles( - grid_coords, - layer_instance.grid_size, - layer_scale, - layer_entity, - )); - } + insert_metadata_to_tile(commands, tile, tile_entity, metadata_map, enum_tags_map); } } @@ -196,7 +208,6 @@ pub fn spawn_level( asset_server: &AssetServer, images: &mut Assets, texture_atlases: &mut Assets, - meshes: &mut ResMut>, ldtk_entity_map: &LdtkEntityMap, ldtk_int_cell_map: &LdtkIntCellMap, entity_definition_map: &HashMap, @@ -209,13 +220,11 @@ pub fn spawn_level( ) { let level = &ldtk_level.level; - let mut map = Map::new(level.uid as u16, ldtk_entity); - if let Some(layer_instances) = &level.layer_instances { - let mut layer_id = 0; + let mut layer_z = 0; // creating an image to use for the background color, and for intgrid colors - let mut white_image = Image::new_fill( + let white_image = Image::new_fill( Extent3d { width: level.px_wid as u32, height: level.px_hei as u32, @@ -225,40 +234,44 @@ pub fn spawn_level( &[255, 255, 255, 255], TextureFormat::Rgba8UnormSrgb, ); - white_image.texture_descriptor.usage = - TextureUsages::TEXTURE_BINDING | TextureUsages::COPY_SRC | TextureUsages::COPY_DST; let white_image_handle = images.add(white_image); if ldtk_settings.level_background == LevelBackground::Rendered { - let settings = LayerSettings::new( - MapSize(1, 1), - ChunkSize(1, 1), - TileSize(level.px_wid as f32, level.px_hei as f32), - TextureSize(level.px_wid as f32, level.px_hei as f32), - ); - - let (mut layer_builder, layer_entity) = - LayerBuilder::::new(commands, settings, map.id, layer_id); - - match layer_builder.set_tile( - TilePos(0, 0), - TileBundle { - tile: Tile { - color: level.bg_color, - ..Default::default() - }, - ..Default::default() - }, - ) { - Ok(()) => (), - Err(_) => warn!("Encountered error when setting background tile"), - } + let background_entity = commands.spawn().id(); + + let mut storage = TileStorage::empty(TilemapSize { x: 1, y: 1 }); - let layer_bundle = layer_builder.build(commands, meshes, white_image_handle.clone()); - commands.entity(layer_entity).insert_bundle(layer_bundle); - map.add_layer(commands, layer_id, layer_entity); - layer_id += 1; + let tile_entity = commands + .spawn_bundle(TileBundle { + color: TileColor(level.bg_color), + tilemap_id: TilemapId(background_entity), + ..default() + }) + .insert_bundle(SpatialBundle::default()) + .id(); + + storage.set(&TilePos::default(), Some(tile_entity)); + + let tile_size = TilemapTileSize { + x: level.px_wid as f32, + y: level.px_hei as f32, + }; + let texture = TilemapTexture(white_image_handle.clone()); + + commands + .entity(background_entity) + .insert_bundle(TilemapBundle { + tile_size, + storage, + texture, + ..default() + }) + .insert_bundle(SpatialBundle::default()) + .add_child(tile_entity); + commands.entity(ldtk_entity).add_child(background_entity); + + layer_z += 1; // Spawn background image if let (Some(background_image_handle), Some(background_position)) = @@ -270,14 +283,14 @@ pub fn spawn_level( background_image_handle, background_position, level.px_hei, - layer_id as f32, + layer_z as f32, ) { Ok(sprite_sheet_bundle) => { - commands - .spawn_bundle(sprite_sheet_bundle) - .insert(Parent(ldtk_entity)); + commands.entity(ldtk_entity).with_children(|parent| { + parent.spawn_bundle(sprite_sheet_bundle); + }); - layer_id += 1; + layer_z += 1; } Err(e) => warn!("{}", e), } @@ -293,7 +306,7 @@ pub fn spawn_level( entity_instance, entity_definition_map, level.px_hei, - layer_id as f32, + layer_z as f32, ); // Note: entities do not seem to be affected visually by layer offsets in // the editor, so no layer offset is added to the transform here. @@ -337,13 +350,14 @@ pub fn spawn_level( texture_atlases, ); - entity_commands - .insert(transform) - .insert(GlobalTransform::default()); + entity_commands.insert_bundle(SpatialBundle { + transform, + ..default() + }); } } }); - layer_id += 1; + layer_z += 1; } _ => { // The remaining layers have a lot of shared code. @@ -351,43 +365,39 @@ pub fn spawn_level( // 1. There is virtually no difference between AutoTile and Tile layers // 2. IntGrid layers can sometimes have AutoTile functionality - let map_size = MapSize( - (layer_instance.c_wid as f32 / CHUNK_SIZE.0 as f32).ceil() as u32, - (layer_instance.c_hei as f32 / CHUNK_SIZE.1 as f32).ceil() as u32, - ); + let size = TilemapSize { + x: layer_instance.c_wid as u32, + y: layer_instance.c_hei as u32, + }; let tileset_definition = layer_instance .tileset_def_uid .map(|u| tileset_definition_map.get(&u).unwrap()); let tile_size = match tileset_definition { - Some(tileset_definition) => TileSize( - tileset_definition.tile_grid_size as f32, - tileset_definition.tile_grid_size as f32, - ), - None => TileSize( - layer_instance.grid_size as f32, - layer_instance.grid_size as f32, - ), + Some(tileset_definition) => TilemapTileSize { + x: tileset_definition.tile_grid_size as f32, + y: tileset_definition.tile_grid_size as f32, + }, + None => TilemapTileSize { + x: layer_instance.grid_size as f32, + y: layer_instance.grid_size as f32, + }, }; - let texture_size = match tileset_definition { - Some(tileset_definition) => TextureSize( - tileset_definition.px_wid as f32, - tileset_definition.px_hei as f32, - ), - None => TextureSize( - layer_instance.grid_size as f32, - layer_instance.grid_size as f32, - ), + let grid_size = match tileset_definition { + Some(_) => TilemapGridSize { + x: layer_instance.grid_size as f32, + y: layer_instance.grid_size as f32, + }, + None => TilemapGridSize { + x: tile_size.x, + y: tile_size.y, + }, }; - let mut settings = - LayerSettings::new(map_size, CHUNK_SIZE, tile_size, texture_size); - - if let Some(tileset_definition) = tileset_definition { - settings.grid_size = Vec2::splat(layer_instance.grid_size as f32); - if tileset_definition.spacing != 0 { + let spacing = match tileset_definition { + Some(tileset_definition) if tileset_definition.spacing != 0 => { // TODO: Check that this is still an issue with upcoming // bevy_ecs_tilemap releases #[cfg(not(feature = "atlas"))] @@ -395,29 +405,34 @@ pub fn spawn_level( warn!( "Tile spacing on Tile and AutoTile layers requires the \"atlas\" feature" ); + + TilemapSpacing::default() } #[cfg(feature = "atlas")] { - settings.tile_spacing = - Vec2::splat(tileset_definition.spacing as f32); + TilemapSpacing { + x: tileset_definition.spacing as f32, + y: tileset_definition.spacing as f32, + } } } - } + _ => TilemapSpacing::default(), + }; // The change to the settings.grid_size above is supposed to help handle cases // where the tileset's tile size and the layer's tile size are different. // However, changing the grid_size doesn't have any affect with the current // bevy_ecs_tilemap, so the workaround is to scale up the entire layer. - let layer_scale = (settings.grid_size - / Vec2::new(settings.tile_size.0 as f32, settings.tile_size.1 as f32)) + let layer_scale = (Vec2::new(grid_size.x, grid_size.y) + / Vec2::new(tile_size.x, tile_size.y)) .extend(1.); - let image_handle = match tileset_definition { - Some(tileset_definition) => { - tileset_map.get(&tileset_definition.uid).unwrap().clone() - } - None => white_image_handle.clone(), + let texture = match tileset_definition { + Some(tileset_definition) => TilemapTexture( + tileset_map.get(&tileset_definition.uid).unwrap().clone(), + ), + None => TilemapTexture(white_image_handle.clone()), }; let metadata_map: HashMap = tileset_definition @@ -457,24 +472,23 @@ pub fn spawn_level( grid_tiles.extend(layer_instance.auto_layer_tiles.clone()); for (i, grid_tiles) in layer_grid_tiles(grid_tiles).into_iter().enumerate() { - let layer_entity = if layer_instance.layer_instance_type == Type::IntGrid { + let layer_entity = commands.spawn().id(); + + let tilemap_bundle = if layer_instance.layer_instance_type == Type::IntGrid + { // The current spawning of IntGrid layers doesn't allow using // LayerBuilder::new_batch(). // So, the actual LayerBuilder usage diverges greatly here - - let (mut layer_builder, layer_entity) = - LayerBuilder::::new( - commands, - settings, - map.id, - layer_id as u16, - ); + let mut storage = TileStorage::empty(size); match tileset_definition { Some(_) => { set_all_tiles_with_func( - &mut layer_builder, - tile_pos_to_tile_bundle_maker( + commands, + &mut storage, + size, + TilemapId(layer_entity), + tile_pos_to_tile_grid_bundle_maker( tile_pos_to_transparent_tile_maker( tile_pos_to_int_grid_with_grid_tiles_tile_maker( &grid_tiles, @@ -497,8 +511,11 @@ pub fn spawn_level( match ldtk_settings.int_grid_rendering { IntGridRendering::Colorful => { set_all_tiles_with_func( - &mut layer_builder, - tile_pos_to_tile_bundle_maker( + commands, + &mut storage, + size, + TilemapId(layer_entity), + tile_pos_to_tile_grid_bundle_maker( tile_pos_to_transparent_tile_maker( tile_pos_to_int_grid_colored_tile_maker( &layer_instance.int_grid_csv, @@ -513,8 +530,11 @@ pub fn spawn_level( } IntGridRendering::Invisible => { set_all_tiles_with_func( - &mut layer_builder, - tile_pos_to_tile_bundle_maker( + commands, + &mut storage, + size, + TilemapId(layer_entity), + tile_pos_to_tile_grid_bundle_maker( tile_pos_to_transparent_tile_maker( tile_pos_to_tile_if_int_grid_nonzero_maker( tile_pos_to_invisible_tile, @@ -544,9 +564,7 @@ pub fn spawn_level( layer_instance.c_hei as u32, ).expect("int_grid_csv indices should be within the bounds of 0..(layer_width * layer_height)"); - let tile_entity = layer_builder - .get_tile_entity(commands, grid_coords.into()) - .unwrap(); + let tile_entity = storage.get(&grid_coords.into()).unwrap(); let mut entity_commands = commands.entity(tile_entity); @@ -564,112 +582,107 @@ pub fn spawn_level( IntGridCell { value: *value }, layer_instance, ); - - let transform_bundle = transform_bundle_for_tiles( - grid_coords, - layer_instance.grid_size, - layer_scale, - layer_entity, - ); - - entity_commands.insert_bundle(transform_bundle); } } if !(metadata_map.is_empty() && enum_tags_map.is_empty()) { - insert_metadata_for_layer( + insert_tile_metadata_for_layer( commands, - &mut layer_builder, + &storage, &grid_tiles, layer_instance, &metadata_map, &enum_tags_map, - layer_scale, - layer_entity, ); } - let layer_bundle = - layer_builder.build(commands, meshes, image_handle.clone()); - - commands.entity(layer_entity).insert_bundle(layer_bundle); - - layer_entity + TilemapBundle { + grid_size, + size, + spacing, + storage, + texture: texture.clone(), + tile_size, + ..default() + } } else { - let tile_bundle_maker = - tile_pos_to_tile_bundle_maker(tile_pos_to_transparent_tile_maker( + let tile_bundle_maker = tile_pos_to_tile_grid_bundle_maker( + tile_pos_to_transparent_tile_maker( tile_pos_to_tile_maker( &grid_tiles, layer_instance.c_hei, layer_instance.grid_size, ), layer_instance.opacity, - )); + ), + ); - if !(metadata_map.is_empty() && enum_tags_map.is_empty()) { - // When we add metadata to tiles, we need to add additional - // components to them. - // This can't be accomplished using LayerBuilder::new_batch, - // so the logic for building layers with metadata is slower. - let (mut layer_builder, layer_entity) = - LayerBuilder::::new( - commands, - settings, - map.id, - layer_id as u16, - ); + // When we add metadata to tiles, we need to add additional + // components to them. + // This can't be accomplished using LayerBuilder::new_batch, + // so the logic for building layers with metadata is slower. + + let mut storage = TileStorage::empty(size); - set_all_tiles_with_func(&mut layer_builder, tile_bundle_maker); + set_all_tiles_with_func( + commands, + &mut storage, + size, + TilemapId(layer_entity), + tile_bundle_maker, + ); - insert_metadata_for_layer( + if !(metadata_map.is_empty() && enum_tags_map.is_empty()) { + insert_tile_metadata_for_layer( commands, - &mut layer_builder, + &storage, &grid_tiles, layer_instance, &metadata_map, &enum_tags_map, - layer_scale, - layer_entity, ); + } - let layer_bundle = - layer_builder.build(commands, meshes, image_handle.clone()); - - commands.entity(layer_entity).insert_bundle(layer_bundle); - - layer_entity - } else { - LayerBuilder::::new_batch( - commands, - settings, - meshes, - image_handle.clone(), - map.id, - layer_id as u16, - tile_bundle_maker, - ) + TilemapBundle { + grid_size, + size, + spacing, + storage, + texture: texture.clone(), + tile_size, + ..default() } }; + insert_spatial_bundle_for_layer_tiles( + commands, + &tilemap_bundle.storage, + &tilemap_bundle.size, + layer_instance.grid_size, + layer_scale, + TilemapId(layer_entity), + ); + let layer_offset = Vec3::new( layer_instance.px_total_offset_x as f32, -layer_instance.px_total_offset_y as f32, - layer_id as f32, + layer_z as f32, ); commands .entity(layer_entity) - .insert( + .insert_bundle(tilemap_bundle) + .insert_bundle(SpatialBundle::from_transform( Transform::from_translation(layer_offset).with_scale(layer_scale), - ) + )) .insert(LayerMetadata::from(layer_instance)); - map.add_layer(commands, layer_id as u16, layer_entity); - layer_id += 1; + commands.entity(ldtk_entity).add_child(layer_entity); + + layer_z += 1; } } } } } - commands.entity(ldtk_entity).insert(map); } diff --git a/src/lib.rs b/src/lib.rs index be4333ba..2e9f4c72 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -28,7 +28,7 @@ //! } //! //! fn setup(mut commands: Commands, asset_server: Res) { -//! commands.spawn_bundle(OrthographicCameraBundle::new_2d()); +//! commands.spawn_bundle(Camera2dBundle::default()); //! //! commands.spawn_bundle(LdtkWorldBundle { //! ldtk_handle: asset_server.load("my_project.ldtk"), @@ -98,7 +98,6 @@ //! [LevelSpawnBehavior::UseWorldTranslation]. use bevy::prelude::*; -use bevy_ecs_tilemap::prelude::*; pub mod app; mod assets; @@ -141,7 +140,7 @@ mod plugin { impl Plugin for LdtkPlugin { fn build(&self, app: &mut App) { - app.add_plugin(TilemapPlugin) + app.add_plugin(bevy_ecs_tilemap::TilemapPlugin) .init_non_send_resource::() .init_non_send_resource::() .init_resource::() @@ -164,10 +163,6 @@ mod plugin { .label(LdtkSystemLabel::PreSpawn) .after(LdtkSystemLabel::LevelSelection), ) - .add_system_to_stage( - CoreStage::PreUpdate, - systems::set_ldtk_texture_filters_to_nearest.label(LdtkSystemLabel::Other), - ) .add_system_to_stage( CoreStage::PreUpdate, systems::worldly_adoption.label(LdtkSystemLabel::Other), diff --git a/src/systems.rs b/src/systems.rs index d0a4dd9a..0323d11d 100644 --- a/src/systems.rs +++ b/src/systems.rs @@ -10,8 +10,7 @@ use crate::{ utils::*, }; -use bevy::{prelude::*, render::render_resource::*}; -use bevy_ecs_tilemap::prelude::*; +use bevy::prelude::*; use std::collections::{HashMap, HashSet}; pub fn choose_levels( @@ -55,18 +54,16 @@ pub fn choose_levels( pub fn apply_level_set( mut commands: Commands, ldtk_world_query: Query<(Entity, &LevelSet, &Children, &Handle), Changed>, - mut ldtk_level_query: Query<(&Handle, &mut Map)>, + ldtk_level_query: Query<&Handle>, ldtk_assets: Res>, level_assets: Res>, ldtk_settings: Res, mut level_events: EventWriter, - layers: Query<&Layer>, - chunks: Query<&Chunk>, ) { for (world_entity, level_set, children, ldtk_asset_handle) in ldtk_world_query.iter() { let mut previous_level_maps = HashMap::new(); for child in children.iter() { - if let Ok((level_handle, _)) = ldtk_level_query.get(*child) { + if let Ok(level_handle) = ldtk_level_query.get(*child) { if let Some(ldtk_level) = level_assets.get(level_handle) { previous_level_maps.insert(ldtk_level.level.iid.clone(), child); } @@ -91,11 +88,8 @@ pub fn apply_level_set( let map_entity = previous_level_maps.get(iid).expect( "The set of previous_iids and the keys in previous_level_maps should be the same.", ); - if let Ok((_, mut map)) = ldtk_level_query.get_mut(**map_entity) { - clear_map(&mut commands, &mut map, &layers, &chunks); - map.despawn(&mut commands); - level_events.send(LevelEvent::Despawned(iid.clone())); - } + commands.entity(**map_entity).despawn_recursive(); + level_events.send(LevelEvent::Despawned(iid.clone())); } } } @@ -107,27 +101,43 @@ pub fn process_ldtk_world( mut ldtk_events: EventReader>, mut level_events: EventWriter, new_ldtks: Query<&Handle, Added>>, - mut ldtk_level_query: Query<&mut Map, With>>, + mut ldtk_level_query: Query<&Handle>, mut ldtk_world_query: Query<(Entity, &Handle, &mut LevelSet, Option<&Children>)>, level_selection: Option>, ldtk_assets: Res>, + level_assets: Res>, ldtk_settings: Res, mut clear_color: ResMut, - layer_query: Query<&Layer>, - chunk_query: Query<&Chunk>, + mut created_assets: Local>>, ) { + let mut changed_ldtks = HashSet::new(); + + // Map despawning should only be run for LDtk handles that have already been spawned + // So, the `new` field indicates that the asset/entity is new, so no despawning needs to happen + #[derive(Hash, PartialEq, Eq)] + struct ChangedLdtk { + handle: Handle, + new: bool, + } + // This function uses code from the bevy_ecs_tilemap ldtk example // https://github.com/StarArawn/bevy_ecs_tilemap/blob/main/examples/ldtk/ldtk.rs - let mut changed_ldtks = Vec::new(); for event in ldtk_events.iter() { match event { AssetEvent::Created { handle } => { debug!("LDtk asset creation detected."); - changed_ldtks.push(handle.clone()); + created_assets.insert(handle.clone_weak()); + changed_ldtks.insert(ChangedLdtk { + handle: handle.clone(), + new: true, + }); } AssetEvent::Modified { handle } => { info!("LDtk asset modification detected."); - changed_ldtks.push(handle.clone()); + changed_ldtks.insert(ChangedLdtk { + handle: handle.clone(), + new: false, + }); } AssetEvent::Removed { handle } => { info!("LDtk asset removal detected."); @@ -135,35 +145,42 @@ pub fn process_ldtk_world( // events are ordered so future modification events are ok changed_ldtks = changed_ldtks .into_iter() - .filter(|changed_handle| changed_handle != handle) + .filter(|changed_handle| changed_handle.handle != *handle) .collect(); } } } for new_ldtk_handle in new_ldtks.iter() { - changed_ldtks.push(new_ldtk_handle.clone()); + // For new LDtk handles, spawning should only occur if its asset has finished loading. + // `created_assets` keeps track of that. + if created_assets.contains(new_ldtk_handle) { + changed_ldtks.insert(ChangedLdtk { + handle: new_ldtk_handle.clone(), + new: true, + }); + } } for changed_ldtk in changed_ldtks { for (ldtk_entity, ldtk_handle, mut level_set, children) in ldtk_world_query .iter_mut() - .filter(|(_, l, _, _)| **l == changed_ldtk) + .filter(|(_, l, _, _)| **l == changed_ldtk.handle) { if let Some(ldtk_asset) = ldtk_assets.get(ldtk_handle) { - if let Some(children) = children { - for child in children.iter() { - if let Ok(mut map) = ldtk_level_query.get_mut(*child) { - clear_map(&mut commands, &mut map, &layer_query, &chunk_query); - map.despawn(&mut commands); - - if let Some(level) = - ldtk_asset.get_level(&LevelSelection::Uid(map.id as i32)) - { - level_events.send(LevelEvent::Despawned(level.iid.clone())); + if !changed_ldtk.new { + if let Some(children) = children { + for child in children.iter() { + if let Ok(level_handle) = ldtk_level_query.get_mut(*child) { + commands.entity(*child).despawn_recursive(); + + if let Some(level) = level_assets.get(level_handle) { + level_events + .send(LevelEvent::Despawned(level.level.iid.clone())); + } + } else { + commands.entity(*child).despawn_recursive(); } - } else { - commands.entity(*child).despawn_recursive(); } } } @@ -229,44 +246,10 @@ fn pre_spawn_level( child_builder .spawn() .insert(level_handle.clone()) - .insert_bundle(( - Transform::from_translation(translation), - GlobalTransform::default(), - )); - } -} - -fn clear_map( - commands: &mut Commands, - map: &mut Map, - layer_query: &Query<&Layer>, - chunk_query: &Query<&Chunk>, -) { - for (layer_id, layer_entity) in map.get_layers() { - if let Ok(layer) = layer_query.get(layer_entity) { - for x in 0..layer.get_layer_size_in_tiles().0 { - for y in 0..layer.get_layer_size_in_tiles().1 { - let tile_pos = TilePos(x, y); - let chunk_pos = ChunkPos( - tile_pos.0 / layer.settings.chunk_size.0, - tile_pos.1 / layer.settings.chunk_size.1, - ); - if let Some(chunk_entity) = layer.get_chunk(chunk_pos) { - if let Ok(chunk) = chunk_query.get(chunk_entity) { - if let Ok(chunk_tile_pos) = chunk.to_chunk_pos(tile_pos) { - if let Some(tile) = chunk.get_tile_entity(chunk_tile_pos) { - commands.entity(tile).despawn_recursive(); - } - } - } - - commands.entity(chunk_entity).despawn_recursive(); - } - } - } - - map.remove_layer(commands, layer_id); - } + .insert_bundle(SpatialBundle { + transform: Transform::from_translation(translation), + ..default() + }); } } @@ -277,7 +260,6 @@ pub fn process_ldtk_levels( mut commands: Commands, asset_server: Res, mut images: ResMut>, - mut meshes: ResMut>, mut texture_atlases: ResMut>, ldtk_assets: Res>, level_assets: Res>, @@ -290,7 +272,7 @@ pub fn process_ldtk_levels( ldtk_settings: Res, ) { for (ldtk_entity, level_handle, parent) in level_query.iter() { - if let Ok(ldtk_handle) = ldtk_query.get(parent.0) { + if let Ok(ldtk_handle) = ldtk_query.get(parent.get()) { if let Some(ldtk_asset) = ldtk_assets.get(ldtk_handle) { let tileset_definition_map: HashMap = ldtk_asset .project @@ -315,7 +297,6 @@ pub fn process_ldtk_levels( &asset_server, &mut images, &mut texture_atlases, - &mut meshes, &ldtk_entity_map, &ldtk_int_cell_map, &entity_definition_map, @@ -334,43 +315,16 @@ pub fn process_ldtk_levels( } pub fn worldly_adoption( - mut worldly_query: Query<(&mut Transform, &mut Parent), Added>, + mut commands: Commands, + mut worldly_query: Query<(&mut Transform, &Parent, Entity), Added>, transform_query: Query<(&Transform, &Parent), Without>, ) { - for (mut transform, mut parent) in worldly_query.iter_mut() { - if let Ok((level_transform, level_parent)) = transform_query.get(parent.0) { + for (mut transform, parent, entity) in worldly_query.iter_mut() { + if let Ok((level_transform, level_parent)) = transform_query.get(parent.get()) { + // Find the entity's world-relative transform, so it doesn't move when its parent changes *transform = level_transform.mul_transform(*transform); - parent.0 = level_parent.0 - } - } -} - -pub fn set_ldtk_texture_filters_to_nearest( - mut texture_events: EventReader>, - mut textures: ResMut>, - ldtk_assets: Res>, -) { - // Based on - // https://github.com/StarArawn/bevy_ecs_tilemap/blob/main/examples/helpers/texture.rs, - // except it only applies to the ldtk tilesets. - for event in texture_events.iter() { - if let AssetEvent::Created { handle } = event { - let mut set_texture_filters_to_nearest = false; - - for (_, ldtk_asset) in ldtk_assets.iter() { - if ldtk_asset.tileset_map.iter().any(|(_, v)| v == handle) { - set_texture_filters_to_nearest = true; - break; - } - } - - if set_texture_filters_to_nearest { - if let Some(mut texture) = textures.get_mut(handle) { - texture.texture_descriptor.usage = TextureUsages::TEXTURE_BINDING - | TextureUsages::COPY_SRC - | TextureUsages::COPY_DST; - } - } + // Make it a child of the world + commands.entity(level_parent.get()).add_child(entity); } } } diff --git a/src/tile_makers.rs b/src/tile_makers.rs index 7fe33f4e..53229f9f 100644 --- a/src/tile_makers.rs +++ b/src/tile_makers.rs @@ -2,16 +2,10 @@ //! //! A tile maker is a function loosely defined with the following signature: //! ```ignore -//! impl FnMut(TilePos) -> Option +//! impl FnMut(TilePos) -> Option //! ``` //! -//! Similarly, tile bundle makers are functions loosely defined as: -//! ```ignore -//! impl FnMut(TilePos) -> Option where T: TileBundleTrait -//! ``` -//! -//! Tile bundle makers can be used with [LayerBuilder::new_batch] and [set_all_tiles_with_func] to -//! spawn many tiles at once. +//! Tile makers can be used with [set_all_tiles_with_func] to spawn many tiles at once. use crate::{ components::TileGridBundle, @@ -20,17 +14,60 @@ use crate::{ utils::*, }; use bevy::prelude::*; -use bevy_ecs_tilemap::prelude::*; +use bevy_ecs_tilemap::tiles::{TileBundle, TileColor, TileFlip, TilePos, TileTexture, TileVisible}; use std::collections::HashMap; +#[derive(Clone, Eq, PartialEq, Debug, Default, Hash)] +pub(crate) struct TilePosMap { + data: Vec>>, +} + +impl TilePosMap { + fn new() -> Self { + TilePosMap:: { data: Vec::new() } + } + + fn get(&self, tile_pos: &TilePos) -> Option<&T> { + self.data + .get(tile_pos.y as usize)? + .get(tile_pos.x as usize)? + .as_ref() + } + + fn set(&mut self, tile_pos: TilePos, value: T) { + while self.data.get(tile_pos.y as usize).is_none() { + self.data.push(Vec::new()); + } + + while self.data[tile_pos.y as usize] + .get(tile_pos.x as usize) + .is_none() + { + self.data[tile_pos.y as usize].push(None); + } + + self.data[tile_pos.y as usize][tile_pos.x as usize] = Some(value); + } +} + +impl FromIterator<(TilePos, T)> for TilePosMap { + fn from_iter>(iter: I) -> Self { + let mut tile_pos_map = TilePosMap::new(); + + iter.into_iter().for_each(|(t, v)| tile_pos_map.set(t, v)); + + tile_pos_map + } +} + /// Tile maker that always creates an invisible tile. /// /// This function doesn't return a tile maker, it IS one, /// contrasting many of the other functions in this module. -pub(crate) fn tile_pos_to_invisible_tile(_: TilePos) -> Option { - Some(Tile { - visible: false, +pub(crate) fn tile_pos_to_invisible_tile(_: TilePos) -> Option { + Some(TileBundle { + visible: TileVisible(false), ..Default::default() }) } @@ -40,7 +77,7 @@ pub(crate) fn tile_pos_to_int_grid_map( int_grid_csv: &[i32], layer_width_in_tiles: i32, layer_height_in_tiles: i32, -) -> HashMap { +) -> TilePosMap { int_grid_csv.iter().enumerate().filter(|(_, v)| **v != 0).map(|(i, v)| { ( int_grid_index_to_grid_coords(i, layer_width_in_tiles as u32, layer_height_in_tiles as u32).expect("int_grid_csv indices should be within the bounds of 0..(layer_width * layer_height)",).into(), @@ -56,8 +93,8 @@ pub(crate) fn tile_pos_to_tile_maker( grid_tiles: &[TileInstance], layer_height_in_tiles: i32, layer_grid_size: i32, -) -> impl FnMut(TilePos) -> Option { - let grid_tile_map: HashMap = grid_tiles +) -> impl FnMut(TilePos) -> Option { + let grid_tile_map: TilePosMap = grid_tiles .iter() .map(|t| { ( @@ -67,7 +104,7 @@ pub(crate) fn tile_pos_to_tile_maker( }) .collect(); - move |tile_pos: TilePos| -> Option { + move |tile_pos: TilePos| -> Option { match grid_tile_map.get(&tile_pos) { Some(tile_instance) => { let (flip_x, flip_y) = match tile_instance.f { @@ -77,11 +114,14 @@ pub(crate) fn tile_pos_to_tile_maker( _ => (false, false), }; - Some(Tile { - texture_index: tile_instance.t as u16, - flip_x, - flip_y, - ..Default::default() + Some(TileBundle { + texture: TileTexture(tile_instance.t as u32), + flip: TileFlip { + x: flip_x, + y: flip_y, + ..default() + }, + ..default() }) } None => None, @@ -95,15 +135,15 @@ pub(crate) fn tile_pos_to_tile_maker( /// /// Used for spawning IntGrid layers with AutoTile functionality. pub(crate) fn tile_pos_to_tile_if_int_grid_nonzero_maker( - mut tile_maker: impl FnMut(TilePos) -> Option, + mut tile_maker: impl FnMut(TilePos) -> Option, int_grid_csv: &[i32], layer_width_in_tiles: i32, layer_height_in_tiles: i32, -) -> impl FnMut(TilePos) -> Option { +) -> impl FnMut(TilePos) -> Option { let int_grid_map = tile_pos_to_int_grid_map(int_grid_csv, layer_width_in_tiles, layer_height_in_tiles); - move |tile_pos: TilePos| -> Option { + move |tile_pos: TilePos| -> Option { int_grid_map .get(&tile_pos) .and_then(|_| tile_maker(tile_pos)) @@ -122,7 +162,7 @@ pub(crate) fn tile_pos_to_int_grid_with_grid_tiles_tile_maker( layer_width_in_tiles: i32, layer_height_in_tiles: i32, layer_grid_size: i32, -) -> impl FnMut(TilePos) -> Option { +) -> impl FnMut(TilePos) -> Option { // Creating the tile makers outside of the returned tile maker so we only do it once. let mut auto_tile_maker = tile_pos_to_tile_maker(grid_tiles, layer_height_in_tiles, layer_grid_size); @@ -133,7 +173,7 @@ pub(crate) fn tile_pos_to_int_grid_with_grid_tiles_tile_maker( layer_height_in_tiles, ); - move |tile_pos: TilePos| -> Option { + move |tile_pos: TilePos| -> Option { auto_tile_maker(tile_pos).or_else(|| invisible_tile_maker(tile_pos)) } } @@ -146,7 +186,7 @@ pub(crate) fn tile_pos_to_int_grid_colored_tile_maker( int_grid_value_defs: &[IntGridValueDefinition], layer_width_in_tiles: i32, layer_height_in_tiles: i32, -) -> impl FnMut(TilePos) -> Option { +) -> impl FnMut(TilePos) -> Option { let color_map: HashMap = int_grid_value_defs .iter() .map(|IntGridValueDefinition { value, color, .. }| (*value, *color)) @@ -154,12 +194,14 @@ pub(crate) fn tile_pos_to_int_grid_colored_tile_maker( let tile_pos_map = tile_pos_to_int_grid_map(int_grid_csv, layer_width_in_tiles, layer_height_in_tiles); - move |tile_pos: TilePos| -> Option { - tile_pos_map.get(&tile_pos).map(|&value| Tile { - color: *color_map - .get(&value) - .expect("Int grid values should have an associated IntGridValueDefinition"), - ..Default::default() + move |tile_pos: TilePos| -> Option { + tile_pos_map.get(&tile_pos).map(|&value| TileBundle { + color: TileColor( + *color_map + .get(&value) + .expect("Int grid values should have an associated IntGridValueDefinition"), + ), + ..default() }) } } @@ -169,13 +211,13 @@ pub(crate) fn tile_pos_to_int_grid_colored_tile_maker( /// /// Used for spawning Tile, AutoTile, and IntGrid layers. pub(crate) fn tile_pos_to_transparent_tile_maker( - mut tile_maker: impl FnMut(TilePos) -> Option, + mut tile_maker: impl FnMut(TilePos) -> Option, alpha: f32, -) -> impl FnMut(TilePos) -> Option { - move |tile_pos: TilePos| -> Option { +) -> impl FnMut(TilePos) -> Option { + move |tile_pos: TilePos| -> Option { if alpha < 1. { tile_maker(tile_pos).map(|mut tile| { - tile.color.set_a(alpha); + tile.color.0.set_a(alpha); tile }) } else { @@ -187,16 +229,17 @@ pub(crate) fn tile_pos_to_transparent_tile_maker( /// Returns a tile bundle maker that returns the bundled result of the provided tile maker. /// /// Used for spawning Tile, AutoTile, and IntGrid layers. -pub(crate) fn tile_pos_to_tile_bundle_maker( - mut tile_maker: impl FnMut(TilePos) -> Option, +pub(crate) fn tile_pos_to_tile_grid_bundle_maker( + mut tile_maker: impl FnMut(TilePos) -> Option, ) -> impl FnMut(TilePos) -> Option { move |tile_pos: TilePos| -> Option { - tile_maker(tile_pos).map(|tile| TileGridBundle { - grid_coords: tile_pos.into(), - tile_bundle: TileBundle { - tile, - ..Default::default() - }, + tile_maker(tile_pos).map(|mut tile_bundle| { + tile_bundle.position = tile_pos; + + TileGridBundle { + grid_coords: tile_pos.into(), + tile_bundle, + } }) } } @@ -236,10 +279,10 @@ mod tests { let mut tile_maker = tile_pos_to_tile_maker(&grid_tiles, 2, 32); - assert_eq!(tile_maker(TilePos(0, 0)).unwrap().texture_index, 2); - assert_eq!(tile_maker(TilePos(1, 0)).unwrap().texture_index, 1); - assert_eq!(tile_maker(TilePos(0, 1)).unwrap().texture_index, 1); - assert_eq!(tile_maker(TilePos(1, 1)).unwrap().texture_index, 4); + assert_eq!(tile_maker(TilePos { x: 0, y: 0 }).unwrap().texture.0, 2); + assert_eq!(tile_maker(TilePos { x: 1, y: 0 }).unwrap().texture.0, 1); + assert_eq!(tile_maker(TilePos { x: 0, y: 1 }).unwrap().texture.0, 1); + assert_eq!(tile_maker(TilePos { x: 1, y: 1 }).unwrap().texture.0, 4); } #[test] @@ -277,17 +320,17 @@ mod tests { let mut tile_maker = tile_pos_to_tile_maker(&grid_tiles, 2, 32); - assert!(!tile_maker(TilePos(0, 0)).unwrap().flip_x); - assert!(tile_maker(TilePos(0, 0)).unwrap().flip_y); + assert!(!tile_maker(TilePos { x: 0, y: 0 }).unwrap().flip.x); + assert!(tile_maker(TilePos { x: 0, y: 0 }).unwrap().flip.y); - assert!(!tile_maker(TilePos(0, 1)).unwrap().flip_x); - assert!(!tile_maker(TilePos(0, 1)).unwrap().flip_y); + assert!(!tile_maker(TilePos { x: 0, y: 1 }).unwrap().flip.x); + assert!(!tile_maker(TilePos { x: 0, y: 1 }).unwrap().flip.y); - assert!(tile_maker(TilePos(1, 1)).unwrap().flip_x); - assert!(!tile_maker(TilePos(1, 1)).unwrap().flip_y); + assert!(tile_maker(TilePos { x: 1, y: 1 }).unwrap().flip.x); + assert!(!tile_maker(TilePos { x: 1, y: 1 }).unwrap().flip.y); - assert!(tile_maker(TilePos(2, 1)).unwrap().flip_x); - assert!(tile_maker(TilePos(2, 1)).unwrap().flip_y); + assert!(tile_maker(TilePos { x: 2, y: 1 }).unwrap().flip.x); + assert!(tile_maker(TilePos { x: 2, y: 1 }).unwrap().flip.y); } #[test] @@ -318,16 +361,16 @@ mod tests { let mut tile_maker = tile_pos_to_int_grid_with_grid_tiles_tile_maker(&grid_tiles, &int_grid_csv, 2, 2, 32); - assert_eq!(tile_maker(TilePos(0, 0)).unwrap().texture_index, 0); - assert_eq!(tile_maker(TilePos(0, 0)).unwrap().visible, false); + assert_eq!(tile_maker(TilePos { x: 0, y: 0 }).unwrap().texture.0, 0); + assert_eq!(tile_maker(TilePos { x: 0, y: 0 }).unwrap().visible.0, false); - assert!(tile_maker(TilePos(1, 0)).is_none()); + assert!(tile_maker(TilePos { x: 1, y: 0 }).is_none()); - assert_eq!(tile_maker(TilePos(0, 1)).unwrap().texture_index, 1); - assert_eq!(tile_maker(TilePos(0, 1)).unwrap().visible, true); + assert_eq!(tile_maker(TilePos { x: 0, y: 1 }).unwrap().texture.0, 1); + assert_eq!(tile_maker(TilePos { x: 0, y: 1 }).unwrap().visible.0, true); - assert_eq!(tile_maker(TilePos(1, 1)).unwrap().texture_index, 2); - assert_eq!(tile_maker(TilePos(1, 1)).unwrap().visible, true); + assert_eq!(tile_maker(TilePos { x: 1, y: 1 }).unwrap().texture.0, 2); + assert_eq!(tile_maker(TilePos { x: 1, y: 1 }).unwrap().visible.0, true); } #[test] @@ -350,9 +393,15 @@ mod tests { let mut tile_maker = tile_pos_to_int_grid_colored_tile_maker(&int_grid_csv, &int_grid_defs, 2, 2); - assert_eq!(tile_maker(TilePos(0, 0)).unwrap().color, Color::BLUE); - assert!(tile_maker(TilePos(1, 0)).is_none()); - assert!(tile_maker(TilePos(0, 1)).is_none()); - assert_eq!(tile_maker(TilePos(1, 1)).unwrap().color, Color::RED); + assert_eq!( + tile_maker(TilePos { x: 0, y: 0 }).unwrap().color.0, + Color::BLUE + ); + assert!(tile_maker(TilePos { x: 1, y: 0 }).is_none()); + assert!(tile_maker(TilePos { x: 0, y: 1 }).is_none()); + assert_eq!( + tile_maker(TilePos { x: 1, y: 1 }).unwrap().color.0, + Color::RED + ); } } diff --git a/src/utils.rs b/src/utils.rs index 195ccd2a..5928b1d4 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -6,9 +6,12 @@ use crate::{ components::{GridCoords, IntGridCell}, }; -use crate::ldtk::*; +use crate::{components::TileGridBundle, ldtk::*}; use bevy::prelude::*; -use bevy_ecs_tilemap::prelude::*; +use bevy_ecs_tilemap::{ + map::{TilemapId, TilemapSize}, + tiles::{TilePos, TileStorage}, +}; use std::{collections::HashMap, hash::Hash}; @@ -199,21 +202,19 @@ pub fn ldtk_pixel_coords_to_translation_pivoted( /// /// This allows for more methods to be performed on the [LayerBuilder] before building it. /// However, the performance cons of using non-batch methods still apply here. -pub fn set_all_tiles_with_func( - layer_builder: &mut LayerBuilder, - mut func: impl FnMut(TilePos) -> Option, -) where - T: TileBundleTrait, -{ - let map_size: Vec2 = layer_builder.settings.map_size.into(); - let chunk_size: Vec2 = layer_builder.settings.chunk_size.into(); - let map_size_in_tiles = (map_size * chunk_size).as_uvec2(); - for x in 0..map_size_in_tiles.x { - for y in 0..map_size_in_tiles.y { - let tile_pos = TilePos(x, y); - if let Some(t) = func(tile_pos) { - layer_builder.set_tile(tile_pos, t).unwrap() - } +pub(crate) fn set_all_tiles_with_func( + commands: &mut Commands, + storage: &mut TileStorage, + size: TilemapSize, + tilemap_id: TilemapId, + mut func: impl FnMut(TilePos) -> Option, +) { + for x in 0..size.x { + for y in 0..size.y { + let tile_pos = TilePos { x, y }; + let tile_entity = func(tile_pos) + .map(|tile_bundle| commands.spawn_bundle(tile_bundle).insert(tilemap_id).id()); + storage.set(&tile_pos, tile_entity); } } } @@ -282,6 +283,7 @@ pub fn sprite_sheet_bundle_from_entity_info( tileset_definition.c_wid as usize, tileset_definition.c_hei as usize, Vec2::splat(tileset_definition.spacing as f32), + Vec2::ZERO, )), sprite: TextureAtlasSprite { index: (tile.y / (tile.h + tileset_definition.spacing)) as usize