diff --git a/Cargo.lock b/Cargo.lock index 816b8a9..6f1c616 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -80,6 +80,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + [[package]] name = "ahash" version = "0.8.11" @@ -90,7 +96,7 @@ dependencies = [ "getrandom", "once_cell", "version_check", - "zerocopy 0.7.35", + "zerocopy", ] [[package]] @@ -203,9 +209,9 @@ checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "as-raw-xcb-connection" @@ -320,9 +326,9 @@ checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "bevy" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e938630e9f472b1899c78ef84aa907081b23bad8333140e2295c620485b6ee7" +checksum = "c8ece0d8dde51890fb52dcba5b04fd1c657617a4022908c327b2d6e83d173a32" dependencies = [ "bevy_dylib", "bevy_internal", @@ -330,9 +336,9 @@ dependencies = [ [[package]] name = "bevy-inspector-egui" -version = "0.25.1" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8d77dbe53c8840aa74b66ea19dac6675d0a1752c989610cbded909d03967bec" +checksum = "8b66b51a66c0be92604c13cd490509d77676c05406f4f4b046672aaffdcc925f" dependencies = [ "bevy-inspector-egui-derive", "bevy_app", @@ -363,20 +369,20 @@ dependencies = [ [[package]] name = "bevy-inspector-egui-derive" -version = "0.25.0" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "161d93f4b3a9246a87485e30ccf4cc927f204a14f26df42da977e383f0a0ec5d" +checksum = "791acfac11e3d5a750952c5201dc0d414b88431260118b46949bf6b159c5a19c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] name = "bevy_a11y" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e613f0e7d5a92637e59744f7185e374c9a59654ecc6d7575adcec9581db1363" +checksum = "82d84e0ae7155afa21c4926fb8b89ebe0cbd66239ac817fdb834025327c4089b" dependencies = [ "accesskit", "bevy_app", @@ -386,9 +392,9 @@ dependencies = [ [[package]] name = "bevy_app" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f548e9dab7d10c5f99e3b504c758c4bf87aa67df9bcb9cc8b317a0271770e72" +checksum = "0af99549f5de61cc91c8c23303b13aa07f97b73fbace39695dee0a0a32cec9d4" dependencies = [ "bevy_derive", "bevy_ecs", @@ -404,9 +410,9 @@ dependencies = [ [[package]] name = "bevy_asset" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d198e4c3419215de2ad981d4e734bbfab46469b7575e3b7150c912b9ec5175" +checksum = "6533d17f13b44ea4fb5177f83b0900269ed13c0fd45772ccffd19a69980647ec" dependencies = [ "async-broadcast", "async-fs", @@ -436,21 +442,21 @@ dependencies = [ [[package]] name = "bevy_asset_macros" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11b2cbeba287a4b44e116c33dbaf37dce80a9d84477b2bb35ff459999d6c9e1b" +checksum = "74b0e132a89e254c0f5c8bc8deebb0f2490f5662f4aa2215a6996701446d6a7b" dependencies = [ "bevy_macro_utils", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] name = "bevy_color" -version = "0.14.1" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a933306f5c7dc9568209180f482b28b5f40d2f8d5b361bc1b270c0a588752c0" +checksum = "82c031f121b8d72e7637c94ef139097613bd32935784d36728f83e77cfdf26f4" dependencies = [ "bevy_math", "bevy_reflect", @@ -463,9 +469,9 @@ dependencies = [ [[package]] name = "bevy_core" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ddeed5ebf2fa75a4d4f32e2da9c60f11037e36252695059a151c6685cd3d72b" +checksum = "8ccc7118a2865267136afb5e6a2c0aed30994e522f298b2ba0b088878e6ddf59" dependencies = [ "bevy_app", "bevy_ecs", @@ -477,9 +483,9 @@ dependencies = [ [[package]] name = "bevy_core_pipeline" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b978220b5edc98f2c5cbbd14c118c74b3ec7216e5416d3c187c1097279b009b" +checksum = "559ad1dc48c3fa6bbace503df2fe44a7de38c8dfe11bee911ec0ffaf93e3e57d" dependencies = [ "bevy_app", "bevy_asset", @@ -502,20 +508,20 @@ dependencies = [ [[package]] name = "bevy_derive" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8a8173bad3ed53fa158806b1beda147263337d6ef71a093780dd141b74386b1" +checksum = "8675f337f374b2b8ae90539982b947d171f9adb302d00c032b823bd5231f8978" dependencies = [ "bevy_macro_utils", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] name = "bevy_diagnostic" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7f82011fd70048be282526a99756d54bf00e874edafa9664ba0dc247678f03" +checksum = "fdcc1d7ba5797e4285a7867227134d4cabaaf8cabfb7cdc42eb697d3b3db0460" dependencies = [ "bevy_app", "bevy_core", @@ -529,18 +535,18 @@ dependencies = [ [[package]] name = "bevy_dylib" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8494bf550eb30f570da1563217bcea25530cf29b35d35887ca6c2d76a411d00" +checksum = "521e5c295b80798b7a886aab4e54d0a92ea1780aa9586cdb17ded1fe34f36504" dependencies = [ "bevy_internal", ] [[package]] name = "bevy_ecs" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c77fdc3a7230eff2fcebe4bd17c155bd238c660a0089d0f98c39ba0d461b923" +checksum = "7a3eed7f144811946ebfa1c740da9e3bcd6dd2dd4da844eda085249d29bc9fef" dependencies = [ "arrayvec", "bevy_ecs_macros", @@ -559,20 +565,20 @@ dependencies = [ [[package]] name = "bevy_ecs_macros" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9272b511958525306cd141726d3ca59740f79fc0707c439b55a007bcc3497308" +checksum = "d523630f2eb9fde6727e6c5ea48fa708079c5345da21ffeb1a4bd8ca761830da" dependencies = [ "bevy_macro_utils", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] name = "bevy_editor_pls" version = "0.9.0" -source = "git+https://github.com/zhaop/bevy_editor_pls.git?branch=bevy-0.14#78aa34ce109ecd924928bbd54b04dcd7286ebfea" +source = "git+https://github.com/zhaop/bevy_editor_pls.git?branch=bevy-0.14#8ae7170f4a5851bb5459530510053efa3b95e45e" dependencies = [ "bevy", "bevy_editor_pls_core", @@ -584,7 +590,7 @@ dependencies = [ [[package]] name = "bevy_editor_pls_core" version = "0.9.0" -source = "git+https://github.com/zhaop/bevy_editor_pls.git?branch=bevy-0.14#78aa34ce109ecd924928bbd54b04dcd7286ebfea" +source = "git+https://github.com/zhaop/bevy_editor_pls.git?branch=bevy-0.14#8ae7170f4a5851bb5459530510053efa3b95e45e" dependencies = [ "bevy", "bevy-inspector-egui", @@ -595,7 +601,7 @@ dependencies = [ [[package]] name = "bevy_editor_pls_default_windows" version = "0.9.0" -source = "git+https://github.com/zhaop/bevy_editor_pls.git?branch=bevy-0.14#78aa34ce109ecd924928bbd54b04dcd7286ebfea" +source = "git+https://github.com/zhaop/bevy_editor_pls.git?branch=bevy-0.14#8ae7170f4a5851bb5459530510053efa3b95e45e" dependencies = [ "bevy", "bevy-inspector-egui", @@ -631,9 +637,9 @@ dependencies = [ [[package]] name = "bevy_encase_derive" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0452d8254c8bfae4bff6caca2a8be3b0c1b2e1a72b93e9b9f6a21c8dff807e0" +checksum = "7a20ec101b103f430481112591e280a8fc3f2db6741579f885595372073b749b" dependencies = [ "bevy_macro_utils", "encase_derive_impl", @@ -641,9 +647,9 @@ dependencies = [ [[package]] name = "bevy_gizmos" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdbb0556f0c6e45f4a17aef9c708c06ebf15ae1bed4533d7eddb493409f9f025" +checksum = "248324352331d719071b0d1545a43e3d63470f4730e75312edee575f210d3a77" dependencies = [ "bevy_app", "bevy_asset", @@ -664,21 +670,21 @@ dependencies = [ [[package]] name = "bevy_gizmos_macros" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ef351a4b6498c197d1317c62f46ba84b69fbde3dbeb57beb2e744bbe5b7c3e0" +checksum = "cbe1708bb0e45a1d0fe0f32e998557689231dfe7bdae62083326e8008e97de23" dependencies = [ "bevy_macro_utils", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] name = "bevy_hierarchy" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "802eca6f341d19ade790ccfaba7044be4d823b708087eb5ac4c1f74e4ea0916a" +checksum = "bb332d2789442ca1577c765977bafefea1dcd4db29479713ec8c6932dfb82cdb" dependencies = [ "bevy_app", "bevy_core", @@ -690,9 +696,9 @@ dependencies = [ [[package]] name = "bevy_input" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d050f1433f48ca23f1ea078734ebff119a3f76eb7d221725ab0f1fd9f81230b" +checksum = "a9ce5f27a8729b473205b01927cd6a5c4898a004cb8fcffa7c896e19ba999d98" dependencies = [ "bevy_app", "bevy_ecs", @@ -705,9 +711,9 @@ dependencies = [ [[package]] name = "bevy_internal" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ddd2b23e44d3a1f8ae547cbee5b6661f8135cc456c5de206e8648789944e7a1" +checksum = "c2463102e46d7d67440dbfe3bc97d34bf529c93191c4f4bb41395f4982062ff3" dependencies = [ "bevy_a11y", "bevy_app", @@ -741,9 +747,9 @@ dependencies = [ [[package]] name = "bevy_log" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab641fd0de254915ab746165a07677465b2d89b72f5b49367d73b9197548a35" +checksum = "52f2c0c374af59007396793a51f747f6b10d74ca4acfb080ce0ade267118827b" dependencies = [ "android_log-sys", "bevy_app", @@ -762,37 +768,38 @@ checksum = "7ec4a585ec2a6dedd4f4143c07219d120ae142121929f0d83e68d82a452cdc9b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", - "toml_edit 0.22.20", + "syn 2.0.77", + "toml_edit", ] [[package]] name = "bevy_math" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51bd6ce2174d3237d30e0ab5b2508480cc7593ca4d96ffb3a3095f9fc6bbc34c" +checksum = "40253578fe83a5ffe5f4fcb4dfa196b7d9c50f36dc8efaa231a53344bf4b3e57" dependencies = [ "bevy_reflect", "glam 0.27.0", "rand", + "serde", "smallvec", "thiserror", ] [[package]] name = "bevy_mikktspace" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7ce4266293629a2d10459cc112dffe3b3e9229a4f2b8a4d20061b8dd53316d0" +checksum = "24a1ad15685c6035e01bdc9d5ea082558ef1438e9d40d69fc552857dd7e83e71" dependencies = [ "glam 0.27.0", ] [[package]] name = "bevy_mod_debugdump" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9651b4fb528d1c4800a8da0a5819ebeffb32933654d13e0aa5b6a738146b7f15" +checksum = "30f0eab3099d7d474b25a95a6a2a945e6089d75e099af5a571fe896f7c1a455b" dependencies = [ "bevy_app", "bevy_color", @@ -807,9 +814,9 @@ dependencies = [ [[package]] name = "bevy_pbr" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3effe8ff28899f14d250d0649ca9868dbe68b389d0f2b7af086759b8e16c6e3d" +checksum = "588998ba295db4a14dec54e571f272490f2885e5aaac59191fb4fa32a25835d0" dependencies = [ "bevy_app", "bevy_asset", @@ -834,15 +841,15 @@ dependencies = [ [[package]] name = "bevy_ptr" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c115c97a5c8a263bd0aa7001b999772c744ac5ba797d07c86f25734ce381ea69" +checksum = "7ed72afbb6249a6803a3ed7bd2f68ff080d9392f550475e050b34c1e1c1e3e8f" [[package]] name = "bevy_reflect" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "406ea0fce267169c2320c7302d97d09f605105686346762562c5f65960b5ca2f" +checksum = "fb37e8fc3c61d04da480c95cc8c303aa7781afed6be01dae333b336af493c38e" dependencies = [ "bevy_ptr", "bevy_reflect_derive", @@ -859,22 +866,22 @@ dependencies = [ [[package]] name = "bevy_reflect_derive" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0427fdb4425fc72cc96d45e550df83ace6347f0503840de116c76a40843ba751" +checksum = "8fc00d5086f5bf534b4c2dbeba549a6b8d3223515f3cb5ba4fdaabe953ec6cea" dependencies = [ "bevy_macro_utils", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", "uuid", ] [[package]] name = "bevy_render" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c48acf1ff4267c231def4cbf573248d42ac60c9952108822d505019460bf36d" +checksum = "1f570f36154296ae5377587d5ef19e1feb4c5734923785c571f55a9fff091701" dependencies = [ "async-channel", "bevy_app", @@ -916,23 +923,32 @@ dependencies = [ "wgpu", ] +[[package]] +name = "bevy_render_layers_manager" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12a7767223f722b4214dc2b834984720e842745e529b61cb7b29da241ea3277" +dependencies = [ + "bevy", +] + [[package]] name = "bevy_render_macros" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ddf4a96d71519c8eca3d74dabcb89a9c0d50ab5d9230638cb004145f46e9ed" +checksum = "fe2d5008c7b4a8a516ef7b58452b8e40e4c2317068fc7505398bedf34e8d45f7" dependencies = [ "bevy_macro_utils", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] name = "bevy_scene" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7a9f0388612a116f02ab6187aeab66e52c9e91abbc21f919b8b50230c4d83e7" +checksum = "3910087f6fc45e7833fb62e4de282c36a7012ff381c0584eb2cc84dede02e72f" dependencies = [ "bevy_app", "bevy_asset", @@ -954,6 +970,7 @@ version = "0.4.0" dependencies = [ "bevy", "bevy_editor_pls", + "bevy_render_layers_manager", "fast_poisson", "iyes_perf_ui", "rand", @@ -962,9 +979,9 @@ dependencies = [ [[package]] name = "bevy_sprite" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d837e33ed27b9f2e5212eca4bdd5655a9ee64c52914112e6189c043cb25dd1ec" +checksum = "fffdfb9a18968c8606286b6be83c9323ff9008b5cc043a23a3ecc95ff72fb20c" dependencies = [ "bevy_app", "bevy_asset", @@ -988,9 +1005,9 @@ dependencies = [ [[package]] name = "bevy_state" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0959984092d56885fd3b320ea84fb816821bad6bfa3040b9d4ee850d3273233d" +checksum = "21066e7bb8014d1b1dd4f611f28c0f4ea9c7738cec2325281e4260a65072d509" dependencies = [ "bevy_app", "bevy_ecs", @@ -1009,14 +1026,14 @@ dependencies = [ "bevy_macro_utils", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] name = "bevy_tasks" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a8bfb8d484bdb1e9bec3789c75202adc5e608c4244347152e50fb31668a54f9" +checksum = "84f5414c3f49c96e02ceccf5fa12fb6cfbf8b271d2a820902d6f622e9c2fa681" dependencies = [ "async-channel", "async-executor", @@ -1027,9 +1044,9 @@ dependencies = [ [[package]] name = "bevy_text" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "454fd29b7828244356b2e0ce782e6d0a6f26b47f521456accde3a7191b121727" +checksum = "f3e77dd86def15f5380e6e7c178ec54e5e356b3f464e2ad35794a08d5ecb82e4" dependencies = [ "ab_glyph", "bevy_app", @@ -1050,9 +1067,9 @@ dependencies = [ [[package]] name = "bevy_time" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6c3d3d14ee8b0dbe4819fd516cc75509b61946134d78e0ee89ad3d1835ffe6c" +checksum = "b3fb18cfac62098e07786e422e84b4f45f469f27ccb5b572b409500bef465f33" dependencies = [ "bevy_app", "bevy_ecs", @@ -1064,9 +1081,9 @@ dependencies = [ [[package]] name = "bevy_transform" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97e8aa6b16be573277c6ceda30aebf1d78af7c6ede19b448dcb052fb8601d815" +checksum = "4ff09cea0dd0d4e6a3ed5f7dcbd4fbbcec07e518ceb64a4c8a75dedbe294ab60" dependencies = [ "bevy_app", "bevy_ecs", @@ -1078,9 +1095,9 @@ dependencies = [ [[package]] name = "bevy_ui" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d9f864c646f3742ff77f67bcd89a13a7ab024b68ca2f1bfbab8245bcb1c06c" +checksum = "50684629a03b7d4891b5953e84dd971c7a8bbd290751bab5ce06e119b692220b" dependencies = [ "bevy_a11y", "bevy_app", @@ -1108,9 +1125,9 @@ dependencies = [ [[package]] name = "bevy_utils" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fab364910e8f5839578aba9cfda00a8388e9ebe352ceb8491a742ce6af9ec6e" +checksum = "f6efbe5a621b56cc4ffa41074929eca84107e242302496b9bb7550675e6bf2e7" dependencies = [ "ahash", "bevy_utils_proc_macros", @@ -1123,20 +1140,20 @@ dependencies = [ [[package]] name = "bevy_utils_proc_macros" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad9db261ab33a046e1f54b35f885a44f21fcc80aa2bc9050319466b88fe58fe3" +checksum = "36a1e91b4294cad2d08620ac062509395d4f65247b636946d6497eaeccf4dbfd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] name = "bevy_window" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9ea5777f933bf7ecaeb3af1a30845720ec730e007972ca7d4aba2d3512abe24" +checksum = "8ba11880f05a3b267ecfa4149fe789b0c046c35fd8418dd8899fad3a4359c986" dependencies = [ "bevy_a11y", "bevy_app", @@ -1150,9 +1167,9 @@ dependencies = [ [[package]] name = "bevy_winit" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c2213bbf14debe819ec8ad4913f233c596002d087bc6f1f20d533e2ebaf8c6" +checksum = "d5aeb4b2e3b1ece189fcf37ea2de625ceab93e6ac2a14d4b15b0393351e4c18b" dependencies = [ "accesskit_winit", "approx", @@ -1208,9 +1225,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.5.3" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9ec96fe9a81b5e365f9db71fe00edc4fe4ca2cc7dcb7861f0603012a7caa210" +checksum = "d82033247fd8e890df8f740e407ad4d038debb9eb1f40533fffb32e7d17dc6f7" dependencies = [ "arrayref", "arrayvec", @@ -1266,22 +1283,22 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] name = "bytemuck" -version = "1.16.3" +version = "1.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "102087e286b4677862ea56cf8fc58bb2cdfa8725c40ffb80fe3a008eb7f2fc83" +checksum = "773d90827bc3feecfb67fab12e24de0749aad83c74b9504ecde46237b5cd24e2" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.7.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee891b04274a59bd38b412188e24b849617b2e45a0fd8d057deb63e7403761b" +checksum = "0cc8b54b395f2fcfbb3d90c47b01c7f444d94d05bdeb775811dec868ac3bbc26" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -1298,9 +1315,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.7.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fca2be1d5c43812bae364ee3f30b3afcb7877cf59f4aeb94c66f313a41d2fac9" +checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" [[package]] name = "calloop" @@ -1330,12 +1347,13 @@ dependencies = [ [[package]] name = "cc" -version = "1.1.7" +version = "1.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26a5c3fd7bfa1ce3897a3a3501d362b2d87b7f2583ebcb4a949ec25911025cbc" +checksum = "e9d013ecb737093c0e86b151a7b837993cf9ec6c502946cfb44bedc392421e0b" dependencies = [ "jobserver", "libc", + "shlex", ] [[package]] @@ -1465,9 +1483,9 @@ checksum = "32b13ea120a812beba79e34316b3942a857c86ec1593cb34f27bb28272ce2cca" [[package]] name = "const_panic" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6051f239ecec86fde3410901ab7860d458d160371533842974fc61f96d15879b" +checksum = "7782af8f90fe69a4bb41e460abe1727d493403d8b2cc43201a3a3e906b24379f" [[package]] name = "const_soft_float" @@ -1477,9 +1495,9 @@ checksum = "87ca1caa64ef4ed453e68bb3db612e51cf1b2f5b871337f0fcab1c8f87cc3dff" [[package]] name = "constant_time_eq" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" [[package]] name = "constgebra" @@ -1502,9 +1520,9 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "core-graphics" @@ -1616,7 +1634,7 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -1627,7 +1645,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -1777,7 +1795,7 @@ checksum = "fd31dbbd9743684d339f907a87fe212cb7b51d75b9e8e74181fe363199ee9b47" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -1789,7 +1807,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -1810,7 +1828,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -1862,9 +1880,9 @@ checksum = "a0474425d51df81997e2f90a21591180b38eccf27292d755f3e30750225c175b" [[package]] name = "euclid" -version = "0.22.10" +version = "0.22.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0f0eb73b934648cd7a4a61f1b15391cd95dab0b4da6e2e66c2a072c144b4a20" +checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" dependencies = [ "num-traits", ] @@ -1910,9 +1928,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] name = "fdeflate" @@ -1950,12 +1968,12 @@ checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] name = "flate2" -version = "1.0.30" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" dependencies = [ "crc32fast", - "miniz_oxide", + "miniz_oxide 0.8.0", ] [[package]] @@ -1982,7 +2000,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -2069,7 +2087,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -2413,9 +2431,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3fc2e30ba82dd1b3911c8de1ffc143c74a914a14e99514d7637e3099df5ea0" +checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" dependencies = [ "equivalent", "hashbrown", @@ -2470,9 +2488,9 @@ checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" [[package]] name = "js-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ "wasm-bindgen", ] @@ -2528,9 +2546,9 @@ checksum = "baff4b617f7df3d896f97fe922b64817f6cd9a756bb81d40f8883f2f66dcb401" [[package]] name = "libc" -version = "0.2.155" +version = "0.2.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" [[package]] name = "libloading" @@ -2661,6 +2679,15 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", +] + [[package]] name = "mint" version = "0.5.9" @@ -2762,11 +2789,11 @@ checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" [[package]] name = "normpath" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5831952a9476f2fed74b77d74182fa5ddc4d21c72ec45a333b250e3ed0272804" +checksum = "c8911957c4b1549ac0dc74e30db9c8b0e66ddcd6d7acc33098f4c63a64a6d7ed" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2816,7 +2843,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -3140,7 +3167,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -3157,9 +3184,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "piper" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1d5c74c9876f070d3e8fd503d748c7d974c3e48da8f41350fa5222ef9b4391" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" dependencies = [ "atomic-waker", "fastrand", @@ -3182,14 +3209,14 @@ dependencies = [ "crc32fast", "fdeflate", "flate2", - "miniz_oxide", + "miniz_oxide 0.7.4", ] [[package]] name = "polling" -version = "3.7.2" +version = "3.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3ed00ed3fbf728b5816498ecd316d1716eecaced9c0c8d2c5a6740ca214985b" +checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" dependencies = [ "cfg-if", "concurrent-queue", @@ -3197,7 +3224,7 @@ dependencies = [ "pin-project-lite", "rustix", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -3211,11 +3238,11 @@ dependencies = [ [[package]] name = "ppv-lite86" -version = "0.2.18" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee4364d9f3b902ef14fab8a1ddffb783a1cb6b4bba3bfc1fa3922732c7de97f" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ - "zerocopy 0.6.6", + "zerocopy", ] [[package]] @@ -3232,11 +3259,11 @@ checksum = "f0f73cdaf19b52e6143685c3606206e114a4dfa969d6b14ec3894c88eb38bd4b" [[package]] name = "proc-macro-crate" -version = "3.1.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ - "toml_edit 0.21.1", + "toml_edit", ] [[package]] @@ -3280,27 +3307,27 @@ checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" [[package]] name = "quick-xml" -version = "0.34.0" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f24d770aeca0eacb81ac29dfbc55ebcc09312fdd1f8bbecdc7e4a84e000e3b4" +checksum = "96a05e2e8efddfa51a84ca47cec303fac86c8541b686d37cac5efc0e094417bc" dependencies = [ "memchr", ] [[package]] name = "quote" -version = "1.0.36" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ "proc-macro2", ] [[package]] name = "radsort" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17fd96390ed3feda12e1dfe2645ed587e0bea749e319333f104a33ff62f77a0b" +checksum = "019b4b213425016d7d84a153c4c73afb0946fbb4840e4eece7ba8848b9d6da22" [[package]] name = "rand" @@ -3409,9 +3436,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.5" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", @@ -3500,7 +3527,7 @@ dependencies = [ "regex", "relative-path", "rustc_version", - "syn 2.0.72", + "syn 2.0.77", "unicode-ident", ] @@ -3512,18 +3539,18 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver", ] [[package]] name = "rustix" -version = "0.38.34" +version = "0.38.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +checksum = "3f55e80d50763938498dd5ebb18647174e0c76dc38c5505294bb224624f30f36" dependencies = [ "bitflags 2.6.0", "errno", @@ -3580,22 +3607,22 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.204" +version = "1.0.209" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" +checksum = "99fce0ffe7310761ca6bf9faf5115afbc19688edd00171d81b1bb1b116c63e09" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.204" +version = "1.0.209" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" +checksum = "a5831b979fd7b5439637af1752d535ff49f4860c0f341d1baeb6faf0f4242170" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -3607,6 +3634,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + [[package]] name = "simd-adler32" version = "0.3.7" @@ -3717,9 +3750,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.72" +version = "2.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc4b9b9bf2add8093d3f2c0204471e951b2285580335de42f9d2534f3ae7a8af" +checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" dependencies = [ "proc-macro2", "quote", @@ -3779,7 +3812,7 @@ checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -3849,17 +3882,6 @@ version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" -[[package]] -name = "toml_edit" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" -dependencies = [ - "indexmap", - "toml_datetime", - "winnow 0.5.40", -] - [[package]] name = "toml_edit" version = "0.22.20" @@ -3868,7 +3890,7 @@ checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" dependencies = [ "indexmap", "toml_datetime", - "winnow 0.6.18", + "winnow", ] [[package]] @@ -3890,7 +3912,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -3986,15 +4008,15 @@ dependencies = [ [[package]] name = "ttf-parser" -version = "0.24.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8686b91785aff82828ed725225925b33b4fde44c4bb15876e5f7c832724c420a" +checksum = "5be21190ff5d38e8b4a2d3b6a3ae57f612cc39c96e83cedeaf7abc338a8bac4a" [[package]] name = "typeid" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "059d83cc991e7a42fc37bd50941885db0888e34209f8cfd9aab07ddec03bc9cf" +checksum = "0e13db2e0ccd5e14a544e8a246ba2312cd25223f616442d7f2cb0e3db614236e" [[package]] name = "typenum" @@ -4037,9 +4059,9 @@ checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" [[package]] name = "unicode-xid" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "229730647fbc343e3a80e463c1db7f78f3855d3f3739bee0dda773c9a037c90a" [[package]] name = "url" @@ -4092,34 +4114,35 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" dependencies = [ "cfg-if", "js-sys", @@ -4129,9 +4152,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4139,28 +4162,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.92" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] name = "wayland-backend" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90e11ce2ca99c97b940ee83edbae9da2d56a08f9ea8158550fd77fa31722993" +checksum = "056535ced7a150d45159d3a8dc30f91a2e2d588ca0b23f70e56033622b8016f6" dependencies = [ "cc", "downcast-rs", @@ -4172,9 +4195,9 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.5" +version = "0.31.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e321577a0a165911bdcfb39cf029302479d7527b517ee58ab0f6ad09edf0943" +checksum = "e3f45d1222915ef1fd2057220c1d9d9624b7654443ea35c3877f7a52bd0a5a2d" dependencies = [ "bitflags 2.6.0", "rustix", @@ -4195,9 +4218,9 @@ dependencies = [ [[package]] name = "wayland-cursor" -version = "0.31.5" +version = "0.31.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ef9489a8df197ebf3a8ce8a7a7f0a2320035c3743f3c1bd0bdbccf07ce64f95" +checksum = "3a94697e66e76c85923b0d28a0c251e8f0666f58fc47d316c0f4da6da75d37cb" dependencies = [ "rustix", "wayland-client", @@ -4206,9 +4229,9 @@ dependencies = [ [[package]] name = "wayland-protocols" -version = "0.32.3" +version = "0.32.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62989625a776e827cc0f15d41444a3cea5205b963c3a25be48ae1b52d6b4daaa" +checksum = "2b5755d77ae9040bb872a25026555ce4cb0ae75fd923e90d25fba07d81057de0" dependencies = [ "bitflags 2.6.0", "wayland-backend", @@ -4218,9 +4241,9 @@ dependencies = [ [[package]] name = "wayland-protocols-plasma" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f79f2d57c7fcc6ab4d602adba364bf59a5c24de57bd194486bf9b8360e06bfc4" +checksum = "8a0a41a6875e585172495f7a96dfa42ca7e0213868f4f15c313f7c33221a7eff" dependencies = [ "bitflags 2.6.0", "wayland-backend", @@ -4231,9 +4254,9 @@ dependencies = [ [[package]] name = "wayland-protocols-wlr" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd993de54a40a40fbe5601d9f1fbcaef0aebcc5fda447d7dc8f6dcbaae4f8953" +checksum = "dad87b5fd1b1d3ca2f792df8f686a2a11e3fe1077b71096f7a175ab699f89109" dependencies = [ "bitflags 2.6.0", "wayland-backend", @@ -4244,9 +4267,9 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.31.4" +version = "0.31.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7b56f89937f1cf2ee1f1259cf2936a17a1f45d8f0aa1019fae6d470d304cfa6" +checksum = "597f2001b2e5fc1121e3d5b9791d3e78f05ba6bfa4641053846248e3a13661c3" dependencies = [ "proc-macro2", "quick-xml", @@ -4255,9 +4278,9 @@ dependencies = [ [[package]] name = "wayland-sys" -version = "0.31.4" +version = "0.31.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43676fe2daf68754ecf1d72026e4e6c15483198b5d24e888b74d3f22f887a148" +checksum = "efa8ac0d8e8ed3e3b5c9fc92c7881406a268e11555abe36493efabe649a29e09" dependencies = [ "dlib", "log", @@ -4267,9 +4290,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.69" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" dependencies = [ "js-sys", "wasm-bindgen", @@ -4442,11 +4465,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -4504,7 +4527,7 @@ checksum = "942ac266be9249c84ca862f0a164a39533dc2f6f33dc98ec89c8da99b82ea0bd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -4515,7 +4538,7 @@ checksum = "da33557140a288fae4e1d5f8873aaf9eb6613a9cf82c3e070223ff177f598b60" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] [[package]] @@ -4554,6 +4577,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -4734,9 +4766,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winit" -version = "0.30.4" +version = "0.30.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4225ddd8ab67b8b59a2fee4b34889ebf13c0460c1c3fa297c58e21eb87801b33" +checksum = "0be9e76a1f1077e04a411f0b989cbd3c93339e1771cb41e71ac4aee95bfd2c67" dependencies = [ "ahash", "android-activity", @@ -4784,15 +4816,6 @@ dependencies = [ "xkbcommon-dl", ] -[[package]] -name = "winnow" -version = "0.5.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] - [[package]] name = "winnow" version = "0.6.18" @@ -4836,9 +4859,9 @@ checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" [[package]] name = "xcursor" -version = "0.3.6" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d491ee231a51ae64a5b762114c3ac2104b967aadba1de45c86ca42cf051513b7" +checksum = "0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61" [[package]] name = "xi-unicode" @@ -4867,19 +4890,9 @@ checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" [[package]] name = "xml-rs" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193" - -[[package]] -name = "zerocopy" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854e949ac82d619ee9a14c66a1b674ac730422372ccb759ce0c39cabcf2bf8e6" -dependencies = [ - "byteorder", - "zerocopy-derive 0.6.6", -] +checksum = "539a77ee7c0de333dcc6da69b177380a0b81e0dacfa4f7344c465a36871ee601" [[package]] name = "zerocopy" @@ -4887,18 +4900,8 @@ version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ - "zerocopy-derive 0.7.35", -] - -[[package]] -name = "zerocopy-derive" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "125139de3f6b9d625c39e2efdd73d41bdac468ccd556556440e322be0e1bbd91" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.72", + "byteorder", + "zerocopy-derive", ] [[package]] @@ -4909,5 +4912,5 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.72", + "syn 2.0.77", ] diff --git a/Cargo.toml b/Cargo.toml index ac7dff6..162d939 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,7 @@ bevy = { version = "0.14", default-features = false, features = [ "bevy_sprite", ] } bevy_editor_pls = { version = "0.9.0", optional = true } +bevy_render_layers_manager = "0.1.0" fast_poisson = { version = "1.0.0", features = [ "single_precision", ], optional = true } diff --git a/examples/multiple.rs b/examples/multiple.rs index 8f17fba..ee279f2 100644 --- a/examples/multiple.rs +++ b/examples/multiple.rs @@ -1,61 +1,56 @@ mod shared; -use bevy::{prelude::*, window::PrimaryWindow}; -use bevy_scroller::{Scroller, ScrollerBundle, ScrollerSize, SingleSpriteGenerator}; +use bevy::prelude::*; +use bevy_scroller::{ + Direction, FillMode, Scroller, ScrollerBundle, ScrollerGenerators, ScrollerSpawner, + SingleSpriteGenerator, +}; use shared::get_app; -use std::f32::consts::PI; fn main() { get_app("multiple".into()).add_systems(Startup, start).run(); } -pub fn start(mut commands: Commands, windows: Query<&Window, With>) { - let window = windows.get_single().expect("no primary window"); +pub fn start( + mut commands: Commands, + spawners: Res, + asset_server: Res, +) { let sprite_size = Vec2::new(128., 128.); commands.spawn(Camera2dBundle::default()); - commands.spawn(( - ScrollerSize { - size: Vec2::new(window.width(), sprite_size.y), - }, - ScrollerBundle { - scroller: Scroller { - speed: 5., - ..default() - }, + commands + .spawn(ScrollerBundle { + scroller: Scroller::new(5.), + size: Vec2::new(1000., sprite_size.y).into(), generator: SingleSpriteGenerator { - path: "gems/1.png".into(), + texture: asset_server.load("bevy_logo.png"), size: sprite_size, }, - spatial: SpatialBundle::from_transform(Transform::from_translation(Vec3::new( - 0., - (sprite_size.y - window.height()) / 2., - 0., - ))), - ..default() - }, - )); + spawner: ScrollerSpawner(*spawners.get::().unwrap()), + direction: Direction::default(), + fill_mode: FillMode::default(), + spatial: SpatialBundle::from_transform(Transform::from_translation(Vec3::new(0., 200., 0.))), + }) + .with_children(|parent| { + parent.spawn(()); + }); - commands.spawn(( - ScrollerSize { - size: Vec2::new(window.width(), sprite_size.y), - }, - ScrollerBundle { - scroller: Scroller { - speed: 5., - ..default() - }, + commands + .spawn(ScrollerBundle { + scroller: Scroller::new(5.), + size: Vec2::new(1000., sprite_size.y).into(), generator: SingleSpriteGenerator { - path: "gems/2.png".into(), + texture: asset_server.load("gems/2.png"), size: sprite_size, }, - spatial: SpatialBundle::from_transform(Transform { - translation: Vec3::new(0., (window.height() - sprite_size.y) / 2., 0.), - rotation: Quat::from_rotation_z(PI), - ..default() - }), - ..default() - }, - )); + spawner: ScrollerSpawner(*spawners.get::().unwrap()), + direction: Direction::default(), + fill_mode: FillMode::default(), + spatial: SpatialBundle::from_transform(Transform::from_translation(Vec3::new(0., -200., 0.))), + }) + .with_children(|parent| { + parent.spawn(()); + }); } diff --git a/examples/sequence.rs b/examples/sequence.rs index 5cc4e1c..3f626af 100644 --- a/examples/sequence.rs +++ b/examples/sequence.rs @@ -72,7 +72,10 @@ pub fn run( speed: 5., ..default() }, - generator: SequenceSpriteGenerator { items }, + generator: SequenceSpriteGenerator { + items + } + spawner: , ..default() }, )); diff --git a/examples/shared/mod.rs b/examples/shared/mod.rs index c1ceb87..c433a19 100644 --- a/examples/shared/mod.rs +++ b/examples/shared/mod.rs @@ -1,5 +1,6 @@ use bevy::{prelude::*, window::WindowResized}; -use bevy_scroller::{ScrollerPlugin, ScrollerSize}; +use bevy_render_layers_manager::RenderLayersManagerPlugin; +use bevy_scroller::{ScrollerPlugin, Size}; use iyes_perf_ui::prelude::*; pub fn get_app(title: String) -> App { @@ -21,8 +22,8 @@ pub fn get_app(title: String) -> App { .add_plugins(bevy::diagnostic::EntityCountDiagnosticsPlugin) .add_plugins(bevy::diagnostic::SystemInformationDiagnosticsPlugin) .add_plugins(PerfUiPlugin) - .add_systems(Startup, default_start) - .add_systems(Update, on_resize); + .add_systems(Startup, default_start); + // .add_systems(Update, on_resize); #[cfg(feature = "dev")] { use bevy_editor_pls::EditorPlugin; @@ -33,17 +34,15 @@ pub fn get_app(title: String) -> App { fn default_start(mut commands: Commands) { commands.spawn(PerfUiCompleteBundle::default()); + // commands.spawn(PerfUiDefaultEntries::default()); } -fn on_resize( - mut resize_reader: EventReader, - mut scroller_size: Query<&mut ScrollerSize>, -) { +fn on_resize(mut resize_reader: EventReader, mut scroller_size: Query<&mut Size>) { for e in resize_reader.read() { debug!("window resized: {:.1} x {:.1}", e.width, e.height); for mut ss in scroller_size.iter_mut() { - ss.size.x = e.width; - ss.size.y = e.height; + // ss.size.x = e.width; + // ss.size.y = e.height; } } } diff --git a/examples/single.rs b/examples/single.rs index 30844ea..a43daad 100644 --- a/examples/single.rs +++ b/examples/single.rs @@ -1,33 +1,36 @@ mod shared; -use bevy::{prelude::*, window::PrimaryWindow}; -use bevy_scroller::{Scroller, ScrollerBundle, ScrollerSize, SingleSpriteGenerator}; +use bevy::prelude::*; +use bevy_scroller::{ + Direction, FillMode, Scroller, ScrollerBundle, ScrollerGenerators, ScrollerSpawner, + SingleSpriteGenerator, +}; use shared::*; fn main() { get_app("single".into()).add_systems(Startup, start).run(); } -pub fn start(mut commands: Commands, windows: Query<&Window, With>) { - let primary_window = windows.get_single().expect("no primary window"); +pub fn start( + mut commands: Commands, + spawners: Res, + asset_server: Res, +) { let sprite_size = Vec2::new(300., 300.); - commands.spawn(Camera2dBundle::default()); - - commands.spawn(( - ScrollerSize { - size: Vec2::new(primary_window.width(), sprite_size.y), - }, - ScrollerBundle { - scroller: Scroller { - speed: 5., - ..default() - }, + commands + .spawn(ScrollerBundle { + scroller: Scroller::new(5.), + size: Vec2::new(1000., 300.).into(), generator: SingleSpriteGenerator { - path: "bevy_logo.png".into(), + texture: asset_server.load("bevy_logo.png"), size: sprite_size, }, - ..default() - }, - )); + direction: Direction::default(), + fill_mode: FillMode::default(), + spatial: SpatialBundle::default(), + }) + .with_children(|parent| { + parent.spawn(()); + }); } diff --git a/examples/sprite_sheet.rs b/examples/sprite_sheet.rs index b806bd5..f6387eb 100644 --- a/examples/sprite_sheet.rs +++ b/examples/sprite_sheet.rs @@ -2,7 +2,7 @@ mod shared; use std::collections::VecDeque; use bevy::{prelude::*, window::PrimaryWindow}; -use bevy_scroller::{Scroller, ScrollerBundle, ScrollerSize, SequenceSpriteSheetGenerator}; +use bevy_scroller::{Direction, Scroller, ScrollerBundle, SequenceSpriteSheetGenerator, Size}; use shared::get_app; fn main() { get_app("sprite sheet".into()) @@ -30,10 +30,10 @@ fn startup( let sprite_size = Vec2::new(64., 64.); commands.spawn(( - ScrollerSize { - size: Vec2::new(primary_window.width(), sprite_size.y * 2.), - }, + Size(Vec2::new(primary_window.width(), sprite_size.y * 2.)), ScrollerBundle { + size: Default::default(), + scroller: Scroller { speed: 1., ..default() diff --git a/src/generators/generator.rs b/src/generators/generator.rs index 32f2f37..c29089b 100644 --- a/src/generators/generator.rs +++ b/src/generators/generator.rs @@ -1,43 +1,66 @@ -use std::fmt::Debug; +use std::{any::TypeId, fmt::Debug}; -use bevy::prelude::*; +use bevy::{ecs::world, prelude::*}; -use crate::Scroller; +use crate::{Scroller, ScrollerGenerators, ScrollerItem, Size}; pub trait GeneratedItem: Debug { fn size(&self) -> Vec2; } -pub trait ScrollerGenerator: Default { - type I: GeneratedItem + Debug; - fn gen_item(&mut self) -> Self::I; +pub trait ScrollerGenerator { + type Item: GeneratedItem + Debug; + fn gen_item(&mut self) -> Self::Item; } -pub type SpawnerInput = Vec<(Entity, Scroller, Box<::I>)>; +pub type SpawnerInput = (Entity, Vec); -const GENERATIONS_LIMIT: u32 = 300; +pub fn spawner() -> Box> { + Box::new(vec![{}]) +} -pub fn pre_generator(mut q_scroller: Query<(Entity, &Scroller, &mut T)>) -> SpawnerInput +pub fn gen(world: &mut World) { + if let Some(generator) = world + .get_resource_ref::() + .unwrap() + .generators + .get(&TypeId::of::()) + { + let spid = world.register_system(spawner); + let asd = world.run_system(spid).unwrap(); + world.spawn_batch(asd.into_iter()); + } +} +pub fn generator( + In(entity): In, + mut query: Query<(&mut G, &Scroller, &Size)>, + q_item: Query<(&Transform, &ScrollerItem)>, + generators: Res, +) -> Box> where - T: ScrollerGenerator + Component + Clone, + G: ScrollerGenerator + Component + Clone, { - q_scroller - .iter_mut() - .flat_map(|(entity, scroller, mut generator)| { - let mut length = scroller.get_free_space(); - let mut generations = 0; - let mut to_generate = vec![]; - while length > 0. && generations <= GENERATIONS_LIMIT { - let item = generator.gen_item(); - trace!("generated item is: {:?}", item); - length -= item.size().x; - generations += 1; - to_generate.push((entity, scroller.clone(), Box::new(item))); + let items = if let Ok((mut generator, scroller, size)) = query.get_mut(entity) { + let edge = match scroller.last_item { + Some(last_item) => { + let (position, item) = q_item.get(last_item).unwrap(); + position.translation.x + item.size.x / 2. } - if generations > GENERATIONS_LIMIT { - panic!("Reached item generation limit"); + None => 0., + }; + let mut free_space = size.x - edge; + // let mut width = scroller.items_width; + let mut items = vec![]; + if let Some(generator) = generators.generators.get(&TypeId::of::()) { + while free_space > 0. { + world.run_system_once(generator).unwrap(); + // width += item.size().x; + free_space -= item.size().x; + items.push(item); } - - to_generate - }) - .collect() + } + items + } else { + vec![] + }; + (entity, items) } diff --git a/src/generators/sprite.rs b/src/generators/sprite.rs index c81e045..4609b7b 100644 --- a/src/generators/sprite.rs +++ b/src/generators/sprite.rs @@ -2,13 +2,16 @@ use bevy::prelude::*; use rand::{seq::SliceRandom, thread_rng}; use std::collections::VecDeque; -use crate::{Scroller, ScrollerGenerator, ScrollerItem}; +use crate::ScrollerItem; -use super::generator::GeneratedItem; +use super::{ + generator::{GeneratedItem, ScrollerGenerator}, + SpawnerInput, +}; -#[derive(Clone, Reflect, Debug)] +#[derive(Clone, Debug, Reflect)] pub struct SpriteScrollerItem { - pub path: String, + pub texture: Handle, pub size: Vec2, } @@ -18,72 +21,86 @@ impl GeneratedItem for SpriteScrollerItem { } } -#[derive(Component, Clone, Default, Reflect)] -#[reflect(Component)] +#[derive(Component, Clone)] pub struct SingleSpriteGenerator { - pub path: String, + pub texture: Handle, pub size: Vec2, + // spawner: SystemId, } impl ScrollerGenerator for SingleSpriteGenerator { - type I = SpriteScrollerItem; + type Item = SpriteScrollerItem; - fn gen_item(&mut self) -> Self::I { - Self::I { + // fn get_spawner(&self) -> SystemId { + // self.spawner + // } + + fn gen_item(&mut self) -> Self::Item { + Self::Item { size: self.size, - path: self.path.clone(), + texture: self.texture.clone(), } } } -#[derive(Component, Default, Reflect, Clone)] -#[reflect(Component)] +#[derive(Component, Clone)] pub struct SequenceSpriteGenerator { pub items: VecDeque, } impl ScrollerGenerator for SequenceSpriteGenerator { - type I = SpriteScrollerItem; + type Item = SpriteScrollerItem; - fn gen_item(&mut self) -> Self::I { + fn gen_item(&mut self) -> Self::Item { let item = self.items.pop_front().unwrap(); self.items.push_back(item.clone()); item } } -#[derive(Component, Default, Reflect, Clone)] -#[reflect(Component)] +#[derive(Component, Clone)] pub struct RandomSequenceSpriteGenerator { pub items: Vec, } impl ScrollerGenerator for RandomSequenceSpriteGenerator { - type I = SpriteScrollerItem; + type Item = SpriteScrollerItem; - fn gen_item(&mut self) -> Self::I { + fn gen_item(&mut self) -> Self::Item { let mut rng = thread_rng(); self.items.choose(&mut rng).unwrap().clone() } } pub fn sprite_spawner( - In(input): In)>>, + In((entity, items)): In>, mut commands: Commands, asset_server: Res, ) { - input.into_iter().for_each(|(entity, _, item)| { - let handle = asset_server.load(item.path.clone()); - commands.spawn(( - ScrollerItem { - size: item.size(), - parent: entity, - }, - SpriteBundle { - texture: handle, - visibility: Visibility::Hidden, - ..default() - }, - )); - }); + if items.len() > 0 { + info!("sprite spawner to generate {:?} items", items.len()); + items.iter().for_each(|item| { + commands.spawn(( + ScrollerItem::new(item.size(), entity), + SpriteBundle { + texture: item.texture.clone(), + ..default() + }, + )); + }); + } + // input.into_iter().for_each(|(entity, _, item)| { + // let handle = asset_server.load(item.path.clone()); + // commands.spawn(( + // // ScrollerItem { + // // size: item.size(), + // // parent: entity, + // // }, + // SpriteBundle { + // texture: handle, + // visibility: Visibility::Hidden, + // ..default() + // }, + // )); + // }); } diff --git a/src/generators/sprite_sheet.rs b/src/generators/sprite_sheet.rs index cdc0ab6..6f560b7 100644 --- a/src/generators/sprite_sheet.rs +++ b/src/generators/sprite_sheet.rs @@ -2,7 +2,9 @@ use std::collections::VecDeque; use bevy::prelude::*; -use crate::{GeneratedItem, Scroller, ScrollerGenerator, ScrollerItem}; +use crate::{GeneratedItem, Scroller}; + +use super::generator::ScrollerGenerator; #[derive(Debug)] pub struct SpriteSheetScrollerItem { @@ -24,8 +26,8 @@ pub struct SequenceSpriteSheetGenerator { } impl ScrollerGenerator for SequenceSpriteSheetGenerator { - type I = SpriteSheetScrollerItem; - fn gen_item(&mut self) -> Self::I { + type Item = SpriteSheetScrollerItem; + fn gen_item(&mut self) -> Self::Item { self.sprites.rotate_left(1); SpriteSheetScrollerItem { @@ -41,10 +43,10 @@ pub fn spritesheet_spawner( input.into_iter().for_each(|(entity, _, item)| { let generator = q_gen.get(entity).unwrap(); commands.spawn(( - ScrollerItem { - size: item.size(), - parent: entity, - }, + // Item { + // size: item.size(), + // // parent: entity, + // }, SpriteBundle { texture: generator.texture.clone(), visibility: Visibility::Hidden, diff --git a/src/lib.rs b/src/lib.rs index 5286c34..1d41704 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,6 +4,7 @@ mod generators; mod plugin; mod scroller; mod scroller_app; +mod spawners; pub use generators::*; pub use plugin::ScrollerPlugin; diff --git a/src/old_scroller.rs b/src/old_scroller.rs new file mode 100644 index 0000000..5f22e79 --- /dev/null +++ b/src/old_scroller.rs @@ -0,0 +1,385 @@ +use bevy::{ + ecs::system::SystemId, + prelude::*, + reflect::Reflect, + render::{ + camera::{RenderTarget, Viewport}, + render_resource::{ + Extent3d, TextureDescriptor, TextureDimension, TextureFormat, TextureUsages, + }, + view::RenderLayers, + }, +}; + +use crate::ScrollerGenerator; + +#[cfg(feature = "dev")] +use bevy::color::palettes::basic::*; + +#[derive(Reflect, Default, Debug, Clone, Component)] +pub enum Direction { + #[default] + Forward, + Backward, +} + +// impl Direction { +// pub fn as_f32(&self) -> f32 { +// (*self).clone().into() +// } +// } + +// impl From for f32 { +// fn from(value: ScrollerDirection) -> Self { +// match value { +// ScrollerDirection::Forward => 1., +// ScrollerDirection::Backward => -1., +// } +// } +// } +#[derive(Copy, Clone, Component)] +pub struct Item { + pub size: Vec2, + // pub parent: Entity, +} + +#[derive(Component)] +pub struct OnScrollerInit(pub SystemId); + +#[derive(Copy, Clone, Default, Component, Reflect, Deref, DerefMut)] +pub struct Size(pub Vec2); + +#[derive(Default, Debug, Component, Clone, Reflect)] +#[reflect(Component, Default)] +pub struct Scroller { + // pub start: f32, + // pub end: f32, + pub speed: f32, + // pub direction: Direction, + pub is_paused: bool, + // pub spawn_edge: f32, + // pub render_layer: Option, + // pub texture_handle: Handle, +} + +// impl Scroller { +// pub fn get_free_space(&self) -> f32 { +// (self.start - self.spawn_edge) * -self.direction.as_f32() +// } + +// pub fn new_item_needed(&self) -> bool { +// self.get_free_space() > self.speed * 3. +// } + +// pub fn get_next_item_position(&self, item: &ScrollerItem) -> Vec2 { +// Vec2 { +// x: self.spawn_edge - item.size.x / 2. * self.direction.as_f32(), +// ..default() +// } +// } +// } + +// #[derive(Component, Debug)] +// pub struct NeedInitialFilling; +#[derive(Bundle)] +pub struct ScrollerBundle { + pub scroller: Scroller, + pub size: Size, + pub direction: Direction, + pub generator: G, + pub spatial: SpatialBundle, +} + +impl Default for ScrollerBundle { + fn default() -> Self { + Self { + scroller: Scroller::default(), + generator: G::default(), + spatial: SpatialBundle { + visibility: Visibility::Hidden, + ..default() + }, + } + } +} + +pub struct UnnamedScrollerIndex(pub u32); +impl Default for UnnamedScrollerIndex { + fn default() -> Self { + Self(1) + } +} + +pub fn init( + mut scroller_index: Local, + mut commands: Commands, + mut q_added_scroller: Query< + ( + Entity, + &mut Scroller, + &ScrollerSize, + Option<&Name>, + &Transform, + ), + Added, + >, + mut images: ResMut>, +) { + for (entity, mut scroller, scroller_size, maybe_name, transform) in q_added_scroller.iter_mut() { + let name = match maybe_name { + Some(name) => name.to_string(), + None => { + let name = format!("Scroller #{}", scroller_index.0); + commands.entity(entity).insert(Name::new(name.clone())); + scroller_index.0 += 1; + name + } + }; + commands.entity(entity).insert(SpatialBundle { + transform: *transform, + ..Default::default() + }); + + debug!("Init scroller: {name}"); + + scroller.end = scroller_size.size.x / 2. * scroller.direction.as_f32(); + scroller.start = -scroller.end; + scroller.spawn_edge = scroller.end; + commands.entity(entity).insert(NeedInitialFilling); + + if let Some(render_layer) = scroller.render_layer { + let size = Extent3d { + width: scroller_size.size.x as u32, + height: scroller_size.size.y as u32, + ..default() + }; + + let mut image = Image { + texture_descriptor: TextureDescriptor { + label: None, + size, + dimension: TextureDimension::D2, + format: TextureFormat::Bgra8UnormSrgb, + mip_level_count: 1, + sample_count: 1, + usage: TextureUsages::TEXTURE_BINDING + | TextureUsages::COPY_DST + | TextureUsages::RENDER_ATTACHMENT, + view_formats: &[], + }, + ..default() + }; + + image.resize(size); + let image_handle = images.add(image); // TODO: remove it on cleanup + scroller.texture_handle = image_handle.clone(); + + commands.entity(entity).with_children(|parent| { + parent.spawn(( + Camera2dBundle { + camera: Camera { + viewport: Some(Viewport { + physical_size: scroller_size.size.as_uvec2(), + ..Default::default() + }), + order: -1, + target: RenderTarget::Image(image_handle.clone()), + ..default() + }, + ..default() + }, + RenderLayers::layer(render_layer), + Name::new("Scroller Camera"), + )); + parent.spawn(( + SpriteBundle { + texture: image_handle, + ..Default::default() + }, + Name::new("Scroller Camera texture"), + )); + }); + } + } +} + +pub fn on_scroller_resize( + mut q_size_changed: Query<(&mut Scroller, &ScrollerSize), Changed>, +) { + for (mut scroller, scroller_size) in q_size_changed.iter_mut() { + info!("item resized"); + scroller.end = scroller_size.size.x / 2. * scroller.direction.as_f32(); + scroller.start = -scroller.end; + scroller.spawn_edge = scroller.end; + } +} + +pub fn on_items_added( + mut commands: Commands, + mut q_added: Query<(&ScrollerItem, &mut Transform, &mut Visibility, Entity), Added>, + mut q_scroller: Query<(&mut Scroller, Entity)>, +) { + for (scroller_item, mut transform, mut visibility, scroller_item_entity) in q_added.iter_mut() { + if let Ok((mut scroller, scroller_entity)) = q_scroller.get_mut(scroller_item.parent) { + let translation = scroller.get_next_item_position(scroller_item).extend(0.); + + transform.translation = translation; + *visibility = Visibility::Inherited; + if let Some(render_layer) = scroller.render_layer { + commands + .entity(scroller_item_entity) + .insert(RenderLayers::layer(render_layer)); + } + + scroller.spawn_edge -= scroller_item.size.x * scroller.direction.as_f32(); + + commands + .entity(scroller_entity) + .add_child(scroller_item_entity); + } + } +} + +#[cfg(feature = "dev")] +pub fn scroller_debug( + q_scroller_item: Query<(&GlobalTransform, &ScrollerItem, Option<&Visibility>)>, + q_scroller: Query<(&GlobalTransform, &Scroller, &ScrollerSize)>, + mut gizmos: Gizmos, +) { + use bevy::color::palettes::css::BLUE; + + for (global_transform, item, visibility) in q_scroller_item.iter() { + if let Some(visibility) = visibility { + if visibility != Visibility::Hidden { + let (scale, rotation, translation) = global_transform.to_scale_rotation_translation(); + + gizmos.rect_2d( + translation.truncate(), + rotation.to_axis_angle().1, + item.size * scale.truncate(), + BLUE, + ); + } + } + } + for (global_transform, scroller, scroller_size) in q_scroller.iter() { + let (scale, rotation, translation) = global_transform.to_scale_rotation_translation(); + + gizmos.line_2d( + Vec2::new(scroller.spawn_edge, scroller_size.size.y / -2. - 20.) * scale.truncate(), // TODO: take rotation into account + Vec2::new(scroller.spawn_edge, scroller_size.size.y / 2. + 20.) * scale.truncate(), // TODO: take rotation into account + RED, + ); + gizmos.rect_2d( + translation.truncate(), + rotation.to_axis_angle().1, + Vec2::new(scroller_size.size.x, scroller_size.size.y) * scale.truncate(), + GREEN, + ); + // gizmos.line_2d( + // Vec2::new(position.x, scroller.rect.min.y), + // Vec2::new(position.x, scroller.rect.max.y), + // Color::WHITE, + // ); + } +} + +pub fn update( + mut commands: Commands, + mut q_scroller: Query<( + &mut Scroller, + &mut Visibility, + Option<&NeedInitialFilling>, + Option<&OnScrollerInit>, + Entity, + )>, + mut q_item: Query<(&mut Transform, Entity, &ScrollerItem)>, + time_fixed: Res>, +) { + let step: f32 = 1. / 60.; + let delta = time_fixed.delta_seconds(); + + for (mut scroller, mut visibility, maybe_need_filling, maybe_on_init, scroller_entity) in + q_scroller.iter_mut() + { + if maybe_need_filling.is_some() && !scroller.new_item_needed() { + *visibility = Visibility::Inherited; + commands + .entity(scroller_entity) + .remove::(); + if let Some(on_init) = maybe_on_init { + commands.run_system_with_input(on_init.0, scroller_entity); + } + } + if !scroller.is_paused { + let update_step = delta / step * scroller.speed * scroller.direction.as_f32(); + + scroller.spawn_edge += update_step; + q_item + .iter_mut() + .filter(|(_, _, item)| item.parent == scroller_entity) + .for_each(|(mut transform, _, _)| { + transform.translation.x += update_step; + }) + } + } +} + +pub fn delete_items( + mut commands: Commands, + q_scroller_item: Query<(&ScrollerItem, Entity, &Transform)>, + q_scroller: Query<&Scroller>, +) { + for (scroller_item, entity, transform) in q_scroller_item.iter() { + if let Ok(scroller) = q_scroller.get(scroller_item.parent) { + if (scroller.end - transform.translation.x + + scroller_item.size.x / 2. * scroller.direction.as_f32()) + * scroller.direction.as_f32() + < 0. + { + commands.entity(entity).despawn_recursive(); + } + } + } +} + +#[cfg(test)] +mod test { + // use crate::{Scroller, ScrollerItem}; + // use bevy::prelude::*; + // use rstest::rstest; + + // #[rstest] + // #[case(0., 30., Vec2::new(-5.0, 0.))] + // #[case(10., 0., Vec2::new(15.0, 0.))] + // #[case(65., 0., Vec2::new(-40.0, 0.))] + // // #[case(65., 30., Vec2::new(25.0, 0.))] + // fn get_inserted_item_position_test( + // #[case] end: f32, + // #[case] scroll: f32, + // #[case] expectation: Vec2, + // ) { + // let scroller = Scroller { + // rect: Rect::from_center_size(Vec2::new(0., 0.), Vec2::new(80., 80.)), + // scroll, + // end, + // ..default() + // }; + // // let position = scroller.get_next_item_position(&ScrollerItem { size: 30. }); + // // assert_eq!(position, expectation); + // } + + // #[rstest] + // #[case(0., 30., true)] + // #[case(10., 0., true)] + // #[case(65., 0., true)] + // fn should_add_new_item_test(#[case] end: f32, #[case] scroll: f32, #[case] expectation: bool) { + // let scroller = Scroller { + // rect: Rect::from_center_size(Vec2::new(0., 0.), Vec2::new(80., 80.)), + // scroll, + // end, + // ..default() + // }; + // assert_eq!(scroller.should_insert_next_item(), expectation); + // } +} diff --git a/src/plugin.rs b/src/plugin.rs index 2ec30ca..71a2174 100644 --- a/src/plugin.rs +++ b/src/plugin.rs @@ -1,43 +1,50 @@ pub struct ScrollerPlugin; use crate::{ - scroller::*, sprite_spawner, spritesheet_spawner, RandomSequenceSpriteGenerator, ScrollerApp, - SequenceSpriteGenerator, SequenceSpriteSheetGenerator, SingleSpriteGenerator, + scroller::*, sprite_spawner, ScrollerApp, ScrollerGenerators, SequenceSpriteSheetGenerator, + SingleSpriteGenerator, }; use bevy::prelude::*; +use bevy_render_layers_manager::RenderLayersManagerPlugin; -#[cfg(feature = "dev")] -use crate::scroller::scroller_debug; +// #[cfg(feature = "dev")] +// use crate::scroller::scroller_debug; impl Plugin for ScrollerPlugin { fn build(&self, app: &mut App) { + if !app.is_plugin_added::() { + app.add_plugins(RenderLayersManagerPlugin); + } app + // .register_type::() + .register_type::() + .register_type::() .register_type::() - .register_type::() - .register_type::() - .register_type::() - .register_type::() - .register_type::() + .register_type::() + // .register_type::() + // .register_type::() + // .register_type::() .register_type::() .register_type::>() .register_type::>() + .init_resource::() .add_scroller_generator::(sprite_spawner) - .add_scroller_generator::(sprite_spawner) - .add_scroller_generator::(spritesheet_spawner) - .add_scroller_generator::(sprite_spawner) + // .add_scroller_generator::(sprite_spawner) + // .add_scroller_generator::(spritesheet_spawner) + // .add_scroller_generator::(sprite_spawner) .add_systems( Update, ( - init, - on_items_added, - on_scroller_resize, - delete_items, - update, - #[cfg(feature = "dev")] - scroller_debug, + // // on_items_added, + // // on_scroller_resize, + // // delete_items, + init, fill_items, update, + delete, // #[cfg(feature = "dev")] + // scroller_debug, ) .chain(), - ); + ) + .observe(on_add); #[cfg(feature = "poisson")] { use crate::{poisson_generator, PoissonSpriteGenerator}; diff --git a/src/scroller.rs b/src/scroller.rs index e277e84..9464c20 100644 --- a/src/scroller.rs +++ b/src/scroller.rs @@ -1,156 +1,186 @@ +use crate::ScrollerGenerator; use bevy::{ - ecs::system::SystemId, + ecs::{component::StorageType, system::SystemId}, prelude::*, reflect::Reflect, render::{ - camera::{RenderTarget, Viewport}, + camera::RenderTarget, render_resource::{ Extent3d, TextureDescriptor, TextureDimension, TextureFormat, TextureUsages, }, view::RenderLayers, }, }; +use bevy_render_layers_manager::RenderLayerManager; -use crate::ScrollerGenerator; - -#[cfg(feature = "dev")] -use bevy::color::palettes::basic::*; - -#[derive(Reflect, Default, Debug, Clone)] -pub enum ScrollerDirection { +#[derive(Reflect, Default, Debug, Clone, Component)] +pub enum Direction { #[default] Forward, Backward, } +#[derive(Copy, Clone, Default, Component, Reflect, Deref, DerefMut)] +pub struct Size(pub Vec2); -impl ScrollerDirection { - pub fn as_f32(&self) -> f32 { - (*self).clone().into() +impl From for Size { + fn from(value: Vec2) -> Self { + Self(value) } } -impl From for f32 { - fn from(value: ScrollerDirection) -> Self { - match value { - ScrollerDirection::Forward => 1., - ScrollerDirection::Backward => -1., - } - } -} -#[derive(Copy, Clone, Component)] -pub struct ScrollerItem { - pub size: Vec2, - pub parent: Entity, -} - -#[derive(Component)] -pub struct OnScrollerInit(pub SystemId); - -#[derive(Copy, Clone, Default, Component, Reflect)] -pub struct ScrollerSize { - pub size: Vec2, +#[derive(Component, Default)] +pub enum FillMode { + #[default] + Filled, + NotFilled, } -#[derive(Default, Debug, Component, Clone, Reflect)] -#[reflect(Component, Default)] +#[derive(Debug, Default, Component, Clone, Reflect)] pub struct Scroller { - pub start: f32, - pub end: f32, pub speed: f32, - pub direction: ScrollerDirection, pub is_paused: bool, - pub spawn_edge: f32, - pub render_layer: Option, - pub texture_handle: Handle, + pub items_width: f32, + pub last_item: Option, + render_layer: usize, } impl Scroller { - pub fn get_free_space(&self) -> f32 { - (self.start - self.spawn_edge) * -self.direction.as_f32() - } - - pub fn new_item_needed(&self) -> bool { - self.get_free_space() > self.speed * 3. - } - - pub fn get_next_item_position(&self, item: &ScrollerItem) -> Vec2 { - Vec2 { - x: self.spawn_edge - item.size.x / 2. * self.direction.as_f32(), - ..default() + pub fn new(speed: f32) -> Self { + Self { + speed, + items_width: 0., + is_paused: false, + last_item: None, + render_layer: 0, } } } +pub struct UnnamedScrollerIndex(pub u32); +impl Default for UnnamedScrollerIndex { + fn default() -> Self { + Self(1) + } +} -#[derive(Component, Debug)] -pub struct NeedInitialFilling; -#[derive(Bundle)] -pub struct ScrollerBundle { - pub scroller: Scroller, - pub spatial: SpatialBundle, - pub generator: G, +#[derive(Copy, Clone, Debug, Reflect)] +pub struct ScrollerItem { + pub size: Vec2, + pub parent: Entity, + limit_position: f32, } -impl Default for ScrollerBundle { - fn default() -> Self { +impl ScrollerItem { + pub fn new(size: Vec2, parent: Entity) -> Self { Self { - scroller: Scroller::default(), - generator: G::default(), - spatial: SpatialBundle { - visibility: Visibility::Hidden, - ..default() - }, + size, + parent, + limit_position: 0., } } } -pub struct UnnamedScrollerIndex(pub u32); -impl Default for UnnamedScrollerIndex { - fn default() -> Self { - Self(1) +impl Component for ScrollerItem { + const STORAGE_TYPE: bevy::ecs::component::StorageType = StorageType::Table; + fn register_component_hooks(hooks: &mut bevy::ecs::component::ComponentHooks) { + hooks.on_remove(|mut world, entity, _component_id| { + let item = *world.get::(entity).unwrap(); + let mut scroller = world.get_mut::(item.parent).unwrap(); + scroller.items_width -= item.size.x; + }); } } +pub fn on_add( + trigger: Trigger, + mut commands: Commands, + mut q_item: Query<(&mut ScrollerItem, &Transform)>, + mut q_scroller: Query<(&mut Scroller, &Size)>, +) { + let (mut item, _) = q_item.get_mut(trigger.entity()).unwrap(); + let (mut scroller, size) = q_scroller.get_mut(item.parent).unwrap(); + // commands.entity(item.parent).add_child(trigger.entity());`` + item.limit_position = -(size.x + item.size.x) / 2.; + let item_size = item.size; + commands.entity(item.parent).add_child(trigger.entity()); + scroller.items_width += item.size.x; + + let position = match scroller.last_item { + Some(last_item) => { + let (last_item, transform) = q_item.get(last_item).unwrap(); + transform.translation.x + (last_item.size.x + item_size.x) / 2. + } + None => -(size.x - item.size.x) / 2., + }; + + commands.entity(trigger.entity()).insert(( + Name::new("Scroller item"), + Transform::from_translation(Vec2::new(position, 0.).extend(0.)), + RenderLayers::from_layers(&[scroller.render_layer]), + )); + + info!("scroller position calculated to be: {position}",); + + info!( + "scroller items_width increased to: {}", + scroller.items_width + ); + scroller.last_item = Some(trigger.entity()); +} + +#[derive(Component)] +pub struct ScrollerSpawner(pub SystemId); + +#[derive(Bundle, Default)] +pub struct ScrollerBundle +where + G: Component + ScrollerGenerator, +{ + pub scroller: Scroller, + pub size: Size, + pub direction: Direction, + pub spatial: SpatialBundle, + pub generator: G, + // pub spawner: ScrollerSpawner, + pub fill_mode: FillMode, +} + +#[derive(Event)] +pub struct FillScroller; + pub fn init( - mut scroller_index: Local, mut commands: Commands, + mut scroller_index: Local, + mut images: ResMut>, mut q_added_scroller: Query< ( Entity, &mut Scroller, - &ScrollerSize, Option<&Name>, - &Transform, + Option<&Direction>, + Option<&Size>, ), - Added, + Added, >, - mut images: ResMut>, + mut render_manager: ResMut, ) { - for (entity, mut scroller, scroller_size, maybe_name, transform) in q_added_scroller.iter_mut() { - let name = match maybe_name { - Some(name) => name.to_string(), - None => { + for (entity, mut scroller, maybe_name, maybe_direction, maybe_size) in q_added_scroller.iter_mut() + { + if maybe_direction.is_none() { + warn!("Scroller without direction"); + } + if maybe_size.is_none() { + warn!("Scroller without size"); + } + if let (Some(direction), Some(size)) = (maybe_direction, maybe_size) { + if maybe_name.is_none() { let name = format!("Scroller #{}", scroller_index.0); commands.entity(entity).insert(Name::new(name.clone())); scroller_index.0 += 1; - name - } - }; - commands.entity(entity).insert(SpatialBundle { - transform: *transform, - ..Default::default() - }); - - debug!("Init scroller: {name}"); - - scroller.end = scroller_size.size.x / 2. * scroller.direction.as_f32(); - scroller.start = -scroller.end; - scroller.spawn_edge = scroller.end; - commands.entity(entity).insert(NeedInitialFilling); + }; - if let Some(render_layer) = scroller.render_layer { let size = Extent3d { - width: scroller_size.size.x as u32, - height: scroller_size.size.y as u32, + width: size.x as u32, + height: size.y as u32, ..default() }; @@ -169,217 +199,80 @@ pub fn init( }, ..default() }; - image.resize(size); - let image_handle = images.add(image); // TODO: remove it on cleanup - scroller.texture_handle = image_handle.clone(); + let image_handle = images.add(image); + + scroller.render_layer = render_manager.pick(); commands.entity(entity).with_children(|parent| { parent.spawn(( Camera2dBundle { camera: Camera { - viewport: Some(Viewport { - physical_size: scroller_size.size.as_uvec2(), - ..Default::default() - }), + // render before the "main pass" camera order: -1, target: RenderTarget::Image(image_handle.clone()), ..default() }, ..default() }, - RenderLayers::layer(render_layer), - Name::new("Scroller Camera"), + // InGameCamera, + RenderLayers::from_layers(&[scroller.render_layer]), )); parent.spawn(( SpriteBundle { texture: image_handle, - ..Default::default() + ..default() }, - Name::new("Scroller Camera texture"), + Name::new("Scroller texture"), )); }); } } } -pub fn on_scroller_resize( - mut q_size_changed: Query<(&mut Scroller, &ScrollerSize), Changed>, -) { - for (mut scroller, scroller_size) in q_size_changed.iter_mut() { - info!("item resized"); - scroller.end = scroller_size.size.x / 2. * scroller.direction.as_f32(); - scroller.start = -scroller.end; - scroller.spawn_edge = scroller.end; - } -} - -pub fn on_items_added( +pub fn fill_items( mut commands: Commands, - mut q_added: Query<(&ScrollerItem, &mut Transform, &mut Visibility, Entity), Added>, - mut q_scroller: Query<(&mut Scroller, Entity)>, -) { - for (scroller_item, mut transform, mut visibility, scroller_item_entity) in q_added.iter_mut() { - if let Ok((mut scroller, scroller_entity)) = q_scroller.get_mut(scroller_item.parent) { - let translation = scroller.get_next_item_position(scroller_item).extend(0.); - - transform.translation = translation; - *visibility = Visibility::Inherited; - if let Some(render_layer) = scroller.render_layer { - commands - .entity(scroller_item_entity) - .insert(RenderLayers::layer(render_layer)); - } - - scroller.spawn_edge -= scroller_item.size.x * scroller.direction.as_f32(); - - commands - .entity(scroller_entity) - .add_child(scroller_item_entity); - } - } -} - -#[cfg(feature = "dev")] -pub fn scroller_debug( - q_scroller_item: Query<(&GlobalTransform, &ScrollerItem, Option<&Visibility>)>, - q_scroller: Query<(&GlobalTransform, &Scroller, &ScrollerSize)>, - mut gizmos: Gizmos, + q_scroller: Query<(Entity, &mut Scroller, &Size, &ScrollerSpawner)>, + q_item: Query<(&Transform, &ScrollerItem)>, ) { - use bevy::color::palettes::css::BLUE; - - for (global_transform, item, visibility) in q_scroller_item.iter() { - if let Some(visibility) = visibility { - if visibility != Visibility::Hidden { - let (scale, rotation, translation) = global_transform.to_scale_rotation_translation(); - - gizmos.rect_2d( - translation.truncate(), - rotation.to_axis_angle().1, - item.size * scale.truncate(), - BLUE, - ); + for (entity, scroller, size, spawner) in q_scroller.iter() { + let edge = match scroller.last_item { + Some(last_item) => { + let (position, item) = q_item.get(last_item).unwrap(); + position.translation.x + item.size.x / 2. } + None => 0., + }; + let free_space = size.x - edge; + if free_space > 0. { + commands.run_system_with_input(spawner.0, entity); } } - for (global_transform, scroller, scroller_size) in q_scroller.iter() { - let (scale, rotation, translation) = global_transform.to_scale_rotation_translation(); - - gizmos.line_2d( - Vec2::new(scroller.spawn_edge, scroller_size.size.y / -2. - 20.) * scale.truncate(), // TODO: take rotation into account - Vec2::new(scroller.spawn_edge, scroller_size.size.y / 2. + 20.) * scale.truncate(), // TODO: take rotation into account - RED, - ); - gizmos.rect_2d( - translation.truncate(), - rotation.to_axis_angle().1, - Vec2::new(scroller_size.size.x, scroller_size.size.y) * scale.truncate(), - GREEN, - ); - // gizmos.line_2d( - // Vec2::new(position.x, scroller.rect.min.y), - // Vec2::new(position.x, scroller.rect.max.y), - // Color::WHITE, - // ); - } } pub fn update( - mut commands: Commands, - mut q_scroller: Query<( - &mut Scroller, - &mut Visibility, - Option<&NeedInitialFilling>, - Option<&OnScrollerInit>, - Entity, - )>, - mut q_item: Query<(&mut Transform, Entity, &ScrollerItem)>, + q_scroller: Query<(&Scroller, &Children)>, + mut q_item: Query<&mut Transform, With>, time_fixed: Res>, ) { let step: f32 = 1. / 60.; let delta = time_fixed.delta_seconds(); - - for (mut scroller, mut visibility, maybe_need_filling, maybe_on_init, scroller_entity) in - q_scroller.iter_mut() - { - if maybe_need_filling.is_some() && !scroller.new_item_needed() { - *visibility = Visibility::Inherited; - commands - .entity(scroller_entity) - .remove::(); - if let Some(on_init) = maybe_on_init { - commands.run_system_with_input(on_init.0, scroller_entity); - } - } + for (scroller, children) in q_scroller.iter() { if !scroller.is_paused { - let update_step = delta / step * scroller.speed * scroller.direction.as_f32(); - - scroller.spawn_edge += update_step; - q_item - .iter_mut() - .filter(|(_, _, item)| item.parent == scroller_entity) - .for_each(|(mut transform, _, _)| { - transform.translation.x += update_step; - }) + for child in children.iter() { + if let Ok(mut transform) = q_item.get_mut(*child) { + let update_step = delta / step * scroller.speed; + transform.translation.x -= update_step; + }; + } } } } -pub fn delete_items( - mut commands: Commands, - q_scroller_item: Query<(&ScrollerItem, Entity, &Transform)>, - q_scroller: Query<&Scroller>, -) { - for (scroller_item, entity, transform) in q_scroller_item.iter() { - if let Ok(scroller) = q_scroller.get(scroller_item.parent) { - if (scroller.end - transform.translation.x - + scroller_item.size.x / 2. * scroller.direction.as_f32()) - * scroller.direction.as_f32() - < 0. - { - commands.entity(entity).despawn_recursive(); - } +pub fn delete(q_item: Query<(&Transform, Entity, &ScrollerItem)>, mut commands: Commands) { + for (item_transform, entity, item) in q_item.iter() { + if item_transform.translation.x < item.limit_position { + commands.entity(entity).despawn_recursive(); } } } - -#[cfg(test)] -mod test { - // use crate::{Scroller, ScrollerItem}; - // use bevy::prelude::*; - // use rstest::rstest; - - // #[rstest] - // #[case(0., 30., Vec2::new(-5.0, 0.))] - // #[case(10., 0., Vec2::new(15.0, 0.))] - // #[case(65., 0., Vec2::new(-40.0, 0.))] - // // #[case(65., 30., Vec2::new(25.0, 0.))] - // fn get_inserted_item_position_test( - // #[case] end: f32, - // #[case] scroll: f32, - // #[case] expectation: Vec2, - // ) { - // let scroller = Scroller { - // rect: Rect::from_center_size(Vec2::new(0., 0.), Vec2::new(80., 80.)), - // scroll, - // end, - // ..default() - // }; - // // let position = scroller.get_next_item_position(&ScrollerItem { size: 30. }); - // // assert_eq!(position, expectation); - // } - - // #[rstest] - // #[case(0., 30., true)] - // #[case(10., 0., true)] - // #[case(65., 0., true)] - // fn should_add_new_item_test(#[case] end: f32, #[case] scroll: f32, #[case] expectation: bool) { - // let scroller = Scroller { - // rect: Rect::from_center_size(Vec2::new(0., 0.), Vec2::new(80., 80.)), - // scroll, - // end, - // ..default() - // }; - // assert_eq!(scroller.should_insert_next_item(), expectation); - // } -} diff --git a/src/scroller_app.rs b/src/scroller_app.rs index d4183fa..40cca40 100644 --- a/src/scroller_app.rs +++ b/src/scroller_app.rs @@ -1,28 +1,44 @@ -use bevy::prelude::*; +use std::any::TypeId; + +use bevy::{ecs::system::SystemId, prelude::*, utils::HashMap}; use crate::{pre_generator, ScrollerGenerator, SpawnerInput}; +#[derive(Resource, Default)] +pub struct ScrollerGenerators { + pub generators: HashMap>, +} + +impl ScrollerGenerators { + pub fn get(&self) -> Option<&SystemId> { + self.generators.get(&TypeId::of::()) + } +} + pub trait ScrollerApp { fn add_scroller_generator< T: ScrollerGenerator + Component + Clone, M, - S: IntoSystem, (), M>, + S: IntoSystem, (), M>, >( &mut self, system: S, ) -> &mut Self; } +pub fn spawner() {} impl ScrollerApp for App { - fn add_scroller_generator< + fn add_scroller_generator(&mut self, generator: G) -> &mut Self + where T: ScrollerGenerator + Component + Clone, - M, - S: IntoSystem, (), M>, - >( - &mut self, - system: S, - ) -> &mut Self { - self.add_systems(Update, pre_generator::.pipe(system)); + G: IntoSystem, (), M>, + { + let registered_system = self.register_system(pre_generator::.pipe(spawner)); + + let mut generators = self.world_mut().resource_mut::(); + generators + .generators + .insert(TypeId::of::(), registered_system); self } } diff --git a/src/spawners/mod.rs b/src/spawners/mod.rs new file mode 100644 index 0000000..2013c3f --- /dev/null +++ b/src/spawners/mod.rs @@ -0,0 +1 @@ +pub mod sprite; diff --git a/src/spawners/sprite.rs b/src/spawners/sprite.rs new file mode 100644 index 0000000..2c3c60b --- /dev/null +++ b/src/spawners/sprite.rs @@ -0,0 +1,54 @@ +// use std::marker::PhantomData; + +// use bevy::{ +// ecs::system::{PipeSystem, SystemParam}, +// prelude::*, +// }; + +// use crate::SpriteScrollerItem; +// trait ScrollerSpawner { +// // fn get_spawner() -> IntoSystem<(), (), _>; +// } + +// pub struct SpriteSpawner; + +// impl SpriteSpawner { +// // pub fn get_spawner(&self) -> impl PipeSystem<(Entity, Vec), O, M> { +// // spawner +// // } +// pub fn spawner( +// In((entity, items)): In<(Entity, Vec)>, +// mut commands: Commands, +// ) { +// items.into_iter().for_each(|item| { +// commands.spawn(( +// // Item { +// // size: item.size(), +// // // parent: entity, +// // }, +// SpriteBundle { +// texture: item.texture, +// visibility: Visibility::Hidden, +// ..default() +// }, +// )); +// }); +// } +// } +// // impl ScrollerSpawner for SpriteSpawner {} + +// fn spawner(In((entity, items)): In<(Entity, Vec)>, mut commands: Commands) { +// items.into_iter().for_each(|item| { +// commands.spawn(( +// // Item { +// // size: item.size(), +// // // parent: entity, +// // }, +// SpriteBundle { +// texture: item.texture, +// visibility: Visibility::Hidden, +// ..default() +// }, +// )); +// }); +// } diff --git a/tests/scroller.rs b/tests/scroller.rs index ae94a93..b0951ee 100644 --- a/tests/scroller.rs +++ b/tests/scroller.rs @@ -13,10 +13,10 @@ impl GeneratedItem for FooItem { } } impl ScrollerGenerator for FooGenerator { - type I = FooItem; + type Item = FooItem; - fn gen_item(&mut self) -> Self::I { - Self::I {} + fn gen_item(&mut self) -> Self::Item { + Self::Item {} } }