From eb6884b173f99d3cd9d4493143520874b0145af4 Mon Sep 17 00:00:00 2001 From: core Date: Sun, 16 Nov 2025 13:35:10 -0500 Subject: [PATCH] feat: bevy 0.17 --- Cargo.lock | 6168 ++++++----------- Cargo.toml | 43 - crates/client/Cargo.toml | 46 - crates/client/index.html | 38 - .../client/src/assets/shaders/fragment.glsl | 14 - crates/client/src/assets/shaders/vertex.glsl | 17 - .../src/assets/textures/autoplr_cfg.svg | 252 - .../src/assets/textures/autoplr_error.svg | 252 - .../client/src/assets/textures/autoplr_on.svg | 246 - .../client/src/assets/textures/cargo_off.svg | 351 - .../client/src/assets/textures/cargo_on.svg | 355 - crates/client/src/assets/textures/chassis.svg | 385 - crates/client/src/assets/textures/earth.svg | 195 - .../client/src/assets/textures/earth_icon.svg | 200 - .../src/assets/textures/ecothruster_on.svg | 268 - .../src/assets/textures/editor_direction.svg | 470 -- crates/client/src/assets/textures/f.png | Bin 8848 -> 0 bytes .../client/src/assets/textures/happy-tree.png | Bin 25451 -> 0 bytes crates/client/src/assets/textures/hearty.svg | 278 - .../src/assets/textures/hearty_ferris.svg | 311 - .../src/assets/textures/hearty_party.svg | 350 - crates/client/src/assets/textures/hub_off.svg | 368 - crates/client/src/assets/textures/hub_on.svg | 396 -- crates/client/src/assets/textures/jupiter.svg | 1600 ----- .../client/src/assets/textures/landingleg.svg | 342 - .../assets/textures/landingthruster_off.svg | 286 - .../assets/textures/landingthruster_on.svg | 314 - crates/client/src/assets/textures/mars.svg | 116 - .../client/src/assets/textures/mars_icon.svg | 132 - .../assets/textures/mercury_NEEDS_4_1_1.svg | 625 -- crates/client/src/assets/textures/missing.svg | 74 - crates/client/src/assets/textures/moon.svg | 144 - .../client/src/assets/textures/moon_icon.svg | 116 - .../src/assets/textures/powerhub_off.svg | 540 -- .../src/assets/textures/powerhub_on.svg | 587 -- .../client/src/assets/textures/starfield.svg | 395 -- .../src/assets/textures/starfield_dim.svg | 516 -- .../src/assets/textures/starfield_transp.svg | 389 -- crates/client/src/assets/textures/sun.svg | 164 - .../client/src/assets/textures/sun_rings.svg | 264 - .../src/assets/textures/superthruster_off.svg | 240 - .../src/assets/textures/superthruster_on.svg | 268 - .../src/assets/textures/thruster_off.svg | 240 - .../src/assets/textures/thruster_on.svg | 268 - .../src/assets/textures/trackindicator.svg | 62 - crates/client/src/assets/textures/uv.png | Bin 306519 -> 0 bytes crates/client/src/assets/textures/venus.svg | 321 - crates/client/src/components.rs | 139 - crates/client/src/lib.rs | 105 - crates/client/src/main.rs | 5 - crates/client/src/native/assets.rs | 68 - crates/client/src/native/mod.rs | 14 - crates/client/src/native/websocket.rs | 76 - crates/client/src/networking/handlers.rs | 215 - crates/client/src/networking/mod.rs | 95 - crates/client/src/networking/websocket.rs | 13 - crates/client/src/rendering/assets.rs | 28 - crates/client/src/rendering/mod.rs | 459 -- crates/client/src/rendering/renderer.rs | 298 - crates/client/src/systems.rs | 18 - crates/client/src/ui/colors.rs | 33 - crates/client/src/ui/mod.rs | 172 - crates/client/src/ui/widgets.rs | 16 - crates/client/src/wasm/assets.rs | 114 - crates/client/src/wasm/mod.rs | 36 - crates/client/src/wasm/websocket.rs | 95 - crates/common/Cargo.toml | 19 - crates/common/src/lib.rs | 126 - crates/common/src/packet.rs | 305 - crates/launcher/src/main.rs | 186 +- crates/server/Cargo.lock | 4019 ----------- crates/server/Cargo.toml | 26 - crates/server/Dockerfile | 6 - crates/server/config.toml | 32 - crates/server/parts.toml | 23 - crates/server/planets.toml | 43 - crates/server/src/config.rs | 124 - crates/server/src/crafting/components.rs | 52 - crates/server/src/crafting/mining.rs | 86 - crates/server/src/crafting/mod.rs | 2 - crates/server/src/macros.rs | 33 - crates/server/src/main.rs | 204 - crates/server/src/mathutil.rs | 27 - crates/server/src/module/component.rs | 80 - crates/server/src/module/mod.rs | 675 -- crates/server/src/module/save.rs | 361 - crates/server/src/module/thruster.rs | 173 - crates/server/src/planet.rs | 292 - crates/server/src/player/client_login.rs | 375 - crates/server/src/player/component.rs | 32 - crates/server/src/player/mod.rs | 347 - crates/server/src/player/packet.rs | 126 - .../server/src/player/player_mouse_input.rs | 209 - crates/server/src/player/request_save.rs | 58 - crates/server/src/player/send_message.rs | 73 - crates/server/src/ws.rs | 248 - crates/unified/Cargo.toml | 26 +- crates/unified/src/client/key_input.rs | 32 +- crates/unified/src/client/mod.rs | 5 +- crates/unified/src/client/net.rs | 22 +- crates/unified/src/client/parts.rs | 110 +- .../unified/src/client/planet/indicators.rs | 4 +- crates/unified/src/client/starfield.rs | 53 +- crates/unified/src/client/ui.rs | 43 +- crates/unified/src/client/zoom.rs | 8 +- crates/unified/src/config/part.rs | 2 +- crates/unified/src/ecs.rs | 8 +- crates/unified/src/particle_editor/ecs.rs | 7 +- crates/unified/src/server/mod.rs | 63 +- crates/unified/src/server/part.rs | 28 +- crates/unified/src/server/planets.rs | 2 +- crates/unified/src/server/player.rs | 201 +- crates/unified/src/server/world_config.rs | 2 +- crates/unified/src/server_plugins.rs | 2 + crates/unified/src/shared_plugins.rs | 7 +- crates/xtask/src/main.rs | 94 +- 116 files changed, 2801 insertions(+), 27285 deletions(-) delete mode 100644 crates/client/Cargo.toml delete mode 100644 crates/client/index.html delete mode 100644 crates/client/src/assets/shaders/fragment.glsl delete mode 100644 crates/client/src/assets/shaders/vertex.glsl delete mode 100644 crates/client/src/assets/textures/autoplr_cfg.svg delete mode 100644 crates/client/src/assets/textures/autoplr_error.svg delete mode 100644 crates/client/src/assets/textures/autoplr_on.svg delete mode 100644 crates/client/src/assets/textures/cargo_off.svg delete mode 100644 crates/client/src/assets/textures/cargo_on.svg delete mode 100644 crates/client/src/assets/textures/chassis.svg delete mode 100644 crates/client/src/assets/textures/earth.svg delete mode 100644 crates/client/src/assets/textures/earth_icon.svg delete mode 100644 crates/client/src/assets/textures/ecothruster_on.svg delete mode 100644 crates/client/src/assets/textures/editor_direction.svg delete mode 100644 crates/client/src/assets/textures/f.png delete mode 100644 crates/client/src/assets/textures/happy-tree.png delete mode 100644 crates/client/src/assets/textures/hearty.svg delete mode 100644 crates/client/src/assets/textures/hearty_ferris.svg delete mode 100644 crates/client/src/assets/textures/hearty_party.svg delete mode 100644 crates/client/src/assets/textures/hub_off.svg delete mode 100644 crates/client/src/assets/textures/hub_on.svg delete mode 100644 crates/client/src/assets/textures/jupiter.svg delete mode 100644 crates/client/src/assets/textures/landingleg.svg delete mode 100644 crates/client/src/assets/textures/landingthruster_off.svg delete mode 100644 crates/client/src/assets/textures/landingthruster_on.svg delete mode 100644 crates/client/src/assets/textures/mars.svg delete mode 100644 crates/client/src/assets/textures/mars_icon.svg delete mode 100644 crates/client/src/assets/textures/mercury_NEEDS_4_1_1.svg delete mode 100644 crates/client/src/assets/textures/missing.svg delete mode 100644 crates/client/src/assets/textures/moon.svg delete mode 100644 crates/client/src/assets/textures/moon_icon.svg delete mode 100644 crates/client/src/assets/textures/powerhub_off.svg delete mode 100644 crates/client/src/assets/textures/powerhub_on.svg delete mode 100644 crates/client/src/assets/textures/starfield.svg delete mode 100644 crates/client/src/assets/textures/starfield_dim.svg delete mode 100644 crates/client/src/assets/textures/starfield_transp.svg delete mode 100644 crates/client/src/assets/textures/sun.svg delete mode 100644 crates/client/src/assets/textures/sun_rings.svg delete mode 100644 crates/client/src/assets/textures/superthruster_off.svg delete mode 100644 crates/client/src/assets/textures/superthruster_on.svg delete mode 100644 crates/client/src/assets/textures/thruster_off.svg delete mode 100644 crates/client/src/assets/textures/thruster_on.svg delete mode 100644 crates/client/src/assets/textures/trackindicator.svg delete mode 100644 crates/client/src/assets/textures/uv.png delete mode 100644 crates/client/src/assets/textures/venus.svg delete mode 100644 crates/client/src/components.rs delete mode 100644 crates/client/src/lib.rs delete mode 100644 crates/client/src/main.rs delete mode 100644 crates/client/src/native/assets.rs delete mode 100644 crates/client/src/native/mod.rs delete mode 100644 crates/client/src/native/websocket.rs delete mode 100644 crates/client/src/networking/handlers.rs delete mode 100644 crates/client/src/networking/mod.rs delete mode 100644 crates/client/src/networking/websocket.rs delete mode 100644 crates/client/src/rendering/assets.rs delete mode 100644 crates/client/src/rendering/mod.rs delete mode 100644 crates/client/src/rendering/renderer.rs delete mode 100644 crates/client/src/systems.rs delete mode 100644 crates/client/src/ui/colors.rs delete mode 100644 crates/client/src/ui/mod.rs delete mode 100644 crates/client/src/ui/widgets.rs delete mode 100644 crates/client/src/wasm/assets.rs delete mode 100644 crates/client/src/wasm/mod.rs delete mode 100644 crates/client/src/wasm/websocket.rs delete mode 100644 crates/common/Cargo.toml delete mode 100644 crates/common/src/lib.rs delete mode 100644 crates/common/src/packet.rs delete mode 100644 crates/server/Cargo.lock delete mode 100644 crates/server/Cargo.toml delete mode 100644 crates/server/Dockerfile delete mode 100644 crates/server/config.toml delete mode 100644 crates/server/parts.toml delete mode 100644 crates/server/planets.toml delete mode 100644 crates/server/src/config.rs delete mode 100644 crates/server/src/crafting/components.rs delete mode 100644 crates/server/src/crafting/mining.rs delete mode 100644 crates/server/src/crafting/mod.rs delete mode 100644 crates/server/src/macros.rs delete mode 100644 crates/server/src/main.rs delete mode 100644 crates/server/src/mathutil.rs delete mode 100644 crates/server/src/module/component.rs delete mode 100644 crates/server/src/module/mod.rs delete mode 100644 crates/server/src/module/save.rs delete mode 100644 crates/server/src/module/thruster.rs delete mode 100644 crates/server/src/planet.rs delete mode 100644 crates/server/src/player/client_login.rs delete mode 100644 crates/server/src/player/component.rs delete mode 100644 crates/server/src/player/mod.rs delete mode 100644 crates/server/src/player/packet.rs delete mode 100644 crates/server/src/player/player_mouse_input.rs delete mode 100644 crates/server/src/player/request_save.rs delete mode 100644 crates/server/src/player/send_message.rs delete mode 100644 crates/server/src/ws.rs diff --git a/Cargo.lock b/Cargo.lock index 9c7a5bcc1fe92552e35b4b4906c4caaa3d7069d0..f7ed5e90d6e5c2a26c0bafbf90f7f184a31e8bab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 4 [[package]] name = "ab_glyph" -version = "0.2.30" +version = "0.2.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0f4f6fbdc5ee39f2ede9f5f3ec79477271a6d6a2baff22310d51736bda6cea" +checksum = "01c0457472c38ea5bd1c3b5ada5e368271cb550be7a4ca4a0b4634e9913f6cc2" dependencies = [ "ab_glyph_rasterizer", "owned_ttf_parser", @@ -14,32 +14,26 @@ dependencies = [ [[package]] name = "ab_glyph_rasterizer" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2187590a23ab1e3df8681afdf0987c48504d80291f002fcdb651f0ef5e25169" +checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" [[package]] name = "accesskit" -version = "0.12.3" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74a4b14f3d99c1255dcba8f45621ab1a2e7540a0009652d33989005a4d0bfc6b" +checksum = "e25ae84c0260bdf5df07796d7cc4882460de26a2b406ec0e6c42461a723b271b" [[package]] name = "accesskit" -version = "0.18.0" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "becf0eb5215b6ecb0a739c31c21bd83c4f326524c9b46b7e882d77559b60a529" +checksum = "cf203f9d3bd8f29f98833d1fbef628df18f759248a547e7e01cfbf63cda36a99" dependencies = [ "enumn", "serde", ] -[[package]] -name = "accesskit" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e25ae84c0260bdf5df07796d7cc4882460de26a2b406ec0e6c42461a723b271b" - [[package]] name = "accesskit_atspi_common" version = "0.12.0" @@ -54,26 +48,6 @@ dependencies = [ "zvariant", ] -[[package]] -name = "accesskit_consumer" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c17cca53c09fbd7288667b22a201274b9becaa27f0b91bf52a526db95de45e6" -dependencies = [ - "accesskit 0.12.3", -] - -[[package]] -name = "accesskit_consumer" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0bf66a7bf0b7ea4fd7742d50b64782a88f99217cf246b3f93b4162528dde520" -dependencies = [ - "accesskit 0.18.0", - "hashbrown 0.15.4", - "immutable-chunkmap", -] - [[package]] name = "accesskit_consumer" version = "0.28.0" @@ -81,30 +55,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8bfae7c152994a31dc7d99b8eeac7784a919f71d1b306f4b83217e110fd3824c" dependencies = [ "accesskit 0.19.0", - "hashbrown 0.15.4", + "hashbrown 0.15.5", ] [[package]] -name = "accesskit_macos" -version = "0.10.1" +name = "accesskit_consumer" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3b6ae1eabbfbced10e840fd3fce8a93ae84f174b3e4ba892ab7bcb42e477a7" +checksum = "db81010a6895d8707f9072e6ce98070579b43b717193d2614014abd5cb17dd43" dependencies = [ - "accesskit 0.12.3", - "accesskit_consumer 0.16.1", - "objc2 0.3.0-beta.3.patch-leaks.3", - "once_cell", + "accesskit 0.21.1", + "hashbrown 0.15.5", ] [[package]] name = "accesskit_macos" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09e230718177753b4e4ad9e1d9f6cfc2f4921212d4c1c480b253f526babb258d" +checksum = "692dd318ff8a7a0ffda67271c4bd10cf32249656f4e49390db0b26ca92b095f2" dependencies = [ - "accesskit 0.18.0", - "accesskit_consumer 0.27.0", - "hashbrown 0.15.4", + "accesskit 0.19.0", + "accesskit_consumer 0.28.0", + "hashbrown 0.15.5", "objc2 0.5.2", "objc2-app-kit 0.2.2", "objc2-foundation 0.2.2", @@ -112,13 +84,13 @@ dependencies = [ [[package]] name = "accesskit_macos" -version = "0.20.0" +version = "0.22.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692dd318ff8a7a0ffda67271c4bd10cf32249656f4e49390db0b26ca92b095f2" +checksum = "a0089e5c0ac0ca281e13ea374773898d9354cc28d15af9f0f7394d44a495b575" dependencies = [ - "accesskit 0.19.0", - "accesskit_consumer 0.28.0", - "hashbrown 0.15.4", + "accesskit 0.21.1", + "accesskit_consumer 0.31.0", + "hashbrown 0.15.5", "objc2 0.5.2", "objc2-app-kit 0.2.2", "objc2-foundation 0.2.2", @@ -142,35 +114,6 @@ dependencies = [ "zbus", ] -[[package]] -name = "accesskit_windows" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afcae27ec0974fc7c3b0b318783be89fd1b2e66dd702179fe600166a38ff4a0b" -dependencies = [ - "accesskit 0.12.3", - "accesskit_consumer 0.16.1", - "once_cell", - "paste", - "static_assertions", - "windows 0.48.0", -] - -[[package]] -name = "accesskit_windows" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65178f3df98a51e4238e584fcb255cb1a4f9111820848eeddd37663be40a625f" -dependencies = [ - "accesskit 0.18.0", - "accesskit_consumer 0.27.0", - "hashbrown 0.15.4", - "paste", - "static_assertions", - "windows 0.58.0", - "windows-core 0.58.0", -] - [[package]] name = "accesskit_windows" version = "0.27.0" @@ -179,57 +122,58 @@ checksum = "70a042b62c9c05bf7b616f015515c17d2813f3ba89978d6f4fc369735d60700a" dependencies = [ "accesskit 0.19.0", "accesskit_consumer 0.28.0", - "hashbrown 0.15.4", + "hashbrown 0.15.5", "static_assertions", "windows 0.61.3", "windows-core 0.61.2", ] [[package]] -name = "accesskit_winit" -version = "0.17.0" +name = "accesskit_windows" +version = "0.29.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45f8f7c9f66d454d5fd8e344c8c8c7324b57194e1041b955519fc58a01e77a25" +checksum = "d2d63dd5041e49c363d83f5419a896ecb074d309c414036f616dc0b04faca971" dependencies = [ - "accesskit 0.12.3", - "accesskit_macos 0.10.1", - "accesskit_windows 0.15.1", - "raw-window-handle", - "winit 0.29.15", + "accesskit 0.21.1", + "accesskit_consumer 0.31.0", + "hashbrown 0.15.5", + "static_assertions", + "windows 0.61.3", + "windows-core 0.61.2", ] [[package]] name = "accesskit_winit" -version = "0.25.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34d941bb8c414caba6e206de669c7dc0dbeb305640ea890772ee422a40e6b89f" +checksum = "5c1f0d3d13113d8857542a4f8d1a1c24d1dc1527b77aee8426127f4901588708" dependencies = [ - "accesskit 0.18.0", - "accesskit_macos 0.19.0", - "accesskit_windows 0.25.0", + "accesskit 0.19.0", + "accesskit_macos 0.20.0", + "accesskit_unix", + "accesskit_windows 0.27.0", "raw-window-handle", - "winit 0.30.11", + "winit", ] [[package]] name = "accesskit_winit" -version = "0.27.0" +version = "0.29.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c1f0d3d13113d8857542a4f8d1a1c24d1dc1527b77aee8426127f4901588708" +checksum = "c8cfabe59d0eaca7412bfb1f70198dd31e3b0496fee7e15b066f9c36a1a140a0" dependencies = [ - "accesskit 0.19.0", - "accesskit_macos 0.20.0", - "accesskit_unix", - "accesskit_windows 0.27.0", + "accesskit 0.21.1", + "accesskit_macos 0.22.2", + "accesskit_windows 0.29.2", "raw-window-handle", - "winit 0.30.11", + "winit", ] [[package]] name = "addr2line" -version = "0.24.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli", ] @@ -242,61 +186,62 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "aeronet" -version = "0.14.0" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20a622d503454e4252c1ea70ae684a8a92f04ea2be97d0723615dfe1f765b84d" +checksum = "db253a824e8aeb2fe2221f70bb22d36f8e33a063def8f84e51e8054e36aba9b8" dependencies = [ "aeronet_io", "aeronet_transport", - "bevy_app 0.16.1", + "bevy_app", ] [[package]] name = "aeronet_io" -version = "0.14.0" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7bb8c8b6d0843602f22cae4be6671d868b284ea2887e91b80f1ad2d87721fb" +checksum = "78aca1c0a167a299cdc4d3e67f1a23619cbb37576832ec9da564697d4c8cbf6f" dependencies = [ "anyhow", - "bevy_app 0.16.1", - "bevy_ecs 0.16.1", + "bevy_app", + "bevy_ecs", "bevy_platform", - "bevy_reflect 0.16.1", + "bevy_reflect", "bytes", - "derive_more 2.0.1", + "derive_more", "log", ] [[package]] name = "aeronet_replicon" -version = "0.15.0" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa8bd4fc72cfffaaa7a449d416c952293d0c48caa0324c23e727fca78b623e0d" +checksum = "4928d34bfb8fd1e72276eb0e926bf2c44780b10a1dc1b3f524e0a39c95d03920" dependencies = [ "aeronet_io", "aeronet_transport", - "bevy_app 0.16.1", - "bevy_ecs 0.16.1", + "bevy_app", + "bevy_ecs", "bevy_platform", - "bevy_reflect 0.16.1", + "bevy_reflect", "bevy_replicon", + "bevy_state", "log", ] [[package]] name = "aeronet_transport" -version = "0.14.0" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea03d9f67dec95062edf7e94a5a3d04c3cf1dc8f8ab6eae9b1e715f1d574941" +checksum = "beb6ef9407fd6613a39738f45b67205d5e5f9efe36709393a5c9823727d17971" dependencies = [ "aeronet_io", - "bevy_app 0.16.1", - "bevy_ecs 0.16.1", + "bevy_app", + "bevy_ecs", "bevy_platform", - "bevy_reflect 0.16.1", - "bevy_time 0.16.1", - "bit-vec 0.8.0", - "derive_more 2.0.1", + "bevy_reflect", + "bevy_time", + "bit-vec", + "derive_more", "either", "log", "octs", @@ -306,17 +251,17 @@ dependencies = [ [[package]] name = "aeronet_websocket" -version = "0.14.0" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521bb8b0351838bbe79fea6be824a490f304724ab9155792446bd3d418efa771" +checksum = "8ec8ade3625244871f9c071ecf6f80ccb2466011f0ccbb6752a73bf2a37628ad" dependencies = [ "aeronet_io", - "bevy_app 0.16.1", - "bevy_ecs 0.16.1", + "bevy_app", + "bevy_ecs", "bevy_platform", "bytes", "cfg-if", - "derive_more 2.0.1", + "derive_more", "futures", "js-sys", "rcgen", @@ -349,8 +294,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "const-random", - "getrandom 0.3.3", + "getrandom 0.3.4", "once_cell", "version_check", "zerocopy", @@ -358,49 +302,19 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] -[[package]] -name = "aligned-vec" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" -dependencies = [ - "equator", -] - [[package]] name = "allocator-api2" version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" -[[package]] -name = "android-activity" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee91c0c2905bae44f84bfa4e044536541df26b7703fd0888deeb9060fcc44289" -dependencies = [ - "android-properties", - "bitflags 2.9.1", - "cc", - "cesu8", - "jni", - "jni-sys", - "libc", - "log", - "ndk 0.8.0", - "ndk-context", - "ndk-sys 0.5.0+25.2.9519653", - "num_enum", - "thiserror 1.0.69", -] - [[package]] name = "android-activity" version = "0.6.0" @@ -408,14 +322,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" dependencies = [ "android-properties", - "bitflags 2.9.1", + "bitflags 2.10.0", "cc", "cesu8", "jni", "jni-sys", "libc", "log", - "ndk 0.9.0", + "ndk", "ndk-context", "ndk-sys 0.6.0+11769913", "num_enum", @@ -428,12 +342,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_log-sys" version = "0.3.2" @@ -457,9 +365,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.19" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ "anstyle", "anstyle-parse", @@ -472,9 +380,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.11" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] name = "anstyle-parse" @@ -487,29 +395,29 @@ dependencies = [ [[package]] name = "anstyle-query" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "anstyle-wincon" -version = "3.0.9" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "approx" @@ -522,44 +430,33 @@ dependencies = [ [[package]] name = "arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" dependencies = [ "derive_arbitrary", ] [[package]] name = "arboard" -version = "3.6.0" +version = "3.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55f533f8e0af236ffe5eb979b99381df3258853f00ba2e44b6e1955292c75227" +checksum = "0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf" dependencies = [ "clipboard-win", - "image 0.25.6", + "image", "log", - "objc2 0.6.1", - "objc2-app-kit 0.3.1", + "objc2 0.6.3", + "objc2-app-kit 0.3.2", "objc2-core-foundation", "objc2-core-graphics", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "parking_lot", "percent-encoding", - "windows-sys 0.59.0", + "windows-sys 0.60.2", "x11rb", ] -[[package]] -name = "arg_enum_proc_macro" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.104", -] - [[package]] name = "arrayref" version = "0.3.9" @@ -587,22 +484,13 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" -[[package]] -name = "ash" -version = "0.37.3+1.3.251" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a" -dependencies = [ - "libloading 0.7.4", -] - [[package]] name = "ash" version = "0.38.0+1.3.281" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" dependencies = [ - "libloading 0.8.8", + "libloading", ] [[package]] @@ -613,17 +501,7 @@ checksum = "f548ad2c4031f2902e3edc1f29c29e835829437de49562d8eb5dc5584d3a1043" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", -] - -[[package]] -name = "async-broadcast" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" -dependencies = [ - "event-listener 2.5.3", - "futures-core", + "syn", ] [[package]] @@ -632,7 +510,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" dependencies = [ - "event-listener 5.4.0", + "event-listener", "event-listener-strategy", "futures-core", "pin-project-lite", @@ -640,9 +518,9 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" dependencies = [ "concurrent-queue", "event-listener-strategy", @@ -652,9 +530,9 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.13.2" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" +checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" dependencies = [ "async-task", "concurrent-queue", @@ -666,9 +544,9 @@ dependencies = [ [[package]] name = "async-fs" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" +checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" dependencies = [ "async-lock", "blocking", @@ -677,39 +555,38 @@ dependencies = [ [[package]] name = "async-io" -version = "2.4.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1237c0ae75a0f3765f58910ff9cdd0a12eeb39ab2f4c7de23262f337f0aacbb3" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" dependencies = [ - "async-lock", + "autocfg", "cfg-if", "concurrent-queue", "futures-io", "futures-lite", "parking", "polling", - "rustix 1.0.7", + "rustix 1.1.2", "slab", - "tracing", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "async-lock" -version = "3.4.0" +version = "3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" dependencies = [ - "event-listener 5.4.0", + "event-listener", "event-listener-strategy", "pin-project-lite", ] [[package]] name = "async-process" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde3f4e40e6021d7acffc90095cbd6dc54cb593903d1de5832f435eb274b85dc" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" dependencies = [ "async-channel", "async-io", @@ -718,10 +595,9 @@ dependencies = [ "async-task", "blocking", "cfg-if", - "event-listener 5.4.0", + "event-listener", "futures-lite", - "rustix 1.0.7", - "tracing", + "rustix 1.1.2", ] [[package]] @@ -732,14 +608,14 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] name = "async-signal" -version = "0.2.11" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7605a4e50d4b06df3898d5a70bf5fde51ed9059b0434b73105193bc27acce0d" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" dependencies = [ "async-io", "async-lock", @@ -747,10 +623,10 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 1.0.7", + "rustix 1.1.2", "signal-hook-registry", "slab", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -764,13 +640,13 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.88" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -848,34 +724,11 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" -[[package]] -name = "av1-grain" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f3efb2ca85bc610acfa917b5aaa36f3fcbebed5b3182d7f877b02531c4b80c8" -dependencies = [ - "anyhow", - "arrayvec", - "log", - "nom", - "num-rational", - "v_frame", -] - -[[package]] -name = "avif-serialize" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19135c0c7a60bfee564dbe44ab5ce0557c6bf3884e5291a50be76a15640c4fbd" -dependencies = [ - "arrayvec", -] - [[package]] name = "aws-lc-rs" -version = "1.13.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fcc8f365936c834db5514fc45aee5b1202d677e6b40e48468aaaa8183ca8c7" +checksum = "5932a7d9d28b0d2ea34c6b3779d35e3dd6f6345317c34e73438c4f1f29144151" dependencies = [ "aws-lc-sys", "zeroize", @@ -883,11 +736,11 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.29.0" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b1d86e7705efe1be1b569bab41d4fa1e14e220b60a160f78de2db687add079" +checksum = "1826f2e4cfc2cd19ee53c42fbf68e2f81ec21108e0b7ecf6a71cf062137360fc" dependencies = [ - "bindgen 0.69.5", + "bindgen", "cc", "cmake", "dunce", @@ -896,9 +749,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.75" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", "cfg-if", @@ -906,21 +759,9 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-link 0.2.1", ] -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - [[package]] name = "base64" version = "0.22.1" @@ -929,84 +770,76 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bevy" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65b9eadaacf8fe971331bc3f250f35c18bc9dace3f96b483062f38ac07e3a1b4" -dependencies = [ - "bevy_internal 0.13.2", -] - -[[package]] -name = "bevy" -version = "0.16.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8369c16b7c017437021341521f8b4a0d98e1c70113fb358c3258ae7d661d79" +checksum = "342f7e9335416dc98642d5747c4ed8a6ad9f7244a36d5b2b7a1b7910e4d8f524" dependencies = [ - "bevy_internal 0.16.1", - "tracing", + "bevy_internal", ] [[package]] name = "bevy_a11y" -version = "0.13.2" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd8ef2795f7f5c816a4eda04834083eb5a92e8fef603bc21d2091c6e3b63621a" +checksum = "3917cd35096fb2fe176632740b68a4b53cb61006cfff13d66ef47ee2c2478d53" dependencies = [ - "accesskit 0.12.3", - "bevy_app 0.13.2", - "bevy_derive 0.13.2", - "bevy_ecs 0.13.2", + "accesskit 0.21.1", + "bevy_app", + "bevy_derive", + "bevy_ecs", + "bevy_reflect", + "serde", ] [[package]] -name = "bevy_a11y" -version = "0.16.1" +name = "bevy_android" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3561712cf49074d89e9989bfc2e6c6add5d33288f689db9a0c333300d2d004" +checksum = "c2a9dd9488c77fa2ea31b5da2f978aab7f1cc82e6d2c3be0adf637d9fd7cb6c8" dependencies = [ - "accesskit 0.18.0", - "bevy_app 0.16.1", - "bevy_derive 0.16.1", - "bevy_ecs 0.16.1", - "bevy_reflect 0.16.1", - "serde", + "android-activity", ] [[package]] -name = "bevy_app" -version = "0.13.2" +name = "bevy_anti_alias" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab348a32e46d21c5d61794294a92d415a770d26c7ba8951830b127b40b53ccc4" +checksum = "38c1adb85fe0956d6c3b6f90777b829785bb7e29a48f58febeeefd2bad317713" dependencies = [ - "bevy_derive 0.13.2", - "bevy_ecs 0.13.2", - "bevy_reflect 0.13.2", - "bevy_tasks 0.13.2", - "bevy_utils 0.13.2", - "downcast-rs 1.2.1", - "wasm-bindgen", - "web-sys", + "bevy_app", + "bevy_asset", + "bevy_camera", + "bevy_core_pipeline", + "bevy_derive", + "bevy_diagnostic", + "bevy_ecs", + "bevy_image", + "bevy_math", + "bevy_reflect", + "bevy_render", + "bevy_shader", + "bevy_utils", + "tracing", ] [[package]] name = "bevy_app" -version = "0.16.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4491cc4c718ae76b4c6883df58b94cc88b32dcd894ea8d5b603c7c7da72ca967" +checksum = "9f582409b4ed3850d9b66ee94e71a0e2c20e7068121d372530060c4dfcba66fa" dependencies = [ - "bevy_derive 0.16.1", - "bevy_ecs 0.16.1", + "bevy_derive", + "bevy_ecs", "bevy_platform", - "bevy_reflect 0.16.1", - "bevy_tasks 0.16.1", - "bevy_utils 0.16.1", + "bevy_reflect", + "bevy_tasks", + "bevy_utils", "cfg-if", "console_error_panic_hook", "ctrlc", - "downcast-rs 2.0.1", + "downcast-rs 2.0.2", "log", - "thiserror 2.0.12", - "tracing", + "thiserror 2.0.17", "variadics_please", "wasm-bindgen", "web-sys", @@ -1014,70 +847,38 @@ dependencies = [ [[package]] name = "bevy_asset" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50028e0d4f28a9f6aab48f61b688ba2793141188f88cdc9aa6c2bca2cc02ad35" -dependencies = [ - "async-broadcast 0.5.1", - "async-fs", - "async-lock", - "bevy_app 0.13.2", - "bevy_asset_macros 0.13.2", - "bevy_ecs 0.13.2", - "bevy_log 0.13.2", - "bevy_reflect 0.13.2", - "bevy_tasks 0.13.2", - "bevy_utils 0.13.2", - "bevy_winit 0.13.2", - "blake3", - "crossbeam-channel", - "downcast-rs 1.2.1", - "futures-io", - "futures-lite", - "js-sys", - "parking_lot", - "ron 0.8.1", - "serde", - "thiserror 1.0.69", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "bevy_asset" -version = "0.16.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f56111d9b88d8649f331a667d9d72163fb26bd09518ca16476d238653823db1e" +checksum = "9e6ee42e74a64a46ab91bd1c0155f8abe5b732bdb948a9b26e541456cc7940e5" dependencies = [ - "async-broadcast 0.7.2", + "async-broadcast", "async-fs", "async-lock", "atomicow", - "bevy_app 0.16.1", - "bevy_asset_macros 0.16.1", - "bevy_ecs 0.16.1", + "bevy_android", + "bevy_app", + "bevy_asset_macros", + "bevy_ecs", "bevy_platform", - "bevy_reflect 0.16.1", - "bevy_tasks 0.16.1", - "bevy_utils 0.16.1", - "bevy_window 0.16.1", - "bitflags 2.9.1", + "bevy_reflect", + "bevy_tasks", + "bevy_utils", + "bitflags 2.10.0", "blake3", "crossbeam-channel", - "derive_more 1.0.0", + "derive_more", "disqualified", - "downcast-rs 2.0.1", + "downcast-rs 2.0.2", "either", "futures-io", "futures-lite", "js-sys", "notify-debouncer-full", "parking_lot", - "ron 0.8.1", + "ron 0.10.1", "serde", "stackfuture", - "thiserror 2.0.12", + "thiserror 2.0.17", "tracing", "uuid", "wasm-bindgen", @@ -1087,200 +888,150 @@ dependencies = [ [[package]] name = "bevy_asset_macros" -version = "0.13.2" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6617475908368418d815360148fdbb82f879dc255a70d2d7baa3766f0cd4bfd7" +checksum = "d03711d2c087227f64ba85dd38a99d4d6893f80d2475c2e77fb90a883760a055" dependencies = [ - "bevy_macro_utils 0.13.2", + "bevy_macro_utils", "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] -name = "bevy_asset_macros" -version = "0.16.1" +name = "bevy_camera" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4cca3e67c0ec760d8889d42293d987ce5da92eaf9c592bf5d503728a63b276d" +checksum = "b70d79ccbd8bfefc79f33a104dfd82ae2f5276ce04d6df75787bfa3edc4c4c1a" dependencies = [ - "bevy_macro_utils 0.16.1", - "proc-macro2", - "quote", - "syn 2.0.104", + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_derive", + "bevy_ecs", + "bevy_image", + "bevy_math", + "bevy_mesh", + "bevy_reflect", + "bevy_transform", + "bevy_utils", + "bevy_window", + "derive_more", + "downcast-rs 2.0.2", + "serde", + "smallvec", + "thiserror 2.0.17", + "wgpu-types 26.0.0", ] [[package]] name = "bevy_color" -version = "0.16.2" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c101cbe1e26b8d701eb77263b14346e2e0cbbd2a6e254b9b1aead814e5ca8d3" +checksum = "94dc78477c1c208c0cd221c64e907aba8ba165f39bebb72adc6180e1a13e8938" dependencies = [ - "bevy_math 0.16.1", - "bevy_reflect 0.16.1", + "bevy_math", + "bevy_reflect", "bytemuck", - "derive_more 1.0.0", - "encase 0.10.0", + "derive_more", + "encase", "serde", - "thiserror 2.0.12", - "wgpu-types 24.0.0", + "thiserror 2.0.17", + "wgpu-types 26.0.0", ] [[package]] name = "bevy_common_assets" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a18527525acb0a131ecad38eecbd0e578aefb55959304a37ab44b474b67734b" +checksum = "bf2d95660d90ec38e1259afa5fe95c5b9f72d822d4dfd2dbfa6ef4c176d3078f" dependencies = [ "anyhow", - "bevy 0.16.1", + "bevy", "csv", "serde", - "thiserror 1.0.69", - "toml 0.8.23", + "thiserror 2.0.17", + "toml 0.9.8", ] [[package]] -name = "bevy_core" -version = "0.13.2" +name = "bevy_core_pipeline" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12b0042f241ba7cd61487aadd8addfb56f7eeb662d713ac1577026704508fc6c" +checksum = "0c866a2fe33ec27a612d883223d30f1857aa852766b21a9603628735dace632f" dependencies = [ - "bevy_app 0.13.2", - "bevy_ecs 0.13.2", - "bevy_math 0.13.2", - "bevy_reflect 0.13.2", - "bevy_tasks 0.13.2", - "bevy_utils 0.13.2", - "bytemuck", - "serde", -] - -[[package]] -name = "bevy_core_pipeline" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48b7a471cb8ba665f12f7a167faa5566c11386f5bfc77d2e10bfde22b179f7b3" -dependencies = [ - "bevy_app 0.13.2", - "bevy_asset 0.13.2", - "bevy_core", - "bevy_derive 0.13.2", - "bevy_ecs 0.13.2", - "bevy_log 0.13.2", - "bevy_math 0.13.2", - "bevy_reflect 0.13.2", - "bevy_render 0.13.2", - "bevy_transform 0.13.2", - "bevy_utils 0.13.2", - "bitflags 2.9.1", - "radsort", - "serde", -] - -[[package]] -name = "bevy_core_pipeline" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed46363cad80dc00f08254c3015232bd6f640738403961c6d63e7ecfc61625" -dependencies = [ - "bevy_app 0.16.1", - "bevy_asset 0.16.1", - "bevy_color", - "bevy_derive 0.16.1", - "bevy_diagnostic 0.16.1", - "bevy_ecs 0.16.1", - "bevy_image", - "bevy_math 0.16.1", - "bevy_platform", - "bevy_reflect 0.16.1", - "bevy_render 0.16.1", - "bevy_transform 0.16.1", - "bevy_utils 0.16.1", - "bevy_window 0.16.1", - "bitflags 2.9.1", - "bytemuck", - "nonmax", - "radsort", - "serde", - "smallvec", - "thiserror 2.0.12", - "tracing", -] - -[[package]] -name = "bevy_derive" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0e01f8343f391e2d6a63b368b82fb5b252ed43c8713fc87f9a8f2d59407dd00" -dependencies = [ - "bevy_macro_utils 0.13.2", - "quote", - "syn 2.0.104", + "bevy_app", + "bevy_asset", + "bevy_camera", + "bevy_color", + "bevy_derive", + "bevy_ecs", + "bevy_image", + "bevy_math", + "bevy_platform", + "bevy_reflect", + "bevy_render", + "bevy_shader", + "bevy_transform", + "bevy_utils", + "bevy_window", + "bitflags 2.10.0", + "nonmax", + "radsort", + "smallvec", + "thiserror 2.0.17", + "tracing", ] [[package]] name = "bevy_derive" -version = "0.16.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b837bf6c51806b10ebfa9edf1844ad80a3a0760d6c5fac4e90761df91a8901a" +checksum = "b8c733807158f8fcac68e23222e69ed91a6492ae9410fc2c145b9bb182cfd63e" dependencies = [ - "bevy_macro_utils 0.16.1", + "bevy_macro_utils", "quote", - "syn 2.0.104", + "syn", ] [[package]] name = "bevy_dev_tools" -version = "0.16.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f29a3abf7b8e0148ef4f74a4ec63f4efb00a3d62aba361921a5d259410556d5" +checksum = "1187d400fa44e1f2b741396fccda2e3ff8cb2775f7eeac508c6b6b068f2050ed" dependencies = [ - "bevy_app 0.16.1", - "bevy_asset 0.16.1", + "bevy_app", + "bevy_asset", + "bevy_camera", "bevy_color", - "bevy_diagnostic 0.16.1", - "bevy_ecs 0.16.1", - "bevy_input 0.16.1", + "bevy_diagnostic", + "bevy_ecs", + "bevy_math", "bevy_picking", - "bevy_reflect 0.16.1", - "bevy_render 0.16.1", + "bevy_reflect", + "bevy_render", + "bevy_shader", "bevy_state", "bevy_text", - "bevy_time 0.16.1", - "bevy_ui 0.16.1", - "bevy_utils 0.16.1", - "bevy_window 0.16.1", + "bevy_time", + "bevy_ui", + "bevy_ui_render", + "bevy_window", "tracing", ] [[package]] name = "bevy_diagnostic" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1401cdccec7e49378d013dfb0ff62c251f85b3be19dcdf04cfd827f793d1ee9" -dependencies = [ - "bevy_app 0.13.2", - "bevy_core", - "bevy_ecs 0.13.2", - "bevy_log 0.13.2", - "bevy_time 0.13.2", - "bevy_utils 0.13.2", - "const-fnv1a-hash", - "sysinfo", -] - -[[package]] -name = "bevy_diagnostic" -version = "0.16.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48797366f312a8f31e237d08ce3ee70162591282d2bfe7c5ad8be196fb263e55" +checksum = "f12fa32312818c08aa4035bebe9fb3f62aaf7efae33688e718dd6ee6c0147493" dependencies = [ - "bevy_app 0.16.1", - "bevy_ecs 0.16.1", + "atomic-waker", + "bevy_app", + "bevy_ecs", "bevy_platform", - "bevy_tasks 0.16.1", - "bevy_time 0.16.1", - "bevy_utils 0.16.1", + "bevy_tasks", + "bevy_time", "const-fnv1a-hash", "log", "serde", @@ -1288,603 +1039,373 @@ dependencies = [ [[package]] name = "bevy_ecs" -version = "0.13.2" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98e612a8e7962ead849e370f3a7e972b88df879ced05cd9dad6a0286d14650cf" -dependencies = [ - "async-channel", - "bevy_ecs_macros 0.13.2", - "bevy_ptr 0.13.2", - "bevy_reflect 0.13.2", - "bevy_tasks 0.13.2", - "bevy_utils 0.13.2", - "downcast-rs 1.2.1", - "fixedbitset 0.4.2", - "rustc-hash 1.1.0", - "serde", - "thiserror 1.0.69", - "thread_local", -] - -[[package]] -name = "bevy_ecs" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b747210d7db09dfacc237707d4fd31c8b43d7744cd5e5829e2c4ca86b9e47baf" -dependencies = [ - "bevy_ecs_macros 0.15.3", - "bevy_ptr 0.15.3", - "bevy_reflect 0.15.1", - "bevy_tasks 0.15.3", - "bevy_utils 0.15.3", - "bitflags 2.9.1", - "concurrent-queue", - "derive_more 1.0.0", - "disqualified", - "fixedbitset 0.5.7", - "nonmax", - "petgraph 0.6.5", - "smallvec", -] - -[[package]] -name = "bevy_ecs" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c2bf6521aae57a0ec3487c4bfb59e36c4a378e834b626a4bea6a885af2fdfe7" +checksum = "69d929d32190cfcde6efd2df493601c4dbc18a691fd9775a544c951c3c112e1a" dependencies = [ "arrayvec", - "bevy_ecs_macros 0.16.1", + "bevy_ecs_macros", "bevy_platform", - "bevy_ptr 0.16.1", - "bevy_reflect 0.16.1", - "bevy_tasks 0.16.1", - "bevy_utils 0.16.1", - "bitflags 2.9.1", + "bevy_ptr", + "bevy_reflect", + "bevy_tasks", + "bevy_utils", + "bitflags 2.10.0", "bumpalo", "concurrent-queue", - "derive_more 1.0.0", - "disqualified", - "fixedbitset 0.5.7", + "derive_more", + "fixedbitset", "indexmap", "log", "nonmax", "serde", + "slotmap", "smallvec", - "thiserror 2.0.12", - "tracing", + "thiserror 2.0.17", "variadics_please", ] [[package]] name = "bevy_ecs_macros" -version = "0.13.2" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "807b5106c3410e58f4f523b55ea3c071e2a09e31e9510f3c22021c6a04732b5b" +checksum = "6eeddfb80a2e000663e87be9229c26b4da92bddbc06c8776bc0d1f4a7f679079" dependencies = [ - "bevy_macro_utils 0.13.2", + "bevy_macro_utils", "proc-macro2", "quote", - "syn 2.0.104", -] - -[[package]] -name = "bevy_ecs_macros" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f453adf07712b39826bc5845e5b0887ce03204ee8359bbe6b40a9afda60564a1" -dependencies = [ - "bevy_macro_utils 0.15.3", - "proc-macro2", - "quote", - "syn 2.0.104", -] - -[[package]] -name = "bevy_ecs_macros" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38748d6f3339175c582d751f410fb60a93baf2286c3deb7efebb0878dce7f413" -dependencies = [ - "bevy_macro_utils 0.16.1", - "proc-macro2", - "quote", - "syn 2.0.104", + "syn", ] [[package]] name = "bevy_egui" -version = "0.35.0" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67c9ddb60d10926899c3eaa022aee43fb92ba507191c62e1ff935b323c5a98" +checksum = "2c20416343c6d24eedad9db93c4c42c6571b15d14bac4f6f41b993ec413243f9" dependencies = [ "arboard", - "bevy_app 0.16.1", - "bevy_asset 0.16.1", - "bevy_core_pipeline 0.16.1", - "bevy_derive 0.16.1", - "bevy_ecs 0.16.1", + "bevy_app", + "bevy_asset", + "bevy_camera", + "bevy_color", + "bevy_core_pipeline", + "bevy_derive", + "bevy_ecs", "bevy_image", - "bevy_input 0.16.1", - "bevy_log 0.16.1", - "bevy_math 0.16.1", + "bevy_input", + "bevy_log", + "bevy_math", + "bevy_mesh", "bevy_picking", "bevy_platform", - "bevy_reflect 0.16.1", - "bevy_render 0.16.1", - "bevy_time 0.16.1", - "bevy_transform 0.16.1", - "bevy_window 0.16.1", - "bevy_winit 0.16.1", + "bevy_reflect", + "bevy_render", + "bevy_shader", + "bevy_time", + "bevy_transform", + "bevy_ui_render", + "bevy_utils", + "bevy_window", + "bevy_winit", "bytemuck", "crossbeam-channel", - "egui 0.31.1", - "encase 0.10.0", - "image 0.25.6", + "egui 0.33.2", + "encase", + "getrandom 0.3.4", + "image", + "itertools 0.14.0", "js-sys", "thread_local", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", "webbrowser", - "wgpu-types 24.0.0", - "winit 0.30.11", -] - -[[package]] -name = "bevy_encase_derive" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "887087a5e522d9f20733a84dd7e6e9ca04cd8fdfac659220ed87d675eebc83a7" -dependencies = [ - "bevy_macro_utils 0.13.2", - "encase_derive_impl 0.7.0", + "wgpu-types 26.0.0", + "winit", ] [[package]] name = "bevy_encase_derive" -version = "0.16.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8148f4edee470a2ea5cad010184c492a4c94c36d7a7158ea28e134ea87f274ab" +checksum = "7449e5903594a00f007732ba232af0c527ad4e6e3d29bc3e195ec78dbd20c8b2" dependencies = [ - "bevy_macro_utils 0.16.1", - "encase_derive_impl 0.10.0", + "bevy_macro_utils", + "encase_derive_impl", ] [[package]] name = "bevy_gizmos" -version = "0.13.2" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "054df3550a9d423a961de65b459946ff23304f97f25af8a62c23f4259db8506d" +checksum = "0d3f174faa13041634060dd99f6f59c29997fd62f40252f0466c2ebea8603d4d" dependencies = [ - "bevy_app 0.13.2", - "bevy_asset 0.13.2", - "bevy_core", - "bevy_core_pipeline 0.13.2", - "bevy_ecs 0.13.2", - "bevy_gizmos_macros 0.13.2", - "bevy_log 0.13.2", - "bevy_math 0.13.2", - "bevy_reflect 0.13.2", - "bevy_render 0.13.2", - "bevy_sprite 0.13.2", - "bevy_transform 0.13.2", - "bevy_utils 0.13.2", -] - -[[package]] -name = "bevy_gizmos" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7823154a9682128c261d8bddb3a4d7192a188490075c527af04520c2f0f8aad6" -dependencies = [ - "bevy_app 0.16.1", - "bevy_asset 0.16.1", + "bevy_app", + "bevy_asset", + "bevy_camera", "bevy_color", - "bevy_core_pipeline 0.16.1", - "bevy_ecs 0.16.1", - "bevy_gizmos_macros 0.16.1", + "bevy_core_pipeline", + "bevy_ecs", + "bevy_gizmos_macros", "bevy_image", - "bevy_math 0.16.1", - "bevy_reflect 0.16.1", - "bevy_render 0.16.1", - "bevy_sprite 0.16.1", - "bevy_time 0.16.1", - "bevy_transform 0.16.1", - "bevy_utils 0.16.1", + "bevy_light", + "bevy_math", + "bevy_mesh", + "bevy_reflect", + "bevy_render", + "bevy_shader", + "bevy_sprite_render", + "bevy_time", + "bevy_transform", + "bevy_utils", "bytemuck", "tracing", ] [[package]] name = "bevy_gizmos_macros" -version = "0.13.2" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abdcaf74d8cd34aa5c3293527e7a012826840886ad3496c1b963ed8b66b1619f" +checksum = "714273aa7f285c0aaa874b7fbe37fe4e6e45355e3e6f3321aefa1b78cda259e0" dependencies = [ - "bevy_macro_utils 0.13.2", - "proc-macro2", - "quote", - "syn 2.0.104", -] - -[[package]] -name = "bevy_gizmos_macros" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f378f3b513218ddc78254bbe76536d9de59c1429ebd0c14f5d8f2a25812131ad" -dependencies = [ - "bevy_macro_utils 0.16.1", - "proc-macro2", + "bevy_macro_utils", "quote", - "syn 2.0.104", -] - -[[package]] -name = "bevy_hierarchy" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb3dfad24866a6713dafa3065a91c5cf5e355f6e1b191c25d704ae54185246c" -dependencies = [ - "bevy_app 0.13.2", - "bevy_core", - "bevy_ecs 0.13.2", - "bevy_log 0.13.2", - "bevy_reflect 0.13.2", - "bevy_utils 0.13.2", + "syn", ] [[package]] name = "bevy_image" -version = "0.16.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65e6e900cfecadbc3149953169e36b9e26f922ed8b002d62339d8a9dc6129328" +checksum = "168de8239b2aedd2eeef9f76ae1909b2fdf859b11dcdb4d4d01b93f5f2c771be" dependencies = [ - "bevy_app 0.16.1", - "bevy_asset 0.16.1", + "bevy_app", + "bevy_asset", "bevy_color", - "bevy_math 0.16.1", + "bevy_ecs", + "bevy_math", "bevy_platform", - "bevy_reflect 0.16.1", - "bevy_utils 0.16.1", - "bitflags 2.9.1", + "bevy_reflect", + "bevy_utils", + "bitflags 2.10.0", "bytemuck", "futures-lite", "guillotiere", "half", - "image 0.25.6", + "image", "ktx2", "rectangle-pack", "ruzstd", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "tracing", - "wgpu-types 24.0.0", + "wgpu-types 26.0.0", ] [[package]] name = "bevy_input" -version = "0.13.2" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47f2b2b3df168c6ef661d25e09abf5bd4fecaacd400f27e5db650df1c3fa3a3b" +checksum = "3cf4074b2d0d6680b4deb308ded7b4e8b1b99181c0502e2632e78af815b26f01" dependencies = [ - "bevy_app 0.13.2", - "bevy_ecs 0.13.2", - "bevy_math 0.13.2", - "bevy_reflect 0.13.2", - "bevy_utils 0.13.2", - "serde", - "smol_str", - "thiserror 1.0.69", -] - -[[package]] -name = "bevy_input" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d6b6516433f6f7d680f648d04eb1866bb3927a1782d52f74831b62042f3cd1" -dependencies = [ - "bevy_app 0.16.1", - "bevy_ecs 0.16.1", - "bevy_math 0.16.1", + "bevy_app", + "bevy_ecs", + "bevy_math", "bevy_platform", - "bevy_reflect 0.16.1", - "bevy_utils 0.16.1", - "derive_more 1.0.0", + "bevy_reflect", + "derive_more", "log", "serde", "smol_str", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] name = "bevy_input_focus" -version = "0.16.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e2d079fda74d1416e0a57dac29ea2b79ff77f420cd6b87f833d3aa29a46bc4d" +checksum = "70761eba0f616a1caa761457bff2b8ae80c9916f39d167fab8c2d5c98d2b8951" dependencies = [ - "bevy_app 0.16.1", - "bevy_ecs 0.16.1", - "bevy_input 0.16.1", - "bevy_math 0.16.1", - "bevy_reflect 0.16.1", - "bevy_window 0.16.1", + "bevy_app", + "bevy_ecs", + "bevy_input", + "bevy_math", + "bevy_picking", + "bevy_reflect", + "bevy_window", "log", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] name = "bevy_internal" -version = "0.13.2" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f58ec0ce77603df9474cde61f429126bfe06eb79094440e9141afb4217751c79" -dependencies = [ - "bevy_a11y 0.13.2", - "bevy_app 0.13.2", - "bevy_asset 0.13.2", - "bevy_core", - "bevy_core_pipeline 0.13.2", - "bevy_derive 0.13.2", - "bevy_diagnostic 0.13.2", - "bevy_ecs 0.13.2", - "bevy_gizmos 0.13.2", - "bevy_hierarchy", - "bevy_input 0.13.2", - "bevy_log 0.13.2", - "bevy_math 0.13.2", - "bevy_ptr 0.13.2", - "bevy_reflect 0.13.2", - "bevy_render 0.13.2", - "bevy_scene 0.13.2", - "bevy_sprite 0.13.2", - "bevy_tasks 0.13.2", - "bevy_time 0.13.2", - "bevy_transform 0.13.2", - "bevy_ui 0.13.2", - "bevy_utils 0.13.2", - "bevy_window 0.13.2", -] - -[[package]] -name = "bevy_internal" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "857da8785678fde537d02944cd20dec9cafb7d4c447efe15f898dc60e733cacd" +checksum = "f43985739584f3a5d43026aa1edd772f064830be46c497518f05f7dfbc886bba" dependencies = [ - "bevy_a11y 0.16.1", - "bevy_app 0.16.1", - "bevy_asset 0.16.1", + "bevy_a11y", + "bevy_android", + "bevy_anti_alias", + "bevy_app", + "bevy_asset", + "bevy_camera", "bevy_color", - "bevy_core_pipeline 0.16.1", - "bevy_derive 0.16.1", + "bevy_core_pipeline", + "bevy_derive", "bevy_dev_tools", - "bevy_diagnostic 0.16.1", - "bevy_ecs 0.16.1", - "bevy_gizmos 0.16.1", + "bevy_diagnostic", + "bevy_ecs", + "bevy_gizmos", "bevy_image", - "bevy_input 0.16.1", + "bevy_input", "bevy_input_focus", - "bevy_log 0.16.1", - "bevy_math 0.16.1", - "bevy_pbr", + "bevy_log", + "bevy_math", + "bevy_mesh", "bevy_picking", "bevy_platform", - "bevy_ptr 0.16.1", - "bevy_reflect 0.16.1", - "bevy_render 0.16.1", - "bevy_scene 0.16.1", - "bevy_sprite 0.16.1", + "bevy_post_process", + "bevy_ptr", + "bevy_reflect", + "bevy_render", + "bevy_scene", + "bevy_shader", + "bevy_sprite", + "bevy_sprite_render", "bevy_state", - "bevy_tasks 0.16.1", + "bevy_tasks", "bevy_text", - "bevy_time 0.16.1", - "bevy_transform 0.16.1", - "bevy_ui 0.16.1", - "bevy_utils 0.16.1", - "bevy_window 0.16.1", - "bevy_winit 0.16.1", + "bevy_time", + "bevy_transform", + "bevy_ui", + "bevy_utils", + "bevy_window", + "bevy_winit", ] [[package]] -name = "bevy_log" -version = "0.13.2" +name = "bevy_light" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5eea6c527fd828b7fef8d0f518167f27f405b904a16f227b644687d3f46a809" +checksum = "cad00ab66d1e93edb928be66606a71066f3b1cbc9f414720e290ef5361eb6237" dependencies = [ - "android_log-sys", - "bevy_app 0.13.2", - "bevy_ecs 0.13.2", - "bevy_utils 0.13.2", - "console_error_panic_hook", - "tracing-log 0.1.4", - "tracing-subscriber", - "tracing-wasm", + "bevy_app", + "bevy_asset", + "bevy_camera", + "bevy_color", + "bevy_ecs", + "bevy_image", + "bevy_math", + "bevy_mesh", + "bevy_platform", + "bevy_reflect", + "bevy_transform", + "bevy_utils", + "tracing", ] [[package]] name = "bevy_log" -version = "0.16.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a61ee8aef17a974f5ca481dcedf0c2bd52670e231d4c4bc9ddef58328865f9" +checksum = "4ae217a035714a37b779487f82edc4c7c1223f7088d7ad94054f29f524d61c51" dependencies = [ "android_log-sys", - "bevy_app 0.16.1", - "bevy_ecs 0.16.1", - "bevy_utils 0.16.1", + "bevy_app", + "bevy_ecs", + "bevy_platform", + "bevy_utils", "tracing", - "tracing-error", - "tracing-log 0.2.0", + "tracing-log", "tracing-oslog", "tracing-subscriber", - "tracing-tracy", "tracing-wasm", ] [[package]] name = "bevy_macro_utils" -version = "0.13.2" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb270c98a96243b29465139ed10bda2f675d00a11904f6588a5f7fc4774119c7" -dependencies = [ - "proc-macro2", - "quote", - "rustc-hash 1.1.0", - "syn 2.0.104", - "toml_edit 0.21.1", -] - -[[package]] -name = "bevy_macro_utils" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb6ded1ddc124ea214f6a2140e47a78d1fe79b0638dad39419cdeef2e1133f1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.104", - "toml_edit 0.22.27", -] - -[[package]] -name = "bevy_macro_utils" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052eeebcb8e7e072beea5031b227d9a290f8a7fbbb947573ab6ec81df0fb94be" +checksum = "17dbc3f8948da58b3c17767d20fd3cd35fe4721ed19a9a3204a6f1d6c9951bdd" dependencies = [ "parking_lot", "proc-macro2", "quote", - "syn 2.0.104", - "toml_edit 0.22.27", -] - -[[package]] -name = "bevy_math" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f06daa26ffb82d90ba772256c0ba286f6c305c392f6976c9822717974805837c" -dependencies = [ - "glam 0.25.0", - "serde", + "syn", + "toml_edit 0.23.7", ] [[package]] name = "bevy_math" -version = "0.16.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68553e0090fe9c3ba066c65629f636bd58e4ebd9444fdba097b91af6cd3e243f" +checksum = "f7a41e368ffa95ae2a353197d1ae3993f4d3d471444d80b65c932db667ea7b9e" dependencies = [ "approx", - "bevy_reflect 0.16.1", - "derive_more 1.0.0", - "glam 0.29.3", + "bevy_reflect", + "derive_more", + "glam 0.30.9", "itertools 0.14.0", "libm", - "rand 0.8.5", + "rand 0.9.2", "rand_distr", "serde", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.17", "variadics_please", ] [[package]] name = "bevy_mesh" -version = "0.16.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b10399c7027001edbc0406d7d0198596b1f07206c1aae715274106ba5bdcac40" +checksum = "b6255244b71153b305fddb4e6f827cb97ed51f276b6e632f5fc46538647948f6" dependencies = [ - "bevy_asset 0.16.1", - "bevy_derive 0.16.1", - "bevy_ecs 0.16.1", + "bevy_app", + "bevy_asset", + "bevy_derive", + "bevy_ecs", "bevy_image", - "bevy_math 0.16.1", - "bevy_mikktspace 0.16.1", + "bevy_math", + "bevy_mikktspace", "bevy_platform", - "bevy_reflect 0.16.1", - "bevy_transform 0.16.1", - "bevy_utils 0.16.1", - "bitflags 2.9.1", + "bevy_reflect", + "bevy_transform", + "bitflags 2.10.0", "bytemuck", - "hexasphere 15.1.0", + "derive_more", + "hexasphere", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "tracing", - "wgpu-types 24.0.0", + "wgpu-types 26.0.0", ] [[package]] name = "bevy_mikktspace" -version = "0.13.2" +version = "0.17.0-dev" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0d7ef7f2a826d0b19f059035831ce00a5e930435cc53c61e045773d0483f67a" -dependencies = [ - "glam 0.25.0", -] - -[[package]] -name = "bevy_mikktspace" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb60c753b968a2de0fd279b76a3d19517695e771edb4c23575c7f92156315de" -dependencies = [ - "glam 0.29.3", -] - -[[package]] -name = "bevy_pbr" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5e0b4eb871f364a0d217f70f6c41d7fdc6f9f931fa1abbf222180c03d0ae410" -dependencies = [ - "bevy_app 0.16.1", - "bevy_asset 0.16.1", - "bevy_color", - "bevy_core_pipeline 0.16.1", - "bevy_derive 0.16.1", - "bevy_diagnostic 0.16.1", - "bevy_ecs 0.16.1", - "bevy_image", - "bevy_math 0.16.1", - "bevy_platform", - "bevy_reflect 0.16.1", - "bevy_render 0.16.1", - "bevy_transform 0.16.1", - "bevy_utils 0.16.1", - "bevy_window 0.16.1", - "bitflags 2.9.1", - "bytemuck", - "derive_more 1.0.0", - "fixedbitset 0.5.7", - "nonmax", - "offset-allocator", - "radsort", - "smallvec", - "static_assertions", - "thiserror 2.0.12", - "tracing", -] +checksum = "7ef8e4b7e61dfe7719bb03c884dc270cd46a82efb40f93e9933b990c5c190c59" [[package]] name = "bevy_picking" -version = "0.16.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ed04757938655ed8094ea1efb533f99063a8b22abffc22010c694d291522850" +checksum = "3a232a8ea4dc9b83c08226f56b868acb1ead06946a95d8b9c8cbbcc860cd8090" dependencies = [ - "bevy_app 0.16.1", - "bevy_asset 0.16.1", - "bevy_derive 0.16.1", - "bevy_ecs 0.16.1", - "bevy_input 0.16.1", - "bevy_math 0.16.1", + "bevy_app", + "bevy_asset", + "bevy_camera", + "bevy_derive", + "bevy_ecs", + "bevy_input", + "bevy_math", "bevy_mesh", "bevy_platform", - "bevy_reflect 0.16.1", - "bevy_render 0.16.1", - "bevy_time 0.16.1", - "bevy_transform 0.16.1", - "bevy_utils 0.16.1", - "bevy_window 0.16.1", + "bevy_reflect", + "bevy_time", + "bevy_transform", + "bevy_window", "crossbeam-channel", "tracing", "uuid", @@ -1892,536 +1413,372 @@ dependencies = [ [[package]] name = "bevy_platform" -version = "0.16.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7573dc824a1b08b4c93fdbe421c53e1e8188e9ca1dd74a414455fe571facb47" +checksum = "10cf8cda162688c95250e74cffaa1c3a04597f105d4ca35554106f107308ea57" dependencies = [ - "cfg-if", "critical-section", - "foldhash", - "getrandom 0.2.16", - "hashbrown 0.15.4", + "foldhash 0.2.0", + "futures-channel", + "getrandom 0.3.4", + "hashbrown 0.16.0", + "js-sys", "portable-atomic", "portable-atomic-util", "serde", "spin", - "web-time 1.1.0", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-time", ] [[package]] -name = "bevy_ptr" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8050e2869fe341db6874203b5a01ff12673807a2c7c80cb829f6c7bea6997268" - -[[package]] -name = "bevy_ptr" -version = "0.15.3" +name = "bevy_post_process" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89fe0b0b919146939481a3a7c38864face2c6d0fd2c73ab3d430dc693ecd9b11" +checksum = "26ee8ab6043f8bbe43e9c16bbdde0c5e7289b99e62cd8aad1a2a4166a7f2bce6" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_camera", + "bevy_color", + "bevy_core_pipeline", + "bevy_derive", + "bevy_ecs", + "bevy_image", + "bevy_math", + "bevy_platform", + "bevy_reflect", + "bevy_render", + "bevy_shader", + "bevy_transform", + "bevy_utils", + "bevy_window", + "bitflags 2.10.0", + "nonmax", + "radsort", + "smallvec", + "thiserror 2.0.17", + "tracing", +] [[package]] name = "bevy_ptr" -version = "0.16.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df7370d0e46b60e071917711d0860721f5347bc958bf325975ae6913a5dfcf01" +checksum = "28ab4074e7b781bab84e9b0a41ede245d673d1f75646ce0db27643aedcfb3a85" [[package]] name = "bevy_rapier2d" -version = "0.25.0" -source = "git+https://github.com/ghostlyzsh/bevy_rapier.git#348c11dc7463a2c4b29c28cd118b4730c3d15035" -dependencies = [ - "bevy 0.13.2", - "bitflags 2.9.1", - "log", - "nalgebra 0.32.6", - "rapier2d 0.18.0", - "serde", -] - -[[package]] -name = "bevy_rapier2d" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ad67c66adfccd20a3253e2abc135aa38d57b5b35a63abe682737c763c2807f9" +version = "0.31.0" +source = "git+https://github.com/Deniskore/bevy_rapier?branch=bevy-0.17#47e1fd32c6ea61cfe9a71cb1c42819d7b7fc88ac" dependencies = [ - "bevy 0.16.1", - "bitflags 2.9.1", + "bevy", + "bitflags 2.10.0", "log", - "nalgebra 0.33.2", - "rapier2d 0.25.1", - "serde", -] - -[[package]] -name = "bevy_reflect" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccbd7de21d586457a340a0962ad0747dc5098ff925eb6b27a918c4bdd8252f7b" -dependencies = [ - "bevy_math 0.13.2", - "bevy_ptr 0.13.2", - "bevy_reflect_derive 0.13.2", - "bevy_utils 0.13.2", - "downcast-rs 1.2.1", - "erased-serde", - "glam 0.25.0", - "serde", - "smol_str", - "thiserror 1.0.69", -] - -[[package]] -name = "bevy_reflect" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab3264acc3b6f48bc23fbd09fdfea6e5d9b7bfec142e4f3333f532acf195bca" -dependencies = [ - "assert_type_match", - "bevy_ptr 0.15.3", - "bevy_reflect_derive 0.15.1", - "bevy_utils 0.15.3", - "derive_more 1.0.0", - "disqualified", - "downcast-rs 1.2.1", - "erased-serde", + "nalgebra", + "rapier2d", "serde", - "smallvec", ] [[package]] name = "bevy_reflect" -version = "0.16.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daeb91a63a1a4df00aa58da8cc4ddbd4b9f16ab8bb647c5553eb156ce36fa8c2" +checksum = "333df3f5947b7e62728eb5c0b51d679716b16c7c5283118fed4563f13230954e" dependencies = [ "assert_type_match", "bevy_platform", - "bevy_ptr 0.16.1", - "bevy_reflect_derive 0.16.1", - "bevy_utils 0.16.1", - "derive_more 1.0.0", + "bevy_ptr", + "bevy_reflect_derive", + "bevy_utils", + "derive_more", "disqualified", - "downcast-rs 2.0.1", + "downcast-rs 2.0.2", "erased-serde", - "foldhash", - "glam 0.29.3", + "foldhash 0.2.0", + "glam 0.30.9", + "inventory", "serde", "smallvec", "smol_str", - "thiserror 2.0.12", + "thiserror 2.0.17", "uuid", "variadics_please", - "wgpu-types 24.0.0", + "wgpu-types 26.0.0", ] [[package]] name = "bevy_reflect_derive" -version = "0.13.2" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ce33051bd49036d4a5a62aa3f2068672ec55f3ebe92aa0d003a341f15cc37ac" +checksum = "0205dce9c5a4d8d041b263bcfd96e9d9d6f3d49416e12db347ab5778b3071fe1" dependencies = [ - "bevy_macro_utils 0.13.2", - "proc-macro2", - "quote", - "syn 2.0.104", - "uuid", -] - -[[package]] -name = "bevy_reflect_derive" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f83876a322130ab38a47d5dcf75258944bf76b3387d1acdb3750920fda63e2" -dependencies = [ - "bevy_macro_utils 0.15.3", - "proc-macro2", - "quote", - "syn 2.0.104", - "uuid", -] - -[[package]] -name = "bevy_reflect_derive" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ddadc55fe16b45faaa54ab2f9cb00548013c74812e8b018aa172387103cce6" -dependencies = [ - "bevy_macro_utils 0.16.1", + "bevy_macro_utils", + "indexmap", "proc-macro2", "quote", - "syn 2.0.104", + "syn", "uuid", ] [[package]] name = "bevy_render" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b2c4b644c739c0b474b6f8f7b0bc68ac13d83b59688781e9a7753c52780177" -dependencies = [ - "async-channel", - "bevy_app 0.13.2", - "bevy_asset 0.13.2", - "bevy_core", - "bevy_derive 0.13.2", - "bevy_ecs 0.13.2", - "bevy_encase_derive 0.13.2", - "bevy_hierarchy", - "bevy_log 0.13.2", - "bevy_math 0.13.2", - "bevy_mikktspace 0.13.2", - "bevy_reflect 0.13.2", - "bevy_render_macros 0.13.2", - "bevy_tasks 0.13.2", - "bevy_time 0.13.2", - "bevy_transform 0.13.2", - "bevy_utils 0.13.2", - "bevy_window 0.13.2", - "bitflags 2.9.1", - "bytemuck", - "codespan-reporting 0.11.1", - "downcast-rs 1.2.1", - "encase 0.7.0", - "futures-lite", - "hexasphere 10.0.0", - "image 0.24.9", - "js-sys", - "naga 0.19.2", - "naga_oil 0.13.0", - "serde", - "thiserror 1.0.69", - "thread_local", - "wasm-bindgen", - "web-sys", - "wgpu 0.19.4", -] - -[[package]] -name = "bevy_render" -version = "0.16.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef91fed1f09405769214b99ebe4390d69c1af5cdd27967deae9135c550eb1667" +checksum = "70d6a5d47ebb247e4ecaaf4a3b0310b7c518728ff2362c69f4220d0d3228e17d" dependencies = [ "async-channel", - "bevy_app 0.16.1", - "bevy_asset 0.16.1", + "bevy_app", + "bevy_asset", + "bevy_camera", "bevy_color", - "bevy_derive 0.16.1", - "bevy_diagnostic 0.16.1", - "bevy_ecs 0.16.1", - "bevy_encase_derive 0.16.1", + "bevy_derive", + "bevy_diagnostic", + "bevy_ecs", + "bevy_encase_derive", "bevy_image", - "bevy_math 0.16.1", + "bevy_math", "bevy_mesh", "bevy_platform", - "bevy_reflect 0.16.1", - "bevy_render_macros 0.16.1", - "bevy_tasks 0.16.1", - "bevy_time 0.16.1", - "bevy_transform 0.16.1", - "bevy_utils 0.16.1", - "bevy_window 0.16.1", - "bitflags 2.9.1", + "bevy_reflect", + "bevy_render_macros", + "bevy_shader", + "bevy_tasks", + "bevy_time", + "bevy_transform", + "bevy_utils", + "bevy_window", + "bitflags 2.10.0", "bytemuck", - "codespan-reporting 0.11.1", - "derive_more 1.0.0", - "downcast-rs 2.0.1", - "encase 0.10.0", - "fixedbitset 0.5.7", - "futures-lite", - "image 0.25.6", + "derive_more", + "downcast-rs 2.0.2", + "encase", + "fixedbitset", + "image", "indexmap", "js-sys", - "ktx2", - "naga 24.0.0", - "naga_oil 0.17.1", + "naga 26.0.0", "nonmax", "offset-allocator", - "profiling", "send_wrapper", - "serde", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.17", "tracing", - "tracy-client", "variadics_please", "wasm-bindgen", "web-sys", - "wgpu 24.0.5", + "wgpu 26.0.1", ] [[package]] name = "bevy_render_macros" -version = "0.13.2" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "720b88406e786e378829b7d43c1ffb5300186912b99904d0d4d8ec6698a4f210" +checksum = "a7e8b553adf0a4f9f059c5c2dcb52d9ac09abede1c322a92b43b9f4bb11c3843" dependencies = [ - "bevy_macro_utils 0.13.2", + "bevy_macro_utils", "proc-macro2", "quote", - "syn 2.0.104", -] - -[[package]] -name = "bevy_render_macros" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abd42cf6c875bcf38da859f8e731e119a6aff190d41dd0a1b6000ad57cf2ed3d" -dependencies = [ - "bevy_macro_utils 0.16.1", - "proc-macro2", - "quote", - "syn 2.0.104", + "syn", ] [[package]] name = "bevy_replicon" -version = "0.34.3" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a53c0883605628061944d818258c506c12ba316ea02d542fa7de300ef4df5c3d" +checksum = "7abe4bb7d0140f2472dd7ecbb40dfeb1c4ee53109a7a17eb057f9bb0ab4b7e61" dependencies = [ - "bevy 0.16.1", - "bitflags 2.9.1", + "bevy", + "bitflags 2.10.0", "bytes", - "fnv", + "deterministic-hash", "log", - "petgraph 0.8.2", + "petgraph", "postcard", "serde", "typeid", "variadics_please", + "xxhash-rust", ] [[package]] name = "bevy_scene" -version = "0.13.2" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3d2caa1bfe7542dbe2c62e1bcc10791ba181fb744d2fe6711d1d373354da7c" -dependencies = [ - "bevy_app 0.13.2", - "bevy_asset 0.13.2", - "bevy_derive 0.13.2", - "bevy_ecs 0.13.2", - "bevy_hierarchy", - "bevy_reflect 0.13.2", - "bevy_render 0.13.2", - "bevy_transform 0.13.2", - "bevy_utils 0.13.2", +checksum = "e601ffeebbdaba1193f823dbdc9fc8787a24cf83225a72fee4def5c27a18778a" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_camera", + "bevy_derive", + "bevy_ecs", + "bevy_platform", + "bevy_reflect", + "bevy_transform", + "bevy_utils", + "derive_more", "serde", - "thiserror 1.0.69", + "thiserror 2.0.17", "uuid", ] [[package]] -name = "bevy_scene" -version = "0.16.1" +name = "bevy_shader" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c52ca165200995fe8afd2a1a6c03e4ffee49198a1d4653d32240ea7f217d4ab" +checksum = "3cef8f8e53776d286eb62bb60164f30671f07005ff407e94ec1176e9426d1477" dependencies = [ - "bevy_app 0.16.1", - "bevy_asset 0.16.1", - "bevy_derive 0.16.1", - "bevy_ecs 0.16.1", + "bevy_asset", "bevy_platform", - "bevy_reflect 0.16.1", - "bevy_render 0.16.1", - "bevy_transform 0.16.1", - "bevy_utils 0.16.1", - "derive_more 1.0.0", + "bevy_reflect", + "naga 26.0.0", + "naga_oil", "serde", - "thiserror 2.0.12", - "uuid", + "thiserror 2.0.17", + "tracing", + "wgpu-types 26.0.0", ] [[package]] name = "bevy_sprite" -version = "0.13.2" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cad1b555161f50e5d62b7fdf7ebeef1b24338aae7a88e51985da9553cd60ddf" -dependencies = [ - "bevy_app 0.13.2", - "bevy_asset 0.13.2", - "bevy_core_pipeline 0.13.2", - "bevy_derive 0.13.2", - "bevy_ecs 0.13.2", - "bevy_log 0.13.2", - "bevy_math 0.13.2", - "bevy_reflect 0.13.2", - "bevy_render 0.13.2", - "bevy_transform 0.13.2", - "bevy_utils 0.13.2", - "bitflags 2.9.1", - "bytemuck", - "fixedbitset 0.4.2", - "guillotiere", +checksum = "74bb52fa52caa1cc8d95acf45e52efc0c72b59755c2f0801a30fdab367921db0" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_camera", + "bevy_color", + "bevy_derive", + "bevy_ecs", + "bevy_image", + "bevy_math", + "bevy_mesh", + "bevy_picking", + "bevy_reflect", + "bevy_text", + "bevy_transform", + "bevy_window", "radsort", - "rectangle-pack", - "thiserror 1.0.69", + "tracing", + "wgpu-types 26.0.0", ] [[package]] -name = "bevy_sprite" -version = "0.16.1" +name = "bevy_sprite_render" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ccae7bab2cb956fb0434004c359e432a3a1a074a6ef4eb471f1fb099f0b620b" +checksum = "31bb90a9139b04568bd30b2492ba61234092d95a7f7e3c84b55369b16d7e261b" dependencies = [ - "bevy_app 0.16.1", - "bevy_asset 0.16.1", + "bevy_app", + "bevy_asset", + "bevy_camera", "bevy_color", - "bevy_core_pipeline 0.16.1", - "bevy_derive 0.16.1", - "bevy_ecs 0.16.1", + "bevy_core_pipeline", + "bevy_derive", + "bevy_ecs", "bevy_image", - "bevy_math 0.16.1", - "bevy_picking", + "bevy_math", + "bevy_mesh", "bevy_platform", - "bevy_reflect 0.16.1", - "bevy_render 0.16.1", - "bevy_transform 0.16.1", - "bevy_utils 0.16.1", - "bevy_window 0.16.1", - "bitflags 2.9.1", + "bevy_reflect", + "bevy_render", + "bevy_shader", + "bevy_sprite", + "bevy_text", + "bevy_transform", + "bevy_utils", + "bitflags 2.10.0", "bytemuck", - "derive_more 1.0.0", - "fixedbitset 0.5.7", + "derive_more", + "fixedbitset", "nonmax", - "radsort", "tracing", ] [[package]] name = "bevy_state" -version = "0.16.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "155d3cd97b900539008cdcaa702f88b724d94b08977b8e591a32536ce66faa8c" +checksum = "fe4e955f36cdc7b31556e4619a653dcf65d46967d90d36fb788f746c8e89257e" dependencies = [ - "bevy_app 0.16.1", - "bevy_ecs 0.16.1", + "bevy_app", + "bevy_ecs", "bevy_platform", - "bevy_reflect 0.16.1", + "bevy_reflect", "bevy_state_macros", - "bevy_utils 0.16.1", + "bevy_utils", "log", "variadics_please", ] [[package]] name = "bevy_state_macros" -version = "0.16.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2481c1304fd2a1851a0d4cb63a1ce6421ae40f3f0117cbc9882963ee4c9bb609" +checksum = "5c3e4e32b1b96585740a2b447661af7db1b9d688db5e4d96da50461cd8f5ce63" dependencies = [ - "bevy_macro_utils 0.16.1", - "proc-macro2", + "bevy_macro_utils", "quote", - "syn 2.0.104", -] - -[[package]] -name = "bevy_tasks" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f07fcc4969b357de143509925b39c9a2c56eaa8750828d97f319ca9ed41897cb" -dependencies = [ - "async-channel", - "async-executor", - "async-task", - "concurrent-queue", - "futures-lite", - "wasm-bindgen-futures", + "syn", ] [[package]] name = "bevy_tasks" -version = "0.15.3" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "028630ddc355563bd567df1076db3515858aa26715ddf7467d2086f9b40e5ab1" -dependencies = [ - "async-executor", - "futures-channel", - "futures-lite", - "pin-project", - "wasm-bindgen-futures", -] - -[[package]] -name = "bevy_tasks" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b674242641cab680688fc3b850243b351c1af49d4f3417a576debd6cca8dcf5" +checksum = "18839182775f30d26f0f84d9de85d25361bb593c99517a80b64ede6cbaf41adc" dependencies = [ "async-channel", "async-executor", "async-task", "atomic-waker", "bevy_platform", - "cfg-if", "concurrent-queue", "crossbeam-queue", - "derive_more 1.0.0", - "futures-channel", + "derive_more", "futures-lite", "heapless", "pin-project", - "wasm-bindgen-futures", ] [[package]] name = "bevy_text" -version = "0.16.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d76c85366159f5f54110f33321c76d8429cfd8f39638f26793a305dae568b60" +checksum = "cc1b759cf2ed8992132bd541ebb9ffcfa777d2faf3596d418fb25984bc6677d8" dependencies = [ - "bevy_app 0.16.1", - "bevy_asset 0.16.1", + "bevy_app", + "bevy_asset", "bevy_color", - "bevy_derive 0.16.1", - "bevy_ecs 0.16.1", + "bevy_derive", + "bevy_ecs", "bevy_image", - "bevy_log 0.16.1", - "bevy_math 0.16.1", + "bevy_log", + "bevy_math", "bevy_platform", - "bevy_reflect 0.16.1", - "bevy_render 0.16.1", - "bevy_sprite 0.16.1", - "bevy_transform 0.16.1", - "bevy_utils 0.16.1", - "bevy_window 0.16.1", + "bevy_reflect", + "bevy_utils", "cosmic-text", "serde", "smallvec", "sys-locale", - "thiserror 2.0.12", + "thiserror 2.0.17", "tracing", - "unicode-bidi", -] - -[[package]] -name = "bevy_time" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38ea5ae9fe7f56f555dbb05a88d34931907873e3f0c7dc426591839eef72fe3e" -dependencies = [ - "bevy_app 0.13.2", - "bevy_ecs 0.13.2", - "bevy_reflect 0.13.2", - "bevy_utils 0.13.2", - "crossbeam-channel", - "serde", - "thiserror 1.0.69", + "wgpu-types 26.0.0", ] [[package]] name = "bevy_time" -version = "0.16.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc98eb356c75be04fbbc77bb3d8ffa24c8bacd99f76111cee23d444be6ac8c9c" +checksum = "1a52edd3d30ed94074f646ba1c9914e407af9abe5b6fb7a4322c855341a536cc" dependencies = [ - "bevy_app 0.16.1", - "bevy_ecs 0.16.1", + "bevy_app", + "bevy_ecs", "bevy_platform", - "bevy_reflect 0.16.1", + "bevy_reflect", "crossbeam-channel", "log", "serde", @@ -2429,259 +1786,140 @@ dependencies = [ [[package]] name = "bevy_transform" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0d51a1f332cc00939d2f19ed6b909e5ed7037e39c7e25cc86930d79d432163e" -dependencies = [ - "bevy_app 0.13.2", - "bevy_ecs 0.13.2", - "bevy_hierarchy", - "bevy_math 0.13.2", - "bevy_reflect 0.13.2", +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7995ae14430b1a268d1e4f098ab770e8af880d2df5e4e37161b47d8d9e9625bd" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_log", + "bevy_math", + "bevy_reflect", + "bevy_tasks", + "bevy_utils", + "derive_more", "serde", - "thiserror 1.0.69", -] - -[[package]] -name = "bevy_transform" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df218e440bb9a19058e1b80a68a031c887bcf7bd3a145b55f361359a2fa3100d" -dependencies = [ - "bevy_app 0.16.1", - "bevy_ecs 0.16.1", - "bevy_log 0.16.1", - "bevy_math 0.16.1", - "bevy_reflect 0.16.1", - "bevy_tasks 0.16.1", - "bevy_utils 0.16.1", - "derive_more 1.0.0", - "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] name = "bevy_ui" -version = "0.13.2" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bbc30be39cfbfa3a073b541d22aea43ab14452dea12d7411ce201df17ff7b1" -dependencies = [ - "bevy_a11y 0.13.2", - "bevy_app 0.13.2", - "bevy_asset 0.13.2", - "bevy_core_pipeline 0.13.2", - "bevy_derive 0.13.2", - "bevy_ecs 0.13.2", - "bevy_hierarchy", - "bevy_input 0.13.2", - "bevy_log 0.13.2", - "bevy_math 0.13.2", - "bevy_reflect 0.13.2", - "bevy_render 0.13.2", - "bevy_sprite 0.13.2", - "bevy_transform 0.13.2", - "bevy_utils 0.13.2", - "bevy_window 0.13.2", - "bytemuck", - "serde", - "taffy 0.3.19", - "thiserror 1.0.69", -] - -[[package]] -name = "bevy_ui" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4a4d2ba51865bc3039af29a26b4f52c48b54cc758369f52004caf4b6f03770" +checksum = "cc999815a67a6b2fc911df9eea27af703ff656aed6fd31d8606dced701f07fd6" dependencies = [ - "accesskit 0.18.0", - "bevy_a11y 0.16.1", - "bevy_app 0.16.1", - "bevy_asset 0.16.1", + "accesskit 0.21.1", + "bevy_a11y", + "bevy_app", + "bevy_asset", + "bevy_camera", "bevy_color", - "bevy_core_pipeline 0.16.1", - "bevy_derive 0.16.1", - "bevy_ecs 0.16.1", + "bevy_derive", + "bevy_ecs", "bevy_image", - "bevy_input 0.16.1", - "bevy_math 0.16.1", + "bevy_input", + "bevy_math", "bevy_platform", - "bevy_reflect 0.16.1", - "bevy_render 0.16.1", - "bevy_sprite 0.16.1", + "bevy_reflect", + "bevy_sprite", "bevy_text", - "bevy_transform 0.16.1", - "bevy_utils 0.16.1", - "bevy_window 0.16.1", - "bytemuck", - "derive_more 1.0.0", - "nonmax", + "bevy_transform", + "bevy_utils", + "bevy_window", + "derive_more", "serde", "smallvec", - "taffy 0.7.7", - "thiserror 2.0.12", - "tracing", -] - -[[package]] -name = "bevy_utils" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9f845a985c00e0ee8dc2d8af3f417be925fb52aad4bda5b96e2e58a2b4d2eb" -dependencies = [ - "ahash", - "bevy_utils_proc_macros 0.13.2", - "getrandom 0.2.16", - "hashbrown 0.14.5", - "nonmax", - "petgraph 0.6.5", - "smallvec", - "thiserror 1.0.69", + "taffy", + "thiserror 2.0.17", "tracing", - "uuid", - "web-time 0.2.4", ] [[package]] -name = "bevy_utils" -version = "0.15.3" +name = "bevy_ui_render" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63c2174d43a0de99f863c98a472370047a2bfa7d1e5cec8d9d647fb500905d9d" +checksum = "adae9770089e04339d003afe7abe7153fe71600d81c828f964c7ac329b04d5b9" dependencies = [ - "ahash", - "bevy_utils_proc_macros 0.15.3", - "getrandom 0.2.16", - "hashbrown 0.14.5", - "thread_local", + "bevy_app", + "bevy_asset", + "bevy_camera", + "bevy_color", + "bevy_core_pipeline", + "bevy_derive", + "bevy_ecs", + "bevy_image", + "bevy_math", + "bevy_mesh", + "bevy_platform", + "bevy_reflect", + "bevy_render", + "bevy_shader", + "bevy_sprite", + "bevy_sprite_render", + "bevy_text", + "bevy_transform", + "bevy_ui", + "bevy_utils", + "bytemuck", + "derive_more", "tracing", - "web-time 1.1.0", ] [[package]] name = "bevy_utils" -version = "0.16.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94f7a8905a125d2017e8561beefb7f2f5e67e93ff6324f072ad87c5fd6ec3b99" +checksum = "080254083c74d5f6eb0649d7cd6181bda277e8fe3c509ec68990a5d56ec23f24" dependencies = [ "bevy_platform", + "disqualified", "thread_local", ] -[[package]] -name = "bevy_utils_proc_macros" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef158627f30503d5c18c20c60b444829f698d343516eeaf6eeee078c9a45163" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.104", -] - -[[package]] -name = "bevy_utils_proc_macros" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94847541f6dd2e28f54a9c2b0e857da5f2631e2201ebc25ce68781cdcb721391" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.104", -] - -[[package]] -name = "bevy_window" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "976202d2ed838176595b550ac654b15ae236e0178a6f19a94ca6d58f2a96ca60" -dependencies = [ - "bevy_a11y 0.13.2", - "bevy_app 0.13.2", - "bevy_ecs 0.13.2", - "bevy_input 0.13.2", - "bevy_math 0.13.2", - "bevy_reflect 0.13.2", - "bevy_utils 0.13.2", - "raw-window-handle", - "serde", - "smol_str", -] - [[package]] name = "bevy_window" -version = "0.16.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df7e8ad0c17c3cc23ff5566ae2905c255e6986037fb041f74c446216f5c38431" +checksum = "f582478606d6b6e5c53befbe7612f038fdfb73f8a27f7aae644406637347acd4" dependencies = [ - "android-activity 0.6.0", - "bevy_app 0.16.1", - "bevy_ecs 0.16.1", - "bevy_input 0.16.1", - "bevy_math 0.16.1", + "bevy_app", + "bevy_ecs", + "bevy_input", + "bevy_math", "bevy_platform", - "bevy_reflect 0.16.1", - "bevy_utils 0.16.1", + "bevy_reflect", "log", "raw-window-handle", - "serde", - "smol_str", -] - -[[package]] -name = "bevy_winit" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa66539aa93d8522b146bf82de429714ea6370a6061fc1f1ff7bcacd4e64c6c4" -dependencies = [ - "accesskit_winit 0.17.0", - "approx", - "bevy_a11y 0.13.2", - "bevy_app 0.13.2", - "bevy_derive 0.13.2", - "bevy_ecs 0.13.2", - "bevy_hierarchy", - "bevy_input 0.13.2", - "bevy_math 0.13.2", - "bevy_tasks 0.13.2", - "bevy_utils 0.13.2", - "bevy_window 0.13.2", - "crossbeam-channel", - "raw-window-handle", - "wasm-bindgen", - "web-sys", - "winit 0.29.15", + "serde", ] [[package]] name = "bevy_winit" -version = "0.16.1" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a5e7f00c6b3b6823df5ec2a5e9067273607208919bc8c211773ebb9643c87f0" +checksum = "eb0ccf2faca4b4c156a26284d1bbf90a8cac8568a273adcd6c1a270c1342f3df" dependencies = [ - "accesskit 0.18.0", - "accesskit_winit 0.25.0", + "accesskit 0.21.1", + "accesskit_winit 0.29.2", "approx", - "bevy_a11y 0.16.1", - "bevy_app 0.16.1", - "bevy_derive 0.16.1", - "bevy_ecs 0.16.1", - "bevy_input 0.16.1", + "bevy_a11y", + "bevy_android", + "bevy_app", + "bevy_derive", + "bevy_ecs", + "bevy_input", "bevy_input_focus", - "bevy_log 0.16.1", - "bevy_math 0.16.1", + "bevy_log", + "bevy_math", "bevy_platform", - "bevy_reflect 0.16.1", - "bevy_tasks 0.16.1", - "bevy_utils 0.16.1", - "bevy_window 0.16.1", + "bevy_reflect", + "bevy_tasks", + "bevy_window", "cfg-if", - "crossbeam-channel", - "raw-window-handle", - "serde", "tracing", "wasm-bindgen", "web-sys", - "winit 0.30.11", + "winit", ] [[package]] @@ -2704,34 +1942,11 @@ dependencies = [ [[package]] name = "bindgen" -version = "0.69.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" -dependencies = [ - "bitflags 2.9.1", - "cexpr", - "clang-sys", - "itertools 0.12.1", - "lazy_static", - "lazycell", - "log", - "prettyplease", - "proc-macro2", - "quote", - "regex", - "rustc-hash 1.1.0", - "shlex", - "syn 2.0.104", - "which", -] - -[[package]] -name = "bindgen" -version = "0.70.1" +version = "0.72.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" +checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "cexpr", "clang-sys", "itertools 0.13.0", @@ -2740,18 +1955,9 @@ dependencies = [ "proc-macro2", "quote", "regex", - "rustc-hash 1.1.0", + "rustc-hash 2.1.1", "shlex", - "syn 2.0.104", -] - -[[package]] -name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec 0.6.3", + "syn", ] [[package]] @@ -2760,16 +1966,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" dependencies = [ - "bit-vec 0.8.0", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" -dependencies = [ - "serde", + "bit-vec", ] [[package]] @@ -2781,12 +1978,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bit_field" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" - [[package]] name = "bitflags" version = "1.3.2" @@ -2795,19 +1986,13 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.1" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" dependencies = [ - "serde", + "serde_core", ] -[[package]] -name = "bitstream-io" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" - [[package]] name = "blake3" version = "1.8.2" @@ -2836,58 +2021,29 @@ dependencies = [ "generic-array", ] -[[package]] -name = "block-sys" -version = "0.1.0-beta.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa55741ee90902547802152aaf3f8e5248aab7e21468089560d4c8840561146" -dependencies = [ - "objc-sys 0.2.0-beta.2", -] - -[[package]] -name = "block-sys" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae85a0696e7ea3b835a453750bf002770776609115e6d25c6d2ff28a8200f7e7" -dependencies = [ - "objc-sys 0.3.5", -] - -[[package]] -name = "block2" -version = "0.2.0-alpha.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dd9e63c1744f755c2f60332b88de39d341e5e86239014ad839bd71c106dec42" -dependencies = [ - "block-sys 0.1.0-beta.1", - "objc2-encode 2.0.0-pre.2", -] - [[package]] name = "block2" -version = "0.3.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15b55663a85f33501257357e6421bb33e769d5c9ffb5ba0921c975a123e35e68" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" dependencies = [ - "block-sys 0.2.1", - "objc2 0.4.1", + "objc2 0.5.2", ] [[package]] name = "block2" -version = "0.5.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" dependencies = [ - "objc2 0.5.2", + "objc2 0.6.3", ] [[package]] name = "blocking" -version = "1.6.1" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" dependencies = [ "async-channel", "async-task", @@ -2896,12 +2052,6 @@ dependencies = [ "piper", ] -[[package]] -name = "built" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" - [[package]] name = "bumpalo" version = "3.19.0" @@ -2910,22 +2060,22 @@ checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytemuck" -version = "1.23.1" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.9.3" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -2942,9 +2092,9 @@ checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" dependencies = [ "portable-atomic", ] @@ -2970,11 +2120,11 @@ dependencies = [ [[package]] name = "calloop" -version = "0.12.4" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fba7adb4dd5aa98e5553510223000e7148f621165ec5f9acd7113f6ca4995298" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "log", "polling", "rustix 0.38.44", @@ -2984,16 +2134,15 @@ dependencies = [ [[package]] name = "calloop" -version = "0.13.0" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" +checksum = "cb9f6e1368bd4621d2c86baa7e37de77a938adf5221e5dd3d6133340101b309e" dependencies = [ - "bitflags 2.9.1", - "log", + "bitflags 2.10.0", "polling", - "rustix 0.38.44", + "rustix 1.1.2", "slab", - "thiserror 1.0.69", + "tracing", ] [[package]] @@ -3008,13 +2157,25 @@ dependencies = [ "wayland-client", ] +[[package]] +name = "calloop-wayland-source" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265876021fa" +dependencies = [ + "calloop 0.14.3", + "rustix 1.1.2", + "wayland-backend", + "wayland-client", +] + [[package]] name = "camino" -version = "1.1.10" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0da45bc31171d8d6960122e222a67740df867c1dd53b4d51caa297084c185cab" +checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -3048,10 +2209,11 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.27" +version = "1.2.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc" +checksum = "b97463e1064cb1b1c1384ad0a0b9c8abd0988e2a91f52606c80ef14aadb63e36" dependencies = [ + "find-msvc-tools", "jobserver", "libc", "shlex", @@ -3072,27 +2234,11 @@ dependencies = [ "nom", ] -[[package]] -name = "cfg-expr" -version = "0.15.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" -dependencies = [ - "smallvec", - "target-lexicon", -] - [[package]] name = "cfg-if" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" - -[[package]] -name = "cfg_aliases" -version = "0.1.1" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -3111,16 +2257,15 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "wasm-bindgen", - "windows-link", + "windows-link 0.2.1", ] [[package]] @@ -3174,14 +2319,14 @@ checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" dependencies = [ "glob", "libc", - "libloading 0.8.8", + "libloading", ] [[package]] name = "clap" -version = "4.5.40" +version = "4.5.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f" +checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5" dependencies = [ "clap_builder", "clap_derive", @@ -3189,9 +2334,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.40" +version = "4.5.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e" +checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a" dependencies = [ "anstream", "anstyle", @@ -3201,27 +2346,27 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.40" +version = "4.5.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] name = "clap_lex" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" +checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" [[package]] name = "clipboard-win" -version = "5.4.0" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" +checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" dependencies = [ "error-code", ] @@ -3241,17 +2386,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" dependencies = [ - "thiserror 2.0.12", -] - -[[package]] -name = "codespan-reporting" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" -dependencies = [ - "termcolor", - "unicode-width 0.1.14", + "thiserror 2.0.17", ] [[package]] @@ -3262,7 +2397,7 @@ checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" dependencies = [ "serde", "termcolor", - "unicode-width 0.2.1", + "unicode-width", ] [[package]] @@ -3287,37 +2422,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "com" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e17887fd17353b65b1b2ef1c526c83e26cd72e74f598a8dc1bee13a48f3d9f6" -dependencies = [ - "com_macros", -] - -[[package]] -name = "com_macros" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d375883580a668c7481ea6631fc1a8863e33cc335bf56bfad8d7e6d4b04b13a5" -dependencies = [ - "com_macros_support", - "proc-macro2", - "syn 1.0.109", -] - -[[package]] -name = "com_macros_support" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad899a1087a9296d5644792d7cb72b8e34c1bec8e7d4fbc002230169a6e8710c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "combine" version = "4.6.7" @@ -3347,7 +2451,7 @@ dependencies = [ "encode_unicode", "libc", "once_cell", - "unicode-width 0.2.1", + "unicode-width", "windows-sys 0.59.0", ] @@ -3368,31 +2472,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32b13ea120a812beba79e34316b3942a857c86ec1593cb34f27bb28272ce2cca" [[package]] -name = "const-random" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" -dependencies = [ - "const-random-macro", -] - -[[package]] -name = "const-random-macro" -version = "0.1.16" +name = "const_panic" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +checksum = "e262cdaac42494e3ae34c43969f9cdeb7da178bdb4b66fa6a1ea2edb4c8ae652" dependencies = [ - "getrandom 0.2.16", - "once_cell", - "tiny-keccak", + "typewit", ] -[[package]] -name = "const_panic" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2459fc9262a1aa204eb4b5764ad4f189caec88aea9634389c0a25f8be7f6265e" - [[package]] name = "const_soft_float" version = "0.1.4" @@ -3448,7 +2535,7 @@ checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" dependencies = [ "bitflags 1.3.2", "core-foundation 0.9.4", - "core-graphics-types", + "core-graphics-types 0.1.3", "foreign-types", "libc", ] @@ -3464,6 +2551,17 @@ dependencies = [ "libc", ] +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.10.0", + "core-foundation 0.10.1", + "libc", +] + [[package]] name = "core_maths" version = "0.1.1" @@ -3475,11 +2573,11 @@ dependencies = [ [[package]] name = "cosmic-text" -version = "0.13.2" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e418dd4f5128c3e93eab12246391c54a20c496811131f85754dc8152ee207892" +checksum = "da46a9d5a8905cc538a4a5bceb6a4510de7a51049c5588c0114efce102bcbbe8" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "fontdb 0.16.2", "log", "rangemap", @@ -3522,9 +2620,9 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -3571,19 +2669,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" -[[package]] -name = "crossbeam" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-epoch", - "crossbeam-queue", - "crossbeam-utils", -] - [[package]] name = "crossbeam-channel" version = "0.5.15" @@ -3635,9 +2720,9 @@ checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", "typenum", @@ -3645,33 +2730,34 @@ dependencies = [ [[package]] name = "csv" -version = "1.3.1" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" +checksum = "52cd9d68cf7efc6ddfaaee42e7288d3a99d613d4b50f76ce9827ae0c6e14f938" dependencies = [ "csv-core", "itoa", "ryu", - "serde", + "serde_core", ] [[package]] name = "csv-core" -version = "0.1.12" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d02f3b0da4c6504f86e9cd789d8dbafab48c2321be74e9987593de5a894d93d" +checksum = "704a3c26996a80471189265814dbc2c257598b96b8a7feae2d31ace646bb9782" dependencies = [ "memchr", ] [[package]] name = "ctrlc" -version = "3.4.7" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f93780a459b7d656ef7f071fe699c4d3d2cb201c4b24d085b6ddc505276e73" +checksum = "73736a89c4aff73035ba2ed2e565061954da00d4970fc9ac25dcc85a2a20d790" dependencies = [ + "dispatch2", "nix", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -3680,17 +2766,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" -[[package]] -name = "d3d12" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e3d747f100290a1ca24b752186f61f6637e1deffe3bf6320de6fcb29510a307" -dependencies = [ - "bitflags 2.9.1", - "libloading 0.8.8", - "winapi", -] - [[package]] name = "data-encoding" version = "2.9.0" @@ -3699,43 +2774,34 @@ checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "data-url" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a" +checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" [[package]] name = "deflate64" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da692b8d1080ea3045efaab14434d40468c3d8657e42abddfffca87b428f4c1b" +checksum = "26bf8fc351c5ed29b5c2f0cbbac1b209b74f60ecd62e675a998df72c49af5204" [[package]] name = "deranged" -version = "0.4.0" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" dependencies = [ "powerfmt", ] [[package]] name = "derive_arbitrary" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" +checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", -] - -[[package]] -name = "derive_more" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" -dependencies = [ - "derive_more-impl 1.0.0", + "syn", ] [[package]] @@ -3744,32 +2810,26 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" dependencies = [ - "derive_more-impl 2.0.1", + "derive_more-impl", ] [[package]] name = "derive_more-impl" -version = "1.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", "unicode-xid", ] [[package]] -name = "derive_more-impl" -version = "2.0.1" +name = "deterministic-hash" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.104", - "unicode-xid", -] +checksum = "11277822c27bde750de02c5dc5159b91e88bf2661a2c1d98106f2fb1c5c6f590" [[package]] name = "dialoguer" @@ -3827,8 +2887,10 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" dependencies = [ - "bitflags 2.9.1", - "objc2 0.6.1", + "bitflags 2.10.0", + "block2 0.6.2", + "libc", + "objc2 0.6.3", ] [[package]] @@ -3839,7 +2901,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -3854,14 +2916,14 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" dependencies = [ - "libloading 0.8.8", + "libloading", ] [[package]] name = "document-features" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" dependencies = [ "litrs", ] @@ -3874,9 +2936,9 @@ checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" [[package]] name = "downcast-rs" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea8a8b81cacc08888170eef4d13b775126db426d0b348bee9d18c2c1eaf123cf" +checksum = "117240f60069e65410b3ae1bb213295bd828f707b5bec6596a1afc8793ce0cbc" [[package]] name = "dpi" @@ -3892,41 +2954,41 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" [[package]] name = "ecolor" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc4feb366740ded31a004a0e4452fbf84e80ef432ecf8314c485210229672fd1" +checksum = "94bdf37f8d5bd9aa7f753573fdda9cf7343afa73dd28d7bfe9593bd9798fc07e" dependencies = [ "bytemuck", - "emath 0.31.1", + "emath 0.32.3", ] [[package]] name = "ecolor" -version = "0.32.0" +version = "0.33.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a631732d995184114016fab22fc7e3faf73d6841c2d7650395fe251fbcd9285" +checksum = "084980ebede2fb1ad6c4f54285b3e489052ef2b6aa4016e4c19349417adc75c5" dependencies = [ "bytemuck", - "emath 0.32.0", + "emath 0.33.2", ] [[package]] name = "eframe" -version = "0.32.0" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790ccfbb3dd556588342463454b2b2b13909e5fdce5bc2a1432a8aa69c8b7a" +checksum = "14d1c15e7bd136b309bd3487e6ffe5f668b354cd9768636a836dd738ac90eb0b" dependencies = [ "ahash", "bytemuck", "document-features", - "egui 0.32.0", + "egui 0.32.3", "egui-wgpu", - "egui-winit 0.32.0", - "egui_glow 0.32.0", - "glow 0.16.0", + "egui-winit", + "egui_glow", + "glow", "glutin", "glutin-winit", - "image 0.25.6", + "image", "js-sys", "log", "objc2 0.5.2", @@ -3940,38 +3002,40 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "web-time 1.1.0", + "web-time", "winapi", "windows-sys 0.59.0", - "winit 0.30.11", + "winit", ] [[package]] name = "egui" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd34cec49ab55d85ebf70139cb1ccd29c977ef6b6ba4fe85489d6877ee9ef3" +checksum = "5d5d0306cd61ca75e29682926d71f2390160247f135965242e904a636f51c0dc" dependencies = [ + "accesskit 0.19.0", "ahash", - "bitflags 2.9.1", - "emath 0.31.1", - "epaint 0.31.1", + "bitflags 2.10.0", + "emath 0.32.3", + "epaint 0.32.3", "log", "nohash-hasher", "profiling", + "smallvec", + "unicode-segmentation", ] [[package]] name = "egui" -version = "0.32.0" +version = "0.33.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8470210c95a42cc985d9ffebfd5067eea55bdb1c3f7611484907db9639675e28" +checksum = "b75645894de4ca1695ab3ab7201c7953bb95c1725aafeefa6822dc901ad2a81b" dependencies = [ - "accesskit 0.19.0", "ahash", - "bitflags 2.9.1", - "emath 0.32.0", - "epaint 0.32.0", + "bitflags 2.10.0", + "emath 0.33.2", + "epaint 0.33.2", "log", "nohash-hasher", "profiling", @@ -3981,72 +3045,55 @@ dependencies = [ [[package]] name = "egui-wgpu" -version = "0.32.0" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14de9942d8b9e99e2d830403c208ab1a6e052e925a7456a4f6f66d567d90de1d" +checksum = "c12eca13293f8eba27a32aaaa1c765bfbf31acd43e8d30d5881dcbe5e99ca0c7" dependencies = [ "ahash", "bytemuck", "document-features", - "egui 0.32.0", - "epaint 0.32.0", - "log", - "profiling", - "thiserror 1.0.69", - "type-map", - "web-time 1.1.0", - "wgpu 25.0.2", - "winit 0.30.11", -] - -[[package]] -name = "egui-winit" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d9dfbb78fe4eb9c3a39ad528b90ee5915c252e77bbab9d4ebc576541ab67e13" -dependencies = [ - "ahash", - "bytemuck", - "egui 0.31.1", + "egui 0.32.3", + "epaint 0.32.3", "log", "profiling", - "raw-window-handle", - "web-time 1.1.0", - "webbrowser", - "winit 0.30.11", + "thiserror 1.0.69", + "type-map", + "web-time", + "wgpu 25.0.2", + "winit", ] [[package]] name = "egui-winit" -version = "0.32.0" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c490804a035cec9c826082894a3e1ecf4198accd3817deb10f7919108ebafab0" +checksum = "f95d0a91f9cb0dc2e732d49c2d521ac8948e1f0b758f306fb7b14d6f5db3927f" dependencies = [ "accesskit_winit 0.27.0", "ahash", "arboard", "bytemuck", - "egui 0.32.0", + "egui 0.32.3", "log", "profiling", "raw-window-handle", "smithay-clipboard", - "web-time 1.1.0", + "web-time", "webbrowser", - "winit 0.30.11", + "winit", ] [[package]] name = "egui_extras" -version = "0.32.0" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f791a5937f518249016b276b3639ad2aa3824048b6f2161ec2b431ab325880a" +checksum = "dddbceddf39805fc6c62b1f7f9c05e23590b40844dc9ed89c6dc6dbc886e3e3b" dependencies = [ "ahash", - "egui 0.32.0", + "egui 0.32.3", "ehttp", "enum-map", - "image 0.25.6", + "image", "log", "mime_guess2", "profiling", @@ -4055,39 +3102,20 @@ dependencies = [ [[package]] name = "egui_glow" -version = "0.31.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "910906e3f042ea6d2378ec12a6fd07698e14ddae68aed2d819ffe944a73aab9e" -dependencies = [ - "ahash", - "bytemuck", - "egui 0.31.1", - "egui-winit 0.31.1", - "glow 0.16.0", - "log", - "memoffset", - "profiling", - "wasm-bindgen", - "web-sys", - "winit 0.30.11", -] - -[[package]] -name = "egui_glow" -version = "0.32.0" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d44f3fd4fdc5f960c9e9ef7327c26647edc3141abf96102980647129d49358e6" +checksum = "cc7037813341727937f9e22f78d912f3e29bc3c46e2f40a9e82bb51cbf5e4cfb" dependencies = [ "ahash", "bytemuck", - "egui 0.32.0", - "glow 0.16.0", + "egui 0.32.3", + "glow", "log", "memoffset", "profiling", "wasm-bindgen", "web-sys", - "winit 0.30.11", + "winit", ] [[package]] @@ -4112,18 +3140,18 @@ checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "emath" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e4cadcff7a5353ba72b7fea76bf2122b5ebdbc68e8155aa56dfdea90083fe1b" +checksum = "45fd7bc25f769a3c198fe1cf183124bf4de3bd62ef7b4f1eaf6b08711a3af8db" dependencies = [ "bytemuck", ] [[package]] name = "emath" -version = "0.32.0" +version = "0.33.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45f057b141e7e46340c321400be74b793543b1b213036f0f989c35d35957c32e" +checksum = "0e561352ae95c22ad179fb56c38d6e6eecd86cf4925cf5c70e738dd01df9b620" dependencies = [ "bytemuck", ] @@ -4139,66 +3167,34 @@ dependencies = [ [[package]] name = "encase" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95ed933078d2e659745df651f4c180511cd582e5b9414ff896e7d50d207e3103" -dependencies = [ - "const_panic", - "encase_derive 0.7.0", - "glam 0.25.0", - "thiserror 1.0.69", -] - -[[package]] -name = "encase" -version = "0.10.0" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0a05902cf601ed11d564128448097b98ebe3c6574bd7b6a653a3d56d54aa020" +checksum = "02ba239319a4f60905966390f5e52799d868103a533bb7e27822792332504ddd" dependencies = [ "const_panic", - "encase_derive 0.10.0", - "glam 0.29.3", - "thiserror 1.0.69", -] - -[[package]] -name = "encase_derive" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4ce1449c7d19eba6cc0abd231150ad81620a8dce29601d7f8d236e5d431d72a" -dependencies = [ - "encase_derive_impl 0.7.0", + "encase_derive", + "glam 0.30.9", + "thiserror 2.0.17", ] [[package]] name = "encase_derive" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "181d475b694e2dd56ae919ce7699d344d1fd259292d590c723a50d1189a2ea85" -dependencies = [ - "encase_derive_impl 0.10.0", -] - -[[package]] -name = "encase_derive_impl" -version = "0.7.0" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92959a9e8d13eaa13b8ae8c7b583c3bf1669ca7a8e7708a088d12587ba86effc" +checksum = "5223d6c647f09870553224f6e37261fe5567bc5a4f4cf13ed337476e79990f2f" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.104", + "encase_derive_impl", ] [[package]] name = "encase_derive_impl" -version = "0.10.0" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f97b51c5cc57ef7c5f7a0c57c250251c49ee4c28f819f87ac32f4aceabc36792" +checksum = "1796db3d892515842ca2dfb11124c4bb4a9e58d9f2c5c1072e5bca1b2334507b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -4230,7 +3226,7 @@ checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -4251,7 +3247,7 @@ checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -4262,7 +3258,7 @@ checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -4276,16 +3272,16 @@ dependencies = [ [[package]] name = "epaint" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fcc0f5a7c613afd2dee5e4b30c3e6acafb8ad6f0edb06068811f708a67c562" +checksum = "63adcea970b7a13094fe97a36ab9307c35a750f9e24bf00bb7ef3de573e0fddb" dependencies = [ "ab_glyph", "ahash", "bytemuck", - "ecolor 0.31.1", - "emath 0.31.1", - "epaint_default_fonts 0.31.1", + "ecolor 0.32.3", + "emath 0.32.3", + "epaint_default_fonts 0.32.3", "log", "nohash-hasher", "parking_lot", @@ -4294,16 +3290,16 @@ dependencies = [ [[package]] name = "epaint" -version = "0.32.0" +version = "0.33.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94cca02195f0552c17cabdc02f39aa9ab6fbd815dac60ab1cd3d5b0aa6f9551c" +checksum = "a909ce8cee63e8350fb0c251ad39277a5b24f19add60787e84a3b3ab3f2bd83a" dependencies = [ "ab_glyph", "ahash", "bytemuck", - "ecolor 0.32.0", - "emath 0.32.0", - "epaint_default_fonts 0.32.0", + "ecolor 0.33.2", + "emath 0.33.2", + "epaint_default_fonts 0.33.2", "log", "nohash-hasher", "parking_lot", @@ -4312,35 +3308,15 @@ dependencies = [ [[package]] name = "epaint_default_fonts" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7e7a64c02cf7a5b51e745a9e45f60660a286f151c238b9d397b3e923f5082f" +checksum = "1537accc50c9cab5a272c39300bdd0dd5dca210f6e5e8d70be048df9596e7ca2" [[package]] name = "epaint_default_fonts" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8495e11ed527dff39663b8c36b6c2b2799d7e4287fb90556e455d72eca0b4d3" - -[[package]] -name = "equator" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" -dependencies = [ - "equator-macro", -] - -[[package]] -name = "equator-macro" -version = "0.4.2" +version = "0.33.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.104", -] +checksum = "ad9649446c23368ae138716910e3e28143995691b598fbb9de16b42b0722cbcc" [[package]] name = "equivalent" @@ -4350,22 +3326,23 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "erased-serde" -version = "0.4.6" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" +checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3" dependencies = [ "serde", + "serde_core", "typeid", ] [[package]] name = "errno" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -4385,15 +3362,9 @@ dependencies = [ [[package]] name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "event-listener" -version = "5.4.0" +version = "5.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" dependencies = [ "concurrent-queue", "parking", @@ -4406,30 +3377,35 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ - "event-listener 5.4.0", + "event-listener", "pin-project-lite", ] [[package]] -name = "exr" -version = "1.73.0" +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fax" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" +checksum = "f05de7d48f37cd6730705cbca900770cab77a89f413d23e100ad7fad7795a0ab" dependencies = [ - "bit_field", - "half", - "lebe", - "miniz_oxide", - "rayon-core", - "smallvec", - "zune-inflate", + "fax_derive", ] [[package]] -name = "fastrand" -version = "2.3.0" +name = "fax_derive" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "fdeflate" @@ -4442,30 +3418,30 @@ dependencies = [ [[package]] name = "file-id" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bc904b9bbefcadbd8e3a9fb0d464a9b979de6324c03b3c663e8994f46a5be36" +checksum = "e1fc6a637b6dc58414714eddd9170ff187ecb0933d4c7024d1abbd23a3cc26e9" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.60.2", ] [[package]] name = "filetime" -version = "0.2.25" +version = "0.2.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" dependencies = [ "cfg-if", "libc", "libredox", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] -name = "fixedbitset" -version = "0.4.2" +name = "find-msvc-tools" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" [[package]] name = "fixedbitset" @@ -4475,9 +3451,9 @@ checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] name = "flate2" -version = "1.1.2" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb" dependencies = [ "crc32fast", "miniz_oxide", @@ -4501,11 +3477,17 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + [[package]] name = "font-types" -version = "0.9.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02a596f5713680923a2080d86de50fe472fb290693cf0f701187a1c8b36996b7" +checksum = "39a654f404bbcbd48ea58c617c2993ee91d1cb63727a37bf2323a4edeed1b8c5" dependencies = [ "bytemuck", ] @@ -4565,7 +3547,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -4576,9 +3558,9 @@ checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -4658,9 +3640,9 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" dependencies = [ "fastrand", "futures-core", @@ -4677,7 +3659,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -4710,20 +3692,6 @@ dependencies = [ "slab", ] -[[package]] -name = "generator" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d18470a76cb7f8ff746cf1f7470914f900252ec36bbc40b569d74b1258446827" -dependencies = [ - "cc", - "cfg-if", - "libc", - "log", - "rustversion", - "windows 0.61.3", -] - [[package]] name = "generic-array" version = "0.14.7" @@ -4736,12 +3704,12 @@ dependencies = [ [[package]] name = "gethostname" -version = "0.4.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" dependencies = [ - "libc", - "windows-targets 0.48.5", + "rustix 1.1.2", + "windows-link 0.2.1", ] [[package]] @@ -4751,23 +3719,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", - "js-sys", "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "wasm-bindgen", + "wasi", ] [[package]] name = "getrandom" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "js-sys", "libc", "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "wasip2", "wasm-bindgen", ] @@ -4781,11 +3747,21 @@ dependencies = [ "weezl", ] +[[package]] +name = "gif" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f954a9e9159ec994f73a30a12b96a702dde78f5547bcb561174597924f7d4162" +dependencies = [ + "color_quant", + "weezl", +] + [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "gl_generator" @@ -4798,45 +3774,113 @@ dependencies = [ "xml-rs", ] +[[package]] +name = "glam" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "333928d5eb103c5d4050533cec0384302db6be8ef7d3cebd30ec6a35350353da" + +[[package]] +name = "glam" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3abb554f8ee44336b72d522e0a7fe86a29e09f839a36022fa869a7dfe941a54b" + +[[package]] +name = "glam" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4126c0479ccf7e8664c36a2d719f5f2c140fbb4f9090008098d2c291fa5b3f16" + +[[package]] +name = "glam" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01732b97afd8508eee3333a541b9f7610f454bb818669e66e90f5f57c93a776" + +[[package]] +name = "glam" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525a3e490ba77b8e326fb67d4b44b4bd2f920f44d4cc73ccec50adc68e3bee34" + +[[package]] +name = "glam" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b8509e6791516e81c1a630d0bd7fbac36d2fa8712a9da8662e716b52d5051ca" + +[[package]] +name = "glam" +version = "0.20.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43e957e744be03f5801a55472f593d43fabdebf25a4585db250f04d86b1675f" + +[[package]] +name = "glam" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "518faa5064866338b013ff9b2350dc318e14cc4fcd6cb8206d7e7c9886c98815" + +[[package]] +name = "glam" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f597d56c1bd55a811a1be189459e8fad2bbc272616375602443bdfb37fa774" + +[[package]] +name = "glam" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e4afd9ad95555081e109fe1d21f2a30c691b5f0919c67dfa690a2e1eb6bd51c" + +[[package]] +name = "glam" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5418c17512bdf42730f9032c74e1ae39afc408745ebb2acf72fbc4691c17945" + [[package]] name = "glam" version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "151665d9be52f9bb40fc7966565d39666f2d1e69233571b71b87791c7e0528b3" -dependencies = [ - "bytemuck", - "serde", -] + +[[package]] +name = "glam" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e05e7e6723e3455f4818c7b26e855439f7546cf617ef669d1adedb8669e5cb9" + +[[package]] +name = "glam" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "779ae4bf7e8421cf91c0b3b64e7e8b40b862fba4d393f59150042de7c4965a94" [[package]] name = "glam" version = "0.29.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8babf46d4c1c9d92deac9f7be466f76dfc4482b6452fc5024b5e8daf6ffeb3ee" + +[[package]] +name = "glam" +version = "0.30.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd47b05dddf0005d850e5644cae7f2b14ac3df487979dbfff3b56f20b1a6ae46" dependencies = [ "bytemuck", "libm", - "rand 0.8.5", - "serde", + "rand 0.9.2", + "serde_core", ] [[package]] name = "glob" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" - -[[package]] -name = "glow" -version = "0.13.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1" -dependencies = [ - "js-sys", - "slotmap", - "wasm-bindgen", - "web-sys", -] +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "glow" @@ -4856,18 +3900,18 @@ version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12124de845cacfebedff80e877bb37b5b75c34c5a4c89e47e1cdd67fb6041325" dependencies = [ - "bitflags 2.9.1", - "cfg_aliases 0.2.1", + "bitflags 2.10.0", + "cfg_aliases", "cgl", "dispatch2", "glutin_egl_sys", "glutin_glx_sys", - "glutin_wgl_sys 0.6.1", - "libloading 0.8.8", - "objc2 0.6.1", - "objc2-app-kit 0.3.1", + "glutin_wgl_sys", + "libloading", + "objc2 0.6.3", + "objc2-app-kit 0.3.2", "objc2-core-foundation", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "once_cell", "raw-window-handle", "wayland-sys", @@ -4881,10 +3925,10 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85edca7075f8fc728f28cb8fbb111a96c3b89e930574369e3e9c27eb75d3788f" dependencies = [ - "cfg_aliases 0.2.1", + "cfg_aliases", "glutin", "raw-window-handle", - "winit 0.30.11", + "winit", ] [[package]] @@ -4907,15 +3951,6 @@ dependencies = [ "x11-dl", ] -[[package]] -name = "glutin_wgl_sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8098adac955faa2d31079b65dc48841251f69efd3ac25477903fc424362ead" -dependencies = [ - "gl_generator", -] - [[package]] name = "glutin_wgl_sys" version = "0.6.1" @@ -4931,7 +3966,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "gpu-alloc-types", ] @@ -4939,22 +3974,9 @@ dependencies = [ name = "gpu-alloc-types" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" -dependencies = [ - "bitflags 2.9.1", -] - -[[package]] -name = "gpu-allocator" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f56f6318968d03c18e1bcf4857ff88c61157e9da8e47c5f29055d60e1228884" -dependencies = [ - "log", - "presser", - "thiserror 1.0.69", - "winapi", - "windows 0.52.0", +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +dependencies = [ + "bitflags 2.10.0", ] [[package]] @@ -4969,35 +3991,15 @@ dependencies = [ "windows 0.58.0", ] -[[package]] -name = "gpu-descriptor" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c" -dependencies = [ - "bitflags 2.9.1", - "gpu-descriptor-types 0.1.2", - "hashbrown 0.14.5", -] - [[package]] name = "gpu-descriptor" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" dependencies = [ - "bitflags 2.9.1", - "gpu-descriptor-types 0.2.0", - "hashbrown 0.15.4", -] - -[[package]] -name = "gpu-descriptor-types" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff3556b8b78c" -dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", + "gpu-descriptor-types", + "hashbrown 0.15.5", ] [[package]] @@ -5006,15 +4008,9 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", ] -[[package]] -name = "grid" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eec1c01eb1de97451ee0d60de7d81cf1e72aabefb021616027f3d1c3ec1c723c" - [[package]] name = "grid" version = "0.15.0" @@ -5033,13 +4029,14 @@ dependencies = [ [[package]] name = "half" -version = "2.6.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ "cfg-if", "crunchy", "num-traits", + "zerocopy", ] [[package]] @@ -5053,42 +4050,26 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.14.5" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "ahash", "allocator-api2", - "serde", + "equivalent", + "foldhash 0.1.5", ] [[package]] name = "hashbrown" -version = "0.15.4" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" dependencies = [ - "allocator-api2", "equivalent", - "foldhash", + "foldhash 0.2.0", "serde", ] -[[package]] -name = "hassle-rs" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" -dependencies = [ - "bitflags 2.9.1", - "com", - "libc", - "libloading 0.8.8", - "thiserror 1.0.69", - "widestring", - "winapi", -] - [[package]] name = "heapless" version = "0.8.0" @@ -5120,22 +4101,12 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hexasphere" -version = "10.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f33ddb7f7143d9e703c072e88b98cd8b9719f174137a671429351bd2ee43c02a" -dependencies = [ - "constgebra", - "glam 0.25.0", -] - -[[package]] -name = "hexasphere" -version = "15.1.0" +version = "16.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c9e718d32b6e6b2b32354e1b0367025efdd0b11d6a740b905ddf5db1074679" +checksum = "29a164ceff4500f2a72b1d21beaa8aa8ad83aec2b641844c659b190cb3ea2e0b" dependencies = [ "constgebra", - "glam 0.29.3", + "glam 0.30.9", "tinyvec", ] @@ -5156,11 +4127,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.11" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -5204,9 +4175,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.63" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -5214,7 +4185,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core 0.61.2", + "windows-core 0.62.2", ] [[package]] @@ -5226,22 +4197,11 @@ dependencies = [ "cc", ] -[[package]] -name = "icrate" -version = "0.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d3aaff8a54577104bafdf686ff18565c3b6903ca5782a2026ef06e2c7aa319" -dependencies = [ - "block2 0.3.0", - "dispatch", - "objc2 0.4.1", -] - [[package]] name = "icu_collections" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ "displaydoc", "potential_utf", @@ -5252,9 +4212,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ "displaydoc", "litemap", @@ -5265,11 +4225,10 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" dependencies = [ - "displaydoc", "icu_collections", "icu_normalizer_data", "icu_properties", @@ -5280,42 +4239,38 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] name = "icu_properties" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" dependencies = [ - "displaydoc", "icu_collections", "icu_locale_core", "icu_properties_data", "icu_provider", - "potential_utf", "zerotrie", "zerovec", ] [[package]] name = "icu_properties_data" -version = "2.0.1" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" +checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" [[package]] name = "icu_provider" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" dependencies = [ "displaydoc", "icu_locale_core", - "stable_deref_trait", - "tinystr", "writeable", "yoke", "zerofrom", @@ -5325,9 +4280,9 @@ dependencies = [ [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -5346,44 +4301,26 @@ dependencies = [ [[package]] name = "image" -version = "0.24.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" -dependencies = [ - "bytemuck", - "byteorder", - "color_quant", - "num-traits", -] - -[[package]] -name = "image" -version = "0.25.6" +version = "0.25.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a" +checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a" dependencies = [ "bytemuck", "byteorder-lite", "color_quant", - "exr", - "gif", + "gif 0.14.0", "image-webp", + "moxcms", "num-traits", - "png", - "qoi", - "ravif", - "rayon", - "rgb", + "png 0.18.0", "tiff", - "zune-core", - "zune-jpeg", ] [[package]] name = "image-webp" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6970fe7a5300b4b42e62c52efa0187540a5bef546c60edaf554ef595d2e6f0b" +checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" dependencies = [ "byteorder-lite", "quick-error", @@ -5395,30 +4332,16 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" -[[package]] -name = "imgref" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" - -[[package]] -name = "immutable-chunkmap" -version = "2.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f97096f508d54f8f8ab8957862eee2ccd628847b6217af1a335e1c44dee578" -dependencies = [ - "arrayvec", -] - [[package]] name = "indexmap" -version = "2.10.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" dependencies = [ "equivalent", - "hashbrown 0.15.4", + "hashbrown 0.16.0", "serde", + "serde_core", ] [[package]] @@ -5438,7 +4361,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "inotify-sys", "libc", ] @@ -5471,36 +4394,23 @@ dependencies = [ ] [[package]] -name = "interpolate_name" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.104", -] - -[[package]] -name = "io-uring" -version = "0.7.8" +name = "inventory" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013" +checksum = "bc61209c082fbeb19919bee74b176221b27223e27b65d781eb91af24eb1fb46e" dependencies = [ - "bitflags 2.9.1", - "cfg-if", - "libc", + "rustversion", ] [[package]] name = "is-terminal" -version = "0.4.16" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" dependencies = [ "hermit-abi", "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -5514,9 +4424,9 @@ dependencies = [ [[package]] name = "is_terminal_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "itertools" @@ -5527,15 +4437,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.13.0" @@ -5584,45 +4485,24 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", "libc", ] -[[package]] -name = "jpeg-decoder" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" - [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" dependencies = [ "once_cell", "wasm-bindgen", ] -[[package]] -name = "jwt" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6204285f77fe7d9784db3fdc449ecce1a0114927a51d5a41c4c7a292011c015f" -dependencies = [ - "base64 0.13.1", - "crypto-common", - "digest", - "hmac", - "serde", - "serde_json", - "sha2", -] - [[package]] name = "kabel" version = "0.1.0" @@ -5638,7 +4518,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" dependencies = [ "libc", - "libloading 0.8.8", + "libloading", "pkg-config", ] @@ -5670,20 +4550,21 @@ dependencies = [ [[package]] name = "ktx2" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87d65e08a9ec02e409d27a0139eaa6b9756b4d81fe7cde71f6941a83730ce838" +checksum = "ff7f53bdf698e7aa7ec916411bbdc8078135da11b66db5182675b2227f6c0d07" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.10.0", ] [[package]] name = "kurbo" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1077d333efea6170d9ccb96d3c3026f300ca0773da4938cc4c811daa6df68b0c" +checksum = "c62026ae44756f8a599ba21140f350303d4f08dcdcc71b5ad9c9bb8128c13c62" dependencies = [ "arrayvec", + "euclid", "smallvec", ] @@ -5692,7 +4573,7 @@ name = "launcher" version = "0.1.0" dependencies = [ "eframe", - "egui 0.32.0", + "egui 0.32.3", "egui_extras", "starkingdoms", ] @@ -5703,52 +4584,20 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "lebe" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" - [[package]] name = "libc" -version = "0.2.174" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" - -[[package]] -name = "libfuzzer-sys" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" -dependencies = [ - "arbitrary", - "cc", -] - -[[package]] -name = "libloading" -version = "0.7.4" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" -dependencies = [ - "cfg-if", - "winapi", -] +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libloading" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ "cfg-if", - "windows-targets 0.53.2", + "windows-link 0.2.1", ] [[package]] @@ -5759,13 +4608,13 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libredox" -version = "0.1.4" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1580801010e535496706ba011c15f8532df6b42297d2e471fec38ceadd8c0638" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "libc", - "redox_syscall 0.5.13", + "redox_syscall 0.5.18", ] [[package]] @@ -5776,59 +4625,36 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "linux-raw-sys" -version = "0.9.4" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] name = "litrs" -version = "0.4.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" [[package]] name = "lock_api" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" - -[[package]] -name = "loom" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" -dependencies = [ - "cfg-if", - "generator", - "scoped-tls", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "loop9" -version = "0.1.5" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" -dependencies = [ - "imgref", -] +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "lzma-rs" @@ -5862,11 +4688,11 @@ dependencies = [ [[package]] name = "matchers" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] [[package]] @@ -5879,27 +4705,17 @@ dependencies = [ "rawpointer", ] -[[package]] -name = "maybe-rayon" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" -dependencies = [ - "cfg-if", - "rayon", -] - [[package]] name = "memchr" -version = "2.7.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "memmap2" -version = "0.9.5" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +checksum = "744133e4a0e0a658e1374cf3bf8e415c4052a15a111acd372764c55b4177d490" dependencies = [ "libc", ] @@ -5915,13 +4731,13 @@ dependencies = [ [[package]] name = "metal" -version = "0.27.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" +checksum = "f569fb946490b5743ad69813cb19629130ce9374034abe31614a36402d18f99e" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "block", - "core-graphics-types", + "core-graphics-types 0.1.3", "foreign-types", "log", "objc", @@ -5930,13 +4746,13 @@ dependencies = [ [[package]] name = "metal" -version = "0.31.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f569fb946490b5743ad69813cb19629130ce9374034abe31614a36402d18f99e" +checksum = "00c15a6f673ff72ddcc22394663290f870fb224c1bfce55734a75c414150e605" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "block", - "core-graphics-types", + "core-graphics-types 0.2.0", "foreign-types", "log", "objc", @@ -5979,58 +4795,24 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" dependencies = [ "libc", "log", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.59.0", + "wasi", + "windows-sys 0.61.2", ] [[package]] -name = "naga" -version = "0.19.2" +name = "moxcms" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e3524642f53d9af419ab5e8dd29d3ba155708267667c2f3f06c88c9e130843" +checksum = "0fbdd3d7436f8b5e892b8b7ea114271ff0fa00bc5acae845d53b07d498616ef6" dependencies = [ - "bit-set 0.5.3", - "bitflags 2.9.1", - "codespan-reporting 0.11.1", - "hexf-parse", - "indexmap", - "log", "num-traits", - "pp-rs", - "rustc-hash 1.1.0", - "spirv", - "termcolor", - "thiserror 1.0.69", - "unicode-xid", -] - -[[package]] -name = "naga" -version = "24.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e380993072e52eef724eddfcde0ed013b0c023c3f0417336ed041aa9f076994e" -dependencies = [ - "arrayvec", - "bit-set 0.8.0", - "bitflags 2.9.1", - "cfg_aliases 0.2.1", - "codespan-reporting 0.11.1", - "hexf-parse", - "indexmap", - "log", - "pp-rs", - "rustc-hash 1.1.0", - "spirv", - "strum", - "termcolor", - "thiserror 2.0.12", - "unicode-xid", + "pxfm", ] [[package]] @@ -6040,123 +4822,110 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b977c445f26e49757f9aca3631c3b8b836942cb278d69a92e7b80d3b24da632" dependencies = [ "arrayvec", - "bit-set 0.8.0", - "bitflags 2.9.1", - "cfg_aliases 0.2.1", - "codespan-reporting 0.12.0", + "bit-set", + "bitflags 2.10.0", + "cfg_aliases", + "codespan-reporting", "half", - "hashbrown 0.15.4", + "hashbrown 0.15.5", "hexf-parse", "indexmap", "log", "num-traits", "once_cell", "rustc-hash 1.1.0", + "spirv", "strum", - "thiserror 2.0.12", + "thiserror 2.0.17", "unicode-ident", ] [[package]] -name = "naga_oil" -version = "0.13.0" +name = "naga" +version = "26.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ea62ae0f2787456afca7209ca180522b41f00cbe159ee369eba1e07d365cd1" +checksum = "916cbc7cb27db60be930a4e2da243cf4bc39569195f22fd8ee419cd31d5b662c" dependencies = [ - "bit-set 0.5.3", - "codespan-reporting 0.11.1", - "data-encoding", + "arrayvec", + "bit-set", + "bitflags 2.10.0", + "cfg-if", + "cfg_aliases", + "codespan-reporting", + "half", + "hashbrown 0.15.5", + "hexf-parse", "indexmap", - "naga 0.19.2", + "libm", + "log", + "num-traits", "once_cell", - "regex", - "regex-syntax 0.8.5", + "pp-rs", "rustc-hash 1.1.0", - "thiserror 1.0.69", - "tracing", + "spirv", + "thiserror 2.0.17", "unicode-ident", ] [[package]] name = "naga_oil" -version = "0.17.1" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2464f7395decfd16bb4c33fb0cb3b2c645cc60d051bc7fb652d3720bfb20f18" +checksum = "1b586d3cf5c9b7e13fe2af6e114406ff70773fd80881960378933b63e76f37dd" dependencies = [ - "bit-set 0.5.3", - "codespan-reporting 0.11.1", + "codespan-reporting", "data-encoding", "indexmap", - "naga 24.0.0", - "once_cell", + "naga 26.0.0", "regex", - "regex-syntax 0.8.5", "rustc-hash 1.1.0", - "thiserror 1.0.69", + "thiserror 2.0.17", "tracing", "unicode-ident", ] [[package]] name = "nalgebra" -version = "0.32.6" +version = "0.34.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5c17de023a86f59ed79891b2e5d5a94c705dbe904a5b5c9c952ea6221b03e4" +checksum = "c4d5b3eff5cd580f93da45e64715e8c20a3996342f1e466599cf7a267a0c2f5f" dependencies = [ "approx", + "glam 0.14.0", + "glam 0.15.2", + "glam 0.16.0", + "glam 0.17.3", + "glam 0.18.0", + "glam 0.19.0", + "glam 0.20.5", + "glam 0.21.3", + "glam 0.22.0", + "glam 0.23.0", + "glam 0.24.2", "glam 0.25.0", - "matrixmultiply", - "nalgebra-macros", - "num-complex", - "num-rational", - "num-traits", - "serde", - "simba 0.8.1", - "typenum", -] - -[[package]] -name = "nalgebra" -version = "0.33.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26aecdf64b707efd1310e3544d709c5c0ac61c13756046aaaba41be5c4f66a3b" -dependencies = [ - "approx", + "glam 0.27.0", + "glam 0.28.0", "glam 0.29.3", + "glam 0.30.9", "matrixmultiply", "nalgebra-macros", "num-complex", "num-rational", "num-traits", "serde", - "simba 0.9.0", + "simba", "typenum", ] [[package]] name = "nalgebra-macros" -version = "0.2.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc" +checksum = "973e7178a678cfd059ccec50887658d482ce16b0aa9da3888ddeab5cd5eb4889" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", -] - -[[package]] -name = "ndk" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" -dependencies = [ - "bitflags 2.9.1", - "jni-sys", - "log", - "ndk-sys 0.5.0+25.2.9519653", - "num_enum", - "raw-window-handle", - "thiserror 1.0.69", + "syn", ] [[package]] @@ -6165,7 +4934,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "jni-sys", "log", "ndk-sys 0.6.0+11769913", @@ -6198,21 +4967,15 @@ dependencies = [ "jni-sys", ] -[[package]] -name = "new_debug_unreachable" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" - [[package]] name = "nix" version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "cfg-if", - "cfg_aliases 0.2.1", + "cfg_aliases", "libc", "memoffset", ] @@ -6239,19 +5002,13 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" -[[package]] -name = "noop_proc_macro" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" - [[package]] name = "notify" version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c533b4c39709f9ba5005d8002048266593c1cfaf3c5f0739d5b8ab0c6c504009" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "filetime", "fsevent-sys", "inotify 0.10.2", @@ -6266,12 +5023,11 @@ dependencies = [ [[package]] name = "notify" -version = "8.0.0" +version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fee8403b3d66ac7b26aee6e40a897d85dc5ce26f44da36b8b73e987cc52e943" +checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.9.1", - "filetime", + "bitflags 2.10.0", "fsevent-sys", "inotify 0.11.0", "kqueue", @@ -6280,7 +5036,7 @@ dependencies = [ "mio", "notify-types 2.0.0", "walkdir", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -6291,7 +5047,7 @@ checksum = "d2d88b1a7538054351c8258338df7c931a590513fb3745e8c15eb9ff4199b8d1" dependencies = [ "file-id", "log", - "notify 8.0.0", + "notify 8.2.0", "notify-types 2.0.0", "walkdir", ] @@ -6311,23 +5067,13 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e0826a989adedc2a244799e823aece04662b66609d96af8dff7ac6df9a8925d" -[[package]] -name = "ntapi" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" -dependencies = [ - "winapi", -] - [[package]] name = "nu-ansi-term" -version = "0.46.0" +version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "overload", - "winapi", + "windows-sys 0.61.2", ] [[package]] @@ -6364,7 +5110,7 @@ checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -6399,9 +5145,9 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" dependencies = [ "num_enum_derive", "rustversion", @@ -6409,14 +5155,14 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -6426,59 +5172,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ "malloc_buf", - "objc_exception", ] -[[package]] -name = "objc-sys" -version = "0.2.0-beta.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b9834c1e95694a05a828b59f55fa2afec6288359cda67146126b3f90a55d7" - [[package]] name = "objc-sys" version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" -[[package]] -name = "objc2" -version = "0.3.0-beta.3.patch-leaks.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e01640f9f2cb1220bbe80325e179e532cb3379ebcd1bf2279d703c19fe3a468" -dependencies = [ - "block2 0.2.0-alpha.6", - "objc-sys 0.2.0-beta.2", - "objc2-encode 2.0.0-pre.2", -] - -[[package]] -name = "objc2" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "559c5a40fdd30eb5e344fbceacf7595a81e242529fb4e21cf5f43fb4f11ff98d" -dependencies = [ - "objc-sys 0.3.5", - "objc2-encode 3.0.0", -] - [[package]] name = "objc2" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" dependencies = [ - "objc-sys 0.3.5", - "objc2-encode 4.1.0", + "objc-sys", + "objc2-encode", ] [[package]] name = "objc2" -version = "0.6.1" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" dependencies = [ - "objc2-encode 4.1.0", + "objc2-encode", ] [[package]] @@ -6487,27 +5205,27 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "block2 0.5.1", "libc", "objc2 0.5.2", - "objc2-core-data", - "objc2-core-image", + "objc2-core-data 0.2.2", + "objc2-core-image 0.2.2", "objc2-foundation 0.2.2", - "objc2-quartz-core", + "objc2-quartz-core 0.2.2", ] [[package]] name = "objc2-app-kit" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ - "bitflags 2.9.1", - "objc2 0.6.1", + "bitflags 2.10.0", + "objc2 0.6.3", "objc2-core-foundation", "objc2-core-graphics", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", ] [[package]] @@ -6516,13 +5234,24 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "block2 0.5.1", "objc2 0.5.2", - "objc2-core-location", + "objc2-core-location 0.2.2", "objc2-foundation 0.2.2", ] +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-foundation 0.3.2", +] + [[package]] name = "objc2-contacts" version = "0.2.2" @@ -6540,32 +5269,42 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", ] +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "objc2 0.6.3", + "objc2-foundation 0.3.2", +] + [[package]] name = "objc2-core-foundation" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "dispatch2", - "objc2 0.6.1", + "objc2 0.6.3", ] [[package]] name = "objc2-core-graphics" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "dispatch2", - "objc2 0.6.1", + "objc2 0.6.3", "objc2-core-foundation", "objc2-io-surface", ] @@ -6582,6 +5321,16 @@ dependencies = [ "objc2-metal", ] +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2 0.6.3", + "objc2-foundation 0.3.2", +] + [[package]] name = "objc2-core-location" version = "0.2.2" @@ -6595,19 +5344,26 @@ dependencies = [ ] [[package]] -name = "objc2-encode" -version = "2.0.0-pre.2" +name = "objc2-core-location" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abfcac41015b00a120608fdaa6938c44cb983fee294351cc4bac7638b4e50512" +checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" dependencies = [ - "objc-sys 0.2.0-beta.2", + "objc2 0.6.3", + "objc2-foundation 0.3.2", ] [[package]] -name = "objc2-encode" -version = "3.0.0" +name = "objc2-core-text" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d079845b37af429bfe5dfa76e6d087d788031045b25cfc6fd898486fd9847666" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-core-foundation", + "objc2-core-graphics", +] [[package]] name = "objc2-encode" @@ -6621,7 +5377,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "block2 0.5.1", "dispatch", "libc", @@ -6630,23 +5386,25 @@ dependencies = [ [[package]] name = "objc2-foundation" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.9.1", - "objc2 0.6.1", + "bitflags 2.10.0", + "block2 0.6.2", + "libc", + "objc2 0.6.3", "objc2-core-foundation", ] [[package]] name = "objc2-io-surface" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" dependencies = [ - "bitflags 2.9.1", - "objc2 0.6.1", + "bitflags 2.10.0", + "objc2 0.6.3", "objc2-core-foundation", ] @@ -6668,7 +5426,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -6680,13 +5438,25 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", "objc2-metal", ] +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.10.0", + "objc2 0.6.3", + "objc2-core-foundation", + "objc2-foundation 0.3.2", +] + [[package]] name = "objc2-symbols" version = "0.2.2" @@ -6703,19 +5473,40 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "block2 0.5.1", "objc2 0.5.2", - "objc2-cloud-kit", - "objc2-core-data", - "objc2-core-image", - "objc2-core-location", + "objc2-cloud-kit 0.2.2", + "objc2-core-data 0.2.2", + "objc2-core-image 0.2.2", + "objc2-core-location 0.2.2", "objc2-foundation 0.2.2", "objc2-link-presentation", - "objc2-quartz-core", + "objc2-quartz-core 0.2.2", "objc2-symbols", "objc2-uniform-type-identifiers", - "objc2-user-notifications", + "objc2-user-notifications 0.2.2", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.10.0", + "block2 0.6.2", + "objc2 0.6.3", + "objc2-cloud-kit 0.3.2", + "objc2-core-data 0.3.2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image 0.3.2", + "objc2-core-location 0.3.2", + "objc2-core-text", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", + "objc2-user-notifications 0.3.2", ] [[package]] @@ -6735,27 +5526,28 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "block2 0.5.1", "objc2 0.5.2", - "objc2-core-location", + "objc2-core-location 0.2.2", "objc2-foundation 0.2.2", ] [[package]] -name = "objc_exception" -version = "0.1.2" +name = "objc2-user-notifications" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" dependencies = [ - "cc", + "objc2 0.6.3", + "objc2-foundation 0.3.2", ] [[package]] name = "object" -version = "0.36.7" +version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "memchr", ] @@ -6787,9 +5579,9 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "once_cell_polyfill" -version = "1.70.1" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "oorandom" @@ -6805,9 +5597,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "orbclient" -version = "0.3.48" +version = "0.3.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" +checksum = "247ad146e19b9437f8604c21f8652423595cf710ad108af40e77d3ae6e96b827" dependencies = [ "libredox", ] @@ -6823,9 +5615,9 @@ dependencies = [ [[package]] name = "ordered-float" -version = "5.0.0" +version = "5.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2c1f9f56e534ac6a9b8a4600bdf0f530fb393b5f393e7b4d03489c3cf0c3f01" +checksum = "7f4779c6901a562440c3786d08192c6fbda7c1c2060edd10006b05ee35d10f2d" dependencies = [ "num-traits", "rand 0.8.5", @@ -6844,27 +5636,25 @@ dependencies = [ [[package]] name = "os_info" -version = "3.12.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0e1ac5fde8d43c34139135df8ea9ee9465394b2d8d20f032d38998f64afffc3" +checksum = "7c39b5918402d564846d5aba164c09a66cc88d232179dfd3e3c619a25a268392" dependencies = [ + "android_system_properties", "log", - "plist", + "nix", + "objc2 0.6.3", + "objc2-foundation 0.3.2", + "objc2-ui-kit 0.3.2", "serde", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "owned_ttf_parser" -version = "0.25.0" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" +checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" dependencies = [ "ttf-parser 0.25.1", ] @@ -6877,9 +5667,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -6887,62 +5677,43 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.11" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.13", - "smallvec", - "windows-targets 0.52.6", -] - -[[package]] -name = "parry2d" -version = "0.13.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fd94bf962ead112f14223469aac6f76e3c24e2c399e348f638924498b238c56" -dependencies = [ - "approx", - "arrayvec", - "bitflags 1.3.2", - "downcast-rs 1.2.1", - "either", - "nalgebra 0.32.6", - "num-derive", - "num-traits", - "rustc-hash 1.1.0", - "serde", - "simba 0.8.1", - "slab", + "redox_syscall 0.5.18", "smallvec", - "spade", + "windows-link 0.2.1", ] [[package]] name = "parry2d" -version = "0.20.2" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b89f8a3309b82a3a81a6957c7916fe00834e79678451683b048e8d75109b9e4" +checksum = "ef681740349cec3ab9b5996b03b459b383b6998e1ffcb2804e8b57eb1e8491d9" dependencies = [ "approx", "arrayvec", - "bitflags 2.9.1", - "downcast-rs 2.0.1", + "bitflags 2.10.0", + "downcast-rs 2.0.2", "either", "ena", - "hashbrown 0.15.4", + "foldhash 0.2.0", + "hashbrown 0.16.0", "log", - "nalgebra 0.33.2", + "nalgebra", "num-derive", "num-traits", - "ordered-float 5.0.0", + "ordered-float 5.1.0", "serde", - "simba 0.9.0", + "serde_arrays", + "simba", "slab", + "smallvec", "spade", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -6969,38 +5740,28 @@ dependencies = [ [[package]] name = "pem" -version = "3.0.5" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38af38e8470ac9dee3ce1bae1af9c1671fffc44ddfd8bd1d0a3445bf349a8ef3" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" dependencies = [ - "base64 0.22.1", - "serde", + "base64", + "serde_core", ] [[package]] name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "petgraph" -version = "0.6.5" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" -dependencies = [ - "fixedbitset 0.4.2", - "indexmap", -] +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "petgraph" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54acf3a685220b533e437e264e4d932cfbdc4cc7ec0cd232ed73c08d03b8a7ca" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" dependencies = [ - "fixedbitset 0.5.7", - "hashbrown 0.15.4", + "fixedbitset", + "hashbrown 0.15.5", "indexmap", "serde", ] @@ -7035,7 +5796,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.104", + "syn", "unicase", ] @@ -7072,7 +5833,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -7104,19 +5865,6 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" -[[package]] -name = "plist" -version = "1.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d77244ce2d584cd84f6a15f86195b8c9b2a0dfbfd817c09e0464244091a58ed" -dependencies = [ - "base64 0.22.1", - "indexmap", - "quick-xml 0.37.5", - "serde", - "time", -] - [[package]] name = "plotters" version = "0.3.7" @@ -7159,38 +5907,32 @@ dependencies = [ ] [[package]] -name = "poll-promise" -version = "0.3.0" +name = "png" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6a58fecbf9da8965bcdb20ce4fd29788d1acee68ddbb64f0ba1b81bccdb7df" +checksum = "97baced388464909d42d89643fe4361939af9b7ce7a31ee32a168f832a70f2a0" dependencies = [ - "document-features", - "static_assertions", - "wasm-bindgen", - "wasm-bindgen-futures", + "bitflags 2.10.0", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", ] [[package]] name = "polling" -version = "3.8.0" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b53a684391ad002dd6a596ceb6c74fd004fdce75f4be2e3f615068abbea5fd50" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" dependencies = [ "cfg-if", "concurrent-queue", "hermit-abi", "pin-project-lite", - "rustix 1.0.7", - "tracing", - "windows-sys 0.59.0", + "rustix 1.1.2", + "windows-sys 0.61.2", ] -[[package]] -name = "pollster" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" - [[package]] name = "portable-atomic" version = "1.11.1" @@ -7208,9 +5950,9 @@ dependencies = [ [[package]] name = "postcard" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c1de96e20f51df24ca73cafcc4690e044854d803259db27a00a461cb3b9d17a" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" dependencies = [ "cobs", "postcard-derive", @@ -7219,20 +5961,20 @@ dependencies = [ [[package]] name = "postcard-derive" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f049d94cb6dda6938cc8a531d2898e7c08d71c6de63d8e67123cca6cdde2cc" +checksum = "e0232bd009a197ceec9cc881ba46f727fcd8060a2d8d6a9dde7a69030a6fe2bb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] name = "potential_utf" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" dependencies = [ "zerovec", ] @@ -7269,28 +6011,28 @@ checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" [[package]] name = "prettyplease" -version = "0.2.35" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "061c1221631e079b26479d25bbf2275bfe5917ae8419cd7e34f13bfc2aa7539a" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.104", + "syn", ] [[package]] name = "proc-macro-crate" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit 0.22.27", + "toml_edit 0.23.7", ] [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] @@ -7302,7 +6044,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" dependencies = [ "profiling-procmacros", - "tracing", ] [[package]] @@ -7312,16 +6053,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52717f9a02b6965224f95ca2a81e2e0c5c43baacd28ca057577988930b6c3d5b" dependencies = [ "quote", - "syn 2.0.104", + "syn", ] [[package]] -name = "qoi" -version = "0.4.1" +name = "pxfm" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +checksum = "a3cbdf373972bf78df4d3b518d07003938e2c7d1fb5891e55f9cb6df57009d84" dependencies = [ - "bytemuck", + "num-traits", ] [[package]] @@ -7351,9 +6092,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.40" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] @@ -7376,32 +6117,20 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ - "libc", - "rand_chacha 0.3.1", "rand_core 0.6.4", "serde", ] [[package]] name = "rand" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ - "rand_chacha 0.9.0", + "rand_chacha", "rand_core 0.9.3", ] -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - [[package]] name = "rand_chacha" version = "0.9.0" @@ -7418,7 +6147,6 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.16", "serde", ] @@ -7428,17 +6156,17 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", ] [[package]] name = "rand_distr" -version = "0.4.3" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" +checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" dependencies = [ "num-traits", - "rand 0.8.5", + "rand 0.9.2", ] [[package]] @@ -7448,105 +6176,35 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" [[package]] -name = "rangemap" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" - -[[package]] -name = "rapier2d" -version = "0.18.0" -source = "git+https://github.com/ghostlyzsh/rapier.git#0ac5a2906d4ffbfba346bf327ed91fac351e29aa" -dependencies = [ - "approx", - "arrayvec", - "bit-vec 0.6.3", - "bitflags 1.3.2", - "crossbeam", - "downcast-rs 1.2.1", - "nalgebra 0.32.6", - "num-derive", - "num-traits", - "parry2d 0.13.8", - "rustc-hash 1.1.0", - "serde", - "simba 0.8.1", -] - -[[package]] -name = "rapier2d" -version = "0.25.1" +name = "rangemap" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ec6acdc5db3699c64e000945450c844d34b215dae3bf875b40e20b1909c0063" +checksum = "acbbbbea733ec66275512d0b9694f34102e7d5406fdbe2ad8d21b28dce92887c" + +[[package]] +name = "rapier2d" +version = "0.30.1" +source = "git+https://github.com/dimforge/rapier?rev=ef5dcaccaf405da41f6f379bde71f9cf33ffd78b#ef5dcaccaf405da41f6f379bde71f9cf33ffd78b" dependencies = [ "approx", "arrayvec", - "bit-vec 0.8.0", - "bitflags 2.9.1", - "crossbeam", - "downcast-rs 2.0.1", + "bit-vec", + "bitflags 2.10.0", + "downcast-rs 2.0.2", "log", - "nalgebra 0.33.2", + "nalgebra", "num-derive", "num-traits", - "ordered-float 5.0.0", - "parry2d 0.20.2", + "ordered-float 5.1.0", + "parry2d", "profiling", "rustc-hash 2.1.1", "serde", - "simba 0.9.0", - "thiserror 2.0.12", + "simba", + "static_assertions", + "thiserror 2.0.17", "vec_map", -] - -[[package]] -name = "rav1e" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" -dependencies = [ - "arbitrary", - "arg_enum_proc_macro", - "arrayvec", - "av1-grain", - "bitstream-io", - "built", - "cfg-if", - "interpolate_name", - "itertools 0.12.1", - "libc", - "libfuzzer-sys", - "log", - "maybe-rayon", - "new_debug_unreachable", - "noop_proc_macro", - "num-derive", - "num-traits", - "once_cell", - "paste", - "profiling", - "rand 0.8.5", - "rand_chacha 0.3.1", - "simd_helpers", - "system-deps", - "thiserror 1.0.69", - "v_frame", - "wasm-bindgen", -] - -[[package]] -name = "ravif" -version = "0.11.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5825c26fddd16ab9f515930d49028a630efec172e903483c94796cfe31893e6b" -dependencies = [ - "avif-serialize", - "imgref", - "loop9", - "quick-error", - "rav1e", - "rayon", - "rgb", + "wide", ] [[package]] @@ -7563,9 +6221,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ "either", "rayon-core", @@ -7573,9 +6231,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -7596,9 +6254,9 @@ dependencies = [ [[package]] name = "read-fonts" -version = "0.29.3" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04ca636dac446b5664bd16c069c00a9621806895b8bb02c2dc68542b23b8f25d" +checksum = "6717cf23b488adf64b9d711329542ba34de147df262370221940dfabc2c91358" dependencies = [ "bytemuck", "font-types", @@ -7610,15 +6268,6 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0d463f2884048e7153449a55166f91028d5b0ea53c79377099ce4e8cf0cf9bb" -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_syscall" version = "0.4.1" @@ -7630,11 +6279,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.13" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", ] [[package]] @@ -7650,47 +6299,32 @@ dependencies = [ [[package]] name = "regex" -version = "1.11.1" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "renderdoc-sys" @@ -7704,7 +6338,7 @@ version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8928798c0a55e03c9ca6c4c6846f76377427d2c1e1f7e6de3c06ae57942df43" dependencies = [ - "gif", + "gif 0.13.3", "image-webp", "log", "pico-args", @@ -7717,9 +6351,9 @@ dependencies = [ [[package]] name = "rgb" -version = "0.8.50" +version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" +checksum = "0c6a884d2998352bb4daf0183589aec883f16a6da1f4dde84d8e2e9a5409a1ce" dependencies = [ "bytemuck", ] @@ -7749,28 +6383,6 @@ dependencies = [ "portable-atomic-util", ] -[[package]] -name = "rmp" -version = "0.8.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" -dependencies = [ - "byteorder", - "num-traits", - "paste", -] - -[[package]] -name = "rmp-serde" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" -dependencies = [ - "byteorder", - "rmp", - "serde", -] - [[package]] name = "robust" version = "1.2.0" @@ -7779,26 +6391,28 @@ checksum = "4e27ee8bb91ca0adcf0ecb116293afa12d393f9c2b9b9cd54d33e8078fe19839" [[package]] name = "ron" -version = "0.8.1" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" +checksum = "beceb6f7bf81c73e73aeef6dd1356d9a1b2b4909e1f0fc3e59b034f9572d7b7f" dependencies = [ - "base64 0.21.7", - "bitflags 2.9.1", + "base64", + "bitflags 2.10.0", "serde", "serde_derive", + "unicode-ident", ] [[package]] name = "ron" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beceb6f7bf81c73e73aeef6dd1356d9a1b2b4909e1f0fc3e59b034f9572d7b7f" +checksum = "fd490c5b18261893f14449cbd28cb9c0b637aebf161cd77900bfdedaff21ec32" dependencies = [ - "base64 0.22.1", - "bitflags 2.9.1", + "bitflags 2.10.0", + "once_cell", "serde", "serde_derive", + "typeid", "unicode-ident", ] @@ -7810,9 +6424,9 @@ checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" [[package]] name = "rustc-demangle" -version = "0.1.25" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustc-hash" @@ -7832,7 +6446,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "errno", "libc", "linux-raw-sys 0.4.15", @@ -7841,22 +6455,22 @@ dependencies = [ [[package]] name = "rustix" -version = "1.0.7" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "errno", "libc", - "linux-raw-sys 0.9.4", - "windows-sys 0.59.0", + "linux-raw-sys 0.11.0", + "windows-sys 0.61.2", ] [[package]] name = "rustls" -version = "0.23.28" +version = "0.23.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7160e3e10bf4535308537f3c4e1641468cd0e485175d6163087c0393c7d46643" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" dependencies = [ "aws-lc-rs", "log", @@ -7870,9 +6484,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" dependencies = [ "openssl-probe", "rustls-pki-types", @@ -7882,18 +6496,18 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a" dependencies = [ "zeroize", ] [[package]] name = "rustls-webpki" -version = "0.103.3" +version = "0.103.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" dependencies = [ "aws-lc-rs", "ring", @@ -7903,9 +6517,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "rustybuzz" @@ -7913,7 +6527,7 @@ version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfb9cf8877777222e4a3bc7eb247e398b56baba500c38c1c46842431adc8b55c" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "bytemuck", "libm", "smallvec", @@ -7930,7 +6544,7 @@ version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "bytemuck", "core_maths", "log", @@ -7944,9 +6558,9 @@ dependencies = [ [[package]] name = "ruzstd" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3640bec8aad418d7d03c72ea2de10d5c646a598f9883c7babc160d91e3c1b26c" +checksum = "e5ff0cc5e135c8870a775d3320910cd9b564ec036b4dc0b8741629020be63f01" dependencies = [ "twox-hash", ] @@ -7977,11 +6591,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -8005,17 +6619,17 @@ dependencies = [ "ab_glyph", "log", "memmap2", - "smithay-client-toolkit", + "smithay-client-toolkit 0.19.2", "tiny-skia", ] [[package]] name = "security-framework" -version = "3.2.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -8024,9 +6638,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.14.0" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" dependencies = [ "core-foundation-sys", "libc", @@ -8034,17 +6648,18 @@ dependencies = [ [[package]] name = "self_cell" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f7d95a54511e0c7be3f51e8867aa8cf35148d7b9445d44de2f943e2b206e749" +checksum = "16c2f82143577edb4921b71ede051dac62ca3c16084e918bf7b40c96ae10eb33" [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" dependencies = [ "serde", + "serde_core", ] [[package]] @@ -8055,43 +6670,64 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_arrays" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94a16b99c5ea4fe3daccd14853ad260ec00ea043b2708d1fd1da3106dcd8d9df" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_core" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] name = "serde_ignored" -version = "0.1.12" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b516445dac1e3535b6d658a7b528d771153dfb272ed4180ca4617a20550365ff" +checksum = "115dffd5f3853e06e746965a20dcbae6ee747ae30b543d91b0e089668bb07798" dependencies = [ "serde", + "serde_core", ] [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] @@ -8102,7 +6738,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -8115,21 +6751,19 @@ dependencies = [ ] [[package]] -name = "sha1" -version = "0.10.6" +name = "serde_spanned" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" dependencies = [ - "cfg-if", - "cpufeatures", - "digest", + "serde_core", ] [[package]] -name = "sha2" -version = "0.10.9" +name = "sha1" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", @@ -8159,31 +6793,18 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.5" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] [[package]] name = "simba" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae" -dependencies = [ - "approx", - "num-complex", - "num-traits", - "paste", - "wide", -] - -[[package]] -name = "simba" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3a386a501cd104797982c15ae17aafe8b9261315b5d07e3ec803f2ea26be0fa" +checksum = "c99284beb21666094ba2b75bbceda012e610f5479dfcc2d6e2426f53197ffd95" dependencies = [ "approx", "num-complex", @@ -8198,15 +6819,6 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" -[[package]] -name = "simd_helpers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" -dependencies = [ - "quote", -] - [[package]] name = "simplecss" version = "0.2.2" @@ -8230,9 +6842,9 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "skrifa" -version = "0.31.3" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbeb4ca4399663735553a09dd17ce7e49a0a0203f03b706b39628c4d913a8607" +checksum = "8c31071dedf532758ecf3fed987cdb4bd9509f900e026ab684b4ecb81ea49841" dependencies = [ "bytemuck", "read-fonts", @@ -8240,9 +6852,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "slotmap" @@ -8268,9 +6880,9 @@ version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "calloop 0.13.0", - "calloop-wayland-source", + "calloop-wayland-source 0.3.0", "cursor-icon", "libc", "log", @@ -8287,14 +6899,41 @@ dependencies = [ "xkeysym", ] +[[package]] +name = "smithay-client-toolkit" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0" +dependencies = [ + "bitflags 2.10.0", + "calloop 0.14.3", + "calloop-wayland-source 0.4.1", + "cursor-icon", + "libc", + "log", + "memmap2", + "rustix 1.1.2", + "thiserror 2.0.17", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-experimental", + "wayland-protocols-misc", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", +] + [[package]] name = "smithay-clipboard" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc8216eec463674a0e90f29e0ae41a4db573ec5b56b1c6c1c71615d249b6d846" +checksum = "71704c03f739f7745053bde45fa203a46c58d25bc5c4efba1d9a60e9dba81226" dependencies = [ "libc", - "smithay-client-toolkit", + "smithay-client-toolkit 0.20.0", "wayland-backend", ] @@ -8309,12 +6948,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.10" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.60.2", ] [[package]] @@ -8330,11 +6969,11 @@ dependencies = [ [[package]] name = "spade" -version = "2.14.0" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a14e31a007e9f85c32784b04f89e6e194bb252a4d41b4a8ccd9e77245d901c8c" +checksum = "fb313e1c8afee5b5647e00ee0fe6855e3d529eb863a0fdae1d60006c4d1e9990" dependencies = [ - "hashbrown 0.15.4", + "hashbrown 0.15.5", "num-traits", "robust", "serde", @@ -8343,9 +6982,9 @@ dependencies = [ [[package]] name = "spin" -version = "0.9.8" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" dependencies = [ "portable-atomic", ] @@ -8356,14 +6995,14 @@ version = "0.3.0+sdk-1.3.268.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", ] [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "stackfuture" @@ -8379,17 +7018,17 @@ dependencies = [ "aeronet_replicon", "aeronet_transport", "aeronet_websocket", - "bevy 0.16.1", + "bevy", "bevy_common_assets", "bevy_egui", - "bevy_rapier2d 0.30.0", + "bevy_rapier2d", "bevy_replicon", "clap", "console_error_panic_hook", - "getrandom 0.3.3", - "ordered-float 5.0.0", - "rand 0.9.1", - "ron 0.10.1", + "getrandom 0.3.4", + "ordered-float 5.1.0", + "rand 0.9.2", + "ron 0.12.0", "serde", "tracing-subscriber", "tracing-wasm", @@ -8397,76 +7036,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "starkingdoms-client" -version = "0.1.0" -dependencies = [ - "bevy_ecs 0.16.1", - "bytemuck", - "console_error_panic_hook", - "crossbeam", - "egui 0.31.1", - "egui-winit 0.31.1", - "egui_glow 0.31.1", - "ehttp", - "futures", - "glow 0.16.0", - "glutin", - "glutin-winit", - "image 0.25.6", - "nalgebra 0.33.2", - "poll-promise", - "pollster", - "resvg", - "serde", - "serde_json", - "starkingdoms-common", - "thiserror 2.0.12", - "tracing", - "tracing-subscriber", - "tracing-web", - "tungstenite 0.26.2", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "web-time 1.1.0", - "winit 0.30.11", -] - -[[package]] -name = "starkingdoms-common" -version = "0.1.0" -dependencies = [ - "base64 0.21.7", - "bevy_ecs 0.15.1", - "hmac", - "rmp-serde", - "serde", - "serde_json", - "sha2", -] - -[[package]] -name = "starkingdoms-server" -version = "0.1.0-alpha1" -dependencies = [ - "bevy 0.16.1", - "bevy_rapier2d 0.25.0", - "crossbeam-channel", - "hex", - "hmac", - "jwt", - "rand 0.8.5", - "serde", - "serde_json", - "sha2", - "starkingdoms-common", - "toml 0.8.23", - "tracing-subscriber", - "tracing-tracy", - "tungstenite 0.21.0", -] - [[package]] name = "static_assertions" version = "1.1.0" @@ -8513,7 +7082,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.104", + "syn", ] [[package]] @@ -8540,9 +7109,9 @@ dependencies = [ [[package]] name = "swash" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f745de914febc7c9ab4388dfaf94bbc87e69f57bb41133a9b0c84d4be49856f3" +checksum = "47846491253e976bdd07d0f9cc24b7daf24720d11309302ccbbc6e6b6e53550a" dependencies = [ "skrifa", "yazi", @@ -8551,20 +7120,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.104" +version = "2.0.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea" dependencies = [ "proc-macro2", "quote", @@ -8579,7 +7137,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -8591,45 +7149,6 @@ dependencies = [ "libc", ] -[[package]] -name = "sysinfo" -version = "0.30.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a5b4ddaee55fb2bea2bf0e5000747e5f5c0de765e5a5ff87f4cd106439f4bb3" -dependencies = [ - "cfg-if", - "core-foundation-sys", - "libc", - "ntapi", - "once_cell", - "windows 0.52.0", -] - -[[package]] -name = "system-deps" -version = "6.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" -dependencies = [ - "cfg-expr", - "heck", - "pkg-config", - "toml 0.8.23", - "version-compare", -] - -[[package]] -name = "taffy" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1315457ccd9c3def787a18fae91914e623e4dcff019b64ce39f5268ded53d3d" -dependencies = [ - "arrayvec", - "grid 0.10.0", - "num-traits", - "slotmap", -] - [[package]] name = "taffy" version = "0.7.7" @@ -8637,7 +7156,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab4f4d046dd956a47a7e1a2947083d7ac3e6aa3cfaaead36173ceaa5ab11878c" dependencies = [ "arrayvec", - "grid 0.15.0", + "grid", "serde", "slotmap", ] @@ -8651,25 +7170,19 @@ dependencies = [ "filetime", "libc", "xattr", -] - -[[package]] -name = "target-lexicon" -version = "0.12.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" +] [[package]] name = "tempfile" -version = "3.20.0" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand", - "getrandom 0.3.3", + "getrandom 0.3.4", "once_cell", - "rustix 1.0.7", - "windows-sys 0.59.0", + "rustix 1.1.2", + "windows-sys 0.61.2", ] [[package]] @@ -8683,13 +7196,13 @@ dependencies = [ [[package]] name = "test_each_file" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5b980155ee175f5b054bafd14e434b89c151ffae1a8bd9d607425a7a6911e2b" +checksum = "2de773517ee4367314c7918f6c9ef69c201ba72bfdbffb00234c22c50a153b73" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", "unicode-ident", ] @@ -8704,11 +7217,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.17", ] [[package]] @@ -8719,18 +7232,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -8744,54 +7257,36 @@ dependencies = [ [[package]] name = "tiff" -version = "0.9.1" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f" dependencies = [ + "fax", "flate2", - "jpeg-decoder", + "half", + "quick-error", "weezl", + "zune-jpeg", ] [[package]] name = "time" -version = "0.3.41" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", - "itoa", "num-conv", "powerfmt", "serde", "time-core", - "time-macros", ] [[package]] name = "time-core" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" - -[[package]] -name = "time-macros" -version = "0.2.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tiny-keccak" -version = "2.0.2" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" -dependencies = [ - "crunchy", -] +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "tiny-skia" @@ -8804,7 +7299,7 @@ dependencies = [ "bytemuck", "cfg-if", "log", - "png", + "png 0.17.16", "tiny-skia-path", ] @@ -8833,9 +7328,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" dependencies = [ "displaydoc", "zerovec", @@ -8853,9 +7348,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -8868,26 +7363,23 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.46.0" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1140bb80481756a8cbe10541f37433b459c5aa1e727b4c020fbfebdc25bf3ec4" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", - "io-uring", "libc", "mio", "pin-project-lite", - "slab", "socket2", - "windows-sys 0.52.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-rustls" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ "rustls", "tokio", @@ -8906,7 +7398,7 @@ dependencies = [ "rustls-pki-types", "tokio", "tokio-rustls", - "tungstenite 0.26.2", + "tungstenite", ] [[package]] @@ -8916,8 +7408,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" dependencies = [ "serde", - "serde_spanned", - "toml_datetime", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", "toml_edit 0.19.15", ] @@ -8928,11 +7420,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", - "serde_spanned", - "toml_datetime", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", "toml_edit 0.22.27", ] +[[package]] +name = "toml" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned 1.0.3", + "toml_datetime 0.7.3", + "toml_parser", + "toml_writer", + "winnow 0.7.13", +] + [[package]] name = "toml_datetime" version = "0.6.11" @@ -8942,6 +7449,15 @@ dependencies = [ "serde", ] +[[package]] +name = "toml_datetime" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +dependencies = [ + "serde_core", +] + [[package]] name = "toml_edit" version = "0.19.15" @@ -8950,34 +7466,43 @@ checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap", "serde", - "serde_spanned", - "toml_datetime", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.21.1" +version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", - "toml_datetime", - "winnow 0.5.40", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_write", ] [[package]] name = "toml_edit" -version = "0.22.27" +version = "0.23.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" dependencies = [ "indexmap", - "serde", - "serde_spanned", - "toml_datetime", - "toml_write", - "winnow 0.7.11", + "toml_datetime 0.7.3", + "toml_parser", + "winnow 0.7.13", +] + +[[package]] +name = "toml_parser" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +dependencies = [ + "winnow 0.7.13", ] [[package]] @@ -8986,12 +7511,19 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" +[[package]] +name = "toml_writer" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" + [[package]] name = "tracing" version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -9005,7 +7537,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -9018,27 +7550,6 @@ dependencies = [ "valuable", ] -[[package]] -name = "tracing-error" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b1581020d7a273442f5b45074a6a57d5757ad0a47dac0e9f0bd57b81936f3db" -dependencies = [ - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "tracing-log" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - [[package]] name = "tracing-log" version = "0.2.0" @@ -9052,46 +7563,32 @@ dependencies = [ [[package]] name = "tracing-oslog" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528bdd1f0e27b5dd9a4ededf154e824b0532731e4af73bb531de46276e0aab1e" +checksum = "d76902d2a8d5f9f55a81155c08971734071968c90f2d9bfe645fe700579b2950" dependencies = [ - "bindgen 0.70.1", "cc", "cfg-if", - "once_cell", - "parking_lot", "tracing-core", "tracing-subscriber", ] [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" dependencies = [ "matchers", "nu-ansi-term", "once_cell", - "regex", + "regex-automata", "sharded-slab", "smallvec", "thread_local", "tracing", "tracing-core", - "tracing-log 0.2.0", -] - -[[package]] -name = "tracing-tracy" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eaa1852afa96e0fe9e44caa53dc0bd2d9d05e0f2611ce09f97f8677af56e4ba" -dependencies = [ - "tracing-core", - "tracing-subscriber", - "tracy-client", + "tracing-log", ] [[package]] @@ -9105,40 +7602,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "tracing-web" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e6a141feebd51f8d91ebfd785af50fca223c570b86852166caa3b141defe7c" -dependencies = [ - "js-sys", - "tracing-core", - "tracing-subscriber", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "tracy-client" -version = "0.18.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef54005d3d760186fd662dad4b7bb27ecd5531cdef54d1573ebd3f20a9205ed7" -dependencies = [ - "loom", - "once_cell", - "tracy-client-sys", -] - -[[package]] -name = "tracy-client-sys" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9612d9503675b07b244922ea6f6f3cdd88c43add1b3498084613fc88cdf69d" -dependencies = [ - "cc", - "windows-targets 0.52.6", -] - [[package]] name = "ttf-parser" version = "0.20.0" @@ -9160,25 +7623,6 @@ dependencies = [ "core_maths", ] -[[package]] -name = "tungstenite" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ef1a641ea34f399a848dea702823bbecfb4c486f911735368f1f137cb8257e1" -dependencies = [ - "byteorder", - "bytes", - "data-encoding", - "http", - "httparse", - "log", - "rand 0.8.5", - "sha1", - "thiserror 1.0.69", - "url", - "utf-8", -] - [[package]] name = "tungstenite" version = "0.26.2" @@ -9190,19 +7634,19 @@ dependencies = [ "http", "httparse", "log", - "rand 0.9.1", + "rand 0.9.2", "rustls", "rustls-pki-types", "sha1", - "thiserror 2.0.12", + "thiserror 2.0.17", "utf-8", ] [[package]] name = "twox-hash" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b907da542cbced5261bd3256de1b3a1bf340a3d37f93425a07362a1d687de56" +checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" [[package]] name = "type-map" @@ -9221,9 +7665,9 @@ checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "typesize" @@ -9242,9 +7686,15 @@ checksum = "536b6812192bda8551cfa0e52524e328c6a951b48e66529ee4522d6c721243d6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] +[[package]] +name = "typewit" +version = "1.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8c1ae7cc0fdb8b842d65d127cb981574b0d2b249b74d1c7a2986863dc134f71" + [[package]] name = "uds_windows" version = "1.1.0" @@ -9294,9 +7744,9 @@ checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e" [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unicode-linebreak" @@ -9306,9 +7756,9 @@ checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" [[package]] name = "unicode-properties" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" [[package]] name = "unicode-script" @@ -9330,15 +7780,9 @@ checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" [[package]] name = "unicode-width" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" - -[[package]] -name = "unicode-width" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" [[package]] name = "unicode-xid" @@ -9358,7 +7802,7 @@ version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" dependencies = [ - "base64 0.22.1", + "base64", "flate2", "log", "once_cell", @@ -9373,13 +7817,14 @@ dependencies = [ [[package]] name = "url" -version = "2.5.4" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] @@ -9388,7 +7833,7 @@ version = "0.45.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "80be9b06fbae3b8b303400ab20778c80bbaf338f563afe567cf3c9eea17b47ef" dependencies = [ - "base64 0.22.1", + "base64", "data-url", "flate2", "fontdb 0.23.0", @@ -9429,27 +7874,16 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.17.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", "js-sys", "serde", "wasm-bindgen", ] -[[package]] -name = "v_frame" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" -dependencies = [ - "aligned-vec", - "num-traits", - "wasm-bindgen", -] - [[package]] name = "valuable" version = "0.1.1" @@ -9464,7 +7898,7 @@ checksum = "41b6d82be61465f97d42bd1d15bf20f3b0a3a0905018f38f9d6f6962055b0b5c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -9473,12 +7907,6 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" -[[package]] -name = "version-compare" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" - [[package]] name = "version_check" version = "0.9.5" @@ -9502,45 +7930,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.104", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" dependencies = [ "cfg-if", "js-sys", @@ -9551,9 +7966,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -9561,22 +7976,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" dependencies = [ + "bumpalo", "proc-macro2", "quote", - "syn 2.0.104", - "wasm-bindgen-backend", + "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" dependencies = [ "unicode-ident", ] @@ -9615,13 +8030,13 @@ dependencies = [ [[package]] name = "wayland-backend" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe770181423e5fc79d3e2a7f4410b7799d5aab1de4372853de3c6aa13ca24121" +checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" dependencies = [ "cc", "downcast-rs 1.2.1", - "rustix 0.38.44", + "rustix 1.1.2", "scoped-tls", "smallvec", "wayland-sys", @@ -9629,12 +8044,12 @@ dependencies = [ [[package]] name = "wayland-client" -version = "0.31.10" +version = "0.31.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978fa7c67b0847dbd6a9f350ca2569174974cd4082737054dbb7fbb79d7d9a61" +checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" dependencies = [ - "bitflags 2.9.1", - "rustix 0.38.44", + "bitflags 2.10.0", + "rustix 1.1.2", "wayland-backend", "wayland-scanner", ] @@ -9645,41 +8060,67 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "cursor-icon", "wayland-backend", ] [[package]] name = "wayland-cursor" -version = "0.31.10" +version = "0.31.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a65317158dec28d00416cb16705934070aef4f8393353d41126c54264ae0f182" +checksum = "447ccc440a881271b19e9989f75726d60faa09b95b0200a9b7eb5cc47c3eeb29" dependencies = [ - "rustix 0.38.44", + "rustix 1.1.2", "wayland-client", "xcursor", ] [[package]] name = "wayland-protocols" -version = "0.32.8" +version = "0.32.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" +dependencies = [ + "bitflags 2.10.0", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-experimental" +version = "20250721.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1" +dependencies = [ + "bitflags 2.10.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-misc" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "779075454e1e9a521794fed15886323ea0feda3f8b0fc1390f5398141310422a" +checksum = "2dfe33d551eb8bffd03ff067a8b44bb963919157841a99957151299a6307d19c" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "wayland-backend", "wayland-client", + "wayland-protocols", "wayland-scanner", ] [[package]] name = "wayland-protocols-plasma" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fd38cdad69b56ace413c6bcc1fbf5acc5e2ef4af9d5f8f1f9570c0c83eae175" +checksum = "a07a14257c077ab3279987c4f8bb987851bf57081b93710381daea94f2c2c032" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -9688,11 +8129,11 @@ dependencies = [ [[package]] name = "wayland-protocols-wlr" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cb6cdc73399c0e06504c437fe3cf886f25568dd5454473d565085b36d6a8bbf" +checksum = "efd94963ed43cf9938a090ca4f7da58eb55325ec8200c3848963e98dc25b78ec" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "wayland-backend", "wayland-client", "wayland-protocols", @@ -9701,9 +8142,9 @@ dependencies = [ [[package]] name = "wayland-scanner" -version = "0.31.6" +version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" +checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" dependencies = [ "proc-macro2", "quick-xml 0.37.5", @@ -9712,9 +8153,9 @@ dependencies = [ [[package]] name = "wayland-sys" -version = "0.31.6" +version = "0.31.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615" +checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" dependencies = [ "dlib", "log", @@ -9724,19 +8165,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.77" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "0.2.4" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa30049b1c872b72c89866d458eae9f20380ab280ffd1b1e18df2d3e2d98cfe0" +checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" dependencies = [ "js-sys", "wasm-bindgen", @@ -9754,16 +8185,16 @@ dependencies = [ [[package]] name = "webbrowser" -version = "1.0.5" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf4f3c0ba838e82b4e5ccc4157003fb8c324ee24c058470ffb82820becbde98" +checksum = "00f1243ef785213e3a32fa0396093424a3a6ea566f9948497e5a2309261a4c97" dependencies = [ "core-foundation 0.10.1", "jni", "log", "ndk-context", - "objc2 0.6.1", - "objc2-foundation 0.3.1", + "objc2 0.6.3", + "objc2-foundation 0.3.2", "url", "web-sys", ] @@ -9774,74 +8205,23 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.1", + "webpki-roots 1.0.4", ] [[package]] name = "webpki-roots" -version = "1.0.1" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8782dd5a41a24eed3a4f40b606249b3e236ca61adf1f25ea4d45c73de122b502" +checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" dependencies = [ "rustls-pki-types", ] -[[package]] -name = "weezl" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" - -[[package]] -name = "wgpu" -version = "0.19.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbd7311dbd2abcfebaabf1841a2824ed7c8be443a0f29166e5d3c6a53a762c01" -dependencies = [ - "arrayvec", - "cfg-if", - "cfg_aliases 0.1.1", - "js-sys", - "log", - "naga 0.19.2", - "parking_lot", - "profiling", - "raw-window-handle", - "smallvec", - "static_assertions", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "wgpu-core 0.19.4", - "wgpu-hal 0.19.5", - "wgpu-types 0.19.2", -] - -[[package]] -name = "wgpu" -version = "24.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b0b3436f0729f6cdf2e6e9201f3d39dc95813fad61d826c1ed07918b4539353" -dependencies = [ - "arrayvec", - "bitflags 2.9.1", - "cfg_aliases 0.2.1", - "document-features", - "js-sys", - "log", - "naga 24.0.0", - "parking_lot", - "profiling", - "raw-window-handle", - "smallvec", - "static_assertions", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "wgpu-core 24.0.5", - "wgpu-hal 24.0.4", - "wgpu-types 24.0.0", -] +[[package]] +name = "weezl" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" [[package]] name = "wgpu" @@ -9850,12 +8230,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec8fb398f119472be4d80bc3647339f56eb63b2a331f6a3d16e25d8144197dd9" dependencies = [ "arrayvec", - "bitflags 2.9.1", - "cfg_aliases 0.2.1", + "bitflags 2.10.0", + "cfg_aliases", "document-features", - "hashbrown 0.15.4", + "hashbrown 0.15.5", "js-sys", "log", + "naga 25.0.1", "parking_lot", "portable-atomic", "profiling", @@ -9863,6 +8244,7 @@ dependencies = [ "smallvec", "static_assertions", "wasm-bindgen", + "wasm-bindgen-futures", "web-sys", "wgpu-core 25.0.2", "wgpu-hal 25.0.2", @@ -9870,72 +8252,76 @@ dependencies = [ ] [[package]] -name = "wgpu-core" -version = "0.19.4" +name = "wgpu" +version = "26.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b94525fc99ba9e5c9a9e24764f2bc29bad0911a7446c12f446a8277369bf3a" +checksum = "70b6ff82bbf6e9206828e1a3178e851f8c20f1c9028e74dd3a8090741ccd5798" dependencies = [ "arrayvec", - "bit-vec 0.6.3", - "bitflags 2.9.1", - "cfg_aliases 0.1.1", - "codespan-reporting 0.11.1", - "indexmap", + "bitflags 2.10.0", + "cfg-if", + "cfg_aliases", + "document-features", + "hashbrown 0.15.5", "log", - "naga 0.19.2", - "once_cell", - "parking_lot", + "naga 26.0.0", + "portable-atomic", "profiling", "raw-window-handle", - "rustc-hash 1.1.0", "smallvec", - "thiserror 1.0.69", - "web-sys", - "wgpu-hal 0.19.5", - "wgpu-types 0.19.2", + "static_assertions", + "wgpu-core 26.0.1", + "wgpu-hal 26.0.6", + "wgpu-types 26.0.0", ] [[package]] name = "wgpu-core" -version = "24.0.5" +version = "25.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f0aa306497a238d169b9dc70659105b4a096859a34894544ca81719242e1499" +checksum = "f7b882196f8368511d613c6aeec80655160db6646aebddf8328879a88d54e500" dependencies = [ "arrayvec", - "bit-vec 0.8.0", - "bitflags 2.9.1", - "cfg_aliases 0.2.1", + "bit-set", + "bit-vec", + "bitflags 2.10.0", + "cfg_aliases", "document-features", + "hashbrown 0.15.5", "indexmap", "log", - "naga 24.0.0", + "naga 25.0.1", "once_cell", "parking_lot", + "portable-atomic", "profiling", "raw-window-handle", "rustc-hash 1.1.0", "smallvec", - "thiserror 2.0.12", - "wgpu-hal 24.0.4", - "wgpu-types 24.0.0", + "thiserror 2.0.17", + "wgpu-core-deps-apple 25.0.0", + "wgpu-core-deps-emscripten", + "wgpu-core-deps-windows-linux-android 25.0.0", + "wgpu-hal 25.0.2", + "wgpu-types 25.0.0", ] [[package]] name = "wgpu-core" -version = "25.0.2" +version = "26.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7b882196f8368511d613c6aeec80655160db6646aebddf8328879a88d54e500" +checksum = "d5f62f1053bd28c2268f42916f31588f81f64796e2ff91b81293515017ca8bd9" dependencies = [ "arrayvec", - "bit-set 0.8.0", - "bit-vec 0.8.0", - "bitflags 2.9.1", - "cfg_aliases 0.2.1", + "bit-set", + "bit-vec", + "bitflags 2.10.0", + "cfg_aliases", "document-features", - "hashbrown 0.15.4", + "hashbrown 0.15.5", "indexmap", "log", - "naga 25.0.1", + "naga 26.0.0", "once_cell", "parking_lot", "portable-atomic", @@ -9943,10 +8329,38 @@ dependencies = [ "raw-window-handle", "rustc-hash 1.1.0", "smallvec", - "thiserror 2.0.12", - "wgpu-core-deps-windows-linux-android", + "thiserror 2.0.17", + "wgpu-core-deps-apple 26.0.0", + "wgpu-core-deps-windows-linux-android 26.0.0", + "wgpu-hal 26.0.6", + "wgpu-types 26.0.0", +] + +[[package]] +name = "wgpu-core-deps-apple" +version = "25.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfd488b3239b6b7b185c3b045c39ca6bf8af34467a4c5de4e0b1a564135d093d" +dependencies = [ + "wgpu-hal 25.0.2", +] + +[[package]] +name = "wgpu-core-deps-apple" +version = "26.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18ae5fbde6a4cbebae38358aa73fcd6e0f15c6144b67ef5dc91ded0db125dbdf" +dependencies = [ + "wgpu-hal 26.0.6", +] + +[[package]] +name = "wgpu-core-deps-emscripten" +version = "25.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f09ad7aceb3818e52539acc679f049d3475775586f3f4e311c30165cf2c00445" +dependencies = [ "wgpu-hal 25.0.2", - "wgpu-types 25.0.0", ] [[package]] @@ -9958,151 +8372,129 @@ dependencies = [ "wgpu-hal 25.0.2", ] +[[package]] +name = "wgpu-core-deps-windows-linux-android" +version = "26.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "720a5cb9d12b3d337c15ff0e24d3e97ed11490ff3f7506e7f3d98c68fa5d6f14" +dependencies = [ + "wgpu-hal 26.0.6", +] + [[package]] name = "wgpu-hal" -version = "0.19.5" +version = "25.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfabcfc55fd86611a855816326b2d54c3b2fd7972c27ce414291562650552703" +checksum = "f968767fe4d3d33747bbd1473ccd55bf0f6451f55d733b5597e67b5deab4ad17" dependencies = [ "android_system_properties", "arrayvec", - "ash 0.37.3+1.3.251", - "bit-set 0.5.3", - "bitflags 2.9.1", + "ash", + "bit-set", + "bitflags 2.10.0", "block", - "cfg_aliases 0.1.1", - "core-graphics-types", - "d3d12", - "glow 0.13.1", - "glutin_wgl_sys 0.5.0", + "bytemuck", + "cfg-if", + "cfg_aliases", + "core-graphics-types 0.1.3", + "glow", + "glutin_wgl_sys", "gpu-alloc", - "gpu-allocator 0.25.0", - "gpu-descriptor 0.2.4", - "hassle-rs", + "gpu-allocator", + "gpu-descriptor", + "hashbrown 0.15.5", "js-sys", "khronos-egl", "libc", - "libloading 0.8.8", + "libloading", "log", - "metal 0.27.0", - "naga 0.19.2", + "metal 0.31.0", + "naga 25.0.1", "ndk-sys 0.5.0+25.2.9519653", "objc", - "once_cell", + "ordered-float 4.6.0", "parking_lot", + "portable-atomic", "profiling", "range-alloc", "raw-window-handle", "renderdoc-sys", - "rustc-hash 1.1.0", "smallvec", - "thiserror 1.0.69", + "thiserror 2.0.17", "wasm-bindgen", "web-sys", - "wgpu-types 0.19.2", - "winapi", + "wgpu-types 25.0.0", + "windows 0.58.0", + "windows-core 0.58.0", ] [[package]] name = "wgpu-hal" -version = "24.0.4" +version = "26.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f112f464674ca69f3533248508ee30cb84c67cf06c25ff6800685f5e0294e259" +checksum = "a8d0e67224cc7305b3b4eb2cc57ca4c4c3afc665c1d1bee162ea806e19c47bdd" dependencies = [ "android_system_properties", "arrayvec", - "ash 0.38.0+1.3.281", - "bit-set 0.8.0", - "bitflags 2.9.1", + "ash", + "bit-set", + "bitflags 2.10.0", "block", "bytemuck", - "cfg_aliases 0.2.1", - "core-graphics-types", - "glow 0.16.0", - "glutin_wgl_sys 0.6.1", + "cfg-if", + "cfg_aliases", + "core-graphics-types 0.2.0", "gpu-alloc", - "gpu-allocator 0.27.0", - "gpu-descriptor 0.3.2", - "js-sys", - "khronos-egl", + "gpu-allocator", + "gpu-descriptor", + "hashbrown 0.15.5", "libc", - "libloading 0.8.8", + "libloading", "log", - "metal 0.31.0", - "naga 24.0.0", - "ndk-sys 0.5.0+25.2.9519653", + "metal 0.32.0", + "naga 26.0.0", "objc", - "once_cell", "ordered-float 4.6.0", "parking_lot", + "portable-atomic", + "portable-atomic-util", "profiling", "range-alloc", "raw-window-handle", "renderdoc-sys", - "rustc-hash 1.1.0", "smallvec", - "thiserror 2.0.12", - "wasm-bindgen", - "web-sys", - "wgpu-types 24.0.0", + "thiserror 2.0.17", + "wgpu-types 26.0.0", "windows 0.58.0", "windows-core 0.58.0", ] -[[package]] -name = "wgpu-hal" -version = "25.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f968767fe4d3d33747bbd1473ccd55bf0f6451f55d733b5597e67b5deab4ad17" -dependencies = [ - "bitflags 2.9.1", - "cfg_aliases 0.2.1", - "libloading 0.8.8", - "log", - "naga 25.0.1", - "parking_lot", - "portable-atomic", - "raw-window-handle", - "renderdoc-sys", - "thiserror 2.0.12", - "wgpu-types 25.0.0", -] - -[[package]] -name = "wgpu-types" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b671ff9fb03f78b46ff176494ee1ebe7d603393f42664be55b64dc8d53969805" -dependencies = [ - "bitflags 2.9.1", - "js-sys", - "web-sys", -] - [[package]] name = "wgpu-types" -version = "24.0.0" +version = "25.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50ac044c0e76c03a0378e7786ac505d010a873665e2d51383dcff8dd227dc69c" +checksum = "2aa49460c2a8ee8edba3fca54325540d904dd85b2e086ada762767e17d06e8bc" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", + "bytemuck", "js-sys", "log", - "serde", + "thiserror 2.0.17", "web-sys", ] [[package]] name = "wgpu-types" -version = "25.0.0" +version = "26.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aa49460c2a8ee8edba3fca54325540d904dd85b2e086ada762767e17d06e8bc" +checksum = "eca7a8d8af57c18f57d393601a1fb159ace8b2328f1b6b5f80893f7d672c9ae2" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "bytemuck", "js-sys", "log", - "thiserror 2.0.12", + "serde", + "thiserror 2.0.17", "web-sys", ] @@ -10128,12 +8520,6 @@ dependencies = [ "safe_arch", ] -[[package]] -name = "widestring" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" - [[package]] name = "winapi" version = "0.3.9" @@ -10152,11 +8538,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -10165,27 +8551,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" -dependencies = [ - "windows-implement 0.48.0", - "windows-interface 0.48.0", - "windows-targets 0.48.5", -] - -[[package]] -name = "windows" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" -dependencies = [ - "windows-core 0.52.0", - "windows-targets 0.52.6", -] - [[package]] name = "windows" version = "0.58.0" @@ -10205,7 +8570,7 @@ dependencies = [ "windows-collections", "windows-core 0.61.2", "windows-future", - "windows-link", + "windows-link 0.1.3", "windows-numerics", ] @@ -10218,15 +8583,6 @@ dependencies = [ "windows-core 0.61.2", ] -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.6", -] - [[package]] name = "windows-core" version = "0.58.0" @@ -10246,33 +8602,35 @@ version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" dependencies = [ - "windows-implement 0.60.0", - "windows-interface 0.59.1", - "windows-link", + "windows-implement 0.60.2", + "windows-interface 0.59.3", + "windows-link 0.1.3", "windows-result 0.3.4", "windows-strings 0.4.2", ] [[package]] -name = "windows-future" -version = "0.2.1" +name = "windows-core" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ - "windows-core 0.61.2", - "windows-link", - "windows-threading", + "windows-implement 0.60.2", + "windows-interface 0.59.3", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", ] [[package]] -name = "windows-implement" -version = "0.48.0" +name = "windows-future" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e2ee588991b9e7e6c8338edf3333fbe4da35dc72092643958ebb43f0ab2c49c" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", ] [[package]] @@ -10283,29 +8641,18 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] name = "windows-implement" -version = "0.60.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.104", -] - -[[package]] -name = "windows-interface" -version = "0.48.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6fb8df20c9bcaa8ad6ab513f7b40104840c8867d5751126e4df3b08388d0cc7" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn", ] [[package]] @@ -10316,18 +8663,18 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -10336,6 +8683,12 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-numerics" version = "0.2.0" @@ -10343,7 +8696,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" dependencies = [ "windows-core 0.61.2", - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -10361,7 +8714,16 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ - "windows-link", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", ] [[package]] @@ -10380,7 +8742,16 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ - "windows-link", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", ] [[package]] @@ -10425,7 +8796,16 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.2", + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", ] [[package]] @@ -10476,18 +8856,19 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.2" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] @@ -10496,7 +8877,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" dependencies = [ - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -10519,9 +8900,9 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" @@ -10543,9 +8924,9 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" @@ -10567,9 +8948,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] name = "windows_i686_gnullvm" @@ -10579,9 +8960,9 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" @@ -10603,9 +8984,9 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" @@ -10627,9 +9008,9 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" @@ -10651,9 +9032,9 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" @@ -10675,60 +9056,24 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" - -[[package]] -name = "winit" -version = "0.29.15" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d59ad965a635657faf09c8f062badd885748428933dad8e8bdd64064d92e5ca" -dependencies = [ - "android-activity 0.5.2", - "atomic-waker", - "bitflags 2.9.1", - "calloop 0.12.4", - "cfg_aliases 0.1.1", - "core-foundation 0.9.4", - "core-graphics", - "cursor-icon", - "icrate", - "js-sys", - "libc", - "log", - "ndk 0.8.0", - "ndk-sys 0.5.0+25.2.9519653", - "objc2 0.4.1", - "once_cell", - "orbclient", - "raw-window-handle", - "redox_syscall 0.3.5", - "rustix 0.38.44", - "smol_str", - "unicode-segmentation", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "web-time 0.2.4", - "windows-sys 0.48.0", - "xkbcommon-dl", -] +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winit" -version = "0.30.11" +version = "0.30.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4409c10174df8779dc29a4788cac85ed84024ccbc1743b776b21a520ee1aaf4" +checksum = "c66d4b9ed69c4009f6321f762d6e61ad8a2389cd431b97cb1e146812e9e6c732" dependencies = [ "ahash", - "android-activity 0.6.0", + "android-activity", "atomic-waker", - "bitflags 2.9.1", + "bitflags 2.10.0", "block2 0.5.1", "bytemuck", "calloop 0.13.0", - "cfg_aliases 0.2.1", + "cfg_aliases", "concurrent-queue", "core-foundation 0.9.4", "core-graphics", @@ -10737,11 +9082,11 @@ dependencies = [ "js-sys", "libc", "memmap2", - "ndk 0.9.0", + "ndk", "objc2 0.5.2", "objc2-app-kit 0.2.2", "objc2-foundation 0.2.2", - "objc2-ui-kit", + "objc2-ui-kit 0.2.2", "orbclient", "percent-encoding", "pin-project", @@ -10749,7 +9094,7 @@ dependencies = [ "redox_syscall 0.4.1", "rustix 0.38.44", "sctk-adwaita", - "smithay-client-toolkit", + "smithay-client-toolkit 0.19.2", "smol_str", "tracing", "unicode-segmentation", @@ -10760,7 +9105,7 @@ dependencies = [ "wayland-protocols", "wayland-protocols-plasma", "web-sys", - "web-time 1.1.0", + "web-time", "windows-sys 0.52.0", "x11-dl", "x11rb", @@ -10778,27 +9123,24 @@ dependencies = [ [[package]] name = "winnow" -version = "0.7.11" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" dependencies = [ "memchr", ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags 2.9.1", -] +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" [[package]] name = "x11-dl" @@ -10813,33 +9155,33 @@ dependencies = [ [[package]] name = "x11rb" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" +checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" dependencies = [ "as-raw-xcb-connection", "gethostname", "libc", - "libloading 0.8.8", + "libloading", "once_cell", - "rustix 0.38.44", + "rustix 1.1.2", "x11rb-protocol", ] [[package]] name = "x11rb-protocol" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" +checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" [[package]] name = "xattr" -version = "1.5.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af3a19837351dc82ba89f8a125e22a3c475f05aba604acc023d62b2739ae2909" +checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" dependencies = [ "libc", - "rustix 1.0.7", + "rustix 1.1.2", ] [[package]] @@ -10854,7 +9196,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.10.0", "dlib", "log", "once_cell", @@ -10869,9 +9211,9 @@ checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" [[package]] name = "xml-rs" -version = "0.8.26" +version = "0.8.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" +checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" [[package]] name = "xmlwriter" @@ -10891,6 +9233,12 @@ dependencies = [ "wasm-pack", ] +[[package]] +name = "xxhash-rust" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" + [[package]] name = "xz2" version = "0.1.7" @@ -10917,11 +9265,10 @@ checksum = "e01738255b5a16e78bbb83e7fbba0a1e7dd506905cfc53f4622d89015a03fbb5" [[package]] name = "yoke" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" dependencies = [ - "serde", "stable_deref_trait", "yoke-derive", "zerofrom", @@ -10929,23 +9276,23 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", "synstructure", ] [[package]] name = "zbus" -version = "5.8.0" +version = "5.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597f45e98bc7e6f0988276012797855613cd8269e23b5be62cc4e5d28b7e515d" +checksum = "b622b18155f7a93d1cd2dc8c01d2d6a44e08fb9ebb7b3f9e6ed101488bad6c91" dependencies = [ - "async-broadcast 0.7.2", + "async-broadcast", "async-executor", "async-io", "async-lock", @@ -10955,7 +9302,7 @@ dependencies = [ "async-trait", "blocking", "enumflags2", - "event-listener 5.4.0", + "event-listener", "futures-core", "futures-lite", "hex", @@ -10965,8 +9312,9 @@ dependencies = [ "serde_repr", "tracing", "uds_windows", - "windows-sys 0.59.0", - "winnow 0.7.11", + "uuid", + "windows-sys 0.61.2", + "winnow 0.7.13", "zbus_macros", "zbus_names", "zvariant", @@ -10990,7 +9338,7 @@ checksum = "dc6821851fa840b708b4cbbaf6241868cabc85a2dc22f426361b0292bfc0b836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", "zbus-lockstep", "zbus_xml", "zvariant", @@ -10998,14 +9346,14 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.8.0" +version = "5.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5c8e4e14dcdd9d97a98b189cd1220f30e8394ad271e8c987da84f73693862c2" +checksum = "1cdb94821ca8a87ca9c298b5d1cbd80e2a8b67115d99f6e4551ac49e42b6a314" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.104", + "syn", "zbus_names", "zvariant", "zvariant_utils", @@ -11019,7 +9367,7 @@ checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" dependencies = [ "serde", "static_assertions", - "winnow 0.7.11", + "winnow 0.7.13", "zvariant", ] @@ -11044,22 +9392,22 @@ checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" [[package]] name = "zerocopy" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -11079,15 +9427,15 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" dependencies = [ "zeroize_derive", ] @@ -11100,14 +9448,14 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] name = "zerotrie" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" dependencies = [ "displaydoc", "yoke", @@ -11116,9 +9464,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.2" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" dependencies = [ "yoke", "zerofrom", @@ -11127,13 +9475,13 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn", ] [[package]] @@ -11151,14 +9499,14 @@ dependencies = [ "deflate64", "displaydoc", "flate2", - "getrandom 0.3.3", + "getrandom 0.3.4", "hmac", "indexmap", "lzma-rs", "memchr", "pbkdf2", "sha1", - "thiserror 2.0.12", + "thiserror 2.0.17", "time", "xz2", "zeroize", @@ -11168,9 +9516,9 @@ dependencies = [ [[package]] name = "zopfli" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfc5ee405f504cd4984ecc6f14d02d55cfda60fa4b689434ef4102aae150cd7" +checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249" dependencies = [ "bumpalo", "crc32fast", @@ -11198,9 +9546,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.15+zstd.1.5.7" +version = "2.0.16+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" dependencies = [ "cc", "pkg-config", @@ -11212,61 +9560,51 @@ version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" -[[package]] -name = "zune-inflate" -version = "0.2.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" -dependencies = [ - "simd-adler32", -] - [[package]] name = "zune-jpeg" -version = "0.4.18" +version = "0.4.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7384255a918371b5af158218d131530f694de9ad3815ebdd0453a940485cb0fa" +checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" dependencies = [ "zune-core", ] [[package]] name = "zvariant" -version = "5.6.0" +version = "5.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91b3680bb339216abd84714172b5138a4edac677e641ef17e1d8cb1b3ca6e6f" +checksum = "2be61892e4f2b1772727be11630a62664a1826b62efa43a6fe7449521cb8744c" dependencies = [ "endi", "enumflags2", "serde", - "winnow 0.7.11", + "winnow 0.7.13", "zvariant_derive", "zvariant_utils", ] [[package]] name = "zvariant_derive" -version = "5.6.0" +version = "5.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a8c68501be459a8dbfffbe5d792acdd23b4959940fc87785fb013b32edbc208" +checksum = "da58575a1b2b20766513b1ec59d8e2e68db2745379f961f86650655e862d2006" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.104", + "syn", "zvariant_utils", ] [[package]] name = "zvariant_utils" -version = "3.2.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34" +checksum = "c6949d142f89f6916deca2232cf26a8afacf2b9fdc35ce766105e104478be599" dependencies = [ "proc-macro2", "quote", "serde", - "static_assertions", - "syn 2.0.104", - "winnow 0.7.11", + "syn", + "winnow 0.7.13", ] diff --git a/Cargo.toml b/Cargo.toml index 000eccab2f115ebea7ac9bacebb4a1053e95dc40..684df9ad5415c8019a6fabd1fd268cb897922367 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,49 +2,6 @@ resolver = "2" members = ["crates/*"] -[workspace.dependencies] -# members of the workspace -starkingdoms-common = { path = "crates/common" } -starkingdoms-proc = { path = "crates/proc" } -kabel = { path = "crates/kabel" } - -# Logging -tracing = "0.1" -tracing-subscriber = "0.3" - -# Bevy! -bevy_ecs = "0.16" - -# egui and friends - rendering stuff -egui = "0.31" -egui_glow = { version = "0.31", features = ["winit"] } -winit = "0.30" -glow = "0.16" -image = "0.25" -resvg = "0.45" -egui-winit = { version = "0.31", default-features = false, features = ["links", "wayland", "x11"] } - -# error handling -thiserror = "2" - -# dealing with wasm -web-time = "1" -futures = "0.3" - -# math -nalgebra = "0.33" - -# serde and friends -serde = { version = "1", features = ["derive"] } -serde_json = "1" - -# sync -crossbeam = "0.8" - -# misc -bytemuck = "1" - - [profile.dev] opt-level = 1 [profile.dev.package."*"] diff --git a/crates/client/Cargo.toml b/crates/client/Cargo.toml deleted file mode 100644 index bff7fe02b3f627f7857e4df118b866e37244a8de..0000000000000000000000000000000000000000 --- a/crates/client/Cargo.toml +++ /dev/null @@ -1,46 +0,0 @@ -[package] -name = "starkingdoms-client" -version = "0.1.0" -edition = "2021" - -[lib] -crate-type = ["cdylib", "rlib"] - -# Everywhere dependencies -[dependencies] -tracing = { workspace = true } -tracing-subscriber = { workspace = true } -bevy_ecs = { workspace = true } -egui = { workspace = true } -egui_glow = { workspace = true } -winit = { workspace = true } -glow = { workspace = true } -thiserror = { workspace = true } -image = { workspace = true } -egui-winit = { workspace = true } -web-time = { workspace = true } -futures = { workspace = true } -nalgebra = { workspace = true } -starkingdoms-common = { workspace = true } -serde = { workspace = true } -serde_json = { workspace = true } -crossbeam = { workspace = true } -resvg = { workspace = true } -bytemuck = { workspace = true } - -# WASM dependencies -[target.'cfg(target_arch = "wasm32")'.dependencies] -tracing-web = "0.1" # Log output -console_error_panic_hook = "0.1" # Give useful information in the panic response, other than the useless "entered unreachable code" -wasm-bindgen = "0.2" -web-sys = { version = "0.3", features = ["Window", "Location", "WebSocket", "MessageEvent", "HtmlCanvasElement"] } -wasm-bindgen-futures = "0.4" -ehttp = "0.5.0" -poll-promise = { version = "0.3.0", features = ["web"] } - -# Native dependencies -[target.'cfg(not(target_arch = "wasm32"))'.dependencies] -pollster = "0.4" -tungstenite = "0.26.1" -glutin-winit = "0.5.0" -glutin = "0.32.2" diff --git a/crates/client/index.html b/crates/client/index.html deleted file mode 100644 index 1aa8a2f17c5a4be882641fac26ecdf9eb03470ca..0000000000000000000000000000000000000000 --- a/crates/client/index.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - StarKingdoms.TK - - - - - - - - - - - diff --git a/crates/client/src/assets/shaders/fragment.glsl b/crates/client/src/assets/shaders/fragment.glsl deleted file mode 100644 index 24afa3e85185c5f980134aca513260c9ef3fd165..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/shaders/fragment.glsl +++ /dev/null @@ -1,14 +0,0 @@ -#version 300 es - -precision mediump float; - -in vec2 v_pos; -in vec2 v_texcoord; - -out vec4 FragColor; - -uniform sampler2D sprite; - -void main() { - FragColor = texture(sprite, v_texcoord); -} diff --git a/crates/client/src/assets/shaders/vertex.glsl b/crates/client/src/assets/shaders/vertex.glsl deleted file mode 100644 index be35d37600c9e3dc8feb00e605a91c11b369e9f2..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/shaders/vertex.glsl +++ /dev/null @@ -1,17 +0,0 @@ -#version 300 es - -precision mediump float; - -in vec2 pos; -in vec2 texcoord; - -out vec2 v_texcoord; - -uniform mat4 model; -uniform mat4 view; - -void main() { - v_texcoord = vec2(texcoord.x, -texcoord.y); - vec4 v_pos = view * model * vec4(pos, 0.0, 1.0); - gl_Position = vec4(v_pos.x, -v_pos.y, v_pos.zw); -} diff --git a/crates/client/src/assets/textures/autoplr_cfg.svg b/crates/client/src/assets/textures/autoplr_cfg.svg deleted file mode 100644 index 518e4a9339bea23a18aaed4ce3dc1dbdd77b5fe8..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/autoplr_cfg.svg +++ /dev/null @@ -1,252 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/autoplr_error.svg b/crates/client/src/assets/textures/autoplr_error.svg deleted file mode 100644 index 5727335d473aee2e7a8a0ba2cf4872643cb37d09..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/autoplr_error.svg +++ /dev/null @@ -1,252 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/autoplr_on.svg b/crates/client/src/assets/textures/autoplr_on.svg deleted file mode 100644 index fbf864759e689db1c19180fe270f7c9bf28e044e..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/autoplr_on.svg +++ /dev/null @@ -1,246 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/cargo_off.svg b/crates/client/src/assets/textures/cargo_off.svg deleted file mode 100644 index 3adeab83203ae8ee73024dfc963e94d1b797c683..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/cargo_off.svg +++ /dev/null @@ -1,351 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/cargo_on.svg b/crates/client/src/assets/textures/cargo_on.svg deleted file mode 100644 index c758d429db2338da096ebafc8a49961e79d67f0e..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/cargo_on.svg +++ /dev/null @@ -1,355 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/chassis.svg b/crates/client/src/assets/textures/chassis.svg deleted file mode 100644 index 12fdf6e95561dbd10beffe16d2441e0050122db4..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/chassis.svg +++ /dev/null @@ -1,385 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/earth.svg b/crates/client/src/assets/textures/earth.svg deleted file mode 100644 index 11dbbf41114f020348b2d42ccb1a96e9858b39db..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/earth.svg +++ /dev/null @@ -1,195 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/earth_icon.svg b/crates/client/src/assets/textures/earth_icon.svg deleted file mode 100644 index fb339e77989c7dcee5fcbf934648cab9aed0a5fe..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/earth_icon.svg +++ /dev/null @@ -1,200 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/ecothruster_on.svg b/crates/client/src/assets/textures/ecothruster_on.svg deleted file mode 100644 index ce865c15aff78d6ec8d1673d97c52e7c68e98314..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/ecothruster_on.svg +++ /dev/null @@ -1,268 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/editor_direction.svg b/crates/client/src/assets/textures/editor_direction.svg deleted file mode 100644 index 8ee9e39a48a6bcd20d06375c9e65bec250271684..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/editor_direction.svg +++ /dev/null @@ -1,470 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/f.png b/crates/client/src/assets/textures/f.png deleted file mode 100644 index 17b8705f65e0d9de741414d854f73ca606e5e8cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8848 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 O{wT?*-7UIf;{QKSZBwxT diff --git a/crates/client/src/assets/textures/happy-tree.png b/crates/client/src/assets/textures/happy-tree.png deleted file mode 100644 index 81a5289f4ee3c200fedcd446dc477f196d18afbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25451 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/hearty_ferris.svg b/crates/client/src/assets/textures/hearty_ferris.svg deleted file mode 100644 index 05af7631d6b5fca1cca27a81093ad506446fe979..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/hearty_ferris.svg +++ /dev/null @@ -1,311 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/hearty_party.svg b/crates/client/src/assets/textures/hearty_party.svg deleted file mode 100644 index 87dc174062870dd3c081b94f2decf77b0bae65e3..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/hearty_party.svg +++ /dev/null @@ -1,350 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/hub_off.svg b/crates/client/src/assets/textures/hub_off.svg deleted file mode 100644 index 20b4eb7b5f5ea6a9f9269e88080941be4161f9ef..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/hub_off.svg +++ /dev/null @@ -1,368 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/hub_on.svg b/crates/client/src/assets/textures/hub_on.svg deleted file mode 100644 index 77a2fc9fa8f12b1bff6cab9f85e2caa9cfd2ba97..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/hub_on.svg +++ /dev/null @@ -1,396 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/jupiter.svg b/crates/client/src/assets/textures/jupiter.svg deleted file mode 100644 index 2a7e116958951c3746f54071065194bddf9d1d34..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/jupiter.svg +++ /dev/null @@ -1,1600 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/landingleg.svg b/crates/client/src/assets/textures/landingleg.svg deleted file mode 100644 index 633703c822148e64eb2702d3aeb6753155e38348..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/landingleg.svg +++ /dev/null @@ -1,342 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/landingthruster_off.svg b/crates/client/src/assets/textures/landingthruster_off.svg deleted file mode 100644 index fa11af4109d1528ed4376cec906d0e3e8c711625..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/landingthruster_off.svg +++ /dev/null @@ -1,286 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/landingthruster_on.svg b/crates/client/src/assets/textures/landingthruster_on.svg deleted file mode 100644 index 64a3b3790078c0b2848d9c53fdf4ec8770ab169b..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/landingthruster_on.svg +++ /dev/null @@ -1,314 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/mars.svg b/crates/client/src/assets/textures/mars.svg deleted file mode 100644 index 50618d6ba40a28f3ffded9de25aac6161789baa2..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/mars.svg +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/mars_icon.svg b/crates/client/src/assets/textures/mars_icon.svg deleted file mode 100644 index 4d288eb2e4d53e7b2826b9418a670c4f0c19912e..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/mars_icon.svg +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/mercury_NEEDS_4_1_1.svg b/crates/client/src/assets/textures/mercury_NEEDS_4_1_1.svg deleted file mode 100644 index 1728a28a2162c861bbf22cb22966c5e63071d6c2..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/mercury_NEEDS_4_1_1.svg +++ /dev/null @@ -1,625 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/missing.svg b/crates/client/src/assets/textures/missing.svg deleted file mode 100644 index c2b51e914e9da248c23f83a99e73652cd0809e3c..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/missing.svg +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/moon.svg b/crates/client/src/assets/textures/moon.svg deleted file mode 100644 index 0944b5a1b7b87ba6f4d939d3bb973ea5500b9ac3..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/moon.svg +++ /dev/null @@ -1,144 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/moon_icon.svg b/crates/client/src/assets/textures/moon_icon.svg deleted file mode 100644 index 77f1a5a7de723a467bb7266434224add19766773..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/moon_icon.svg +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/powerhub_off.svg b/crates/client/src/assets/textures/powerhub_off.svg deleted file mode 100644 index cafda58f0f0892a216f898918b89ec7cce46d48c..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/powerhub_off.svg +++ /dev/null @@ -1,540 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/powerhub_on.svg b/crates/client/src/assets/textures/powerhub_on.svg deleted file mode 100644 index 7ed9e5bbff1c9699ee40d992f14f473706985bce..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/powerhub_on.svg +++ /dev/null @@ -1,587 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/starfield.svg b/crates/client/src/assets/textures/starfield.svg deleted file mode 100644 index 408597e3f85482c4ca6216db898e3eb447b8130d..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/starfield.svg +++ /dev/null @@ -1,395 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/starfield_dim.svg b/crates/client/src/assets/textures/starfield_dim.svg deleted file mode 100644 index 4a1155f42c1d0512bfb353a5aa63542de82cc493..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/starfield_dim.svg +++ /dev/null @@ -1,516 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/starfield_transp.svg b/crates/client/src/assets/textures/starfield_transp.svg deleted file mode 100644 index 1ebad5478766586785b0b74ef2bfca05234c4ca8..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/starfield_transp.svg +++ /dev/null @@ -1,389 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/sun.svg b/crates/client/src/assets/textures/sun.svg deleted file mode 100644 index 730172c343042372cabd3fcb3135a1531340daf4..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/sun.svg +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/sun_rings.svg b/crates/client/src/assets/textures/sun_rings.svg deleted file mode 100644 index 2c4a6611342808e350db7030c892154145f09074..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/sun_rings.svg +++ /dev/null @@ -1,264 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/superthruster_off.svg b/crates/client/src/assets/textures/superthruster_off.svg deleted file mode 100644 index f3f61a59a31c7862b00a76df95afe07ea8ce6e5c..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/superthruster_off.svg +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/superthruster_on.svg b/crates/client/src/assets/textures/superthruster_on.svg deleted file mode 100644 index dc71420ec2547b959943aa3d4aea3d5dad0f134c..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/superthruster_on.svg +++ /dev/null @@ -1,268 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/thruster_off.svg b/crates/client/src/assets/textures/thruster_off.svg deleted file mode 100644 index b7fba0f44e4e7af0bdbcbbbd98921638186acf38..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/thruster_off.svg +++ /dev/null @@ -1,240 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/thruster_on.svg b/crates/client/src/assets/textures/thruster_on.svg deleted file mode 100644 index aeb292daf86f337bccd84b4e9b18c6d8841b4bfe..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/thruster_on.svg +++ /dev/null @@ -1,268 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/trackindicator.svg b/crates/client/src/assets/textures/trackindicator.svg deleted file mode 100644 index 573bccdc053d409e619e3edad5c600d9f84ecf61..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/trackindicator.svg +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - diff --git a/crates/client/src/assets/textures/uv.png b/crates/client/src/assets/textures/uv.png deleted file mode 100644 index 5026c7a06a89f4c540be7e111986d1f0763c6fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 306519 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 jy6Ya(iP-7>yFE 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ʹ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 RD+us+N$tw{Pv=Y@{2$!|2igDt diff --git a/crates/client/src/assets/textures/venus.svg b/crates/client/src/assets/textures/venus.svg deleted file mode 100644 index 491408b66e6e6a1ff03cfbcb800684cbea8f9e6e..0000000000000000000000000000000000000000 --- a/crates/client/src/assets/textures/venus.svg +++ /dev/null @@ -1,321 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/crates/client/src/components.rs b/crates/client/src/components.rs deleted file mode 100644 index 10e6a56dddd1b099ace0a377da31bc9447decec0..0000000000000000000000000000000000000000 --- a/crates/client/src/components.rs +++ /dev/null @@ -1,139 +0,0 @@ -use bevy_ecs::schedule::ScheduleLabel; -use bevy_ecs::{bundle::Bundle, component::Component, event::Event, system::Resource}; -use nalgebra::{Matrix3, Matrix4, Rotation2, Scale2, Scale3, Translation2, Translation3}; -use starkingdoms_common::packet::Packet; - -#[derive(Bundle)] -pub struct PlayerBundle { - pub transform: Transform, - pub texture: Texture, - pub player: Player, - pub part: Part, -} - -#[derive(Bundle)] -pub struct PartBundle { - pub transform: Transform, - pub texture: Texture, - pub server_id: ServerId, - pub part: Part, -} - -#[derive(Bundle)] -pub struct OtherPlayerBundle { - pub part: PartBundle, - pub username: PlayerUsername, -} - -#[derive(Bundle)] -pub struct PlanetBundle { - pub transform: Transform, - pub texture: Texture, - pub server_id: ServerId, - pub planet: Planet, -} - -#[derive(ScheduleLabel, Hash, Clone, Debug, Eq, PartialEq)] -pub enum Schedule { - Startup, - Update, -} - -#[derive(Component, Debug)] -pub struct PlayerUsername { - pub username: String, -} - -#[derive(Component, Debug)] -pub struct Texture { - pub name: String, -} - -#[derive(Component, Debug)] -pub struct Transform { - pub translation: Translation3, - pub rotation: Rotation2, - pub scale: Scale3, -} -#[derive(Resource, Debug)] -pub struct PlayerResources { - pub fuel_amount: u32, - pub fuel_max: u32, -} - -impl Transform { - pub fn to_matrix(&self) -> Matrix4 { - self.translation.to_homogeneous() - * self.rotation.to_homogeneous().to_homogeneous() - * self.scale.to_homogeneous() - } -} - -#[derive(Bundle, Debug)] -pub struct SpriteBundle { - pub transform: Transform, - pub texture: Texture, -} - -#[derive(Resource, Debug)] -pub struct Camera { - pub x: f32, - pub y: f32, - pub zoom: f32, - pub width: u32, // screen width (these are for aspect ratio) - pub height: u32, // screen height -} -impl Camera { - pub fn to_matrix(&self) -> Matrix4 { - let x_scale = self.zoom / self.width as f32 * 2.0; - let y_scale = self.zoom / self.height as f32 * 2.0; - Matrix4::from_vec(vec![ - x_scale, - 0.0, - 0.0, - 0.0, - 0.0, - y_scale, - 0.0, - 0.0, - 0.0, - 0.0, - 1.0, - 0.0, - self.x * x_scale, - self.y * y_scale, - 0.0, - 1.0, - ]) - } - pub fn to_cursor_matrix(&self) -> Matrix3 { - let x = -(self.width as f32 / 2.0); - let y = -(self.height as f32 / 2.0); - Translation2::new(-self.x, -self.y).to_homogeneous() - * Scale2::new(1.0 / self.zoom, 1.0 / self.zoom).to_homogeneous() - * Translation2::new(x, y).to_homogeneous() - } -} - -#[derive(Component, Debug, Clone, Copy)] -pub struct Player; -#[derive(Component, Debug, Clone, Copy)] -pub struct Planet; -#[derive(Component, Debug, Clone, Copy)] -pub struct Part(pub bool); // Part(attached) -#[derive(Component, Debug, Clone, Copy)] -pub struct ServerId(pub u32); - -#[derive(Component, Debug, Clone, Copy)] -pub struct Menu; - -#[derive(Event, Clone, PartialEq)] -pub struct SendPacket(pub Packet); -#[derive(Event, Clone, PartialEq)] -pub struct RecvPacket(pub Packet); - -#[derive(Resource, Clone)] -pub struct Chat { - pub messages: Vec, - pub textbox: String, -} diff --git a/crates/client/src/lib.rs b/crates/client/src/lib.rs deleted file mode 100644 index e628a1a2b33a7fe1d894c6e6d77edd713b6b969d..0000000000000000000000000000000000000000 --- a/crates/client/src/lib.rs +++ /dev/null @@ -1,105 +0,0 @@ -use crate::components::PlayerResources; -use crate::components::Schedule::{Startup, Update}; -use crate::networking::handlers::{ - handle_crafting_ui, handle_despawn_part, handle_energy_update, handle_existing_players_list, - handle_login_response, handle_message, handle_part_positions, handle_player_leave, - handle_spawn_part, handle_spawn_player, -}; -use crate::networking::websocket::Websocket; -use crate::systems::create_hearty; -use bevy_ecs::schedule::Schedule; -use bevy_ecs::{event::Events, world::World}; -use components::{Camera, Chat, RecvPacket, SendPacket}; -use networking::handlers::{handle_planet_positions, handle_spawn_planet}; -use platform::assets::Assets; -use platform::websocket::Ws; -use rendering::assets::AssetLoader; -use rendering::App; -use tracing::info; -use winit::event_loop::{ControlFlow, EventLoop}; - -#[cfg(target_arch = "wasm32")] -#[path = "wasm/mod.rs"] -pub mod platform; -#[cfg(not(target_arch = "wasm32"))] -#[path = "native/mod.rs"] -pub mod platform; - -pub mod components; -pub mod networking; -pub mod rendering; -pub mod systems; -pub mod ui; - -// Hi, you've found the real main function! This is called AFTER platform-specific initialization code. -pub fn start() { - info!( - "Hello, world! StarKingdoms.TK v{} says hello, running on {}", - env!("CARGO_PKG_VERSION"), - if cfg!(target_arch = "wasm32") { - "wasm" - } else { - "native" - } - ); - - info!("Creating the ECS world..."); - let mut world = World::new(); - - world.insert_resource(Camera { - x: 0.0, - y: 0.0, - zoom: 1.0, - width: 0, - height: 0, - }); - - world.insert_resource(Assets::new()); - world.insert_resource(Ws::new()); - world.insert_resource(PlayerResources { - fuel_amount: 0, - fuel_max: 0, - }); - world.insert_resource(Chat { - messages: vec![], - textbox: String::new(), - }); - - let send_packet_events = Events::::default(); - let recv_packet_events = Events::::default(); - - starkingdoms_common::packet::register_packet_events(&mut world); - - let mut startup_schedule = Schedule::new(Startup); - - startup_schedule.add_systems(create_hearty); - - let mut update_schedule = Schedule::new(Update); - - update_schedule.add_systems(handle_existing_players_list); - update_schedule.add_systems(handle_spawn_player); - update_schedule.add_systems(handle_spawn_part); - update_schedule.add_systems(handle_part_positions); - update_schedule.add_systems(handle_spawn_planet); - update_schedule.add_systems(handle_planet_positions); - update_schedule.add_systems(handle_energy_update); - update_schedule.add_systems(handle_crafting_ui); - update_schedule.add_systems(handle_message); - update_schedule.add_systems(handle_player_leave); - update_schedule.add_systems(handle_despawn_part); - update_schedule.add_systems(handle_login_response); - - // add systems here - - world.add_schedule(startup_schedule); - world.add_schedule(update_schedule); - - world.run_schedule(Startup); - - let event_loop = EventLoop::new().unwrap(); - event_loop.set_control_flow(ControlFlow::Wait); - - event_loop - .run_app(&mut App::new(world, send_packet_events, recv_packet_events)) - .unwrap(); -} diff --git a/crates/client/src/main.rs b/crates/client/src/main.rs deleted file mode 100644 index 570e0893bf673c407c70a5e21c49baed28bd2d6b..0000000000000000000000000000000000000000 --- a/crates/client/src/main.rs +++ /dev/null @@ -1,5 +0,0 @@ -/// --- IMPORTANT: DO NOT EDIT - EDIT THE APPROPRIATE PLATFORM SPECIFIC ENTRYPOINT --- -/// `platform::start` IS WHAT YOU WANT -fn main() { - starkingdoms_client::platform::entrypoint(); -} diff --git a/crates/client/src/native/assets.rs b/crates/client/src/native/assets.rs deleted file mode 100644 index 2246203c6131945030557a7c9003e5a90ad78fff..0000000000000000000000000000000000000000 --- a/crates/client/src/native/assets.rs +++ /dev/null @@ -1,68 +0,0 @@ -use std::io::Read; - -use bevy_ecs::system::Resource; -use resvg::{tiny_skia, usvg}; - -#[derive(Debug, Clone)] -pub struct ImgData { - pub bytes: Vec, - pub width: u32, - pub height: u32, -} - -#[derive(Resource)] -pub struct Assets {} -impl Default for Assets { - fn default() -> Self { - Self::new() - } -} - -impl Assets { - pub fn new() -> Self { - Assets {} - } - pub fn get(&self, local_path: impl Into) -> Option { - let local_path = local_path.into(); - let bytes = std::fs::read(format!("src/assets/vector_textures/{}", local_path)).unwrap(); - if local_path.ends_with(".svg") { - let opt = usvg::Options { - default_size: usvg::Size::from_wh(20.0, 20.0).unwrap(), - ..Default::default() - }; - let tree = usvg::Tree::from_data(&bytes, &opt) - .unwrap_or_else(|_| panic!("Couldn't parse svg {}", local_path)); - let tree_size = tree.size().to_int_size(); - let size = usvg::Size::from_wh(200.0, 200.0).unwrap().to_int_size(); - assert!(size.width() > 0 && size.height() > 0); - let mut pixmap = tiny_skia::Pixmap::new(size.width(), size.height()) - .expect("Failed to construct pixmap"); - resvg::render( - &tree, - tiny_skia::Transform::from_scale( - (size.width() as f32) / (tree_size.height() as f32), - (size.height() as f32) / (tree_size.height() as f32), - ), - &mut pixmap.as_mut(), - ); - let data = ImgData { - bytes: pixmap.data().to_vec(), - width: size.width(), - height: size.height(), - }; - - Some(data) - } else if local_path.ends_with(".png") { - let img = image::load_from_memory(&bytes).unwrap(); - let rgba = img.to_rgba8(); - let data = ImgData { - bytes: rgba.bytes().map(|byte| byte.unwrap()).collect::>(), - width: rgba.width(), - height: rgba.height(), - }; - Some(data) - } else { - panic!("Unsupported sprite type"); - } - } -} diff --git a/crates/client/src/native/mod.rs b/crates/client/src/native/mod.rs deleted file mode 100644 index 5773cf27ca8883a2505fff42f7d4c37f1b045077..0000000000000000000000000000000000000000 --- a/crates/client/src/native/mod.rs +++ /dev/null @@ -1,14 +0,0 @@ -pub mod assets; -pub mod websocket; - -/// --- IMPORTANT: THIS IS A DUAL TARGET CRATE --- -/// THIS WILL ONLY EXECUTE ON NATIVE -/// DO ONLY PLATFORM SPECIFIC INITIALIZATION HERE -/// FOR ACTUAL PROGRAM LOGIC, EDIT `crate::start` -/// DO NOT RENAME -pub fn entrypoint() { - tracing_subscriber::fmt::init(); - - // All done with platform-specific initialization, call back into the common code path - crate::start(); -} diff --git a/crates/client/src/native/websocket.rs b/crates/client/src/native/websocket.rs deleted file mode 100644 index cc9f82fe9a5e8ed88a396177af56f5a096e0a867..0000000000000000000000000000000000000000 --- a/crates/client/src/native/websocket.rs +++ /dev/null @@ -1,76 +0,0 @@ -use std::{ - net::TcpStream, - sync::{Arc, Mutex}, -}; - -use crate::networking::websocket::{PacketMessageConvert, Websocket}; -use bevy_ecs::system::Resource; -use crossbeam::channel::{unbounded, Receiver, Sender}; -use starkingdoms_common::packet::{MsgFromError, Packet, SpecialDisconnectPacket}; -use tungstenite::{connect, stream::MaybeTlsStream, Message, WebSocket}; - -impl PacketMessageConvert for Packet { - type M = Message; - - fn from_message(value: &Message) -> Result { - match value { - Message::Text(s) => serde_json::from_str(s).map_err(MsgFromError::JSONError), - Message::Binary(b) => serde_json::from_slice(b).map_err(MsgFromError::JSONError), - Message::Close(_) => Ok(Packet::_SpecialDisconnect(SpecialDisconnectPacket {})), - Message::Frame(_) | Message::Pong(_) | Message::Ping(_) => { - Err(MsgFromError::InvalidMessageType) - } - } - } - fn as_message(&self) -> Message { - Message::Text( - serde_json::to_string(self) - .expect("failed to serialize packet to json") - .into(), - ) - } -} - -#[derive(Resource, Debug)] -pub struct Ws { - socket: Arc>>>, - pub sender: Sender, - pub receiver: Receiver, - packet_receiver: Receiver, -} -impl Websocket for Ws { - fn new() -> Self { - let (socket, _) = connect("ws://localhost:3000").expect("Failed to connect to server"); - let socket = Arc::new(Mutex::new(socket)); - let (packet_sender, receiver) = unbounded(); - let (sender, packet_receiver) = unbounded(); - let socket_clone = socket.clone(); - std::thread::spawn(move || { - let socket = socket_clone; - loop { - let message = socket - .lock() - .unwrap() - .read() - .expect("Failed to reading message"); - let packet = Packet::from_message(&message).expect("Server sent invalid packet"); - packet_sender - .send(packet) - .expect("Couldn't send packet to server"); - } - }); - Ws { - socket, - sender, - receiver, - packet_receiver, - } - } - fn send_packet(&mut self, packet: Packet) { - self.socket - .lock() - .unwrap() - .send(packet.as_message()) - .expect("Couldn't send packet to server"); - } -} diff --git a/crates/client/src/networking/handlers.rs b/crates/client/src/networking/handlers.rs deleted file mode 100644 index 6e5eaaee9bca57ac16fdfb7808c572bf6f451c2b..0000000000000000000000000000000000000000 --- a/crates/client/src/networking/handlers.rs +++ /dev/null @@ -1,215 +0,0 @@ -use crate::components::{ - Camera, Chat, Menu, OtherPlayerBundle, Part, PartBundle, Planet, PlanetBundle, Player, PlayerResources, PlayerUsername, ServerId, Texture, Transform -}; -use bevy_ecs::prelude::*; -use nalgebra::{Rotation2, Scale3, Translation3}; -use starkingdoms_common::packet::{ - DespawnPartPacket, EnergyUpdatePacket, LoginResponsePacket, MessagePacket, OpenCraftingUiPacket, PartPositionsPacket, PlanetPositionsPacket, PlayerLeavePacket, PlayerListPacket, SpawnPartPacket, SpawnPlanetPacket, SpawnPlayerPacket -}; -use starkingdoms_common::PartType; - -use super::{part_texture_name, planet_texture_name}; - -pub fn handle_login_response( - mut reader: EventReader, - player: Query>, - mut commands: Commands, -) { - for packet in reader.read() { - let player = player.single(); - commands.entity(player).insert(ServerId(packet.id)); - } -} - -pub fn handle_message(mut reader: EventReader, mut chat: ResMut) { - for message in reader.read() { - chat.messages - .push(format!("{}: {}", message.actor, message.content)); - } -} - -pub fn handle_existing_players_list( - mut reader: EventReader, - mut commands: Commands, -) { - for packet in reader.read() { - for (server_id, username) in &packet.players { - commands.spawn(OtherPlayerBundle { - part: PartBundle { - transform: Transform { - translation: Translation3::new(0.0, 0.0, 0.0), - rotation: Rotation2::new(0.0), - scale: Scale3::new(25.0, 25.0, 1.0), - }, - texture: Texture { - name: "hearty.svg".to_string(), - }, - server_id: ServerId(*server_id), - part: Part(false), - }, - username: PlayerUsername { - username: username.clone(), - }, - }); - } - } -} - -pub fn handle_spawn_player(mut reader: EventReader, mut commands: Commands) { - for SpawnPlayerPacket { - id: server_id, - username, - } in reader.read() - { - commands.spawn(OtherPlayerBundle { - part: PartBundle { - transform: Transform { - translation: Translation3::new(0.0, 0.0, 0.0), - rotation: Rotation2::new(0.0), - scale: Scale3::new(25.0, 25.0, 1.0), - }, - texture: Texture { - name: "hearty.svg".to_string(), - }, - server_id: ServerId(*server_id), - part: Part(false), - }, - username: PlayerUsername { - username: username.clone(), - }, - }); - } -} - -pub fn handle_spawn_part(mut reader: EventReader, mut commands: Commands) { - for SpawnPartPacket { - id: server_id, - part, - } in reader.read() - { - commands.spawn(PartBundle { - transform: Transform { - translation: Translation3::new(part.transform.x, part.transform.y, 0.0), - rotation: Rotation2::new(part.transform.rot), - scale: Scale3::new(25.0, 25.0, 1.0), - }, - texture: Texture { - name: part_texture_name(part.part_type, part.flags.attached), - }, - server_id: ServerId(*server_id), - part: Part(part.flags.attached), - }); - } -} - -pub fn handle_part_positions( - mut reader: EventReader, - mut parts_query: Query<(Entity, &ServerId, &mut Transform, &mut Texture, &mut Part)>, - player: Query<&ServerId, With>, - mut camera: ResMut, -) { - for PartPositionsPacket { parts } in reader.read() { - for (this_id, part) in parts { - for (_, server_id, mut transform, mut texture, mut bevy_part) in &mut parts_query { - if *this_id == server_id.0 { - transform.translation.x = part.transform.x; - transform.translation.y = part.transform.y; - transform.rotation = Rotation2::new(part.transform.rot); - - if part.flags.attached && !bevy_part.0 { - texture.name = part_texture_name(part.part_type, part.flags.attached); - bevy_part.0 = true; - } else if !part.flags.attached && bevy_part.0 { - texture.name = part_texture_name(part.part_type, part.flags.attached); - bevy_part.0 = false; - } - } - - if part.part_type == PartType::Hearty { - let player_id = player.single(); - if player_id.0 == server_id.0 { - camera.x = -part.transform.x; - camera.y = -part.transform.y; - } - } - } - } - } -} - -pub fn handle_spawn_planet( - mut reader: EventReader, - mut commands: Commands, -) { - for SpawnPlanetPacket { id, planet, radius } in reader.read() { - commands.spawn(PlanetBundle { - transform: Transform { - translation: Translation3::new(planet.transform.x, planet.transform.y, 0.0), - rotation: Rotation2::new(0.0), - scale: Scale3::new(*radius, *radius, 1.0), - }, - texture: Texture { name: planet_texture_name(planet.planet_type) }, - server_id: ServerId(*id), - planet: Planet, - }); - } -} -pub fn handle_planet_positions( - mut reader: EventReader -) { - for PlanetPositionsPacket { planets } in reader.read() { - // TODO: do something - } -} - -pub fn handle_energy_update( - mut reader: EventReader, - mut player_res: ResMut, -) { - for EnergyUpdatePacket { amount, max } in reader.read() { - player_res.fuel_amount = *amount; - player_res.fuel_max = *max; - } -} - -pub fn handle_crafting_ui( - mut reader: EventReader, - entities: Query<(Entity, &ServerId)>, - mut commands: Commands, -) { - for OpenCraftingUiPacket { id } in reader.read() { - for (entity, server_id) in &entities { - if server_id.0 == *id { - commands.entity(entity).insert(Menu); - } - } - } -} - -pub fn handle_player_leave( - mut reader: EventReader, - mut part_query: Query<(Entity, &ServerId), With>, - mut commands: Commands, -) { - for PlayerLeavePacket { id } in reader.read() { - for (entity, server_id) in &mut part_query { - if server_id.0 == *id { - commands.entity(entity).despawn(); - } - } - } -} - -pub fn handle_despawn_part( - mut reader: EventReader, - mut part_query: Query<(Entity, &ServerId), With>, - mut commands: Commands, -) { - for DespawnPartPacket { id } in reader.read() { - for (entity, server_id) in &mut part_query { - if server_id.0 == *id { - commands.entity(entity).despawn(); - } - } - } -} diff --git a/crates/client/src/networking/mod.rs b/crates/client/src/networking/mod.rs deleted file mode 100644 index 88b63565aef80391038fc9a5e08103d719b346e4..0000000000000000000000000000000000000000 --- a/crates/client/src/networking/mod.rs +++ /dev/null @@ -1,95 +0,0 @@ -use bevy_ecs::prelude::Event; -use bevy_ecs::{event::Events, world::World}; -use starkingdoms_common::packet::Packet; -use starkingdoms_common::packet::Packet::{ - DespawnPart, EnergyUpdate, LoginResponse, Message, OpenCraftingUi, PartPositions, - PlanetPositions, PlayerLeave, PlayerList, SpawnPart, SpawnPlayer, -}; -use starkingdoms_common::{PartType, PlanetType}; - -pub mod handlers; -pub mod websocket; - -fn part_texture_name(part_type: PartType, attached: bool) -> String { - use PartType::*; - if attached { - match part_type { - Placeholder => panic!("AHHHH PLACEHOLDER PANIC"), - Hearty => "hearty.svg", - Chassis => "chassis.svg", - Hub => "hub_on.svg", - LandingThruster => "landingthruster_on.svg", - LandingThrusterSuspension => "landingleg.svg", - } - .to_string() - } else { - match part_type { - Placeholder => panic!("AHHHH PLACEHOLDER PANIC"), - Hearty => "hearty.svg", - Chassis => "chassis.svg", - Hub => "hub_off.svg", - LandingThruster => "landingthruster_off.svg", - LandingThrusterSuspension => "landingleg.svg", - } - .to_string() - } -} - -fn planet_texture_name(planet_type: PlanetType) -> String { - match planet_type { - /*PlanetType::Sun => "sun.svg", - PlanetType::Mercury => "mercury.svg", - PlanetType::Venus => "venus.svg", - PlanetType::Earth => "earth.svg", - PlanetType::Moon => "moon.svg", - PlanetType::Mars => "mars.svg", - PlanetType::Jupiter => "jupiter.svg", - PlanetType::Saturn => "saturn.svg", - PlanetType::Uranus => "uranus.svg", - PlanetType::Neptune => "neptune.svg", - PlanetType::Pluto => "pluto.svg",*/ - PlanetType::Sun => "sun.svg", - PlanetType::Mercury => "moon.svg", - PlanetType::Venus => "venus.svg", - PlanetType::Earth => "earth.svg", - PlanetType::Moon => "moon.svg", - PlanetType::Mars => "mars.svg", - PlanetType::Jupiter => "jupiter.svg", - PlanetType::Saturn => "sun.svg", - PlanetType::Uranus => "venus.svg", - PlanetType::Neptune => "mars.svg", - PlanetType::Pluto => "earth.svg", - } - .to_string() -} - -pub fn send_event(e: T, world: &mut World) { - let mut events = world.resource_mut::>(); - events.send(e); -} - -pub fn send_packet_event(packet: Packet, world: &mut World) { - match packet { - Packet::ClientLogin(e) => send_event(e, world), - Packet::SendMessage(e) => send_event(e, world), - Packet::PlayerInput(e) => send_event(e, world), - Packet::PlayerMouseInput(e) => send_event(e, world), - Packet::RequestSave(e) => send_event(e, world), - Packet::RequestMining(e) => send_event(e, world), - Packet::_SpecialDisconnect(e) => send_event(e, world), - LoginResponse(e) => send_event(e, world), - SpawnPlayer(e) => send_event(e, world), - PlayerList(e) => send_event(e, world), - PlanetPositions(e) => send_event(e, world), - Packet::SpawnPlanet(e) => send_event(e, world), - PartPositions(e) => send_event(e, world), - SpawnPart(e) => send_event(e, world), - DespawnPart(e) => send_event(e, world), - PlayerLeave(e) => send_event(e, world), - Message(e) => send_event(e, world), - Packet::SaveEligibility(e) => send_event(e, world), - Packet::SaveData(e) => send_event(e, world), - EnergyUpdate(e) => send_event(e, world), - OpenCraftingUi(e) => send_event(e, world), - } -} diff --git a/crates/client/src/networking/websocket.rs b/crates/client/src/networking/websocket.rs deleted file mode 100644 index fc030cf73bbc74e1fb115194dd1ecd786b068f39..0000000000000000000000000000000000000000 --- a/crates/client/src/networking/websocket.rs +++ /dev/null @@ -1,13 +0,0 @@ -use starkingdoms_common::packet::{MsgFromError, Packet}; - -pub trait Websocket { - fn new() -> Self; - fn send_packet(&mut self, packet: Packet); -} - -pub trait PacketMessageConvert { - type M; - - fn from_message(value: &Self::M) -> Result; - fn as_message(&self) -> Self::M; -} diff --git a/crates/client/src/rendering/assets.rs b/crates/client/src/rendering/assets.rs deleted file mode 100644 index b4380dbc5d066a873546933e33e65ea06450e9b0..0000000000000000000000000000000000000000 --- a/crates/client/src/rendering/assets.rs +++ /dev/null @@ -1,28 +0,0 @@ -use std::fmt::Display; - -#[derive(Debug, Clone)] -pub enum AssetError { - AssetNotFound, - ResponseNotOk(u16), -} -impl Display for AssetError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - AssetError::AssetNotFound => write!(f, "Asset not found"), - AssetError::ResponseNotOk(code) => write!(f, "Server response was not ok {}", code), - } - } -} -impl std::error::Error for AssetError {} - -#[derive(Debug, Clone)] -pub struct ImgData { - pub bytes: Vec, - pub width: u32, - pub height: u32, -} - -pub trait AssetLoader { - fn new() -> Self; - fn get(&self, local_path: impl Into) -> Option; -} diff --git a/crates/client/src/rendering/mod.rs b/crates/client/src/rendering/mod.rs deleted file mode 100644 index 25a165dda163a7f43455ee36223a4e88e9f1c52f..0000000000000000000000000000000000000000 --- a/crates/client/src/rendering/mod.rs +++ /dev/null @@ -1,459 +0,0 @@ -use std::mem::swap; -use std::num::NonZeroU32; -use std::sync::Arc; - -use bevy_ecs::entity::Entity; -use bevy_ecs::event::Events; -use bevy_ecs::query::With; -use bevy_ecs::world::World; -use glow::HasContext; -#[cfg(not(target_arch = "wasm32"))] -use glutin::surface::{GlSurface, Surface, SwapInterval, WindowSurface}; -#[cfg(not(target_arch = "wasm32"))] -use glutin::{ - config::{ConfigTemplateBuilder, GlConfig}, - context::{ContextApi, ContextAttributesBuilder, PossiblyCurrentContext}, - display::GetGlDisplay, - prelude::{GlDisplay, NotCurrentGlContext}, -}; -#[cfg(not(target_arch = "wasm32"))] -use glutin_winit::{DisplayBuilder, GlWindow}; -use nalgebra::Vector3; -use starkingdoms_common::packet::{ButtonType, Packet, PlayerInputPacket, PlayerMouseInputPacket}; -#[cfg(target_arch = "wasm32")] -use wasm_bindgen::{prelude::Closure, JsCast}; -#[cfg(target_arch = "wasm32")] -use web_sys::{Event, HtmlCanvasElement}; -use winit::event::{ElementState, MouseButton, MouseScrollDelta}; -use winit::event_loop::ControlFlow; -use winit::keyboard::{KeyCode, PhysicalKey}; -#[cfg(target_arch = "wasm32")] -use winit::platform::web::{WindowAttributesExtWebSys, WindowExtWebSys}; -use winit::{ - application::ApplicationHandler, dpi::LogicalSize, event::WindowEvent, - event_loop::ActiveEventLoop, raw_window_handle::HasWindowHandle, window::Window, -}; - -use crate::components::Schedule::Update; -use crate::components::{Camera, Menu, RecvPacket, SendPacket}; -use crate::networking::send_packet_event; -use crate::networking::websocket::Websocket; -use crate::platform::websocket::Ws; -use crate::rendering::renderer::{RenderCreateContext, Renderer}; -use crate::rendering::MaybeRenderer::{Initialized, Initializing}; -use assets::AssetLoader; - -pub mod assets; -mod renderer; - -enum MaybeRenderer { - Uninitialized(RenderCreateContext), - Initializing, - Initialized(Renderer), -} - -pub struct App { - window: Option, - world: World, - renderer: MaybeRenderer, - - #[cfg(not(target_arch = "wasm32"))] - gl_surface: Option>, - #[cfg(not(target_arch = "wasm32"))] - gl_context: Option, - gl: Option>, -} - -impl App { - pub fn new( - world: World, - send_packet_events: Events, - recv_packet_events: Events, - ) -> Self { - Self { - window: None, - world, - renderer: MaybeRenderer::Uninitialized(RenderCreateContext { - send_packet_events, - recv_packet_events, - planet_types: Default::default(), - }), - #[cfg(not(target_arch = "wasm32"))] - gl_context: None, - #[cfg(not(target_arch = "wasm32"))] - gl_surface: None, - gl: None, - } - } -} - -impl ApplicationHandler for App { - fn resumed(&mut self, event_loop: &ActiveEventLoop) { - #[cfg(target_arch = "wasm32")] - let attributes = { - let document = web_sys::window().unwrap().document().unwrap(); - let canvas = document.get_element_by_id("canvas").unwrap(); - let canvas = canvas - .dyn_into::() - .map_err(|_| ()) - .unwrap(); - canvas.set_width( - web_sys::window() - .unwrap() - .inner_width() - .unwrap() - .as_f64() - .unwrap() as u32, - ); - canvas.set_height( - web_sys::window() - .unwrap() - .inner_height() - .unwrap() - .as_f64() - .unwrap() as u32, - ); - Window::default_attributes() - .with_title("StarKingdoms.TK") - .with_canvas(Some(canvas)) - }; - #[cfg(not(target_arch = "wasm32"))] - let attributes = { - Window::default_attributes() - .with_transparent(true) - .with_title("StarKingdoms.TK") - .with_inner_size(LogicalSize::new(400, 300)) - }; - self.window = Some(event_loop.create_window(attributes.clone()).unwrap()); - let window = self.window.as_ref().unwrap(); - #[cfg(target_arch = "wasm32")] - let context = window - .canvas() - .unwrap() - .get_context("webgl2") - .unwrap() - .unwrap() - .dyn_into::() - .unwrap(); - #[cfg(target_arch = "wasm32")] - let (gl, shader_version) = ( - Arc::new(glow::Context::from_webgl2_context(context)), - "#version 300 es", - ); - - #[cfg(not(target_arch = "wasm32"))] - let (gl, shader_version) = unsafe { - let template = ConfigTemplateBuilder::new().with_transparency(true); - - let display_builder = DisplayBuilder::new().with_window_attributes(Some(attributes)); - - let (window, gl_config) = display_builder - .build(event_loop, template, |configs| { - configs - .reduce(|accum, config| { - let supports_transparency = - config.supports_transparency().unwrap_or(false) - && !accum.supports_transparency().unwrap_or(false); - if supports_transparency || config.num_samples() > accum.num_samples() { - config - } else { - accum - } - }) - .unwrap() - }) - .unwrap(); - let raw_handle = window.as_ref().map(|window| { - window - .window_handle() - .unwrap() - .window_handle() - .unwrap() - .as_raw() - }); - let gl_display = gl_config.display(); - let context_attributes = ContextAttributesBuilder::new() - .with_context_api(ContextApi::OpenGl(Some(glutin::context::Version { - major: 3, - minor: 0, - }))) - .build(raw_handle); - - let not_current_gl_context = gl_display - .create_context(&gl_config, &context_attributes) - .unwrap(); - - let window = window.unwrap(); - let surface_attributes = window.build_surface_attributes(Default::default()).unwrap(); - let gl_surface = gl_display - .create_window_surface(&gl_config, &surface_attributes) - .unwrap(); - - let gl_context = not_current_gl_context.make_current(&gl_surface).unwrap(); - - let gl = glow::Context::from_loader_function_cstr(|s| gl_display.get_proc_address(s)); - - gl_surface - .set_swap_interval(&gl_context, SwapInterval::Wait(NonZeroU32::new(1).unwrap())) - .unwrap(); - - self.gl_surface = Some(gl_surface); - self.gl_context = Some(gl_context); - - (Arc::new(gl), "#version 300 es") - }; - - #[cfg(target_arch = "wasm32")] - web_sys::window().unwrap().set_onresize(Some( - Closure::::new(move |_| { - let document = web_sys::window().unwrap().document().unwrap(); - let canvas = document.get_element_by_id("canvas").unwrap(); - let canvas = canvas - .dyn_into::() - .map_err(|_| ()) - .unwrap(); - canvas.set_width( - web_sys::window() - .unwrap() - .inner_width() - .unwrap() - .as_f64() - .unwrap() as u32, - ); - canvas.set_height( - web_sys::window() - .unwrap() - .inner_height() - .unwrap() - .as_f64() - .unwrap() as u32, - ); - }) - .into_js_value() - .as_ref() - .unchecked_ref(), - )); - - let mut rcc = Initializing; - swap(&mut self.renderer, &mut rcc); - let MaybeRenderer::Uninitialized(rcc) = rcc else { - unreachable!() - }; - - let renderer = unsafe { Renderer::new(gl.clone(), event_loop, rcc) }; - - self.renderer = Initialized(renderer); - - self.gl = Some(gl); - } - fn window_event( - &mut self, - event_loop: &ActiveEventLoop, - _window_id: winit::window::WindowId, - event: winit::event::WindowEvent, - ) { - let Initialized(renderer) = &mut self.renderer else { - return; - }; - let Some(window) = &self.window else { return }; - - if renderer.egui_glow.on_window_event(window, &event).consumed { - return; // egui ate it - } - - match event { - WindowEvent::CloseRequested => { - event_loop.exit(); - } - WindowEvent::Resized(size) => { - #[cfg(not(target_arch = "wasm32"))] - self.gl_surface.as_ref().unwrap().resize( - self.gl_context.as_ref().unwrap(), - NonZeroU32::new(size.width).unwrap(), - NonZeroU32::new(size.height).unwrap(), - ); - - let mut camera = self.world.get_resource_mut::().unwrap(); - camera.width = size.width; - camera.height = size.height; - - unsafe { - self.gl - .as_ref() - .unwrap() - .viewport(0, 0, size.width as i32, size.height as i32); - } - } - WindowEvent::MouseWheel { delta, .. } => { - let mut camera = self.world.get_resource_mut::().unwrap(); - let raw_delta = match delta { - MouseScrollDelta::PixelDelta(pos) => pos.y as f32, - MouseScrollDelta::LineDelta(y, ..) => y, - }; - let delta = 1.1; - if raw_delta < 0.0 { - camera.zoom = (camera.zoom * 1.0 / delta).max(0.13); - } else { - camera.zoom = (camera.zoom * delta).min(5.0); - } - } - WindowEvent::KeyboardInput { ref event, .. } => { - match event.physical_key { - PhysicalKey::Code(key) => { - let matched: bool; - match event.state { - ElementState::Pressed => match key { - KeyCode::KeyW => { - renderer.up = true; - matched = true; - } - KeyCode::KeyS => { - renderer.down = true; - matched = true; - } - KeyCode::KeyA => { - renderer.left = true; - matched = true; - } - KeyCode::KeyD => { - renderer.right = true; - matched = true; - } - _ => matched = false, - }, - ElementState::Released => match key { - KeyCode::KeyW => { - renderer.up = false; - matched = true; - } - KeyCode::KeyS => { - renderer.down = false; - matched = true; - } - KeyCode::KeyA => { - renderer.left = false; - matched = true; - } - KeyCode::KeyD => { - renderer.right = false; - matched = true; - } - _ => matched = false, - }, - } - if matched { - renderer - .send_packet_events - .send(SendPacket(Packet::PlayerInput(PlayerInputPacket { - up: renderer.up, - down: renderer.down, - left: renderer.left, - right: renderer.right, - }))); - } - } - PhysicalKey::Unidentified(_) => {} // unsupported - } - } - WindowEvent::CursorMoved { position, .. } => renderer.mouse_pos = position, - WindowEvent::MouseInput { state, button, .. } => { - let button = match button { - MouseButton::Left => ButtonType::Left, - MouseButton::Middle => ButtonType::Middle, - MouseButton::Right => ButtonType::Right, - _ => return, - }; - - if state.is_pressed() { - let mut menu_query = self.world.query_filtered::>(); - let mut menus = Vec::new(); - for menu in menu_query.iter(&self.world) { - menus.push(menu); - } - for menu in menus { - self.world.entity_mut(menu).remove::(); - } - } - - let camera = self.world.get_resource::().unwrap(); - let view = camera.to_cursor_matrix(); - let pos = view - * Vector3::new( - renderer.mouse_pos.x as f32, - renderer.mouse_pos.y as f32, - 1.0, - ); - let pos = pos / pos.z; - renderer - .send_packet_events - .send(SendPacket(Packet::PlayerMouseInput( - PlayerMouseInputPacket { - x: pos.x, - y: pos.y, - released: !state.is_pressed(), - button, - }, - ))); - } - _ => {} - } - } - fn about_to_wait(&mut self, event_loop: &ActiveEventLoop) { - let Initialized(renderer) = &mut self.renderer else { - return; - }; - let Some(window) = &self.window else { return }; - - let mut ws = self - .world - .get_resource_mut::() - .expect("Failed to get Ws resource"); - - let mut packets = vec![]; - - #[cfg(target_arch = "wasm32")] - while let Ok(Some(packet)) = ws.receiver.try_next() { - packets.push(packet); - } - #[cfg(not(target_arch = "wasm32"))] - while let Ok(packet) = ws.receiver.try_recv() { - packets.push(packet); - } - - for packet in packets { - send_packet_event(packet, &mut self.world); - } - - renderer.send_packet_events.update(); - renderer.recv_packet_events.update(); - - self.world.run_schedule(Update); - - let gl = self.gl.as_ref().unwrap(); - unsafe { - renderer.draw(gl, window, &mut self.world); - } - - #[cfg(not(target_arch = "wasm32"))] - self.gl_surface - .as_ref() - .unwrap() - .swap_buffers(self.gl_context.as_ref().unwrap()) - .unwrap(); - - let mut ws = self - .world - .get_resource_mut::() - .expect("Failed to get Ws resource"); - let mut send_event_cursor = renderer.send_packet_events.get_cursor(); - for event in send_event_cursor.read(&renderer.send_packet_events) { - ws.send_packet(event.0.clone()); - } - - event_loop.set_control_flow(ControlFlow::WaitUntil( - web_time::Instant::now() - .checked_add(web_time::Duration::from_millis(16)) - .unwrap(), - )); - } -} diff --git a/crates/client/src/rendering/renderer.rs b/crates/client/src/rendering/renderer.rs deleted file mode 100644 index 6f5692fa67527b0a5b54bff41ac0b9d01be62dac..0000000000000000000000000000000000000000 --- a/crates/client/src/rendering/renderer.rs +++ /dev/null @@ -1,298 +0,0 @@ -use crate::components::{Camera, Player, RecvPacket, SendPacket, Texture, Transform}; -use crate::rendering::assets::AssetLoader; -use crate::ui::draw_ui; -use bevy_ecs::entity::Entity; -use bevy_ecs::event::Events; -use bevy_ecs::prelude::With; -use bevy_ecs::world::World; -use egui_glow::EguiGlow; -use glow::PixelUnpackData; -use nalgebra::{Scale3, Translation3}; -use starkingdoms_common::PlanetType; -use std::collections::HashMap; -use std::sync::Arc; -use winit::dpi::PhysicalPosition; -use winit::event_loop::ActiveEventLoop; - -pub struct Renderer { - program: glow::Program, - vertex_array: glow::VertexArray, - vertex_buffer: glow::Buffer, - element_buffer: glow::Buffer, - pub egui_glow: EguiGlow, - textures: HashMap, - pub(crate) send_packet_events: Events, - pub(crate) recv_packet_events: Events, - pub(crate) planet_types: HashMap, // (world entity, server id) - - pub(crate) up: bool, - pub(crate) down: bool, - pub(crate) left: bool, - pub(crate) right: bool, - - pub(crate) mouse_pos: PhysicalPosition, -} - -pub struct RenderCreateContext { - pub send_packet_events: Events, - pub recv_packet_events: Events, - pub planet_types: HashMap, -} - -const VERTICES: [f32; 16] = [ - -1.0, -1.0, 0.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, -1.0, 1.0, 0.0, 0.0, -]; -const INDICES: [u32; 6] = [0, 1, 2, 2, 3, 0]; - -impl Renderer { - pub unsafe fn new( - gl: Arc, - event_loop: &ActiveEventLoop, - ctx: RenderCreateContext, - ) -> Self { - use glow::HasContext as _; - - let shaders = [ - ( - "vertex", - include_str!("../assets/shaders/vertex.glsl"), - glow::VERTEX_SHADER, - ), - ( - "fragment", - include_str!("../assets/shaders/fragment.glsl"), - glow::FRAGMENT_SHADER, - ), - ]; - let program = gl.create_program().expect("Failed to create program"); - - for (name, source, shader_type) in shaders { - let shader = gl - .create_shader(shader_type) - .expect("Failed to create vertex shader"); - gl.shader_source(shader, source); - gl.compile_shader(shader); - if !gl.get_shader_compile_status(shader) { - tracing::error!( - "error in {} shader: {}", - name, - gl.get_shader_info_log(shader) - ); - } - gl.attach_shader(program, shader); - gl.delete_shader(shader); - } - gl.link_program(program); - - gl.use_program(Some(program)); - - let vertex_array = gl - .create_vertex_array() - .expect("Failed to create vertex array"); - gl.bind_vertex_array(Some(vertex_array)); - let vertex_buffer = gl.create_buffer().expect("Failed to create vertex buffer"); - gl.bind_buffer(glow::ARRAY_BUFFER, Some(vertex_buffer)); - let element_buffer = gl.create_buffer().expect("Failed to create element buffer"); - gl.bind_buffer(glow::ELEMENT_ARRAY_BUFFER, Some(element_buffer)); - gl.buffer_data_u8_slice( - glow::ARRAY_BUFFER, - std::slice::from_raw_parts(VERTICES.as_ptr() as *const u8, size_of_val(&VERTICES)), - glow::STATIC_DRAW, - ); - gl.buffer_data_u8_slice( - glow::ELEMENT_ARRAY_BUFFER, - std::slice::from_raw_parts(INDICES.as_ptr() as *const u8, size_of_val(&INDICES)), - glow::STATIC_DRAW, - ); - - gl.vertex_attrib_pointer_f32(0, 2, glow::FLOAT, false, 4 * size_of::() as i32, 0); - gl.enable_vertex_attrib_array(0); - gl.vertex_attrib_pointer_f32( - 1, - 2, - glow::FLOAT, - false, - 4 * size_of::() as i32, - 2 * size_of::() as i32, - ); - gl.enable_vertex_attrib_array(1); - - gl.clear_color(0.1, 0.1, 0.1, 1.0); - gl.enable(glow::BLEND); - gl.blend_func(glow::SRC_ALPHA, glow::ONE_MINUS_SRC_ALPHA); - - let egui_glow = EguiGlow::new(event_loop, gl.clone(), None, None, true); - - crate::ui::init_ui(egui_glow.egui_ctx.clone()); - - Self { - program, - vertex_array, - vertex_buffer, - element_buffer, - egui_glow, - textures: HashMap::new(), - send_packet_events: ctx.send_packet_events, - recv_packet_events: ctx.recv_packet_events, - planet_types: ctx.planet_types, - left: false, - right: false, - up: false, - down: false, - mouse_pos: Default::default(), - } - } - - pub unsafe fn draw( - &mut self, - gl: &glow::Context, - window: &winit::window::Window, - world: &mut World, - ) { - use glow::HasContext as _; - - let player = world.query_filtered::<&Transform, With>(); - - // draw the UI - self.egui_glow.run(window, |ctx| { - draw_ui(ctx, &mut *world, &mut self.send_packet_events); - }); - - let camera = world.get_resource::().unwrap(); - let x_scale = camera.zoom / camera.width as f32 * 2.0; - let y_scale = camera.zoom / camera.height as f32 * 2.0; - let view = &[ - x_scale, - 0.0, - 0.0, - camera.x * x_scale, - 0.0, - y_scale, - 0.0, - camera.y * y_scale, - 0.0, - 0.0, - 1.0, - 0.0, - 0.0, - 0.0, - 0.0, - 1.0, - ]; - - let mut sprite_query = world.query::<(&Transform, &mut Texture)>(); - - let mut sprites = Vec::new(); - for (transform, texture) in sprite_query.iter(world) { - sprites.push((transform, texture)); - } - - gl.clear(glow::COLOR_BUFFER_BIT); - gl.use_program(Some(self.program)); - gl.bind_vertex_array(Some(self.vertex_array)); - gl.bind_buffer(glow::ARRAY_BUFFER, Some(self.vertex_buffer)); - gl.bind_buffer(glow::ELEMENT_ARRAY_BUFFER, Some(self.element_buffer)); - gl.active_texture(glow::TEXTURE0); - - let view_loc = gl.get_uniform_location(self.program, "view"); - let model_loc = gl.get_uniform_location(self.program, "model"); - - gl.uniform_matrix_4_f32_slice(view_loc.as_ref(), true, view); - - if !self.textures.contains_key("starfield.svg") { - let assets = world.resource::(); - if let Some(image) = assets.get("starfield.svg") { - let texture_object = gl - .create_texture() - .expect("Failed to create texture object"); - gl.bind_texture(glow::TEXTURE_2D, Some(texture_object)); - gl.tex_parameter_i32( - glow::TEXTURE_2D, - glow::TEXTURE_MIN_FILTER, - glow::LINEAR_MIPMAP_LINEAR as i32, - ); - gl.tex_image_2d( - glow::TEXTURE_2D, - 0, - glow::RGBA as i32, - image.width as i32, - image.height as i32, - 0, - glow::RGBA, - glow::UNSIGNED_BYTE, - PixelUnpackData::Slice(Some(&image.bytes)), - ); - gl.generate_mipmap(glow::TEXTURE_2D); - - self.textures - .insert("starfield.svg".to_string(), texture_object); - } - } - if self.textures.contains_key("starfield.svg") { - gl.bind_texture( - glow::TEXTURE_2D, - self.textures.get("starfield.svg").copied(), - ); - - let camera = world.get_resource::().unwrap(); - let x = -(camera.x + camera.x.signum() * 200.0) + camera.x % 400.0; - let y = -(camera.y + camera.y.signum() * 200.0) + camera.y % 400.0; - let x_range = camera.width as f32 / camera.zoom / 400.0; - let y_range = camera.height as f32 / camera.zoom / 400.0; - for i in ((-x_range / 2.0) as i32 - 1)..=((x_range / 2.0) as i32 + 1) { - for j in ((-y_range / 2.0) as i32 - 1)..=((y_range / 2.0) as i32 + 1) { - let model = Translation3::new(x + (i * 400) as f32, y + (j * 400) as f32, 0.0) - .to_homogeneous() - * Scale3::new(200.0, 200.0, 1.0).to_homogeneous(); - gl.uniform_matrix_4_f32_slice(model_loc.as_ref(), false, model.as_slice()); - gl.draw_elements(glow::TRIANGLES, 6, glow::UNSIGNED_INT, 0); - } - } - } - - for (transform, texture) in sprites { - if !self.textures.contains_key(&texture.name) { - let assets = world.resource::(); - let image = match assets.get(texture.name.clone()) { - Some(t) => t, - None => continue, - }; - - let texture_object = gl - .create_texture() - .expect("Failed to create texture object"); - gl.bind_texture(glow::TEXTURE_2D, Some(texture_object)); - gl.tex_parameter_i32( - glow::TEXTURE_2D, - glow::TEXTURE_MIN_FILTER, - glow::LINEAR_MIPMAP_LINEAR as i32, - ); - gl.tex_image_2d( - glow::TEXTURE_2D, - 0, - glow::RGBA as i32, - image.width as i32, - image.height as i32, - 0, - glow::RGBA, - glow::UNSIGNED_BYTE, - PixelUnpackData::Slice(Some(&image.bytes)), - ); - gl.generate_mipmap(glow::TEXTURE_2D); - - self.textures.insert(texture.name.clone(), texture_object); - } - // now the texture must exist - - let model = transform.to_matrix(); - let model = model.as_slice(); - gl.uniform_matrix_4_f32_slice(model_loc.as_ref(), false, model); - - gl.bind_texture(glow::TEXTURE_2D, self.textures.get(&texture.name).copied()); - gl.draw_elements(glow::TRIANGLES, 6, glow::UNSIGNED_INT, 0); - } - - // paint UI - self.egui_glow.paint(window); - } -} diff --git a/crates/client/src/systems.rs b/crates/client/src/systems.rs deleted file mode 100644 index 497856e7661e43cc616767651b6eb76ae4ca9477..0000000000000000000000000000000000000000 --- a/crates/client/src/systems.rs +++ /dev/null @@ -1,18 +0,0 @@ -use crate::components::{Part, Player, PlayerBundle, Texture, Transform}; -use bevy_ecs::prelude::Commands; -use nalgebra::{Rotation2, Scale3, Translation3}; - -pub fn create_hearty(mut commands: Commands) { - commands.spawn(PlayerBundle { - transform: Transform { - translation: Translation3::new(0.0, 0.0, 0.0), - rotation: Rotation2::new(0.0), - scale: Scale3::new(25.0, 25.0, 1.0), - }, - texture: Texture { - name: "hearty.svg".to_string(), - }, - player: Player, - part: Part(false), - }); -} diff --git a/crates/client/src/ui/colors.rs b/crates/client/src/ui/colors.rs deleted file mode 100644 index 0bdfcf364de6f572d9171a7944987e671cb1b8c0..0000000000000000000000000000000000000000 --- a/crates/client/src/ui/colors.rs +++ /dev/null @@ -1,33 +0,0 @@ -macro_rules! color { - ($n:ident,rgb($r:expr, $g:expr, $b:expr)) => { - #[allow(dead_code)] - pub const $n: ::egui::Color32 = ::egui::Color32::from_rgb($r, $g, $b); - }; -} - -color!(ROSEWATER, rgb(245, 224, 220)); -color!(FLAMINGO, rgb(242, 205, 205)); -color!(PINK, rgb(245, 194, 231)); -color!(MAUVE, rgb(203, 166, 247)); -color!(RED, rgb(243, 139, 168)); -color!(MAROON, rgb(235, 160, 172)); -color!(PEACH, rgb(250, 179, 135)); -color!(YELLOW, rgb(249, 226, 175)); -color!(GREEN, rgb(166, 227, 161)); -color!(TEAL, rgb(148, 226, 213)); -color!(SKY, rgb(137, 220, 235)); -color!(SAPPHIRE, rgb(116, 199, 236)); -color!(BLUE, rgb(137, 180, 250)); -color!(LAVENDER, rgb(180, 190, 254)); -color!(TEXT, rgb(205, 214, 244)); -color!(SUBTEXT_1, rgb(186, 194, 222)); -color!(SUBTEXT_0, rgb(166, 173, 200)); -color!(OVERLAY_2, rgb(147, 153, 178)); -color!(OVERLAY_1, rgb(127, 132, 156)); -color!(OVERLAY_0, rgb(108, 112, 132)); -color!(SURFACE_2, rgb(88, 91, 112)); -color!(SURFACE_1, rgb(69, 71, 90)); -color!(SURFACE_0, rgb(49, 50, 68)); -color!(BASE, rgb(30, 30, 46)); -color!(MANTLE, rgb(24, 24, 37)); -color!(CRUST, rgb(17, 17, 27)); diff --git a/crates/client/src/ui/mod.rs b/crates/client/src/ui/mod.rs deleted file mode 100644 index bc4eeca12d4cbb0d02af53e2b57f5764921172fa..0000000000000000000000000000000000000000 --- a/crates/client/src/ui/mod.rs +++ /dev/null @@ -1,172 +0,0 @@ -mod colors; -mod widgets; - -use std::f32; - -use crate::components::{Camera, Chat, Menu, Player, PlayerResources, SendPacket, ServerId, Transform}; -use crate::ui::widgets::{progress_bar, RichTextExt}; -use bevy_ecs::entity::Entity; -use bevy_ecs::event::Events; -use bevy_ecs::prelude::With; -use bevy_ecs::world::World; -use egui::{Align, Align2, CursorIcon, Layout, Margin, Order, RichText, Shadow, Visuals}; -use starkingdoms_common::packet::{Packet, RequestMiningPacket, SendMessagePacket}; - -pub fn init_ui(ctx: egui::Context) { - // set colors - let mut style = egui::Style::default(); - - let mut visuals = Visuals::default(); - visuals.dark_mode = true; - - // TODO(core): code_bg_colors - - visuals.warn_fg_color = colors::YELLOW; // used for warning text - visuals.error_fg_color = colors::RED; // used for error text - - visuals.window_shadow = Shadow::NONE; - visuals.window_fill = colors::MANTLE; // window background color - visuals.extreme_bg_color = colors::CRUST; // must be darker than window_fill - visuals.faint_bg_color = colors::BASE; // slightly different than window background color - visuals.window_stroke.color = colors::SURFACE_0; - visuals.window_highlight_topmost = false; - - visuals.text_cursor.stroke.color = colors::ROSEWATER; - - // TODO(core): button_frame, collapsing_header_frame - visuals.striped = true; - - visuals.interact_cursor = Some(CursorIcon::PointingHand); - - visuals.selection.bg_fill = colors::OVERLAY_2.gamma_multiply(0.2); // selection background - - visuals.hyperlink_color = colors::BLUE; - - visuals.widgets.noninteractive.fg_stroke.color = colors::TEXT; // standard text color - - style.visuals = visuals; - - ctx.set_style(style); -} - -pub fn draw_ui( - ctx: &egui::Context, - world: &mut World, - send_packet_events: &mut Events, -) { - draw_status_bar(ctx, world); - draw_chat(ctx, world, send_packet_events); - draw_crafting(ctx, world, send_packet_events); -} - -pub fn draw_status_bar(ctx: &egui::Context, world: &mut World) { - let mut player = world.query_filtered::<&Transform, With>(); - let player_position = player.single(world); - let player_resources = world.resource::(); - - egui::Window::new("status_bar") - .title_bar(false) - .movable(false) - .resizable(false) - .order(Order::Foreground) - .anchor(Align2::CENTER_BOTTOM, [0.0, -5.0]) - .show(ctx, |ui| { - ui.horizontal(|ui| { - ui.vertical(|ui| { - ui.label(RichText::new("Position:").stk_weak()); - ui.label(RichText::new(format!( - "{:.0}, {:.0}", - player_position.translation.x / 10.0, - player_position.translation.y / 10.0 - ))) - }); - - ui.add_space(8.0); - - ui.vertical(|ui| { - ui.horizontal(|ui| { - ui.label(RichText::new("Fuel:").stk_weak()); - ui.with_layout(Layout::right_to_left(Align::Center), |ui| { - ui.label(RichText::new(format!( - "{}/{} ({:.2}%)", - player_resources.fuel_amount, - player_resources.fuel_max, - player_resources.fuel_amount as f32 - / player_resources.fuel_max as f32 - * 100.0 - ))) - }); - }); - - ui.add(progress_bar( - player_resources.fuel_amount as f32 / player_resources.fuel_max as f32, - )); - }) - }); - }); -} - -pub fn draw_chat( - ctx: &egui::Context, - world: &mut World, - send_packet_events: &mut Events, -) { - let mut chat = world.get_resource_mut::().unwrap(); - - egui::Window::new("Chat") - .movable(true) - .order(Order::Foreground) - .show(ctx, |ui| { - egui::Frame::new() - .inner_margin(Margin::same(5)) - .corner_radius(2) - .fill(colors::CRUST) - .show(ui, |ui| { - egui::ScrollArea::vertical() - .max_width(f32::INFINITY) - .max_height(100.0) - .auto_shrink(false) - .stick_to_bottom(true) - .show(ui, |ui| { - for message in &chat.messages { - ui.label(message); - } - }); - }); - ui.horizontal(|ui| { - let output = egui::TextEdit::singleline(&mut chat.textbox).show(ui); - if ui.button("Send").clicked() - || (ctx.input(|i| i.key_pressed(egui::Key::Enter)) - && output.response.lost_focus()) - { - send_packet_events.send(SendPacket(Packet::SendMessage(SendMessagePacket { - target: None, - content: chat.textbox.clone(), - }))); - chat.textbox.clear(); - } - }); - }); -} - -pub fn draw_crafting(ctx: &egui::Context, world: &mut World, send_packet_events: &mut Events) { - let mut menus = world.query_filtered::<(Entity, &ServerId, &Transform), With>(); - let camera = world.resource::(); - for (entity, server_id, menu) in menus.iter(world) { - egui::Window::new("Crafting") - .id(format!("Crafting{}", entity.index()).into()) - .pivot(Align2::LEFT_BOTTOM) - .fixed_pos(( - (menu.translation.x + camera.x) * camera.zoom + camera.width as f32 / 2.0, - (menu.translation.y + camera.y) * camera.zoom + camera.height as f32 / 2.0, - )) - .show(ctx, |ui| { - if ui.button("Mining").clicked() { - send_packet_events.send(SendPacket(Packet::RequestMining(RequestMiningPacket { - id: server_id.0, - is_mining: true, - }))); - } - }); - } -} diff --git a/crates/client/src/ui/widgets.rs b/crates/client/src/ui/widgets.rs deleted file mode 100644 index cd7b8f132b023c6b3bfe8c6e13574cc0eac2199c..0000000000000000000000000000000000000000 --- a/crates/client/src/ui/widgets.rs +++ /dev/null @@ -1,16 +0,0 @@ -use egui::RichText; - -pub fn progress_bar(progress: f32) -> egui::ProgressBar { - egui::ProgressBar::new(progress) - .fill(super::colors::BLUE) - .corner_radius(0) -} - -pub trait RichTextExt { - fn stk_weak(self) -> Self; -} -impl RichTextExt for RichText { - fn stk_weak(self) -> Self { - self.color(super::colors::OVERLAY_2) - } -} diff --git a/crates/client/src/wasm/assets.rs b/crates/client/src/wasm/assets.rs deleted file mode 100644 index ab2e1a33e486dd1fa6b23340c92e3dfe964ca2e6..0000000000000000000000000000000000000000 --- a/crates/client/src/wasm/assets.rs +++ /dev/null @@ -1,114 +0,0 @@ -use std::{ - collections::HashMap, - fmt::Display, - sync::{Arc, Mutex}, -}; - -use crate::rendering::assets::{AssetLoader, ImgData}; -use bevy_ecs::system::Resource; -use image::EncodableLayout; -use poll_promise::Promise; -use resvg::{tiny_skia, usvg}; - -#[derive(Resource)] -pub struct Assets { - texture_promises: Arc>>>, - textures: Arc>>, -} - -impl AssetLoader for Assets { - fn new() -> Self { - Assets { - textures: Arc::new(Mutex::new(HashMap::new())), - texture_promises: Arc::new(Mutex::new(HashMap::new())), - } - } - fn get(&self, local_path: impl Into) -> Option { - let local_path = local_path.into(); - let contains_texture = { self.textures.lock().unwrap().contains_key(&local_path) }; - let contains_texture_promise = { - self.texture_promises - .lock() - .unwrap() - .contains_key(&local_path) - }; - if !contains_texture && !contains_texture_promise { - let local_path_clone = local_path.clone(); - let request_promise = poll_promise::Promise::spawn_local(async move { - let window = web_sys::window().unwrap(); - let request = ehttp::Request::get(format!( - "{}/src/assets/textures/{}", - window.location().origin().unwrap(), - local_path_clone - )); - let response = match ehttp::fetch_async(request).await { - Ok(resp) => resp, - Err(e) => { - panic!("{}", e); - } - }; - if local_path_clone.ends_with(".svg") { - let opt = usvg::Options { - default_size: usvg::Size::from_wh(20.0, 20.0).unwrap(), - ..Default::default() - }; - let tree = usvg::Tree::from_data(&response.bytes, &opt) - .expect(&format!("Couldn't parse svg {}", local_path_clone)); - let tree_size = tree.size().to_int_size(); - let size = usvg::Size::from_wh(512.0, 512.0).unwrap().to_int_size(); - assert!(size.width() > 0 && size.height() > 0); - let mut pixmap = tiny_skia::Pixmap::new(size.width(), size.height()) - .expect("Failed to construct pixmap"); - resvg::render( - &tree, - tiny_skia::Transform::from_scale( - (size.width() as f32) / (tree_size.height() as f32), - (size.height() as f32) / (tree_size.height() as f32), - ), - &mut pixmap.as_mut(), - ); - let data = ImgData { - bytes: pixmap.data().to_vec(), - width: size.width(), - height: size.height(), - }; - - data - } else if local_path_clone.ends_with(".png") { - let img = image::load_from_memory(&response.bytes).unwrap(); - let rgba = img.to_rgba8(); - let data = ImgData { - bytes: rgba.as_bytes().to_vec(), - width: rgba.width(), - height: rgba.height(), - }; - data - } else { - panic!("Unsupported sprite type"); - } - }); - { - self.texture_promises - .lock() - .unwrap() - .insert(local_path.clone(), request_promise); - } - None - } else if !contains_texture { - let mut texture_promises = self.texture_promises.lock().unwrap(); - let promise = texture_promises.get_mut(&local_path).unwrap(); - let mut returned_value = None; - if let Some(texture) = promise.ready() { - self.textures - .lock() - .unwrap() - .insert(local_path.clone(), texture.clone()); - returned_value = Some(texture.clone()); - texture_promises.remove(&local_path); - } - return returned_value; - } else { - self.textures.lock().unwrap().get(&local_path).cloned() - } - } -} diff --git a/crates/client/src/wasm/mod.rs b/crates/client/src/wasm/mod.rs deleted file mode 100644 index 6ac1313ba52cce569b056c2e31c12a6473ebe514..0000000000000000000000000000000000000000 --- a/crates/client/src/wasm/mod.rs +++ /dev/null @@ -1,36 +0,0 @@ -use tracing::Level; -use tracing_subscriber::fmt::format::Pretty; -use tracing_subscriber::prelude::*; -use tracing_web::{performance_layer, MakeWebConsoleWriter}; -use wasm_bindgen::prelude::wasm_bindgen; - -pub mod assets; -pub mod websocket; - -/// --- IMPORTANT: THIS IS A DUAL TARGET CRATE --- -/// THIS WILL ONLY EXECUTE ON WEBASSEMBLY -/// DO ONLY PLATFORM SPECIFIC INITIALIZATION HERE -/// FOR ACTUAL PROGRAM LOGIC, EDIT `crate::start` -/// DO NOT RENAME -#[wasm_bindgen(start)] -pub fn entrypoint() { - // Panic handler - console_error_panic_hook::set_once(); - - /* ----- Logging setup ----- */ - let fmt_layer = tracing_subscriber::fmt::layer() - .with_ansi(false) // not supported in browsers - .without_time() // std::time doesn't exist in wasm - .with_writer(MakeWebConsoleWriter::new().with_max_level(Level::DEBUG)); // wgpu spams the console, and this is slow as hell - - let perf_layer = performance_layer() // enable performance tracing - .with_details_from_fields(Pretty::default()); // ... with pretty fields - - tracing_subscriber::registry() - .with(fmt_layer) - .with(perf_layer) - .init(); // register the logger - - // All done with platform-specific initialization, call back into the common code path - crate::start(); -} diff --git a/crates/client/src/wasm/websocket.rs b/crates/client/src/wasm/websocket.rs deleted file mode 100644 index c357a12a7602a9ecde6bcffd9cd86f399f95d741..0000000000000000000000000000000000000000 --- a/crates/client/src/wasm/websocket.rs +++ /dev/null @@ -1,95 +0,0 @@ -use std::thread::yield_now; - -use bevy_ecs::system::Resource; -//use crossbeam::channel::{unbounded, Receiver, Sender}; -use crate::networking::websocket::Websocket; -use futures::{ - channel::mpsc::{unbounded, UnboundedReceiver, UnboundedSender}, - SinkExt, -}; -use starkingdoms_common::packet::{ClientLoginPacket, Packet}; -use wasm_bindgen::{prelude::Closure, JsCast, JsValue}; -use wasm_bindgen_futures::spawn_local; -use web_sys::{MessageEvent, WebSocket}; - -const PORT: u16 = 3000; - -#[derive(Debug)] -pub struct Socket(WebSocket); -unsafe impl Send for Socket {} -unsafe impl Sync for Socket {} - -#[derive(Resource, Debug)] -pub struct Ws { - socket: Socket, - pub sender: UnboundedSender, - pub receiver: UnboundedReceiver, - packet_receiver: UnboundedReceiver, -} - -impl Websocket for Ws { - fn new() -> Self { - let window = web_sys::window().unwrap(); - /*let ws = WebSocket::new(&format!( - "ws://{}:{}", - window.location().hostname().unwrap(), - PORT - ))*/ - let ws = WebSocket::new("ws://localhost:3000").expect("Couldn't connect to server"); - let (packet_sender, receiver) = unbounded(); - //let packet_sender = Rc::new(RwLock::new(packet_sender)); - let (sender, packet_receiver) = unbounded(); - - let ws_clone = ws.clone(); - let onopen_callback = Closure::::new(move || { - let packet = Packet::ClientLogin(ClientLoginPacket { - username: String::new(), - save: None, - jwt: None, - }); - - ws_clone - .send_with_str( - &serde_json::to_string(&packet).expect("Couldn't convert packet to string"), - ) - .expect("Failed to send packet"); - }); - ws.set_onopen(Some(onopen_callback.as_ref().unchecked_ref())); - onopen_callback.forget(); - let onmessage_callback = Closure::::new(move |e: MessageEvent| { - //tracing::error!("{}", ws.ready_state()); - let data = e - .data() - .as_string() - .expect("Expected string, found some other type"); - let data: Packet = - serde_json::from_str(&data).expect("Received invalid json from server"); - let mut sender_clone = packet_sender.clone(); - spawn_local(async move { - sender_clone - .send(data) - .await - .expect("Couldn't transmit packet to client"); - }); - }); - ws.set_onmessage(Some(onmessage_callback.as_ref().unchecked_ref())); - onmessage_callback.forget(); - Ws { - socket: Socket(ws), - sender, - receiver, - packet_receiver, - } - } - fn send_packet(&mut self, packet: Packet) { - let socket = self.socket.0.clone(); - spawn_local(async move { - //while socket.ready_state() != 1 { } - socket - .send_with_str( - &serde_json::to_string(&packet).expect("Couldn't convert packet to json"), - ) - .expect("Couldn't send packet to server"); - }); - } -} diff --git a/crates/common/Cargo.toml b/crates/common/Cargo.toml deleted file mode 100644 index c797ef5cf5d392a532d4d5cda4872be75d256080..0000000000000000000000000000000000000000 --- a/crates/common/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -[package] -name = "starkingdoms-common" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -serde = { version = "1", features = ["derive"] } -serde_json = "1" -rmp-serde = "1" -hmac = "0.12" -sha2 = "0.10" -base64 = "0.21" -bevy_ecs = { version = "0.15", optional = true } - -[features] -default = [] -bevy = ["dep:bevy_ecs"] \ No newline at end of file diff --git a/crates/common/src/lib.rs b/crates/common/src/lib.rs deleted file mode 100644 index 6a0d01a708ea65b749ce6d7bbe575d8fd699aa81..0000000000000000000000000000000000000000 --- a/crates/common/src/lib.rs +++ /dev/null @@ -1,126 +0,0 @@ -// StarKingdoms.IO, a browser game about drifting through space -// Copyright (C) 2024 ghostly_zsh, TerraMaster85, core -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -use base64::Engine; -use hmac::{Hmac, Mac}; -use serde::{Deserialize, Serialize}; -use sha2::Sha256; -use std::error::Error; - -pub mod packet; - -#[derive(Clone, Serialize, Deserialize, Debug, PartialEq)] -pub struct SaveData { - // ---------------------------------------------------------------------- - // HEY YOU - // YES YOU - // GHOSTLY - // FILL THIS WITH STUFF - // ---------------------------------------------------------------------- - // THANKS! -core - pub children: Vec>, - pub unused_modules: Vec<(PartType, u32)>, -} - -#[derive(Clone, Serialize, Deserialize, Debug, PartialEq)] -pub struct SaveModule { - pub part_type: PartType, - pub children: Vec>, -} - -#[derive(Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Debug, Default)] -pub enum PartType { - #[default] - Placeholder, - Hearty, - Chassis, - Hub, - LandingThruster, - LandingThrusterSuspension, -} - -#[derive(Clone, Copy, Serialize, Deserialize, Debug, PartialEq, Eq, Hash)] -pub enum PlanetType { - Sun, - Mercury, - Venus, - Earth, - Moon, - Mars, - Jupiter, - Saturn, - Uranus, - Neptune, - Pluto, -} - -// no touchy. this is the struct that savefiles are actually represented in -#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)] -pub struct Savefile { - data_msgpack: Vec, - mac: Vec, -} - -pub fn pack_savefile(key: &[u8], save_data: SaveData) -> String { - let mut mac: Hmac = Hmac::new_from_slice(key).unwrap(); - - let save_data_bytes = rmp_serde::to_vec(&save_data).unwrap(); - mac.update(&save_data_bytes); - let mc_code = mac.finalize().into_bytes(); - - let save_file = Savefile { - data_msgpack: save_data_bytes, - mac: mc_code.to_vec(), - }; - - let final_bytes = rmp_serde::to_vec(&save_file).unwrap(); - - base64::engine::general_purpose::STANDARD.encode(final_bytes) -} -pub fn unpack_savefile(key: &[u8], file: String) -> Result> { - // << reverse! << - let savefile_bytes = base64::engine::general_purpose::STANDARD - .decode(file) - .map_err(|e| format!("error decoding b64: {e}"))?; - - let save_file: Savefile = rmp_serde::from_slice(&savefile_bytes) - .map_err(|e| format!("error decoding savefile wrapper: {e}"))?; - - let mut mac: Hmac = - Hmac::new_from_slice(key).map_err(|e| format!("error loading hmac-sha256: {e}"))?; - mac.update(&save_file.data_msgpack); - mac.verify_slice(&save_file.mac) - .map_err(|e| format!("error verifying signature: {e}"))?; - - let save_data = rmp_serde::from_slice(&save_file.data_msgpack) - .map_err(|e| format!("error decoding inner signature: {e}"))?; - - Ok(save_data) -} -pub fn __noverify_unpack_savefile(file: String) -> Result> { - // << reverse! << - let savefile_bytes = base64::engine::general_purpose::STANDARD - .decode(file) - .map_err(|e| format!("error decoding b64: {e}"))?; - - let save_file: Savefile = rmp_serde::from_slice(&savefile_bytes) - .map_err(|e| format!("error decoding savefile wrapper: {e}"))?; - - let save_data = rmp_serde::from_slice(&save_file.data_msgpack) - .map_err(|e| format!("error decoding inner signature: {e}"))?; - - Ok(save_data) -} diff --git a/crates/common/src/packet.rs b/crates/common/src/packet.rs deleted file mode 100644 index cb3eb8f92b294ca02e34a381c1ad5f9bbf9e130b..0000000000000000000000000000000000000000 --- a/crates/common/src/packet.rs +++ /dev/null @@ -1,305 +0,0 @@ -use std::fmt::{Display, Formatter}; -// StarKingdoms.IO, a browser game about drifting through space -// Copyright (C) 2024 ghostly_zsh, TerraMaster85, core -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . -use serde::{Deserialize, Serialize}; - -use crate::{PartType, PlanetType}; - -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -pub struct ProtoTransform { - pub x: f32, - pub y: f32, - pub rot: f32, -} -#[macro_export] -macro_rules! proto_transform { - ($e:expr) => { - $crate::packet::ProtoTransform { - x: $e.translation.x, - y: $e.translation.y, - rot: $e.rotation.to_euler(bevy::math::EulerRot::ZYX).0, - } - }; -} - -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -pub struct Planet { - pub planet_type: PlanetType, - pub transform: ProtoTransform, -} -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -pub struct Part { - pub part_type: PartType, - pub transform: ProtoTransform, - pub flags: ProtoPartFlags, -} - -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -pub struct ProtoPartFlags { - pub attached: bool, -} - -#[macro_export] -macro_rules! proto_part_flags { - ($e:expr) => { - $crate::packet::ProtoPartFlags { - attached: $e.attached, - } - }; -} - -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -pub enum MessageType { - Server, - Error, - Chat, - Direct, -} -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -pub enum ButtonType { - Left, - Middle, - Right, -} - -// serverbound -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))] -pub struct ClientLoginPacket { - pub username: String, - pub save: Option, - pub jwt: Option, -} -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))] -pub struct SendMessagePacket { - pub target: Option, - pub content: String, -} -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))] -pub struct PlayerInputPacket { - pub up: bool, - pub down: bool, - pub left: bool, - pub right: bool, -} - -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))] -pub struct PlayerMouseInputPacket { - pub x: f32, - pub y: f32, - pub released: bool, - pub button: ButtonType, -} - -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))] -pub struct RequestSavePacket { - pub old_save: Option, -} - -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))] -pub struct RequestMiningPacket { - pub id: u32, - pub is_mining: bool, -} - -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))] -pub struct SpecialDisconnectPacket {} - -// clientbound -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))] -pub struct LoginResponsePacket { - pub id: u32, -} - -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))] -pub struct SpawnPlayerPacket { - pub id: u32, - pub username: String, -} - -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))] -pub struct PlayerListPacket { - pub players: Vec<(u32, String)>, -} - -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))] -pub struct PlanetPositionsPacket { - pub planets: Vec<(u32, Planet)>, -} - -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))] -pub struct SpawnPlanetPacket { - pub id: u32, - pub planet: Planet, - pub radius: f32, -} - -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))] -pub struct PartPositionsPacket { - pub parts: Vec<(u32, Part)>, -} - -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))] -pub struct SpawnPartPacket { - pub id: u32, - pub part: Part, -} - -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))] -pub struct DespawnPartPacket { - pub id: u32, -} - -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))] -pub struct PlayerLeavePacket { - pub id: u32, -} - -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))] -pub struct MessagePacket { - pub message_type: MessageType, - pub actor: String, - pub content: String, -} - -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))] -pub struct SaveEligibilityPacket { - pub eligible: bool, -} - -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))] -pub struct SaveDataPacket { - pub payload: String, -} - -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))] -pub struct EnergyUpdatePacket { - pub amount: u32, - pub max: u32, -} - -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -#[cfg_attr(feature = "bevy", derive(::bevy_ecs::event::Event))] -pub struct OpenCraftingUiPacket { - pub id: u32, -} - -#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)] -#[serde(tag = "t", content = "c")] -pub enum Packet { - // serverbound - ClientLogin(ClientLoginPacket), - SendMessage(SendMessagePacket), - PlayerInput(PlayerInputPacket), - PlayerMouseInput(PlayerMouseInputPacket), - RequestSave(RequestSavePacket), - RequestMining(RequestMiningPacket), - _SpecialDisconnect(SpecialDisconnectPacket), - - // clientbound - LoginResponse(LoginResponsePacket), - SpawnPlayer(SpawnPlayerPacket), - PlayerList(PlayerListPacket), - PlanetPositions(PlanetPositionsPacket), - SpawnPlanet(SpawnPlanetPacket), - PartPositions(PartPositionsPacket), - SpawnPart(SpawnPartPacket), - DespawnPart(DespawnPartPacket), - PlayerLeave(PlayerLeavePacket), - Message(MessagePacket), - SaveEligibility(SaveEligibilityPacket), - SaveData(SaveDataPacket), - EnergyUpdate(EnergyUpdatePacket), - OpenCraftingUi(OpenCraftingUiPacket), -} - -#[cfg(feature = "bevy")] -pub fn register_packet_events(world: &mut bevy_ecs::prelude::World) { - // serverbound - bevy_ecs::event::EventRegistry::register_event::(world); - bevy_ecs::event::EventRegistry::register_event::(world); - bevy_ecs::event::EventRegistry::register_event::(world); - bevy_ecs::event::EventRegistry::register_event::(world); - bevy_ecs::event::EventRegistry::register_event::(world); - bevy_ecs::event::EventRegistry::register_event::(world); - bevy_ecs::event::EventRegistry::register_event::(world); - // clientbound - bevy_ecs::event::EventRegistry::register_event::(world); - bevy_ecs::event::EventRegistry::register_event::(world); - bevy_ecs::event::EventRegistry::register_event::(world); - bevy_ecs::event::EventRegistry::register_event::(world); - bevy_ecs::event::EventRegistry::register_event::(world); - bevy_ecs::event::EventRegistry::register_event::(world); - bevy_ecs::event::EventRegistry::register_event::(world); - bevy_ecs::event::EventRegistry::register_event::(world); - bevy_ecs::event::EventRegistry::register_event::(world); - bevy_ecs::event::EventRegistry::register_event::(world); - bevy_ecs::event::EventRegistry::register_event::(world); - bevy_ecs::event::EventRegistry::register_event::(world); - bevy_ecs::event::EventRegistry::register_event::(world); - bevy_ecs::event::EventRegistry::register_event::(world); -} - -impl From for String { - fn from(val: Packet) -> Self { - serde_json::to_string(&val).expect("failed to serialize packet to json") - } -} - -#[derive(Debug)] -pub enum MsgFromError { - InvalidMessageType, - JSONError(serde_json::Error), -} -impl Display for MsgFromError { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - write!(f, "{:?}", self) - } -} - -impl TryFrom<&String> for Packet { - type Error = MsgFromError; - - fn try_from(value: &String) -> Result { - serde_json::from_str(value).map_err(MsgFromError::JSONError) - } -} -impl TryFrom<&Vec> for Packet { - type Error = MsgFromError; - - fn try_from(value: &Vec) -> Result { - serde_json::from_slice(value).map_err(MsgFromError::JSONError) - } -} diff --git a/crates/launcher/src/main.rs b/crates/launcher/src/main.rs index 9cc49ffe2e37b50bcb692355b6886e22ea6b5098..fbbff6f630e6e9f5224db58058d07a7864659a2e 100644 --- a/crates/launcher/src/main.rs +++ b/crates/launcher/src/main.rs @@ -3,15 +3,17 @@ #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // hide console window on Windows in release #![allow(rustdoc::missing_crate_level_docs)] // it's an example +use eframe::egui::{self, ViewportCommand}; +use eframe::epaint::Stroke; +use egui::epaint::text::FontInsert; +use egui::{ + Atom, Button, Color32, ComboBox, CornerRadius, FontData, FontDefinitions, FontFamily, FontId, + Id, RichText, TextEdit, Vec2, include_image, +}; use std::ops::Deref; use std::sync::{Arc, Mutex}; use std::thread::sleep; use std::time::Duration; -use eframe::egui::{self, ViewportCommand}; -use eframe::epaint::Stroke; -use egui::{include_image, Atom, Button, Color32, ComboBox, CornerRadius, FontData, FontDefinitions, FontFamily, FontId, Id, RichText, TextEdit, Vec2}; -use egui::epaint::text::FontInsert; -use starkingdoms::Cli; fn main() -> eframe::Result { let options = eframe::NativeOptions { @@ -23,8 +25,8 @@ fn main() -> eframe::Result { ..Default::default() }; - let mut cli_lock: Arc>> = Arc::new(Mutex::new(None)); - let c2 = cli_lock.clone(); + //let mut cli_lock: Arc>> = Arc::new(Mutex::new(None)); + //let c2 = cli_lock.clone(); eframe::run_native( "Custom window frame", // unused title options, @@ -32,10 +34,21 @@ fn main() -> eframe::Result { egui_extras::install_image_loaders(&cc.egui_ctx); let mut fonts = FontDefinitions::empty(); - fonts.font_data.insert("Inter-Regular".to_string(), Arc::new(FontData::from_static(include_bytes!("Inter-Regular.otf")))); - fonts.font_data.insert("Inter-SemiBold".to_string(), Arc::new(FontData::from_static(include_bytes!("Inter-SemiBold.otf")))); - fonts.families.insert(FontFamily::Proportional, vec!["Inter-Regular".to_string()]); - fonts.families.insert(FontFamily::Name("semibold".into()), vec!["Inter-SemiBold".to_string()]); + fonts.font_data.insert( + "Inter-Regular".to_string(), + Arc::new(FontData::from_static(include_bytes!("Inter-Regular.otf"))), + ); + fonts.font_data.insert( + "Inter-SemiBold".to_string(), + Arc::new(FontData::from_static(include_bytes!("Inter-SemiBold.otf"))), + ); + fonts + .families + .insert(FontFamily::Proportional, vec!["Inter-Regular".to_string()]); + fonts.families.insert( + FontFamily::Name("semibold".into()), + vec!["Inter-SemiBold".to_string()], + ); cc.egui_ctx.set_fonts(fonts); cc.egui_ctx.style_mut(|u| { @@ -52,22 +65,23 @@ fn main() -> eframe::Result { url: "wss://stk.e3t.cc".to_string(), }, username: "core".to_string(), - cli_lock + //cli_lock })) }), - ).unwrap(); - - if let Some(cli) = c2.lock().as_ref().unwrap().deref() { - starkingdoms::native_entrypoint::start(cli.clone()); - } - + ) + .unwrap(); + + //if let Some(cli) = c2.lock().as_ref().unwrap().deref() { + // starkingdoms::native_entrypoint::start(cli.clone()); + //} + Ok(()) } struct MyApp { selected_server: Server, - cli_lock: Arc>>, - username: String + //cli_lock: Arc>>, + username: String, } #[derive(PartialEq)] struct Server { @@ -85,87 +99,90 @@ impl eframe::App for MyApp { custom_window_frame(ctx, "starkingdoms", |ui| { ui.heading( RichText::new("StarKingdoms") - .font(FontId::new(24.0, FontFamily::Name("semibold".into()))) + .font(FontId::new(24.0, FontFamily::Name("semibold".into()))), ); ui.add_space(10.0); ui.style_mut().visuals.widgets.inactive.weak_bg_fill = Color32::TRANSPARENT; - ui.style_mut().visuals.widgets.inactive.bg_stroke = Stroke::new(1.0, Color32::from_hex("#89b4fa").unwrap()); - ui.style_mut().visuals.widgets.inactive.fg_stroke = Stroke::new(1.0, Color32::from_hex("#89b4fa").unwrap()); - - if ui.add(Button::new(( - Atom::custom(Id::new("left-space"), Vec2::new(64.0, 24.0)), - RichText::new("Launch!").font(FontId::new(12.0, FontFamily::Name("semibold".into()))).color(Color32::from_hex("#89b4fa").unwrap()), - Atom::custom(Id::new("right-space"), Vec2::new(64.0, 24.0)), - ))).clicked() { - - let cli = Cli::Client { - server: self.selected_server.url.clone(), - }; - - println!("starting client with arguments: {:?}", cli); - - *self.cli_lock.lock().unwrap() = Some(cli); - + ui.style_mut().visuals.widgets.inactive.bg_stroke = + Stroke::new(1.0, Color32::from_hex("#89b4fa").unwrap()); + ui.style_mut().visuals.widgets.inactive.fg_stroke = + Stroke::new(1.0, Color32::from_hex("#89b4fa").unwrap()); + + if ui + .add(Button::new(( + Atom::custom(Id::new("left-space"), Vec2::new(64.0, 24.0)), + RichText::new("Launch!") + .font(FontId::new(12.0, FontFamily::Name("semibold".into()))) + .color(Color32::from_hex("#89b4fa").unwrap()), + Atom::custom(Id::new("right-space"), Vec2::new(64.0, 24.0)), + ))) + .clicked() + { + //let cli = Cli::Client { + // server: self.selected_server.url.clone(), + //}; + + //println!("starting client with arguments: {:?}", cli); + + //*self.cli_lock.lock().unwrap() = Some(cli); + let ctx = ctx.clone(); std::thread::spawn(move || { ctx.send_viewport_cmd(egui::ViewportCommand::Close); }); - } - + ui.style_mut().visuals.widgets.inactive.bg_stroke = Stroke::NONE; ui.add_space(10.0); - ui.style_mut().visuals.widgets.active.weak_bg_fill = Color32::TRANSPARENT; ui.style_mut().visuals.widgets.hovered.weak_bg_fill = Color32::TRANSPARENT; ui.vertical(|ui| { - ui.horizontal(|ui| { - - ui.label( - RichText::new("joining as") - .size(10.0) - .weak() - ); - - ui.add( - TextEdit::singleline(&mut self.username) - .text_color(Color32::from_hex("#89b4fa").unwrap()) - .font(FontId::new(10.0, FontFamily::Name("semibold".into()))) - ); - }); - ui.horizontal(|ui| { - ui.label( - RichText::new("connecting to") - .size(10.0) - .weak() - ); - - let servers = vec![ - Server { name: "US - East".to_string(), is_prod: true, url: "wss://stk.e3t.cc".to_string() }, - Server { name: "Local Development".to_string(), is_prod: false, url: "ws://localhost:5151".to_string() }, - ]; - - ComboBox::new("combobox", "") - .selected_text(match self.selected_server.is_prod { - true => srv_string(&self.selected_server.name), - false => nonprod_srv_string(&self.selected_server.name) - }) - .icon(|_, _, _, _| {}) - .show_ui(ui, |ui| { - for srv in servers { - let s = match srv.is_prod { - true => srv_string(&srv.name), - false => nonprod_srv_string(&srv.name) - }; - ui.selectable_value(&mut self.selected_server, srv, s); - } - }); - }); + ui.horizontal(|ui| { + ui.label(RichText::new("joining as").size(10.0).weak()); + + ui.add( + TextEdit::singleline(&mut self.username) + .text_color(Color32::from_hex("#89b4fa").unwrap()) + .font(FontId::new(10.0, FontFamily::Name("semibold".into()))), + ); + }); + ui.horizontal(|ui| { + ui.label(RichText::new("connecting to").size(10.0).weak()); + + let servers = vec![ + Server { + name: "US - East".to_string(), + is_prod: true, + url: "wss://stk.e3t.cc".to_string(), + }, + Server { + name: "Local Development".to_string(), + is_prod: false, + url: "ws://localhost:5151".to_string(), + }, + ]; + + ComboBox::new("combobox", "") + .selected_text(match self.selected_server.is_prod { + true => srv_string(&self.selected_server.name), + false => nonprod_srv_string(&self.selected_server.name), + }) + .icon(|_, _, _, _| {}) + .show_ui(ui, |ui| { + for srv in servers { + let s = match srv.is_prod { + true => srv_string(&srv.name), + false => nonprod_srv_string(&srv.name), + }; + ui.selectable_value(&mut self.selected_server, srv, s); + } + }); + }); }); }); } @@ -185,8 +202,7 @@ fn custom_window_frame(ctx: &egui::Context, title: &str, add_contents: impl FnOn let app_rect = ui.max_rect(); // Add the contents: - let content_rect = app_rect - .shrink(8.0); + let content_rect = app_rect.shrink(8.0); let mut content_ui = ui.new_child(UiBuilder::new().max_rect(content_rect)); add_contents(&mut content_ui); }); diff --git a/crates/server/Cargo.lock b/crates/server/Cargo.lock deleted file mode 100644 index c47c13bb1b2594ed1f2a19074fc15d2f0cef7861..0000000000000000000000000000000000000000 --- a/crates/server/Cargo.lock +++ /dev/null @@ -1,4019 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "ab_glyph" -version = "0.2.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80179d7dd5d7e8c285d67c4a1e652972a92de7475beddfb92028c76463b13225" -dependencies = [ - "ab_glyph_rasterizer", - "owned_ttf_parser", -] - -[[package]] -name = "ab_glyph_rasterizer" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" - -[[package]] -name = "accesskit" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca8410747ed85a17c4a1e9ed3f5a74d3e7bdcc876cf9a18ff40ae21d645997b2" - -[[package]] -name = "accesskit_consumer" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c17cca53c09fbd7288667b22a201274b9becaa27f0b91bf52a526db95de45e6" -dependencies = [ - "accesskit", -] - -[[package]] -name = "accesskit_macos" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3b6ae1eabbfbced10e840fd3fce8a93ae84f174b3e4ba892ab7bcb42e477a7" -dependencies = [ - "accesskit", - "accesskit_consumer", - "objc2", - "once_cell", -] - -[[package]] -name = "accesskit_windows" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afcae27ec0974fc7c3b0b318783be89fd1b2e66dd702179fe600166a38ff4a0b" -dependencies = [ - "accesskit", - "accesskit_consumer", - "once_cell", - "paste", - "static_assertions", - "windows 0.48.0", -] - -[[package]] -name = "accesskit_winit" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88e39fcec2e10971e188730b7a76bab60647dacc973d4591855ebebcadfaa738" -dependencies = [ - "accesskit", - "accesskit_macos", - "accesskit_windows", - "winit", -] - -[[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "ahash" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" -dependencies = [ - "cfg-if", - "getrandom", - "once_cell", - "version_check", - "zerocopy", -] - -[[package]] -name = "aho-corasick" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" -dependencies = [ - "memchr", -] - -[[package]] -name = "allocator-api2" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" - -[[package]] -name = "alsa" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2562ad8dcf0f789f65c6fdaad8a8a9708ed6b488e649da28c01656ad66b8b47" -dependencies = [ - "alsa-sys", - "bitflags 1.3.2", - "libc", - "nix 0.24.3", -] - -[[package]] -name = "alsa-sys" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" -dependencies = [ - "libc", - "pkg-config", -] - -[[package]] -name = "android-activity" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64529721f27c2314ced0890ce45e469574a73e5e6fdd6e9da1860eb29285f5e0" -dependencies = [ - "android-properties", - "bitflags 1.3.2", - "cc", - "jni-sys", - "libc", - "log", - "ndk", - "ndk-context", - "ndk-sys", - "num_enum 0.6.1", -] - -[[package]] -name = "android-properties" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" - -[[package]] -name = "android_log-sys" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ecc8056bf6ab9892dcd53216c83d1597487d7dacac16c8df6b877d127df9937" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "approx" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" -dependencies = [ - "num-traits", -] - -[[package]] -name = "arrayref" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" - -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" - -[[package]] -name = "ash" -version = "0.37.3+1.3.251" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a" -dependencies = [ - "libloading 0.7.4", -] - -[[package]] -name = "async-broadcast" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" -dependencies = [ - "event-listener 2.5.3", - "futures-core", -] - -[[package]] -name = "async-channel" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" -dependencies = [ - "concurrent-queue", - "event-listener 2.5.3", - "futures-core", -] - -[[package]] -name = "async-channel" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d37875bd9915b7d67c2f117ea2c30a0989874d0b2cb694fe25403c85763c0c9e" -dependencies = [ - "concurrent-queue", - "event-listener 3.1.0", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-executor" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0c4a4f319e45986f347ee47fef8bf5e81c9abc3f6f58dc2391439f30df65f0" -dependencies = [ - "async-lock 2.8.0", - "async-task", - "concurrent-queue", - "fastrand 2.0.1", - "futures-lite 1.13.0", - "slab", -] - -[[package]] -name = "async-fs" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" -dependencies = [ - "async-lock 2.8.0", - "autocfg", - "blocking", - "futures-lite 1.13.0", -] - -[[package]] -name = "async-lock" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" -dependencies = [ - "event-listener 2.5.3", -] - -[[package]] -name = "async-lock" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb2ab2aa8a746e221ab826c73f48bc6ba41be6763f0855cb249eb6d154cf1d7" -dependencies = [ - "event-listener 3.1.0", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-task" -version = "4.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4eb2cdb97421e01129ccb49169d8279ed21e829929144f4a22a6e54ac549ca1" - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "backtrace" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.21.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" - -[[package]] -name = "bevy" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "329e344f835f5a9a4c46a6d1d57371f726aa2c482d1bd669b2b9c4eb1ee91fd7" -dependencies = [ - "bevy_internal", -] - -[[package]] -name = "bevy_a11y" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271b812e5734f5056a400f7d64592dd82d6c0e6179389c2f066f433ab8bc7692" -dependencies = [ - "accesskit", - "bevy_app", - "bevy_derive", - "bevy_ecs", -] - -[[package]] -name = "bevy_animation" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab94187a1253433e14f175293d8a86ec1c2822fda2a17807908f11ec21f45f00" -dependencies = [ - "bevy_app", - "bevy_asset", - "bevy_core", - "bevy_ecs", - "bevy_hierarchy", - "bevy_math", - "bevy_reflect", - "bevy_render", - "bevy_time", - "bevy_transform", - "bevy_utils", -] - -[[package]] -name = "bevy_app" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "172d532ea812e5954fa814dae003c207f2a0b20c6e50431787c94a7159677ece" -dependencies = [ - "bevy_derive", - "bevy_ecs", - "bevy_reflect", - "bevy_tasks", - "bevy_utils", - "downcast-rs", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "bevy_asset" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccb2b67984088b23e223cfe9ec1befd89a110665a679acb06839bc4334ed37d6" -dependencies = [ - "async-broadcast", - "async-fs", - "async-lock 2.8.0", - "bevy_app", - "bevy_asset_macros", - "bevy_ecs", - "bevy_log", - "bevy_reflect", - "bevy_tasks", - "bevy_utils", - "bevy_winit", - "blake3", - "crossbeam-channel", - "downcast-rs", - "futures-io", - "futures-lite 1.13.0", - "js-sys", - "parking_lot", - "ron", - "serde", - "thiserror", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "bevy_asset_macros" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b3245193e90fc8abcf1059a467cb224501dcda083d114c67c10ac66b7171e3a" -dependencies = [ - "bevy_macro_utils", - "proc-macro2", - "quote", - "syn 2.0.39", -] - -[[package]] -name = "bevy_audio" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478de80ff25cb7decbcb22797774d1597e8c32914e81431c67d64faadc08f84a" -dependencies = [ - "bevy_app", - "bevy_asset", - "bevy_derive", - "bevy_ecs", - "bevy_math", - "bevy_reflect", - "bevy_transform", - "bevy_utils", - "oboe", - "rodio", -] - -[[package]] -name = "bevy_core" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "025e6800b73048092a55c3611e9327ad4c4c17b60517ec1c0086bb40b4b19ea8" -dependencies = [ - "bevy_app", - "bevy_ecs", - "bevy_math", - "bevy_reflect", - "bevy_tasks", - "bevy_utils", - "bytemuck", -] - -[[package]] -name = "bevy_core_pipeline" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e4b08a2d53ba62d9ec1fca3f7f4e0f556e9f59e1c8e63a4b7c2a18c0701152c" -dependencies = [ - "bevy_app", - "bevy_asset", - "bevy_core", - "bevy_derive", - "bevy_ecs", - "bevy_log", - "bevy_math", - "bevy_reflect", - "bevy_render", - "bevy_transform", - "bevy_utils", - "bitflags 2.4.1", - "radsort", - "serde", -] - -[[package]] -name = "bevy_derive" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24bf40259be12a1a24d9fd536f5ff18d31eeb5665b77e2732899783be6edc5d6" -dependencies = [ - "bevy_macro_utils", - "quote", - "syn 2.0.39", -] - -[[package]] -name = "bevy_diagnostic" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41b5a99a9fb6cd7d1eb1714fad193944a0317f0887a15cccb8309c8d37951132" -dependencies = [ - "bevy_app", - "bevy_core", - "bevy_ecs", - "bevy_log", - "bevy_time", - "bevy_utils", - "sysinfo", -] - -[[package]] -name = "bevy_ecs" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae11a1f467c372b50e9d4b55e78370f5420c9db7416200cc441cc84f08174dd3" -dependencies = [ - "async-channel 1.9.0", - "bevy_ecs_macros", - "bevy_ptr", - "bevy_reflect", - "bevy_tasks", - "bevy_utils", - "downcast-rs", - "event-listener 2.5.3", - "fixedbitset", - "rustc-hash", - "serde", - "thiserror", - "thread_local", -] - -[[package]] -name = "bevy_ecs_macros" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f642c2b67c4d0daf8edf15074f6351457eb487a34b3de1290c760d8f3ac9ec16" -dependencies = [ - "bevy_macro_utils", - "proc-macro2", - "quote", - "syn 2.0.39", -] - -[[package]] -name = "bevy_encase_derive" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65b9fb5a62c4e3ab70caaa839470d35fa932001b1b34b08bc7f7f1909bd2b3a7" -dependencies = [ - "bevy_macro_utils", - "encase_derive_impl", -] - -[[package]] -name = "bevy_gilrs" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad31cc2c84315e0759d793d6c5bcb7d8789bbc16359c98d1b766e708c1bbae49" -dependencies = [ - "bevy_app", - "bevy_ecs", - "bevy_input", - "bevy_log", - "bevy_time", - "bevy_utils", - "gilrs", - "thiserror", -] - -[[package]] -name = "bevy_gizmos" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87d1cc978b91f416b23eb16f00e69f95c3a04582021827d8082e92d4725cc510" -dependencies = [ - "bevy_app", - "bevy_asset", - "bevy_core", - "bevy_core_pipeline", - "bevy_ecs", - "bevy_math", - "bevy_pbr", - "bevy_reflect", - "bevy_render", - "bevy_sprite", - "bevy_transform", - "bevy_utils", -] - -[[package]] -name = "bevy_gltf" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f933745c0c86e2c07948def581259b466f99708328657054e956275430ccfd7" -dependencies = [ - "base64 0.13.1", - "bevy_animation", - "bevy_app", - "bevy_asset", - "bevy_core", - "bevy_core_pipeline", - "bevy_ecs", - "bevy_hierarchy", - "bevy_log", - "bevy_math", - "bevy_pbr", - "bevy_reflect", - "bevy_render", - "bevy_scene", - "bevy_tasks", - "bevy_transform", - "bevy_utils", - "gltf", - "percent-encoding", - "serde", - "serde_json", - "thiserror", -] - -[[package]] -name = "bevy_hierarchy" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64fa240011fce8ee23f9b46e5a26a628a31d7860d6d2e4e0e361bb3ea6d5a703" -dependencies = [ - "bevy_app", - "bevy_core", - "bevy_ecs", - "bevy_log", - "bevy_reflect", - "bevy_utils", - "smallvec", -] - -[[package]] -name = "bevy_input" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e86e241b3a10b79f65a69205552546723b855d3d4c1bd8261637c076144d32f" -dependencies = [ - "bevy_app", - "bevy_ecs", - "bevy_math", - "bevy_reflect", - "bevy_utils", - "thiserror", -] - -[[package]] -name = "bevy_internal" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55124e486814c4d3632d5cfad9c4f4e46d052c028593ec46fef5bfbfb0f840b1" -dependencies = [ - "bevy_a11y", - "bevy_animation", - "bevy_app", - "bevy_asset", - "bevy_audio", - "bevy_core", - "bevy_core_pipeline", - "bevy_derive", - "bevy_diagnostic", - "bevy_ecs", - "bevy_gilrs", - "bevy_gizmos", - "bevy_gltf", - "bevy_hierarchy", - "bevy_input", - "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", - "bevy_window", - "bevy_winit", -] - -[[package]] -name = "bevy_log" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "011417debf7868b45932bb97fc0d5bfdeaf9304e324aa94840e2f1e6deeed69d" -dependencies = [ - "android_log-sys", - "bevy_app", - "bevy_ecs", - "bevy_utils", - "console_error_panic_hook", - "tracing-log 0.1.4", - "tracing-subscriber", - "tracing-wasm", -] - -[[package]] -name = "bevy_macro_utils" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf6fba87c6d069fcbcd8a48625ca8ab4392ad40d2b260863ce7d641a0f42986d" -dependencies = [ - "proc-macro2", - "quote", - "rustc-hash", - "syn 2.0.39", - "toml_edit 0.20.7", -] - -[[package]] -name = "bevy_math" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "752764558a1f429c20704c3b836a019fa308961c43fdfef4f08e339d456c96be" -dependencies = [ - "glam", - "serde", -] - -[[package]] -name = "bevy_mikktspace" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b596c41a56f2268ec7cde560edc588bc7b5886e4b49c8b27c4dcc9f7c743424c" -dependencies = [ - "glam", -] - -[[package]] -name = "bevy_pbr" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb6a35a78d355cc21c10f277dcd171eca65e30a90e76eb89f4dacf606621fe1" -dependencies = [ - "bevy_app", - "bevy_asset", - "bevy_core_pipeline", - "bevy_derive", - "bevy_ecs", - "bevy_math", - "bevy_reflect", - "bevy_render", - "bevy_transform", - "bevy_utils", - "bevy_window", - "bitflags 2.4.1", - "bytemuck", - "fixedbitset", - "naga_oil", - "radsort", - "smallvec", - "thread_local", -] - -[[package]] -name = "bevy_ptr" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308a02679f6ce21ef71de20fae6d6a2016c07baa21d8e8d0558e6b7851e8adf2" - -[[package]] -name = "bevy_reflect" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdd56914a8ad57621d7a1a099f7e6b1f7482c9c76cedc9c3d4c175a203939c5d" -dependencies = [ - "bevy_math", - "bevy_ptr", - "bevy_reflect_derive", - "bevy_utils", - "downcast-rs", - "erased-serde", - "glam", - "serde", - "smallvec", - "smol_str", - "thiserror", -] - -[[package]] -name = "bevy_reflect_derive" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25f627907c40ac552f798423447fc331fc1ddacd94c5f7a2a70942eb06bc8447" -dependencies = [ - "bevy_macro_utils", - "proc-macro2", - "quote", - "syn 2.0.39", - "uuid", -] - -[[package]] -name = "bevy_render" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90d777f4c51bd58e9e40777c6cb8dde0778df7e2c5298b3f9e3455bd12a9856c" -dependencies = [ - "async-channel 1.9.0", - "bevy_app", - "bevy_asset", - "bevy_core", - "bevy_derive", - "bevy_ecs", - "bevy_encase_derive", - "bevy_hierarchy", - "bevy_log", - "bevy_math", - "bevy_mikktspace", - "bevy_reflect", - "bevy_render_macros", - "bevy_tasks", - "bevy_time", - "bevy_transform", - "bevy_utils", - "bevy_window", - "bitflags 2.4.1", - "bytemuck", - "codespan-reporting", - "downcast-rs", - "encase", - "futures-lite 1.13.0", - "hexasphere", - "image", - "js-sys", - "ktx2", - "naga", - "naga_oil", - "ruzstd", - "serde", - "smallvec", - "thiserror", - "thread_local", - "wasm-bindgen", - "web-sys", - "wgpu", -] - -[[package]] -name = "bevy_render_macros" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35b00c3d0abff94a729460fc9aa95c2ceac71b49b3041166bb5ba3098e9657e7" -dependencies = [ - "bevy_macro_utils", - "proc-macro2", - "quote", - "syn 2.0.39", -] - -[[package]] -name = "bevy_scene" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6294396a6375f0b14341d8003408c10aa040e3f833ac8bd49677170ec55d73" -dependencies = [ - "bevy_app", - "bevy_asset", - "bevy_derive", - "bevy_ecs", - "bevy_hierarchy", - "bevy_reflect", - "bevy_render", - "bevy_transform", - "bevy_utils", - "ron", - "serde", - "thiserror", - "uuid", -] - -[[package]] -name = "bevy_sprite" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4f7d1f88a6e5497fdafd95c20984a1d1b5517bc39d51600b4988cd60c51837a" -dependencies = [ - "bevy_app", - "bevy_asset", - "bevy_core_pipeline", - "bevy_derive", - "bevy_ecs", - "bevy_log", - "bevy_math", - "bevy_reflect", - "bevy_render", - "bevy_transform", - "bevy_utils", - "bitflags 2.4.1", - "bytemuck", - "fixedbitset", - "guillotiere", - "radsort", - "rectangle-pack", - "thiserror", -] - -[[package]] -name = "bevy_tasks" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a45be906618192515bc613e46546150089adbb4a82178dc462045acd1e89e92" -dependencies = [ - "async-channel 1.9.0", - "async-executor", - "async-task", - "concurrent-queue", - "futures-lite 1.13.0", - "wasm-bindgen-futures", -] - -[[package]] -name = "bevy_text" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c136af700af4f87c94f68d6e019528c371bf09ebf4a8ff7468bb3c73806b34f5" -dependencies = [ - "ab_glyph", - "bevy_app", - "bevy_asset", - "bevy_ecs", - "bevy_math", - "bevy_reflect", - "bevy_render", - "bevy_sprite", - "bevy_transform", - "bevy_utils", - "bevy_window", - "glyph_brush_layout", - "serde", - "thiserror", -] - -[[package]] -name = "bevy_time" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b29709cadf22d318a0b7c79f763e9c5ac414292bd0e850066fa935959021b276" -dependencies = [ - "bevy_app", - "bevy_ecs", - "bevy_reflect", - "bevy_utils", - "crossbeam-channel", - "thiserror", -] - -[[package]] -name = "bevy_transform" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70262c51e915b6224129206d23823364e650cf5eb5f4b6ce3ee379f608c180d2" -dependencies = [ - "bevy_app", - "bevy_ecs", - "bevy_hierarchy", - "bevy_math", - "bevy_reflect", - "thiserror", -] - -[[package]] -name = "bevy_twite" -version = "0.1.0" -source = "git+https://gitlab.com/ghostlyzsh/twite.git#6d54f37b7c392d2df993ee1cae2064b7ac410da7" -dependencies = [ - "bevy", - "crossbeam-channel", - "twite", -] - -[[package]] -name = "bevy_ui" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd5ecbf2dceaab118769dd870e34d780bfde556af561fd10d8d613b0f237297e" -dependencies = [ - "bevy_a11y", - "bevy_app", - "bevy_asset", - "bevy_core_pipeline", - "bevy_derive", - "bevy_ecs", - "bevy_hierarchy", - "bevy_input", - "bevy_log", - "bevy_math", - "bevy_reflect", - "bevy_render", - "bevy_sprite", - "bevy_text", - "bevy_transform", - "bevy_utils", - "bevy_window", - "bytemuck", - "serde", - "smallvec", - "taffy", - "thiserror", -] - -[[package]] -name = "bevy_utils" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e75d4a34ef0b15dffd1ee9079ef1f0f5139527e192b9d5708b3e158777c753" -dependencies = [ - "ahash", - "bevy_utils_proc_macros", - "getrandom", - "hashbrown 0.14.2", - "instant", - "nonmax", - "petgraph", - "thiserror", - "tracing", - "uuid", -] - -[[package]] -name = "bevy_utils_proc_macros" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7dfd3735a61a1b681ed1e176afe4eae731bbb03e51ad871e9eb39e76a2d170e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.39", -] - -[[package]] -name = "bevy_window" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e60d1830b3fbd7db5bfea7ac9fcd0f5e1d1af88c91ab469e697ab176d8b3140b" -dependencies = [ - "bevy_a11y", - "bevy_app", - "bevy_ecs", - "bevy_input", - "bevy_math", - "bevy_reflect", - "bevy_utils", - "raw-window-handle", -] - -[[package]] -name = "bevy_winit" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f8294e78c6a1f9c34d36501a377c5d20bf0fa23a0958187bb270187741448ba" -dependencies = [ - "accesskit_winit", - "approx", - "bevy_a11y", - "bevy_app", - "bevy_derive", - "bevy_ecs", - "bevy_hierarchy", - "bevy_input", - "bevy_math", - "bevy_tasks", - "bevy_utils", - "bevy_window", - "crossbeam-channel", - "raw-window-handle", - "wasm-bindgen", - "web-sys", - "winit", -] - -[[package]] -name = "bindgen" -version = "0.69.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ffcebc3849946a7170a05992aac39da343a90676ab392c51a4280981d6379c2" -dependencies = [ - "bitflags 2.4.1", - "cexpr", - "clang-sys", - "lazy_static", - "lazycell", - "peeking_take_while", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn 2.0.39", -] - -[[package]] -name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" -dependencies = [ - "serde", -] - -[[package]] -name = "blake3" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0231f06152bf547e9c2b5194f247cd97aacf6dcd8b15d8e5ec0663f64580da87" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if", - "constant_time_eq", -] - -[[package]] -name = "block" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-sys" -version = "0.1.0-beta.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa55741ee90902547802152aaf3f8e5248aab7e21468089560d4c8840561146" -dependencies = [ - "objc-sys", -] - -[[package]] -name = "block2" -version = "0.2.0-alpha.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dd9e63c1744f755c2f60332b88de39d341e5e86239014ad839bd71c106dec42" -dependencies = [ - "block-sys", - "objc2-encode", -] - -[[package]] -name = "blocking" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" -dependencies = [ - "async-channel 2.1.0", - "async-lock 3.1.0", - "async-task", - "fastrand 2.0.1", - "futures-io", - "futures-lite 2.0.1", - "piper", - "tracing", -] - -[[package]] -name = "bumpalo" -version = "3.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" - -[[package]] -name = "bytemuck" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" -dependencies = [ - "bytemuck_derive", -] - -[[package]] -name = "bytemuck_derive" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.39", -] - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" - -[[package]] -name = "cc" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "jobserver", - "libc", -] - -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" - -[[package]] -name = "clang-sys" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" -dependencies = [ - "glob", - "libc", - "libloading 0.7.4", -] - -[[package]] -name = "codespan-reporting" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" -dependencies = [ - "termcolor", - "unicode-width", -] - -[[package]] -name = "color_quant" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" - -[[package]] -name = "com-rs" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf43edc576402991846b093a7ca18a3477e0ef9c588cde84964b5d3e43016642" - -[[package]] -name = "combine" -version = "4.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" -dependencies = [ - "bytes", - "memchr", -] - -[[package]] -name = "concurrent-queue" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f057a694a54f12365049b0958a1685bb52d567f5593b355fbf685838e873d400" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "console_error_panic_hook" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" -dependencies = [ - "cfg-if", - "wasm-bindgen", -] - -[[package]] -name = "const_panic" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6051f239ecec86fde3410901ab7860d458d160371533842974fc61f96d15879b" - -[[package]] -name = "const_soft_float" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ca1caa64ef4ed453e68bb3db612e51cf1b2f5b871337f0fcab1c8f87cc3dff" - -[[package]] -name = "constant_time_eq" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" - -[[package]] -name = "constgebra" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edd23e864550e6dafc1e41ac78ce4f1ccddc8672b40c403524a04ff3f0518420" -dependencies = [ - "const_soft_float", -] - -[[package]] -name = "core-foundation" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" - -[[package]] -name = "core-graphics" -version = "0.22.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-graphics-types", - "foreign-types 0.3.2", - "libc", -] - -[[package]] -name = "core-graphics-types" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb142d41022986c1d8ff29103a1411c8a3dfad3552f87a4f8dc50d61d4f4e33" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "libc", -] - -[[package]] -name = "coreaudio-rs" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" -dependencies = [ - "bitflags 1.3.2", - "core-foundation-sys", - "coreaudio-sys", -] - -[[package]] -name = "coreaudio-sys" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3120ebb80a9de008e638ad833d4127d50ea3d3a960ea23ea69bc66d9358a028" -dependencies = [ - "bindgen", -] - -[[package]] -name = "cpal" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d959d90e938c5493000514b446987c07aed46c668faaa7d34d6c7a67b1a578c" -dependencies = [ - "alsa", - "core-foundation-sys", - "coreaudio-rs", - "dasp_sample", - "jni 0.19.0", - "js-sys", - "libc", - "mach2", - "ndk", - "ndk-context", - "oboe", - "once_cell", - "parking_lot", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows 0.46.0", -] - -[[package]] -name = "cpufeatures" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" -dependencies = [ - "libc", -] - -[[package]] -name = "crc32fast" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" -dependencies = [ - "cfg-if", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "d3d12" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16e44ab292b1dddfdaf7be62cfd8877df52f2f3fde5858d95bab606be259f20" -dependencies = [ - "bitflags 2.4.1", - "libloading 0.8.1", - "winapi", -] - -[[package]] -name = "dasp_sample" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" - -[[package]] -name = "data-encoding" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "crypto-common", -] - -[[package]] -name = "dispatch" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" - -[[package]] -name = "downcast-rs" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" - -[[package]] -name = "encase" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fce2eeef77fd4a293a54b62aa00ac9daebfbcda4bf8998c5a815635b004aa1c" -dependencies = [ - "const_panic", - "encase_derive", - "glam", - "thiserror", -] - -[[package]] -name = "encase_derive" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e520cde08cbf4f7cc097f61573ec06ce467019803de8ae82fb2823fa1554a0e" -dependencies = [ - "encase_derive_impl", -] - -[[package]] -name = "encase_derive_impl" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fe2568f851fd6144a45fa91cfed8fe5ca8fc0b56ba6797bfc1ed2771b90e37c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.39", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "erased-serde" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c138974f9d5e7fe373eb04df7cae98833802ae4b11c24ac7039a21d5af4b26c" -dependencies = [ - "serde", -] - -[[package]] -name = "euclid" -version = "0.22.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f253bc5c813ca05792837a0ff4b3a580336b224512d48f7eda1d7dd9210787" -dependencies = [ - "num-traits", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "event-listener" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96b852f1345da36d551b9473fa1e2b1eb5c5195585c6c018118bc92a8d91160" -dependencies = [ - "event-listener 3.1.0", - "pin-project-lite", -] - -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - -[[package]] -name = "fastrand" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" - -[[package]] -name = "fdeflate" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64d6dafc854908ff5da46ff3f8f473c6984119a2876a383a860246dd7841a868" -dependencies = [ - "simd-adler32", -] - -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - -[[package]] -name = "flate2" -version = "1.0.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" -dependencies = [ - "crc32fast", - "miniz_oxide", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared 0.1.1", -] - -[[package]] -name = "foreign-types" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" -dependencies = [ - "foreign-types-macros", - "foreign-types-shared 0.3.1", -] - -[[package]] -name = "foreign-types-macros" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.39", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "foreign-types-shared" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" - -[[package]] -name = "form_urlencoded" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures-core" -version = "0.3.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" - -[[package]] -name = "futures-io" -version = "0.3.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" - -[[package]] -name = "futures-lite" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] - -[[package]] -name = "futures-lite" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3831c2651acb5177cbd83943f3d9c8912c5ad03c76afcc0e9511ba568ec5ebb" -dependencies = [ - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", -] - -[[package]] -name = "gilrs" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e9eec02069fcbd7abe00a28adf216547774889129a777cb5e53fdfb75d59f09" -dependencies = [ - "fnv", - "gilrs-core", - "log", - "uuid", - "vec_map", -] - -[[package]] -name = "gilrs-core" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "178769da179a47b187837d1ab2b5b9b684a21180166a77a4ca37e7e58ee3833d" -dependencies = [ - "core-foundation", - "inotify", - "io-kit-sys", - "js-sys", - "libc", - "libudev-sys", - "log", - "nix 0.27.1", - "uuid", - "vec_map", - "wasm-bindgen", - "web-sys", - "windows 0.51.1", -] - -[[package]] -name = "gimli" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" - -[[package]] -name = "glam" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5418c17512bdf42730f9032c74e1ae39afc408745ebb2acf72fbc4691c17945" -dependencies = [ - "bytemuck", - "serde", -] - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "glow" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca0fe580e4b60a8ab24a868bc08e2f03cbcb20d3d676601fa909386713333728" -dependencies = [ - "js-sys", - "slotmap", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "gltf" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad2dcfb6dd7a66f9eb3d181a29dcfb22d146b0bcdc2e1ed1713cbf03939a88ea" -dependencies = [ - "byteorder", - "gltf-json", - "lazy_static", -] - -[[package]] -name = "gltf-derive" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cbcea5dd47e7ad4e9ee6f040384fcd7204bbf671aa4f9e7ca7dfc9bfa1de20" -dependencies = [ - "inflections", - "proc-macro2", - "quote", - "syn 2.0.39", -] - -[[package]] -name = "gltf-json" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5b810806b78dde4b71a95cc0e6fdcab34c4c617da3574df166f9987be97d03" -dependencies = [ - "gltf-derive", - "serde", - "serde_derive", - "serde_json", -] - -[[package]] -name = "glyph_brush_layout" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc32c2334f00ca5ac3695c5009ae35da21da8c62d255b5b96d56e2597a637a38" -dependencies = [ - "ab_glyph", - "approx", - "xi-unicode", -] - -[[package]] -name = "gpu-alloc" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" -dependencies = [ - "bitflags 2.4.1", - "gpu-alloc-types", -] - -[[package]] -name = "gpu-alloc-types" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" -dependencies = [ - "bitflags 2.4.1", -] - -[[package]] -name = "gpu-allocator" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce95f9e2e11c2c6fadfce42b5af60005db06576f231f5c92550fdded43c423e8" -dependencies = [ - "backtrace", - "log", - "thiserror", - "winapi", - "windows 0.44.0", -] - -[[package]] -name = "gpu-descriptor" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c" -dependencies = [ - "bitflags 2.4.1", - "gpu-descriptor-types", - "hashbrown 0.14.2", -] - -[[package]] -name = "gpu-descriptor-types" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff3556b8b78c" -dependencies = [ - "bitflags 2.4.1", -] - -[[package]] -name = "grid" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eec1c01eb1de97451ee0d60de7d81cf1e72aabefb021616027f3d1c3ec1c723c" - -[[package]] -name = "guillotiere" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62d5865c036cb1393e23c50693df631d3f5d7bcca4c04fe4cc0fd592e74a782" -dependencies = [ - "euclid", - "svg_fmt", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.14.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" -dependencies = [ - "ahash", - "allocator-api2", - "serde", -] - -[[package]] -name = "hassle-rs" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1397650ee315e8891a0df210707f0fc61771b0cc518c3023896064c5407cb3b0" -dependencies = [ - "bitflags 1.3.2", - "com-rs", - "libc", - "libloading 0.7.4", - "thiserror", - "widestring", - "winapi", -] - -[[package]] -name = "hexasphere" -version = "9.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cb3df16a7bcb1b5bc092abd55e14f77ca70aea14445026e264586fc62889a10" -dependencies = [ - "constgebra", - "glam", -] - -[[package]] -name = "hexf-parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" - -[[package]] -name = "idna" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "image" -version = "0.24.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711" -dependencies = [ - "bytemuck", - "byteorder", - "color_quant", - "num-rational", - "num-traits", - "png", -] - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", -] - -[[package]] -name = "indexmap" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" -dependencies = [ - "equivalent", - "hashbrown 0.14.2", -] - -[[package]] -name = "inflections" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a" - -[[package]] -name = "inotify" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd168d97690d0b8c412d6b6c10360277f4d7ee495c5d0d5d5fe0854923255cc" -dependencies = [ - "bitflags 1.3.2", - "inotify-sys", - "libc", -] - -[[package]] -name = "inotify-sys" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" -dependencies = [ - "libc", -] - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "io-kit-sys" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4769cb30e5dcf1710fc6730d3e94f78c47723a014a567de385e113c737394640" -dependencies = [ - "core-foundation-sys", - "mach2", -] - -[[package]] -name = "itoa" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" - -[[package]] -name = "jni" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" -dependencies = [ - "cesu8", - "combine", - "jni-sys", - "log", - "thiserror", - "walkdir", -] - -[[package]] -name = "jni" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" -dependencies = [ - "cesu8", - "combine", - "jni-sys", - "log", - "thiserror", - "walkdir", -] - -[[package]] -name = "jni-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" - -[[package]] -name = "jobserver" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" -dependencies = [ - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "khronos-egl" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c2352bd1d0bceb871cb9d40f24360c8133c11d7486b68b5381c1dd1a32015e3" -dependencies = [ - "libc", - "libloading 0.7.4", - "pkg-config", -] - -[[package]] -name = "ktx2" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87d65e08a9ec02e409d27a0139eaa6b9756b4d81fe7cde71f6941a83730ce838" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "lewton" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "777b48df9aaab155475a83a7df3070395ea1ac6902f5cd062b8f2b028075c030" -dependencies = [ - "byteorder", - "ogg", - "tinyvec", -] - -[[package]] -name = "libc" -version = "0.2.150" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" - -[[package]] -name = "libloading" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" -dependencies = [ - "cfg-if", - "winapi", -] - -[[package]] -name = "libloading" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "libredox" -version = "0.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" -dependencies = [ - "bitflags 2.4.1", - "libc", - "redox_syscall 0.4.1", -] - -[[package]] -name = "libudev-sys" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324" -dependencies = [ - "libc", - "pkg-config", -] - -[[package]] -name = "lock_api" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" - -[[package]] -name = "mach2" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d0d1830bcd151a6fc4aea1369af235b36c1528fe976b8ff678683c9995eade8" -dependencies = [ - "libc", -] - -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", -] - -[[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata 0.1.10", -] - -[[package]] -name = "memchr" -version = "2.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" - -[[package]] -name = "metal" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "623b5e6cefd76e58f774bd3cc0c6f5c7615c58c03a97815245a25c3c9bdee318" -dependencies = [ - "bitflags 2.4.1", - "block", - "core-graphics-types", - "foreign-types 0.5.0", - "log", - "objc", - "paste", -] - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", - "simd-adler32", -] - -[[package]] -name = "mio" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" -dependencies = [ - "libc", - "log", - "wasi", - "windows-sys 0.48.0", -] - -[[package]] -name = "naga" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ceaaa4eedaece7e4ec08c55c640ba03dbb73fb812a6570a59bcf1930d0f70e" -dependencies = [ - "bit-set", - "bitflags 2.4.1", - "codespan-reporting", - "hexf-parse", - "indexmap 1.9.3", - "log", - "num-traits", - "pp-rs", - "rustc-hash", - "spirv", - "termcolor", - "thiserror", - "unicode-xid", -] - -[[package]] -name = "naga_oil" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac54c77b3529887f9668d3dd81e955e58f252b31a333f836e3548c06460b958" -dependencies = [ - "bit-set", - "codespan-reporting", - "data-encoding", - "indexmap 1.9.3", - "naga", - "once_cell", - "regex", - "regex-syntax 0.7.5", - "rustc-hash", - "thiserror", - "tracing", - "unicode-ident", -] - -[[package]] -name = "ndk" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" -dependencies = [ - "bitflags 1.3.2", - "jni-sys", - "ndk-sys", - "num_enum 0.5.11", - "raw-window-handle", - "thiserror", -] - -[[package]] -name = "ndk-context" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" - -[[package]] -name = "ndk-sys" -version = "0.4.1+23.1.7779620" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cf2aae958bd232cac5069850591667ad422d263686d75b52a065f9badeee5a3" -dependencies = [ - "jni-sys", -] - -[[package]] -name = "nix" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "libc", -] - -[[package]] -name = "nix" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" -dependencies = [ - "bitflags 2.4.1", - "cfg-if", - "libc", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "nonmax" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e4a593ea4fffed8684ad13d75c82cf0b6dc2b88947e0ed85b9e70f555a7e422" - -[[package]] -name = "ntapi" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" -dependencies = [ - "winapi", -] - -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - -[[package]] -name = "num-derive" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_enum" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" -dependencies = [ - "num_enum_derive 0.5.11", -] - -[[package]] -name = "num_enum" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" -dependencies = [ - "num_enum_derive 0.6.1", -] - -[[package]] -name = "num_enum_derive" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "num_enum_derive" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.39", -] - -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", - "objc_exception", -] - -[[package]] -name = "objc-sys" -version = "0.2.0-beta.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b9834c1e95694a05a828b59f55fa2afec6288359cda67146126b3f90a55d7" - -[[package]] -name = "objc2" -version = "0.3.0-beta.3.patch-leaks.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e01640f9f2cb1220bbe80325e179e532cb3379ebcd1bf2279d703c19fe3a468" -dependencies = [ - "block2", - "objc-sys", - "objc2-encode", -] - -[[package]] -name = "objc2-encode" -version = "2.0.0-pre.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abfcac41015b00a120608fdaa6938c44cb983fee294351cc4bac7638b4e50512" -dependencies = [ - "objc-sys", -] - -[[package]] -name = "objc_exception" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" -dependencies = [ - "cc", -] - -[[package]] -name = "object" -version = "0.32.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" -dependencies = [ - "memchr", -] - -[[package]] -name = "oboe" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8868cc237ee02e2d9618539a23a8d228b9bb3fc2e7a5b11eed3831de77c395d0" -dependencies = [ - "jni 0.20.0", - "ndk", - "ndk-context", - "num-derive", - "num-traits", - "oboe-sys", -] - -[[package]] -name = "oboe-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f44155e7fb718d3cfddcf70690b2b51ac4412f347cd9e4fbe511abe9cd7b5f2" -dependencies = [ - "cc", -] - -[[package]] -name = "ogg" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6951b4e8bf21c8193da321bcce9c9dd2e13c858fe078bf9054a288b419ae5d6e" -dependencies = [ - "byteorder", -] - -[[package]] -name = "once_cell" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" - -[[package]] -name = "orbclient" -version = "0.3.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f0d54bde9774d3a51dcf281a5def240c71996bc6ca05d2c847ec8b2b216166" -dependencies = [ - "libredox", -] - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "owned_ttf_parser" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4586edfe4c648c71797a74c84bacb32b52b212eff5dfe2bb9f2c599844023e7" -dependencies = [ - "ttf-parser", -] - -[[package]] -name = "parking" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" - -[[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", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.4.1", - "smallvec", - "windows-targets 0.48.5", -] - -[[package]] -name = "paste" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" - -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - -[[package]] -name = "percent-encoding" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" - -[[package]] -name = "petgraph" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" -dependencies = [ - "fixedbitset", - "indexmap 2.1.0", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" - -[[package]] -name = "piper" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" -dependencies = [ - "atomic-waker", - "fastrand 2.0.1", - "futures-io", -] - -[[package]] -name = "pkg-config" -version = "0.3.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" - -[[package]] -name = "png" -version = "0.17.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64" -dependencies = [ - "bitflags 1.3.2", - "crc32fast", - "fdeflate", - "flate2", - "miniz_oxide", -] - -[[package]] -name = "pp-rs" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb458bb7f6e250e6eb79d5026badc10a3ebb8f9a15d1fff0f13d17c71f4d6dee" -dependencies = [ - "unicode-xid", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit 0.19.15", -] - -[[package]] -name = "proc-macro2" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "profiling" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f89dff0959d98c9758c88826cc002e2c3d0b9dfac4139711d1f30de442f1139b" - -[[package]] -name = "quote" -version = "1.0.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" -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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "range-alloc" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab" - -[[package]] -name = "raw-window-handle" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" - -[[package]] -name = "rectangle-pack" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0d463f2884048e7153449a55166f91028d5b0ea53c79377099ce4e8cf0cf9bb" - -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "regex" -version = "1.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.3", - "regex-syntax 0.8.2", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", -] - -[[package]] -name = "regex-automata" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.8.2", -] - -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" - -[[package]] -name = "regex-syntax" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" - -[[package]] -name = "renderdoc-sys" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216080ab382b992234dda86873c18d4c48358f5cfcb70fd693d7f6f2131b628b" - -[[package]] -name = "rmp" -version = "0.8.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9860a6cc38ed1da53456442089b4dfa35e7cedaa326df63017af88385e6b20" -dependencies = [ - "byteorder", - "num-traits", - "paste", -] - -[[package]] -name = "rmp-serde" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bffea85eea980d8a74453e5d02a8d93028f3c34725de143085a844ebe953258a" -dependencies = [ - "byteorder", - "rmp", - "serde", -] - -[[package]] -name = "rodio" -version = "0.17.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b1bb7b48ee48471f55da122c0044fcc7600cfcc85db88240b89cb832935e611" -dependencies = [ - "cpal", - "lewton", -] - -[[package]] -name = "ron" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" -dependencies = [ - "base64 0.21.5", - "bitflags 2.4.1", - "serde", - "serde_derive", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "ruzstd" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3ffab8f9715a0d455df4bbb9d21e91135aab3cd3ca187af0cd0c3c3f868fdc" -dependencies = [ - "byteorder", - "thiserror-core", - "twox-hash", -] - -[[package]] -name = "ryu" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "serde" -version = "1.0.192" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bca2a08484b285dcb282d0f67b26cadc0df8b19f8c12502c13d966bf9482f001" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.192" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6c7207fbec9faa48073f3e3074cbe553af6ea512d7c21ba46e434e70ea9fbc1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.39", -] - -[[package]] -name = "serde_json" -version = "1.0.108" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "server" -version = "0.0.1" -dependencies = [ - "bevy", - "bevy_twite", - "rmp", - "rmp-serde", - "serde", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shlex" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380" - -[[package]] -name = "simd-adler32" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "slotmap" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e08e261d0e8f5c43123b7adf3e4ca1690d655377ac93a03b2c9d3e98de1342" -dependencies = [ - "version_check", -] - -[[package]] -name = "smallvec" -version = "1.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" -dependencies = [ - "serde", -] - -[[package]] -name = "smol_str" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74212e6bbe9a4352329b2f68ba3130c15a3f26fe88ff22dbdc6cdd58fa85e99c" -dependencies = [ - "serde", -] - -[[package]] -name = "spirv" -version = "0.2.0+1.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "246bfa38fe3db3f1dfc8ca5a2cdeb7348c78be2112740cc0ec8ef18b6d94f830" -dependencies = [ - "bitflags 1.3.2", - "num-traits", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "svg_fmt" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fb1df15f412ee2e9dfc1c504260fa695c1c3f10fe9f4a6ee2d2184d7d6450e2" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sysinfo" -version = "0.29.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a18d114d420ada3a891e6bc8e96a2023402203296a47cdd65083377dad18ba5" -dependencies = [ - "cfg-if", - "core-foundation-sys", - "libc", - "ntapi", - "once_cell", - "winapi", -] - -[[package]] -name = "taffy" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c2287b6d7f721ada4cddf61ade5e760b2c6207df041cac9bfaa192897362fd3" -dependencies = [ - "arrayvec", - "grid", - "num-traits", - "slotmap", -] - -[[package]] -name = "termcolor" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "thiserror" -version = "1.0.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-core" -version = "1.0.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d97345f6437bb2004cd58819d8a9ef8e36cdd7661c2abc4bbde0a7c40d9f497" -dependencies = [ - "thiserror-core-impl", -] - -[[package]] -name = "thiserror-core-impl" -version = "1.0.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10ac1c5050e43014d16b2f94d0d2ce79e65ffdd8b38d8048f9c8f6a8a6da62ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.50" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.39", -] - -[[package]] -name = "thread_local" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" -dependencies = [ - "cfg-if", - "once_cell", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "toml_datetime" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" - -[[package]] -name = "toml_edit" -version = "0.19.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" -dependencies = [ - "indexmap 2.1.0", - "toml_datetime", - "winnow", -] - -[[package]] -name = "toml_edit" -version = "0.20.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" -dependencies = [ - "indexmap 2.1.0", - "toml_datetime", - "winnow", -] - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.39", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log 0.2.0", -] - -[[package]] -name = "tracing-wasm" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4575c663a174420fa2d78f4108ff68f65bf2fbb7dd89f33749b6e826b3626e07" -dependencies = [ - "tracing", - "tracing-subscriber", - "wasm-bindgen", -] - -[[package]] -name = "ttf-parser" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" - -[[package]] -name = "twite" -version = "0.1.0" -source = "git+https://gitlab.com/ghostlyzsh/twite.git#6d54f37b7c392d2df993ee1cae2064b7ac410da7" -dependencies = [ - "base64 0.21.5", - "rand", - "sha1", - "url", -] - -[[package]] -name = "twox-hash" -version = "1.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" -dependencies = [ - "cfg-if", - "static_assertions", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "unicode-bidi" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-width" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" - -[[package]] -name = "unicode-xid" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" - -[[package]] -name = "url" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "uuid" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ad59a7560b41a70d191093a945f0b87bc1deeda46fb237479708a1d6b6cdfc" -dependencies = [ - "getrandom", - "serde", -] - -[[package]] -name = "valuable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" - -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "waker-fn" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" - -[[package]] -name = "walkdir" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.88" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.88" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.39", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.88" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.88" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.39", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.88" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" - -[[package]] -name = "wayland-scanner" -version = "0.29.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" -dependencies = [ - "proc-macro2", - "quote", - "xml-rs", -] - -[[package]] -name = "web-sys" -version = "0.3.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "wgpu" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "752e44d3998ef35f71830dd1ad3da513e628e2e4d4aedb0ab580f850827a0b41" -dependencies = [ - "arrayvec", - "cfg-if", - "js-sys", - "log", - "naga", - "parking_lot", - "profiling", - "raw-window-handle", - "smallvec", - "static_assertions", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "wgpu-core", - "wgpu-hal", - "wgpu-types", -] - -[[package]] -name = "wgpu-core" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f8a44dd301a30ceeed3c27d8c0090433d3da04d7b2a4042738095a424d12ae7" -dependencies = [ - "arrayvec", - "bit-vec", - "bitflags 2.4.1", - "codespan-reporting", - "log", - "naga", - "parking_lot", - "profiling", - "raw-window-handle", - "rustc-hash", - "smallvec", - "thiserror", - "web-sys", - "wgpu-hal", - "wgpu-types", -] - -[[package]] -name = "wgpu-hal" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a80bf0e3c77399bb52850cb0830af9bad073d5cfcb9dd8253bef8125c42db17" -dependencies = [ - "android_system_properties", - "arrayvec", - "ash", - "bit-set", - "bitflags 2.4.1", - "block", - "core-graphics-types", - "d3d12", - "glow", - "gpu-alloc", - "gpu-allocator", - "gpu-descriptor", - "hassle-rs", - "js-sys", - "khronos-egl", - "libc", - "libloading 0.8.1", - "log", - "metal", - "naga", - "objc", - "parking_lot", - "profiling", - "range-alloc", - "raw-window-handle", - "renderdoc-sys", - "rustc-hash", - "smallvec", - "thiserror", - "wasm-bindgen", - "web-sys", - "wgpu-types", - "winapi", -] - -[[package]] -name = "wgpu-types" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee64d7398d0c2f9ca48922c902ef69c42d000c759f3db41e355f4a570b052b67" -dependencies = [ - "bitflags 2.4.1", - "js-sys", - "web-sys", -] - -[[package]] -name = "widestring" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" -dependencies = [ - "winapi", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows" -version = "0.44.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e745dab35a0c4c77aa3ce42d595e13d2003d6902d6b08c9ef5fc326d08da12b" -dependencies = [ - "windows-targets 0.42.2", -] - -[[package]] -name = "windows" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdacb41e6a96a052c6cb63a144f24900236121c6f63f4f8219fef5977ecb0c25" -dependencies = [ - "windows-targets 0.42.2", -] - -[[package]] -name = "windows" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-targets 0.48.5", -] - -[[package]] -name = "windows" -version = "0.51.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" -dependencies = [ - "windows-core", - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-core" -version = "0.51.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-implement" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e2ee588991b9e7e6c8338edf3333fbe4da35dc72092643958ebb43f0ab2c49c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "windows-interface" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6fb8df20c9bcaa8ad6ab513f7b40104840c8867d5751126e4df3b08388d0cc7" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "winit" -version = "0.28.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9596d90b45384f5281384ab204224876e8e8bf7d58366d9b795ad99aa9894b94" -dependencies = [ - "android-activity", - "bitflags 1.3.2", - "cfg_aliases", - "core-foundation", - "core-graphics", - "dispatch", - "instant", - "libc", - "log", - "mio", - "ndk", - "objc2", - "once_cell", - "orbclient", - "percent-encoding", - "raw-window-handle", - "redox_syscall 0.3.5", - "wasm-bindgen", - "wayland-scanner", - "web-sys", - "windows-sys 0.45.0", - "x11-dl", -] - -[[package]] -name = "winnow" -version = "0.5.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" -dependencies = [ - "memchr", -] - -[[package]] -name = "x11-dl" -version = "2.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" -dependencies = [ - "libc", - "once_cell", - "pkg-config", -] - -[[package]] -name = "xi-unicode" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a67300977d3dc3f8034dae89778f502b6ba20b269527b3223ba59c0cf393bb8a" - -[[package]] -name = "xml-rs" -version = "0.8.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" - -[[package]] -name = "zerocopy" -version = "0.7.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e97e415490559a91254a2979b4829267a57d2fcd741a98eee8b722fb57289aa0" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd7e48ccf166952882ca8bd778a43502c64f33bf94c12ebe2a7f08e5a0f6689f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.39", -] diff --git a/crates/server/Cargo.toml b/crates/server/Cargo.toml deleted file mode 100644 index 45950f26cb1b47a11ff27f0fda086a51985b1823..0000000000000000000000000000000000000000 --- a/crates/server/Cargo.toml +++ /dev/null @@ -1,26 +0,0 @@ -[package] -name = "starkingdoms-server" -version = "0.1.0-alpha1" -edition = "2021" -license = "AGPL-3" - -[dependencies] -bevy = { version = "0.16", default-features = false } -serde = { version = "1", features = ["derive"] } -serde_json = "1" -bevy_rapier2d = { git = "https://github.com/ghostlyzsh/bevy_rapier.git", features = ["serde-serialize"] } -rand = "0.8.5" -tracing-subscriber = "0.3" -starkingdoms-common = { version = "0.1", path = "../common" } -jwt = "0.16" -sha2 = "0.10" -hmac = "0.12" -hex = "0.4" -crossbeam-channel = "0.5" -tungstenite = "0.21" -toml = "0.8" -tracing-tracy = "0.11.0" - -[features] -default = [] -profiling = ["bevy/trace_tracy"] diff --git a/crates/server/Dockerfile b/crates/server/Dockerfile deleted file mode 100644 index c18245df47f8c5876ea86ab3fe93cb49b12b86a9..0000000000000000000000000000000000000000 --- a/crates/server/Dockerfile +++ /dev/null @@ -1,6 +0,0 @@ -FROM debian:bookworm-slim - -COPY target/release-ci/starkingdoms-server /bin/starkingdoms-server - -EXPOSE 3000 -ENTRYPOINT ["starkingdoms-server"] \ No newline at end of file diff --git a/crates/server/config.toml b/crates/server/config.toml deleted file mode 100644 index 0c9167afe79707ec7da6853f8a775565e8567e45..0000000000000000000000000000000000000000 --- a/crates/server/config.toml +++ /dev/null @@ -1,32 +0,0 @@ -[physics] -solver = "SmallstepPGS" # or "OldPGS" -[physics.parameters] -dt = 0.016666666 -min_ccd_dt = 0.000166666666667 -erp = 0.8 -damping_ratio = 0.25 -joint_erp = 1.0 -joint_damping_ratio = 0.25 -allowed_linear_error = 0.001 -max_penetration_correction = 0.5 -prediction_distance = 0.002 -num_solver_iterations = 4 -num_additional_friction_iterations = 4 -num_internal_pgs_iterations = 1 -num_stabilization_iterations = 16 -min_island_size = 128 -max_ccd_substeps = 1 - -[world] -gravity = 0.015 -pixels_per_meter = 1.0 - -[security] -app_key = "abcd" -required_permission_level = 0 - -[server] -tick_time_ms = 1 -world_fixed_timestep = 0.016666666 -bind = { ip = "0.0.0.0", port = 3000 } -max_free_parts = 50 diff --git a/crates/server/parts.toml b/crates/server/parts.toml deleted file mode 100644 index 8d44f3be3ccb00382bfb11ebeaaf8632afc246e7..0000000000000000000000000000000000000000 --- a/crates/server/parts.toml +++ /dev/null @@ -1,23 +0,0 @@ -[parts.Hearty] -mass = 1.0 -energy_capacity = 2000 -thruster_force = 0.3 -thruster_energy = 1 - -[parts.LandingThruster] -mass = 0.9 -energy_capacity = 1000 -thruster_force = 5 -thruster_energy = 2 - -[parts.Chassis] -mass = 0.5 -energy_capacity = 0 -thruster_force = 0 -thruster_energy = 0 - -[parts.Hub] -mass = 1 -energy_capacity = 3000 -thruster_force = 0 -thruster_energy = 0 diff --git a/crates/server/planets.toml b/crates/server/planets.toml deleted file mode 100644 index e889cfdecb3f8ecf4624dbdbaa4314fc1b3650ca..0000000000000000000000000000000000000000 --- a/crates/server/planets.toml +++ /dev/null @@ -1,43 +0,0 @@ -[planets.Sun] -size = 400.0 -mass = 16000000.0 - -[planets.Mercury] -size = 6.66667 -mass = 246.669133339 - -[planets.Venus] -size = 18.998 -mass = 8166.826315 - -[planets.Earth] -size = 20.0 -mass = 10000.0 - -[planets.Moon] -size = 5.454 -mass = 123.082143245 - -[planets.Mars] -size = 10.62 -mass = 1070.519602 - -[planets.Jupiter] -size = 219.46 -mass = 2554342.75093 - -[planets.Saturn] -size = 182.804 -mass = 889991.421487 - -[planets.Uranus] -size = 80.14 -mass = 142374.556949 - -[planets.Neptune] -size = 77.66 -mass = 171547.175867 - -[planets.Pluto] -size = 3.736 -mass = 22.0759477551 diff --git a/crates/server/src/config.rs b/crates/server/src/config.rs deleted file mode 100644 index 4c50a5c593fa36c0556cfd5d0179a790be3d4f5f..0000000000000000000000000000000000000000 --- a/crates/server/src/config.rs +++ /dev/null @@ -1,124 +0,0 @@ -// StarKingdoms.IO, a browser game about drifting through space -// Copyright (C) 2024 ghostly_zsh, TerraMaster85, core -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -use crate::module::component::PartType; -use crate::planet::PlanetType; -use bevy::ecs::system::Resource; -use bevy_rapier2d::rapier::dynamics::IntegrationParameters; -use serde::{Deserialize, Serialize}; -use std::collections::HashMap; -use std::net::IpAddr; - -#[derive(Resource, Serialize, Deserialize, Debug, Clone)] -pub struct StkConfig { - pub security: SecurityConfig, - pub server: ServerConfig, - pub world: WorldConfig, - pub physics: PhysicsConfig, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct SecurityConfig { - pub app_key: String, - pub required_permission_level: i32, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct ServerConfig { - pub tick_time_ms: u64, - pub world_fixed_timestep: f64, - pub bind: BindConfig, - pub max_free_parts: usize, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct BindConfig { - pub ip: IpAddr, - pub port: u16, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct WorldConfig { - pub gravity: f32, - pub pixels_per_meter: f32, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct PhysicsConfig { - pub parameters: IntegrationParameters, - pub solver: PhysicsSolver, -} -#[derive(Serialize, Deserialize, Debug, Clone)] -pub enum PhysicsSolver { - SmallstepPGS, - OldPGS, -} - -#[derive(Resource, Serialize, Deserialize, Debug, Clone)] -pub struct PlanetsConfig { - pub planets: HashMap, -} -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct PlanetConfig { - pub size: f32, - pub mass: f32, -} - -#[derive(Resource, Deserialize, Debug, Clone)] -pub struct PartsConfig { - pub parts: HashMap, -} - -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct PartConfig { - pub mass: f32, - pub energy_capacity: u32, - pub thruster_force: f32, - pub thruster_energy: u32, -} - -#[macro_export] -macro_rules! mass { - ($p:expr) => { - match $crate::parts_config().parts.get(&$p) { - Some(v) => v.mass, - None => 1.0, - } - }; -} - -#[macro_export] -macro_rules! capacity { - ($p:expr) => { - match $crate::parts_config().parts.get(&$p) { - Some(v) => v.energy_capacity, - None => 0, - } - }; -} - -#[macro_export] -macro_rules! planet { - ($t:expr) => { - $crate::planets_config().planets.get(&$t).unwrap() - }; -} -#[macro_export] -macro_rules! part { - ($t:expr) => { - $crate::parts_config().parts.get(&$t).unwrap() - }; -} diff --git a/crates/server/src/crafting/components.rs b/crates/server/src/crafting/components.rs deleted file mode 100644 index ae61e07f1248ce6f725085b234eaa142efb32311..0000000000000000000000000000000000000000 --- a/crates/server/src/crafting/components.rs +++ /dev/null @@ -1,52 +0,0 @@ -use std::collections::HashMap; - -use bevy::prelude::Component; -use starkingdoms_common::PlanetType; - -#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)] -pub enum MaterialType { - Plasma, // Sun - Composite, // Mercury - Sulfur, // Venus - Silicon, // Moon - Iron, // Mars - Hydrogen, // Jupiter - Helium, // Saturn - Rubber, // Uranus - Methane, // Neptune - Ice, // Pluto -} -impl TryFrom for MaterialType { - type Error = (); - fn try_from(value: PlanetType) -> Result { - match value { - PlanetType::Sun => Ok(Self::Plasma), - PlanetType::Mercury => Ok(Self::Composite), - PlanetType::Venus => Ok(Self::Sulfur), - PlanetType::Moon => Ok(Self::Silicon), - PlanetType::Mars => Ok(Self::Iron), - PlanetType::Jupiter => Ok(Self::Hydrogen), - PlanetType::Saturn => Ok(Self::Helium), - PlanetType::Uranus => Ok(Self::Rubber), - PlanetType::Neptune => Ok(Self::Methane), - PlanetType::Pluto => Ok(Self::Ice), - _ => Err(()), - } - } -} - -#[derive(Component, Debug, Clone)] -pub struct MaterialStorage { - pub material_type: MaterialType, - pub stored: u32, - pub capacity: u32, -} - -#[derive(Component, Debug, Clone, Default)] -pub struct VarietyMaterialStorage { - pub materials: HashMap, - pub capacity: u32, -} - -#[derive(Component, Debug, Clone, Default)] -pub struct IsMining(pub bool); diff --git a/crates/server/src/crafting/mining.rs b/crates/server/src/crafting/mining.rs deleted file mode 100644 index 248da5e8bc3770bdbe3f613e59ad8830c2c8bb0c..0000000000000000000000000000000000000000 --- a/crates/server/src/crafting/mining.rs +++ /dev/null @@ -1,86 +0,0 @@ -use crate::{module::component::Attach, planet::PlanetType}; -use bevy::prelude::{Children, Entity, Query, Res}; -use bevy_rapier2d::plugin::RapierContext; - -use super::components::{IsMining, VarietyMaterialStorage}; -pub fn mine_materials( - rapier_context: Res, - planet_query: Query<(&PlanetType, &Children)>, - mut mineable_query: Query<( - Entity, - &mut Attach, - Option<&IsMining>, - Option<&mut VarietyMaterialStorage>, - )>, -) { - for (planet_type, children) in &planet_query { - for (entity1, entity2, intersecting) in - rapier_context.intersection_pairs_with(*children.first().unwrap()) - { - if !intersecting { - continue; - } - let other = if *children.first().unwrap() == entity1 { - entity2 - } else { - entity1 - }; - let (entity, attach, mineable, _) = match mineable_query.get(other) { - Ok(m) => m, - Err(_) => continue, - }; - let associated_player = match attach.associated_player { - Some(e) => e, - None => entity, - }; - // is the module mining - if let Some(mineable) = mineable { - if mineable.0 { - if let Some(storage_entity) = find_storage(associated_player, &mineable_query) { - let (_, _, _, storage) = mineable_query.get_mut(storage_entity).unwrap(); - if let Some(mut storage) = storage { - if let Ok(material) = planet_type.0.try_into() { - match storage.materials.get_mut(&material) { - Some(v) => *v += 1, - None => { - storage.materials.insert(material, 1); - } - } - } - } - } - } - } - } - } -} -pub fn find_storage( - player: Entity, - mineable_query: &Query<( - Entity, - &mut Attach, - Option<&IsMining>, - Option<&mut VarietyMaterialStorage>, - )>, -) -> Option { - for (entity, attach, _, storage) in mineable_query.iter() { - if let Some(storage) = storage { - if attach.associated_player == Some(player) { - // found a valid storage - if storage.materials.values().sum::() > storage.capacity { - // cannot store more materials in a filled storage - continue; - } - return Some(entity); - } else if attach.associated_player.is_none() { - // this is a player - if storage.materials.values().sum::() > storage.capacity { - // cannot store more materials in a filled storage - continue; - } - return Some(entity); - } - } - } - None -} diff --git a/crates/server/src/crafting/mod.rs b/crates/server/src/crafting/mod.rs deleted file mode 100644 index 334e6a7224f9b581351370208a824a8f926ce2b9..0000000000000000000000000000000000000000 --- a/crates/server/src/crafting/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod components; -pub mod mining; diff --git a/crates/server/src/macros.rs b/crates/server/src/macros.rs deleted file mode 100644 index b81f702a040283631fe2ac5b05c05c90f09f5e10..0000000000000000000000000000000000000000 --- a/crates/server/src/macros.rs +++ /dev/null @@ -1,33 +0,0 @@ -// StarKingdoms.IO, a browser game about drifting through space -// Copyright (C) 2023 ghostly_zsh, TerraMaster85, core -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . -#[macro_export] -macro_rules! err_or_cont { - ($expr:expr) => { - match $expr { - Ok(n) => n, - Err(_) => continue, - } - }; -} -#[macro_export] -macro_rules! some_or_cont { - ($expr:expr) => { - match $expr { - Some(n) => n, - None => continue, - } - }; -} diff --git a/crates/server/src/main.rs b/crates/server/src/main.rs deleted file mode 100644 index f907a083f77f09e79697491d191a3711f6bd9ef6..0000000000000000000000000000000000000000 --- a/crates/server/src/main.rs +++ /dev/null @@ -1,204 +0,0 @@ -// StarKingdoms.IO, a browser game about drifting through space -// Copyright (C) 2023 ghostly_zsh, TerraMaster85, core -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . -#![allow(clippy::type_complexity)] // bevy :( -#![allow(clippy::too_many_arguments)] // bevy :( -#![allow(clippy::only_used_in_recursion)] // todo: remove this - -use crate::ws::{StkTungsteniteServerConfig, StkTungsteniteServerPlugin}; -use bevy::{ - app::{PluginGroupBuilder, ScheduleRunnerPlugin}, - prelude::*, - time::TimePlugin, -}; -use bevy_rapier2d::prelude::*; -use module::component::{ - Attach, CanAttach, LooseAttach, ModuleTimer, PartBundle, PartFlags, PartType, -}; -use serde::{Deserialize, Serialize}; -use std::fs; - -use crate::config::{PartsConfig, PhysicsSolver, PlanetsConfig, StkConfig}; -use std::sync::OnceLock; -use std::time::Duration; - -#[macro_use] -pub mod config; -pub mod crafting; -pub mod macros; -pub mod mathutil; -pub mod module; -pub mod planet; -pub mod player; -pub mod ws; - -struct StkPluginGroup; - -#[derive(Resource, Clone)] -pub struct AppKeys { - pub app_key: Vec, -} - -// factor to multiply positions by to send to the client -pub static CLIENT_SCALE: f32 = 50.0; - -// good ol' classic almost useless but still necessary code -static _SERVER_CONFIG: OnceLock = OnceLock::new(); -#[inline] -pub fn server_config() -> StkConfig { - _SERVER_CONFIG.get().unwrap().clone() -} -static _PARTS_CONFIG: OnceLock = OnceLock::new(); -#[inline] -pub fn parts_config() -> PartsConfig { - _PARTS_CONFIG.get().unwrap().clone() -} -static _PLANETS_CONFIG: OnceLock = OnceLock::new(); -#[inline] -pub fn planets_config() -> PlanetsConfig { - _PLANETS_CONFIG.get().unwrap().clone() -} - -// group main stk plugins together -#[cfg(debug_assertions)] -impl PluginGroup for StkPluginGroup { - fn build(self) -> PluginGroupBuilder { - PluginGroupBuilder::start::() - .add(TaskPoolPlugin::default()) - .add(TypeRegistrationPlugin) - .add(FrameCountPlugin) - .add(TimePlugin) - .add(ScheduleRunnerPlugin::run_loop(Duration::from_millis( - server_config().server.tick_time_ms, - ))) - .add(bevy::log::LogPlugin { - level: bevy::log::Level::DEBUG, - filter: "wgpu=error,bevy_render=info,bevy_ecs=trace".to_string(), - update_subscriber: None, - }) - } -} - -#[cfg(not(debug_assertions))] -impl PluginGroup for StkPluginGroup { - fn build(self) -> PluginGroupBuilder { - PluginGroupBuilder::start::() - .add(TaskPoolPlugin::default()) - .add(TypeRegistrationPlugin) - .add(FrameCountPlugin) - .add(TimePlugin) - .add(ScheduleRunnerPlugin::run_loop(Duration::from_millis(1))) - } -} - -// auth token -#[derive(Serialize, Deserialize, Debug, Clone)] -pub struct UserToken { - pub id: i64, - pub username: String, - pub permission_level: i32, - pub expires: std::time::SystemTime, -} - -fn main() { - // read the server main config - let server_config = fs::read_to_string("/etc/starkingdoms/config.toml").unwrap(); - let parts_config = fs::read_to_string("/etc/starkingdoms/parts.toml").unwrap(); - let planets_config = fs::read_to_string("/etc/starkingdoms/planets.toml").unwrap(); - - // put config in variables - let server_config: StkConfig = toml::from_str(&server_config).unwrap(); - _SERVER_CONFIG.set(server_config.clone()).unwrap(); - let parts_config: PartsConfig = toml::from_str(&parts_config).unwrap(); - _PARTS_CONFIG.set(parts_config.clone()).unwrap(); - let planets_config: PlanetsConfig = toml::from_str(&planets_config).unwrap(); - _PLANETS_CONFIG.set(planets_config.clone()).unwrap(); - - // make the game, start it in .run() - App::new() - .insert_resource(AppKeys { - app_key: server_config.security.app_key.as_bytes().to_vec(), - }) - .insert_resource(StkTungsteniteServerConfig { - addr: server_config.server.bind.ip, - port: server_config.server.bind.port, - }) - .insert_resource(server_config.clone()) - .insert_resource(parts_config) - .insert_resource(planets_config) - .add_plugins(StkPluginGroup) - .insert_resource(RapierConfiguration { - gravity: Vect { x: 0.0, y: 0.0 }, - ..Default::default() - }) - .init_resource::() - .add_plugins( - RapierPhysicsPlugin::::pixels_per_meter( - server_config.world.pixels_per_meter, - ) - .in_fixed_schedule(), - ) - .add_plugins(StkTungsteniteServerPlugin) - .add_systems( - Startup, - (setup_integration_parameters, planet::spawn_planets), - ) - .add_systems(Update, (player::on_message, player::packet::on_close)) - .add_systems( - FixedUpdate, - ( - module::module_spawn, - player::packet::send_player_energy, - player::packet::on_position_change, - module::save::save_eligibility, - module::convert_modules, - crafting::mining::mine_materials, - ), - ) - .add_systems( - FixedUpdate, - ( - module::break_modules, - planet::gravity_update, - player::player_input_update, - ) - .chain(), - ) - .insert_resource(Time::::from_seconds( - server_config.server.world_fixed_timestep, - )) - .run(); - - // game is done running - info!("Goodbye!"); -} - -// set settings in physics engine -fn setup_integration_parameters(mut context: ResMut, server_config: Res) { - context.integration_parameters = server_config.physics.parameters; - - match server_config.physics.solver { - PhysicsSolver::SmallstepPGS => { - context - .integration_parameters - .switch_to_small_steps_pgs_solver(); - } - PhysicsSolver::OldPGS => { - context - .integration_parameters - .switch_to_standard_pgs_solver(); - } - } -} diff --git a/crates/server/src/mathutil.rs b/crates/server/src/mathutil.rs deleted file mode 100644 index 04435722f5c89ecd4984ca8468923ee4b553f965..0000000000000000000000000000000000000000 --- a/crates/server/src/mathutil.rs +++ /dev/null @@ -1,27 +0,0 @@ -// StarKingdoms.IO, a browser game about drifting through space -// Copyright (C) 2023 ghostly_zsh, TerraMaster85, core -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . -use bevy::math::{vec2, Vec2, Vec3}; - -pub fn rot2d(uncast: Vec2, angle: f32) -> Vec2 { - vec2( - uncast.x * angle.cos() - uncast.y * angle.sin(), - uncast.x * angle.sin() + uncast.y * angle.cos(), - ) -} - -pub fn v3_to_v2(downgrade: Vec3) -> Vec2 { - vec2(downgrade.x, downgrade.y) -} diff --git a/crates/server/src/module/component.rs b/crates/server/src/module/component.rs deleted file mode 100644 index b658a69dad4eb23c0592531cd561972f591c792a..0000000000000000000000000000000000000000 --- a/crates/server/src/module/component.rs +++ /dev/null @@ -1,80 +0,0 @@ -use bevy::prelude::*; -use bevy_rapier2d::prelude::{ - ExternalForce, ExternalImpulse, ReadMassProperties, RigidBody, Velocity, -}; -use serde::{Deserialize, Serialize}; -use starkingdoms_common::PartType as c_PartType; - -#[derive(Component, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Debug, Default)] -pub struct PartType(pub c_PartType); - -impl From for c_PartType { - fn from(value: PartType) -> Self { - value.0 - } -} -impl From for PartType { - fn from(value: c_PartType) -> Self { - PartType(value) - } -} - -#[derive(Component, Clone, Debug)] -pub struct Attach { - pub associated_player: Option, - pub parent: Option, - pub children: [Option; 4], -} - -#[derive(Component, Clone, Debug)] -pub struct LooseAttach { - pub children: [Option; 4], -} - -#[derive(Component, Clone, Copy, PartialEq, Debug)] -pub struct CanAttach(pub u8); // each bit means a slot able to attach to - -#[derive(Component, Copy, Clone, Default)] -pub struct PartFlags { - pub attached: bool, -} - -#[derive(Bundle)] -pub struct PartBundle { - pub transform: TransformBundle, - pub part_type: PartType, - pub flags: PartFlags, - pub velocity: Velocity, - pub force: ExternalForce, - pub impulse: ExternalImpulse, - pub rigidbody: RigidBody, - pub read_mass_properties: ReadMassProperties, -} - -impl Default for PartBundle { - fn default() -> Self { - Self { - transform: TransformBundle::default(), - part_type: PartType::default(), - flags: PartFlags::default(), - velocity: Velocity::default(), - force: ExternalForce::default(), - impulse: ExternalImpulse::default(), - rigidbody: RigidBody::Dynamic, - read_mass_properties: ReadMassProperties::default(), - } - } -} - -#[derive(Resource)] -pub struct ModuleTimer(pub Timer); -impl ModuleTimer { - pub fn new() -> Self { - Self(Timer::from_seconds(0.3, TimerMode::Repeating)) - } -} -impl Default for ModuleTimer { - fn default() -> Self { - Self::new() - } -} diff --git a/crates/server/src/module/mod.rs b/crates/server/src/module/mod.rs deleted file mode 100644 index 27c7f0c35aef919e7c93b68960f45db2ac8ba9d7..0000000000000000000000000000000000000000 --- a/crates/server/src/module/mod.rs +++ /dev/null @@ -1,675 +0,0 @@ -use std::f32::consts::PI; - -use bevy::{math::vec2, prelude::*}; -use bevy_rapier2d::prelude::*; -use component::*; -use rand::Rng; -use starkingdoms_common::packet::Part; -use starkingdoms_common::packet::{DespawnPartPacket, Packet, SpawnPartPacket}; -use starkingdoms_common::proto_part_flags; -use starkingdoms_common::proto_transform; - -use crate::ws::PacketMessageConvert; -use crate::{ - capacity, config::StkConfig, part, planet::PlanetType, player::component::Player, ws::WsEvent, -}; -use starkingdoms_common::PartType as c_PartType; -use starkingdoms_common::PlanetType as c_PlanetType; - -pub mod component; -pub mod save; -pub mod thruster; - -// half size of hearty -pub static PART_HALF_SIZE: f32 = 25.0; - -pub fn module_spawn( - mut commands: Commands, - time: Res(Receiver); - -//#[derive(Resource)] -//pub struct Tx(Sender); - -impl StkTungsteniteServerPlugin { - pub fn init_server(config: Res, mut commands: Commands) { - let listener = TcpListener::bind(SocketAddr::from((config.addr, config.port))) - .expect("Failed to bind"); - - let (tx, rx) = unbounded::(); - - let clients = Clients(Arc::new(RwLock::new(HashMap::new()))); - - commands.insert_resource(clients.clone()); - commands.insert_resource(Rx(rx.clone())); - //commands.insert_resource(Tx(tx.clone())); - - let clients = clients.0.clone(); - - thread::spawn(move || { - loop { - let (stream, this_addr) = listener.accept().unwrap(); - - let upgraded = match tungstenite::accept(stream) { - Ok(up) => up, - Err(e) => { - warn!("error upgrading {}: {}", this_addr, e); - continue; - } - }; - - let (ltx, lrx) = std::sync::mpsc::channel(); - - { - // Lock block - let mut handle = clients.write().expect("failed to lock clients map"); - handle.insert(this_addr, ltx); - } // unlocked here - - tx.send(WsEvent::Connection { from: this_addr }) - .expect("failed to send event across channel"); - - // send packet - thread::spawn({ - let fd_ref = upgraded - .get_ref() - .try_clone() - .expect("failed to clone tcpstream"); - let mut l_stream = WebSocket::from_raw_socket(fd_ref, Role::Server, None); - let l_gtx = tx.clone(); - move || { - for event in lrx.iter() { - match event { - WsEvent::Send { to, message } => { - if to == this_addr { - match l_stream.send(message) { - Ok(_) => (), - Err(e) => match e { - tungstenite::Error::AlreadyClosed - | tungstenite::Error::ConnectionClosed => { - l_gtx - .send(WsEvent::Close { addr: this_addr }) - .expect("failed to send on stream"); - } - e => { - error!("error sending to {}: {}", this_addr, e); - break; - } - }, - } - } - } - WsEvent::Close { addr } => { - if addr == this_addr { - match l_stream.close(None) { - Ok(_) => (), - Err(e) => { - error!("failed to disconnect client: {}", e); - break; - } - } - break; - } - } - _ => {} - } - } - } - }); - - // receive packet - thread::spawn({ - let fd_ref = upgraded - .get_ref() - .try_clone() - .expect("failed to clone tcpstream"); - let mut l_stream = WebSocket::from_raw_socket(fd_ref, Role::Server, None); - let l_gtx = tx.clone(); - move || loop { - let msg = match l_stream.read() { - Ok(m) => m, - Err(e) => { - error!("error reading from stream: {}", e); - break; - } - }; - if let Message::Close(_) = msg { - let _ = l_stream.close(None); - l_gtx.send(WsEvent::Close { addr: this_addr }).unwrap(); - break; - } - l_gtx - .send(WsEvent::Recv { - from: this_addr, - message: msg, - }) - .unwrap(); - } - }); - } - }); - } - - pub fn event_listener( - clients: Res, - game_receiver: Res>, - mut event_reader: Local>, - mut events: ResMut>, - ) { - let mut clients = clients.0.write().unwrap(); - for event in event_reader.read(&events) { - match event { - WsEvent::Send { to, .. } => { - if let Some(client) = clients.get_mut(to) { - client.send(event.clone()).expect("failed to forward event"); - } - } - WsEvent::Close { addr } => { - if let Some(client) = clients.get_mut(addr) { - match client.send(event.clone()) { - Ok(_) => (), - Err(e) => error!("failed to forward event: {}", e), - } - } - clients.remove(addr); - } - WsEvent::Broadcast { message } => { - for (addr, client) in clients.iter() { - client - .send(WsEvent::Send { - to: *addr, - message: message.clone(), - }) - .expect("failed to forward event"); - } - } - _ => {} - } - } - - if let Ok(event) = game_receiver.0.try_recv() { - events.send(event); - } - } -} diff --git a/crates/unified/Cargo.toml b/crates/unified/Cargo.toml index 1ebde3747cc4b7c86093346274b93aff9d01b251..c6fcc3e97b6ae59d3d3fee6809c9778ebecdf25b 100644 --- a/crates/unified/Cargo.toml +++ b/crates/unified/Cargo.toml @@ -8,7 +8,7 @@ version = "0.1.0" crate-type = ["cdylib", "rlib"] [dependencies] -bevy = { version = "0.16", default-features = false, features = [ +bevy = { version = "0.17", default-features = false, features = [ "serialize", "tonemapping_luts", "bevy_window", @@ -28,12 +28,16 @@ bevy = { version = "0.16", default-features = false, features = [ "bevy_dev_tools", "bevy_sprite_picking_backend", "default_font", - "png" + "png", + "bevy_gizmos", + "bevy_post_process", + "bevy_anti_alias", + "bevy_sprite_render" ] } -bevy_rapier2d = { version = "0.30", features = ["serde-serialize", "simd-stable"] } -bevy_common_assets = { version = "0.13", features = ["toml"] } +bevy_rapier2d = { features = ["serde-serialize", "simd-stable"], git = "https://github.com/Deniskore/bevy_rapier", branch = "bevy-0.17" } +bevy_common_assets = { version = "0.14", features = ["toml"] } -bevy_replicon = "0.34" +bevy_replicon = "0.36" clap = { version = "4", features = ["derive", "cargo"] } url = "2" @@ -45,15 +49,15 @@ serde = { version = "1", features = ["derive"] } rand = "0.9" getrandom = { version = "0.3", features = [] } -aeronet = "0.14" -aeronet_replicon = { version = "0.15", features = ["client"] } -aeronet_websocket = { version = "0.14", features = ["client"] } -aeronet_transport = "0.14" +aeronet = "0.17" +aeronet_replicon = { version = "0.17", features = ["client"] } +aeronet_websocket = { version = "0.17", features = ["client"] } +aeronet_transport = "0.17" -bevy_egui = "0.35" +bevy_egui = "0.38" ordered-float = { version = "5", features = ["serde"] } -ron = "0.10" +ron = "0.12" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] diff --git a/crates/unified/src/client/key_input.rs b/crates/unified/src/client/key_input.rs index 784e316ba07dfaaa8ce4de351f5e7e1160c1c9bd..6e0c49dcb90901ebd03fb5e90be4654f81b6bc2a 100644 --- a/crates/unified/src/client/key_input.rs +++ b/crates/unified/src/client/key_input.rs @@ -2,11 +2,12 @@ use crate::attachment::{JointOf, Peer, SnapOf}; use crate::ecs::{Part, ThrustEvent}; use bevy::color::palettes::css::{FUCHSIA, GREEN, ORANGE, WHITE}; use bevy::dev_tools::picking_debug::DebugPickingMode; +use bevy::gizmos::gizmos::Gizmos; use bevy::math::{Vec3, Vec3Swizzles}; -use bevy::prelude::{Gizmos, GlobalTransform, Query, ResMut, Resource, Transform, With}; +use bevy::prelude::{GlobalTransform, Query, ResMut, Resource, Transform, With}; use bevy::{ app::{App, Update}, - ecs::{event::EventWriter, system::Res}, + ecs::{message::MessageWriter, system::Res}, input::{ButtonInput, keyboard::KeyCode}, }; use bevy_rapier2d::render::DebugRenderContext; @@ -46,7 +47,7 @@ fn debug_render_keybind( } } -fn directional_keys(keys: Res>, mut thrust_event: EventWriter) { +fn directional_keys(keys: Res>, mut thrust_event: MessageWriter) { if keys.just_pressed(KeyCode::KeyW) || keys.just_pressed(KeyCode::ArrowUp) { thrust_event.write(ThrustEvent::Up(true)); } else if keys.just_released(KeyCode::KeyW) || keys.just_released(KeyCode::ArrowUp) { @@ -89,11 +90,26 @@ fn draw_attachment_debug( let joint_target = parent_pos.transform_point(offset.translation); gizmos.cross_2d(joint_target.xy(), 4.0, FUCHSIA); - if let Some(peer_id) = peer && let Ok(peer) = joints.get(peer_id.0) { - let Ok(peer_parent_pos) = parts.get(peer.1.0) else { continue }; - gizmos.arrow_2d(peer_parent_pos.translation().xy(), peer_parent_pos.translation().xy() - + ((peer.0.rotation * peer_parent_pos.rotation()).mul_vec3(Vec3::Y).xy()*20.0), ORANGE); - gizmos.arrow_2d(parent_pos.translation().xy(), peer_parent_pos.translation().xy(), WHITE); + if let Some(peer_id) = peer + && let Ok(peer) = joints.get(peer_id.0) + { + let Ok(peer_parent_pos) = parts.get(peer.1.0) else { + continue; + }; + gizmos.arrow_2d( + peer_parent_pos.translation().xy(), + peer_parent_pos.translation().xy() + + ((peer.0.rotation * peer_parent_pos.rotation()) + .mul_vec3(Vec3::Y) + .xy() + * 20.0), + ORANGE, + ); + gizmos.arrow_2d( + parent_pos.translation().xy(), + peer_parent_pos.translation().xy(), + WHITE, + ); } } for (offset, parent) in snaps.iter() { diff --git a/crates/unified/src/client/mod.rs b/crates/unified/src/client/mod.rs index 682e0e79a37cad52cb9c9e5257d9cd8827dcdb68..ed6af2e19070455ca8c282ee0bb1db59f067c6a8 100644 --- a/crates/unified/src/client/mod.rs +++ b/crates/unified/src/client/mod.rs @@ -17,10 +17,10 @@ use crate::client::ui::ui_plugin; use crate::client::zoom::zoom_plugin; use crate::ecs::{CursorWorldCoordinates, MainCamera, Part, Player}; use aeronet_websocket::client::WebSocketClient; -use bevy::core_pipeline::bloom::Bloom; -use bevy::core_pipeline::fxaa::Fxaa; +use bevy::anti_alias::fxaa::Fxaa; use bevy::core_pipeline::tonemapping::DebandDither; use bevy::dev_tools::picking_debug::DebugPickingMode; +use bevy::post_process::bloom::Bloom; use bevy::prelude::*; use bevy::window::PrimaryWindow; use planet::incoming_planets::incoming_planets_plugin; @@ -89,7 +89,6 @@ fn setup_graphics(mut commands: Commands) { commands .spawn(Camera2d) .insert(Camera { - hdr: true, clear_color: ClearColorConfig::Custom(Color::BLACK), ..default() }) diff --git a/crates/unified/src/client/net.rs b/crates/unified/src/client/net.rs index 213ca24b560e87a17cf536cdaa6058fa4cb2a0b9..972c8e8bbfe387fbbd05f99e091e9bacaea5dee1 100644 --- a/crates/unified/src/client/net.rs +++ b/crates/unified/src/client/net.rs @@ -1,4 +1,4 @@ -use aeronet::io::connection::Disconnected; +use aeronet::io::connection::{DisconnectReason, Disconnected}; use aeronet::io::{Session, SessionEndpoint}; use aeronet_replicon::client::AeronetRepliconClient; use aeronet_transport::TransportConfig; @@ -11,33 +11,33 @@ pub fn set_config(mut q: Query<&mut TransportConfig, Added>) { } pub fn on_connecting( - trigger: Trigger, + trigger: On, names: Query<&Name>, mut commands: Commands, ) { - let entity = trigger.target(); + let entity = trigger.event_target(); let name = names.get(entity).unwrap(); info!("{name} is connecting"); commands.entity(entity).insert(AeronetRepliconClient); } -pub fn on_connected(trigger: Trigger, names: Query<&Name>) { - let entity = trigger.target(); +pub fn on_connected(trigger: On, names: Query<&Name>) { + let entity = trigger.event_target(); let name = names.get(entity).unwrap(); info!("{name} is connected"); } -pub fn on_disconnected(trigger: Trigger, names: Query<&Name>) { - let session = trigger.target(); +pub fn on_disconnected(trigger: On, names: Query<&Name>) { + let session = trigger.event_target(); let name = names.get(session).unwrap(); - match &*trigger { - Disconnected::ByUser(reason) => { + match &trigger.reason { + DisconnectReason::ByUser(reason) => { info!(?name, ?reason, "session disconnected by user"); } - Disconnected::ByPeer(reason) => { + DisconnectReason::ByPeer(reason) => { info!(?name, ?reason, "session disconnected by peer"); } - Disconnected::ByError(err) => { + DisconnectReason::ByError(err) => { warn!(?name, "session disconnected due to error: {err:?}"); } } diff --git a/crates/unified/src/client/parts.rs b/crates/unified/src/client/parts.rs index 44a161073db72d9deb8c7c0b35d5304b6afee6c8..780ed5701d331d02ad723cd979a8daa26e6c9887 100644 --- a/crates/unified/src/client/parts.rs +++ b/crates/unified/src/client/parts.rs @@ -10,14 +10,14 @@ use bevy_rapier2d::prelude::AdditionalMassProperties; pub fn parts_plugin(app: &mut App) { app.insert_resource(DragResource(None)); - app.insert_resource(SnapResource(None,None)); + app.insert_resource(SnapResource(None, None)); app.add_systems( Update, ( handle_incoming_parts, handle_updated_parts, update_drag_ghosts, - update_part_sprites + update_part_sprites, ), ); app.add_observer(on_part_release); @@ -29,13 +29,11 @@ fn handle_incoming_parts( asset_server: Res, ) { for (new_entity, new_part, is_connected) in new_parts.iter() { - let mut sprite = Sprite::from_image( - asset_server.load(if is_connected.is_some() { - &new_part.strong_config.part.sprite_connected - } else { - &new_part.strong_config.part.sprite_disconnected - }), - ); + let mut sprite = Sprite::from_image(asset_server.load(if is_connected.is_some() { + &new_part.strong_config.part.sprite_connected + } else { + &new_part.strong_config.part.sprite_disconnected + })); sprite.custom_size = Some(Vec2::new( new_part.strong_config.physics.width, new_part.strong_config.physics.height, @@ -59,13 +57,11 @@ fn handle_updated_parts( asset_server: Res, ) { for (updated_entity, updated_part, is_connected) in updated_parts.iter() { - let mut sprite = Sprite::from_image( - asset_server.load(if is_connected.is_some() { - &updated_part.strong_config.part.sprite_connected - } else { - &updated_part.strong_config.part.sprite_disconnected - }), - ); + let mut sprite = Sprite::from_image(asset_server.load(if is_connected.is_some() { + &updated_part.strong_config.part.sprite_connected + } else { + &updated_part.strong_config.part.sprite_disconnected + })); sprite.custom_size = Some(Vec2::new( updated_part.strong_config.physics.width, updated_part.strong_config.physics.height, @@ -84,15 +80,25 @@ fn handle_updated_parts( } } -fn update_part_sprites(added: Query>, mut removed: RemovedComponents, parts: Query<(&Part, Option<&PartInShip>)>, asset_server: Res, mut commands: Commands) { +fn update_part_sprites( + added: Query>, + mut removed: RemovedComponents, + parts: Query<(&Part, Option<&PartInShip>)>, + asset_server: Res, + mut commands: Commands, +) { for e in added.into_iter().chain(removed.read()) { - let Ok((part, connected_to)) = parts.get(e) else { continue }; + let Ok((part, connected_to)) = parts.get(e) else { + continue; + }; - let sprite = if connected_to.is_some() { &part.strong_config.part.sprite_connected } else { &part.strong_config.part.sprite_disconnected }; + let sprite = if connected_to.is_some() { + &part.strong_config.part.sprite_connected + } else { + &part.strong_config.part.sprite_disconnected + }; - let mut sprite = Sprite::from_image( - asset_server.load(sprite), - ); + let mut sprite = Sprite::from_image(asset_server.load(sprite)); sprite.custom_size = Some(Vec2::new( part.strong_config.physics.width, part.strong_config.physics.height, @@ -116,7 +122,7 @@ const TRANSLATION_SMOOTH: f32 = 0.3; const ROTATION_SMOOTH: f32 = 0.1; fn on_part_click( - ev: Trigger>, + ev: On>, sprites: Query<(&Sprite, &Transform, &Joints), Without>, joints: Query<&Joint, Without>, mut drag: ResMut, @@ -125,7 +131,7 @@ fn on_part_click( if ev.button != PointerButton::Primary { return; } - let Ok(sprite) = sprites.get(ev.target()) else { + let Ok(sprite) = sprites.get(ev.event_target()) else { return; }; // make sure it has at least 1 valid unpeered joint @@ -142,13 +148,13 @@ fn on_part_click( s.color = Color::srgba(0.7, 0.7, 0.7, 1.0); commands.spawn((DragGhost, GhostTarget(sprite.1.rotation), *sprite.1, s)); - drag.0 = Some(ev.target()); + drag.0 = Some(ev.event().event_target()); } fn on_part_release( - ev: Trigger>, + ev: On>, mut drag: ResMut, - mut events: EventWriter, + mut events: MessageWriter, cursor: Res, mut commands: Commands, ghost: Single<(Entity, &Transform), With>, @@ -169,7 +175,7 @@ fn on_part_release( drag_to: c, set_rotation: rotation, snap_target: snap.0, - peer_snap: snap.1 + peer_snap: snap.1, }); } } @@ -183,8 +189,8 @@ fn on_part_release( /// /// This code is super cursed, and it will break at the lightest breeze fn update_drag_ghosts( - mut ghost: Single< - (&mut Transform, &mut GhostTarget), + ghost: Single< + (&mut Transform, &mut GhostTarget), ( With, Without, @@ -226,7 +232,8 @@ fn update_drag_ghosts( // only snap to ourselves - let Ok((part_being_snapped_to, maybe_me, maybe_parent_ship)) = parts.get(snap_part.0) else { + let Ok((part_being_snapped_to, maybe_me, maybe_parent_ship)) = parts.get(snap_part.0) + else { continue; }; @@ -235,8 +242,7 @@ fn update_drag_ghosts( continue; } - let snap_global_translation = part_being_snapped_to - .mul_transform(*snap_local_transform); + let snap_global_translation = part_being_snapped_to.mul_transform(*snap_local_transform); let distance_to_cursor = cursor.distance(snap_global_translation.translation().xy()); @@ -284,13 +290,21 @@ fn update_drag_ghosts( let mut best_peer_target_pos = None; let mut best_joint_transform = None; for (our_snap_local_transform, our_snap_joint, our_snap_part, our_snap_id) in &snaps { - if Some(our_snap_part.0) != drag.0 { continue; } - let our_snap_global_translation = target_transform - .mul_transform(*our_snap_local_transform); - let distance = our_snap_global_translation.translation.distance(snap_global_translation.translation()); - if distance > best_peer_snap_distance { continue; } + if Some(our_snap_part.0) != drag.0 { + continue; + } + let our_snap_global_translation = + target_transform.mul_transform(*our_snap_local_transform); + let distance = our_snap_global_translation + .translation + .distance(snap_global_translation.translation()); + if distance > best_peer_snap_distance { + continue; + } - let Ok((our_joint, _, _)) = joints.get(our_snap_joint.0) else { continue }; + let Ok((our_joint, _, _)) = joints.get(our_snap_joint.0) else { + continue; + }; best_peer_snap = Some(our_snap_id); best_peer_snap_distance = distance; @@ -298,19 +312,25 @@ fn update_drag_ghosts( best_peer_target_pos = Some(target_transform.translation.xy()); best_joint_transform = Some(our_joint); } - target_transform.rotation = part_being_snapped_to.rotation() * (offset.rotation * best_joint_transform.unwrap().rotation.inverse()) * Quat::from_rotation_z(180.0f32.to_radians()); + target_transform.rotation = part_being_snapped_to.rotation() + * (offset.rotation * best_joint_transform.unwrap().rotation.inverse()) + * Quat::from_rotation_z(180.0f32.to_radians()); best_target = target_transform; best_self_snap = best_peer_snap; best_self_snap_position = best_peer_snap_pos; best_self_position = best_peer_target_pos; } - - - if debug.0 && let Some(part) = best_parent_position && let Some(snap) = best_snap_position { + if debug.0 + && let Some(part) = best_parent_position + && let Some(snap) = best_snap_position + { gizmos.arrow_2d(part, snap.translation().xy(), YELLOW); } - if debug.0 && let Some(part) = best_self_position && let Some(snap) = best_self_snap_position { + if debug.0 + && let Some(part) = best_self_position + && let Some(snap) = best_self_snap_position + { gizmos.arrow_2d(part, snap, PURPLE); } @@ -326,7 +346,7 @@ fn update_drag_ghosts( } ghost_target.0 = best_target.rotation; ghost.rotation = ghost.rotation.slerp(ghost_target.0, ROTATION_SMOOTH); - let dx = TRANSLATION_SMOOTH*(best_target.translation - ghost.translation); + let dx = TRANSLATION_SMOOTH * (best_target.translation - ghost.translation); ghost.translation += dx; rsnap.0 = snap; diff --git a/crates/unified/src/client/planet/indicators.rs b/crates/unified/src/client/planet/indicators.rs index 8bb3bf2f4057c1d3012d080dabcfaf18dd1c70f1..d80ff6d63225e98016807f08ea80a4dfe86c7896 100644 --- a/crates/unified/src/client/planet/indicators.rs +++ b/crates/unified/src/client/planet/indicators.rs @@ -88,11 +88,11 @@ fn update_indicators_position( // scale both parts to fit x, then same for y if offset.x.abs() > half_window_width { let scale_factor = offset.x.clamp(-half_window_width, half_window_width) / offset.x; - offset = offset * scale_factor; + offset *= scale_factor; } if offset.y.abs() > half_window_height { let scale_factor = offset.y.clamp(-half_window_height, half_window_height) / offset.y; - offset = offset * scale_factor; + offset *= scale_factor; } let Ok((mut this_indicator, mut this_sprite)) = indicators.get_mut(indicator_id.0) else { diff --git a/crates/unified/src/client/starfield.rs b/crates/unified/src/client/starfield.rs index 00fd6b75a845399a793b8de45d1b5a413035b104..550304dd65586e1f40f9716b178d1d76daf2a2cf 100644 --- a/crates/unified/src/client/starfield.rs +++ b/crates/unified/src/client/starfield.rs @@ -1,11 +1,19 @@ use bevy::{ - app::{App, Startup, Update}, asset::{AssetEvent, AssetServer, Assets}, ecs::{ + app::{App, Startup, Update}, + asset::{AssetEvent, AssetServer, Assets}, + ecs::{ //entity::Entity, //entity_disabling::Disabled, - event::EventReader, query::{With, Without}, system::{Commands, Query, Res, Single}, - }, image::Image, log::warn, math::{Vec2, Vec3}, render::view::Visibility, sprite::{Sprite, SpriteImageMode}, transform::components::Transform, window::{Window, WindowResized} + }, + image::Image, + log::warn, + math::{Vec2, Vec3}, + prelude::*, + sprite::{Sprite, SpriteImageMode}, + transform::components::Transform, + window::{Window, WindowResized}, }; use crate::{ @@ -30,8 +38,7 @@ pub fn set_up_starfield( window: Query<&Window>, ) { let starfield_handle = asset_server.load("textures/starfield.png"); - let starfield_transp_handle = - asset_server.load("textures/starfield_transp.png"); + let starfield_transp_handle = asset_server.load("textures/starfield_transp.png"); let window = window.iter().next().unwrap(); commands .spawn(Sprite { @@ -64,9 +71,7 @@ pub fn set_up_starfield( commands .spawn(Sprite { image: starfield_transp_handle, - custom_size: Some( - window.size() + Vec2::splat(FRONT_STARFIELD_SIZE), - ), + custom_size: Some(window.size() + Vec2::splat(FRONT_STARFIELD_SIZE)), image_mode: SpriteImageMode::Tiled { tile_x: true, tile_y: true, @@ -105,7 +110,7 @@ pub fn fix_starfield( ), >, assets: Res>, - mut asset_events: EventReader>, + mut asset_events: MessageReader>, ) { for event in asset_events.read() { if let AssetEvent::Added { id } = event { @@ -115,8 +120,7 @@ pub fn fix_starfield( starfield_back.image_mode = SpriteImageMode::Tiled { tile_x: true, tile_y: true, - stretch_value: BACK_STARFIELD_SIZE - / (starfield_image.size().x as f32), + stretch_value: BACK_STARFIELD_SIZE / (starfield_image.size().x as f32), }; } let mut starfield_mid = starfield_mid.single_mut().unwrap(); @@ -125,8 +129,7 @@ pub fn fix_starfield( starfield_mid.image_mode = SpriteImageMode::Tiled { tile_x: true, tile_y: true, - stretch_value: MID_STARFIELD_SIZE - / (starfield_image.size().x as f32), + stretch_value: MID_STARFIELD_SIZE / (starfield_image.size().x as f32), }; } let mut starfield_front = starfield_front.single_mut().unwrap(); @@ -135,8 +138,7 @@ pub fn fix_starfield( starfield_front.image_mode = SpriteImageMode::Tiled { tile_x: true, tile_y: true, - stretch_value: FRONT_STARFIELD_SIZE - / (starfield_image.size().x as f32), + stretch_value: FRONT_STARFIELD_SIZE / (starfield_image.size().x as f32), }; } } @@ -168,9 +170,8 @@ pub fn resize_starfield( Without, ), >, - mut resize_event: EventReader, + mut resize_event: MessageReader, camera: Single<&Transform, With>, - mut commands: Commands, ) { for event in resize_event.read() { let Ok(mut starfield_back) = starfield_back.single_mut() else { @@ -268,33 +269,21 @@ pub fn update_starfield( //starfield_pos.translation = (player.translation / STARFIELD_SIZE).round() * STARFIELD_SIZE; starfield_back_pos.translation = player.translation + (-player.translation / 3.0) % BACK_STARFIELD_SIZE - + (Vec3::new( - window.resolution.width(), - -window.resolution.height(), - 0.0, - ) * camera.scale.z + + (Vec3::new(window.resolution.width(), -window.resolution.height(), 0.0) * camera.scale.z / 2.0) % BACK_STARFIELD_SIZE + Vec3::new(0.0, BACK_STARFIELD_SIZE, 0.0) - Vec3::new(0.0, 0.0, 5.0); starfield_mid_pos.translation = player.translation + (-player.translation / 2.5) % MID_STARFIELD_SIZE - + (Vec3::new( - window.resolution.width(), - -window.resolution.height(), - 0.0, - ) * camera.scale.z + + (Vec3::new(window.resolution.width(), -window.resolution.height(), 0.0) * camera.scale.z / 2.0) % MID_STARFIELD_SIZE + Vec3::new(0.0, MID_STARFIELD_SIZE, 0.0) - Vec3::new(0.0, 0.0, 4.5); starfield_front_pos.translation = player.translation + (-player.translation / 2.0) % FRONT_STARFIELD_SIZE - + (Vec3::new( - window.resolution.width(), - -window.resolution.height(), - 0.0, - ) * camera.scale.z + + (Vec3::new(window.resolution.width(), -window.resolution.height(), 0.0) * camera.scale.z / 2.0) % FRONT_STARFIELD_SIZE + Vec3::new(0.0, FRONT_STARFIELD_SIZE, 0.0) diff --git a/crates/unified/src/client/ui.rs b/crates/unified/src/client/ui.rs index 327067bd249ac079ebeb2c7527247f131b17bc20..aa95ce5974b1837ebcc525aaae7792435f27c665 100644 --- a/crates/unified/src/client/ui.rs +++ b/crates/unified/src/client/ui.rs @@ -1,10 +1,12 @@ use bevy::prelude::*; -use crate::{client::colors, ecs::{FuelText, Player, PlayerStorage, PowerText}}; +use crate::{ + client::colors, + ecs::{FuelText, Player, PlayerStorage, PowerText}, +}; pub fn ui_plugin(app: &mut App) { - app - .add_systems(Startup, setup_ui) + app.add_systems(Startup, setup_ui) .add_systems(Update, update_ui); } @@ -28,26 +30,19 @@ fn setup_ui(mut commands: Commands) { BorderRadius::all(Val::Px(5.0)), BackgroundColor(colors::MANTLE), children![ - ( - TextColor(colors::PEACH), - Text::new("Fuel: 25"), - FuelText, - ), - ( - TextColor(colors::PEACH), - Text::new("Power: 25"), - PowerText, - ), - /*( - Node { - width: Val::Percent(100.0), - height: Val::Px(20.0), - margin: UiRect::all(Val::Px(5.0)), - ..Default::default() - }, - BorderRadius::all(Val::Px(5.0)), - BackgroundColor(colors::CRUST), - )*/], + (TextColor(colors::PEACH), Text::new("Fuel: 25"), FuelText,), + (TextColor(colors::PEACH), Text::new("Power: 25"), PowerText,), + /*( + Node { + width: Val::Percent(100.0), + height: Val::Px(20.0), + margin: UiRect::all(Val::Px(5.0)), + ..Default::default() + }, + BorderRadius::all(Val::Px(5.0)), + BackgroundColor(colors::CRUST), + )*/ + ], )], )); } @@ -55,7 +50,7 @@ fn setup_ui(mut commands: Commands) { fn update_ui( mut fuel_text: Single<&mut Text, With>, mut power_text: Single<&mut Text, (With, Without)>, - player: Single<(&PlayerStorage), (With, Without)>, + player: Single<&PlayerStorage, (With, Without)>, ) { fuel_text.0 = format!("Fuel: {}/{}", player.fuel, player.fuel_capacity); power_text.0 = format!("Power: {}/{}", player.power, player.power_capacity); diff --git a/crates/unified/src/client/zoom.rs b/crates/unified/src/client/zoom.rs index c703064b62d4b7d9a22e92d51afa43b0653d0c6c..a93b4d06b985aa738132efc5c772343ea555f068 100644 --- a/crates/unified/src/client/zoom.rs +++ b/crates/unified/src/client/zoom.rs @@ -16,7 +16,7 @@ pub fn zoom_plugin(app: &mut App) { } fn on_scroll( - mut scroll_events: EventReader, + mut scroll_events: MessageReader, window: Single<&Window>, starfield_back: Single< (&mut Sprite, &mut Transform, &mut Visibility), @@ -63,9 +63,11 @@ fn on_scroll( ), >, ) { - let (mut starfield_back, mut starfield_back_pos, mut visibility_back) = starfield_back.into_inner(); + let (mut starfield_back, mut starfield_back_pos, mut visibility_back) = + starfield_back.into_inner(); let (mut starfield_mid, mut starfield_mid_pos, mut visibility_mid) = starfield_mid.into_inner(); - let (mut starfield_front, mut starfield_front_pos, mut visibility_front) = starfield_front.into_inner(); + let (mut starfield_front, mut starfield_front_pos, mut visibility_front) = + starfield_front.into_inner(); for event in scroll_events.read() { match event.unit { MouseScrollUnit::Line | MouseScrollUnit::Pixel => { diff --git a/crates/unified/src/config/part.rs b/crates/unified/src/config/part.rs index c7011ed1b25e8e5334f2a295a30af5e246faa2a9..0de920da4cf048f43c24cb0fb1abac7ac73f0eef 100644 --- a/crates/unified/src/config/part.rs +++ b/crates/unified/src/config/part.rs @@ -24,7 +24,7 @@ pub struct PartPhysicsConfig { } #[derive(Deserialize, TypePath, Serialize, Clone, Debug, PartialEq)] pub struct PartThrusterConfig { - pub flow_rate: f32, // kg/s + pub flow_rate: f32, // kg/s pub exhaust_speed: f32, // m/s } #[derive(Deserialize, TypePath, Serialize, Clone, Debug, PartialEq)] diff --git a/crates/unified/src/ecs.rs b/crates/unified/src/ecs.rs index 6fd0aef0f9dfefe93332087f634c50db1681d32a..f541091711c5672efec1e3091c7e9715dc6ff9d0 100644 --- a/crates/unified/src/ecs.rs +++ b/crates/unified/src/ecs.rs @@ -1,7 +1,7 @@ use crate::config::part::PartConfig; use bevy::ecs::entity::MapEntities; use bevy::math::{Quat, Vec2}; -use bevy::prelude::{Component, Entity, Event, Handle, Resource}; +use bevy::prelude::*; use bevy_rapier2d::dynamics::RigidBody; use bevy_rapier2d::prelude::*; use bevy_replicon::prelude::Replicated; @@ -24,7 +24,7 @@ pub struct PowerText; #[derive(Resource, Default)] pub struct CursorWorldCoordinates(pub Option); -#[derive(Debug, Deserialize, Event, Serialize)] +#[derive(Debug, Deserialize, Message, Serialize)] pub enum ThrustEvent { Up(bool), Down(bool), @@ -67,7 +67,7 @@ pub struct Particles { pub active: bool, } -#[derive(Serialize, Deserialize, Event, Debug, MapEntities, Clone)] +#[derive(Serialize, Deserialize, Message, Debug, MapEntities, Clone)] pub struct DragRequestEvent { #[entities] pub drag_target: Entity, @@ -76,7 +76,7 @@ pub struct DragRequestEvent { #[entities] pub snap_target: Option, #[entities] - pub peer_snap: Option + pub peer_snap: Option, } #[derive(Component, Serialize, Deserialize, Debug)] diff --git a/crates/unified/src/particle_editor/ecs.rs b/crates/unified/src/particle_editor/ecs.rs index e1958e776084e2332fa39db55b4278f74543863f..ad4af92f8db3549a7128625b7ed9297eb18d8a34 100644 --- a/crates/unified/src/particle_editor/ecs.rs +++ b/crates/unified/src/particle_editor/ecs.rs @@ -1,15 +1,14 @@ use std::time::Duration; +use crate::particles::ParticleEffect; +use bevy::prelude::ColorMaterial; use bevy::{ asset::Handle, ecs::component::Component, - render::mesh::Mesh, - sprite::ColorMaterial, + prelude::*, time::{Timer, TimerMode}, }; -use crate::particles::ParticleEffect; - #[derive(Component)] pub struct Particle; diff --git a/crates/unified/src/server/mod.rs b/crates/unified/src/server/mod.rs index c6d4feaa2466ff0c58fb9137da6d66614a36abc6..2b65f0c0ad95c3ec0c318b02967b2df0c6c404bb 100644 --- a/crates/unified/src/server/mod.rs +++ b/crates/unified/src/server/mod.rs @@ -14,7 +14,7 @@ use crate::server::player::player_management_plugin; use crate::server::system_sets::{PlayerInputSet, WorldUpdateSet}; use crate::server::world_config::world_config_plugin; use aeronet::io::Session; -use aeronet::io::connection::{Disconnected, LocalAddr}; +use aeronet::io::connection::{DisconnectReason, Disconnected, LocalAddr}; use aeronet::io::server::Server; use aeronet_replicon::server::AeronetRepliconServer; use aeronet_websocket::server::WebSocketServer; @@ -31,28 +31,27 @@ impl Plugin for ServerPlugin { fn build(&self, app: &mut App) { let config = self.websocket_config(); - app.add_systems(FixedPreUpdate, bevy_replicon::server::increment_tick) // !!important!! do not remove or move - .add_systems(Startup, move |mut commands: Commands| { - let server = commands - .spawn(Name::new("ws-server")) - .insert(AeronetRepliconServer) - .insert(Transform::from_xyz(0.0, 0.0, 0.0)) - .queue(WebSocketServer::open(config.clone())) - .id(); + app.add_systems(Startup, move |mut commands: Commands| { + let server = commands + .spawn(Name::new("ws-server")) + .insert(AeronetRepliconServer) + .insert(Transform::from_xyz(0.0, 0.0, 0.0)) + .queue(WebSocketServer::open(config.clone())) + .id(); - info!(entity_id=?server, "opening websocket server"); - }) - .add_observer(on_opened) - .add_observer(on_connected) - .add_observer(on_disconnected) - .add_plugins(planets_plugin) - .add_plugins(world_config_plugin) - .add_plugins(newtonian_gravity_plugin) - .add_plugins(player_management_plugin) - .add_plugins(spawn_parts_plugin) - .add_plugins(part_management_plugin) - .configure_sets(Update, WorldUpdateSet.before(PlayerInputSet)) - .configure_sets(Update, PlayerInputSet.before(PhysicsSet::SyncBackend)); + info!(entity_id=?server, "opening websocket server"); + }) + .add_observer(on_opened) + .add_observer(on_connected) + .add_observer(on_disconnected) + .add_plugins(planets_plugin) + .add_plugins(world_config_plugin) + .add_plugins(newtonian_gravity_plugin) + .add_plugins(player_management_plugin) + .add_plugins(spawn_parts_plugin) + .add_plugins(part_management_plugin) + .configure_sets(Update, WorldUpdateSet.before(PlayerInputSet)) + .configure_sets(Update, PlayerInputSet.before(PhysicsSet::SyncBackend)); } } impl ServerPlugin { @@ -72,17 +71,17 @@ pub struct ConnectedNetworkEntity { pub game_entity: Entity, } -fn on_opened(trigger: Trigger, servers: Query<&LocalAddr>) { - let server = trigger.target(); +fn on_opened(trigger: On, servers: Query<&LocalAddr>) { + let server = trigger.event_target(); let local_addr = servers.get(server).unwrap(); info!(server_entity=?server, "websocket server opened on {:?}", *local_addr); } fn on_connected( - trigger: Trigger, + trigger: On, clients: Query<&ChildOf>, mut commands: Commands, ) { - let client = trigger.target(); + let client = trigger.event_target(); let Ok(&ChildOf(server)) = clients.get(client) else { return; }; @@ -104,23 +103,23 @@ fn on_connected( )); } fn on_disconnected( - trigger: Trigger, + trigger: On, clients: Query<&ChildOf>, player_entity: Query<&ConnectedNetworkEntity>, mut commands: Commands, ) { - let client = trigger.target(); + let client = trigger.event_target(); let Ok(&ChildOf(server)) = clients.get(client) else { return; }; - match &*trigger { - Disconnected::ByUser(reason) => { + match &trigger.reason { + DisconnectReason::ByUser(reason) => { info!(?client, ?server, ?reason, "client disconnected by user"); } - Disconnected::ByPeer(reason) => { + DisconnectReason::ByPeer(reason) => { info!(?client, ?server, ?reason, "client disconnected by peer"); } - Disconnected::ByError(err) => { + DisconnectReason::ByError(err) => { warn!(?client, ?server, "client disconnected with error: {err:?}"); } } diff --git a/crates/unified/src/server/part.rs b/crates/unified/src/server/part.rs index f87a33f6c86a358771517243ed47da8be2072d3a..519ed090513b12873f1bbd940974f7d4dc96f0a7 100644 --- a/crates/unified/src/server/part.rs +++ b/crates/unified/src/server/part.rs @@ -1,4 +1,3 @@ -use std::cmp::PartialEq; use crate::attachment::{Joint, JointId, JointOf, Joints, Peer, SnapOf, SnapOfJoint}; use crate::config::part::{JointConfig, PartConfig}; use crate::ecs::{Part, PartHandle}; @@ -43,7 +42,7 @@ fn handle_part_reloading( joints: Query<(&mut Joint, Option<&Peer>, Entity)>, snaps: Query<(Entity, &SnapOfJoint)>, assets: Res>, - mut asset_events: EventReader>, + mut asset_events: MessageReader>, mut commands: Commands, ) { for event in asset_events.read() { @@ -58,14 +57,17 @@ fn handle_part_reloading( let mut used_joints = vec![]; for joint_id in &**existing_part.2 { // find in config - let Ok((joint, peer, _)) = joints.get(*joint_id) else { continue }; - let joint_cfg = config.joints.iter().find(|u| joint.id == JointId::from_part_and_joint_id(&config.part.name, &u.id)); + let Ok((joint, peer, _)) = joints.get(*joint_id) else { + continue; + }; + let joint_cfg = config.joints.iter().find(|u| { + joint.id == JointId::from_part_and_joint_id(&config.part.name, &u.id) + }); let Some(joint_cfg) = joint_cfg else { - if let Some(peer_id) = peer { - if let Ok(peer) = joints.get(peer_id.0) { + if let Some(peer_id) = peer + && let Ok(peer) = joints.get(peer_id.0) { commands.entity(peer.2).remove::(); } - } commands.entity(*joint_id).despawn(); for snap in &snaps { if snap.1.0 == *joint_id { @@ -75,9 +77,11 @@ fn handle_part_reloading( continue; }; used_joints.push(joint.id.clone()); - commands - .entity(*joint_id) - .insert(spawn_joint_bundle(joint_cfg, config, &existing_part.0)); + commands.entity(*joint_id).insert(spawn_joint_bundle( + joint_cfg, + config, + &existing_part.0, + )); // annihilate all snaps then respawn for snap in &snaps { if snap.1.0 == *joint_id { @@ -88,7 +92,9 @@ fn handle_part_reloading( } for joint in &config.joints { let id = JointId::from_part_and_joint_id(&config.part.name, &joint.id); - if used_joints.contains(&id) { continue }; + if used_joints.contains(&id) { + continue; + } let joint_id = commands .spawn(spawn_joint_bundle(joint, config, &existing_part.0)) .id(); diff --git a/crates/unified/src/server/planets.rs b/crates/unified/src/server/planets.rs index 4b1872a06ab15f535279e6ab13ef7eb7fd17be7a..ace5bb7b07c70c6e71efd11d13783ba17b03ee01 100644 --- a/crates/unified/src/server/planets.rs +++ b/crates/unified/src/server/planets.rs @@ -22,7 +22,7 @@ fn start_loading_planets(assets: Res, mut planets: ResMut>, + mut ev_config: MessageReader>, assets: ResMut>, planets: ResMut, mut q_planets: Query<( diff --git a/crates/unified/src/server/player.rs b/crates/unified/src/server/player.rs index d529f007f8f7ee94505b9398857975ea0163e776..d77cf5391e4b7b78fac6eede411768a444d1ba0a 100644 --- a/crates/unified/src/server/player.rs +++ b/crates/unified/src/server/player.rs @@ -1,3 +1,4 @@ +use crate::attachment::{Joint, JointOf, Joints, PartInShip, Peer, SnapOf, SnapOfJoint}; use crate::config::planet::Planet; use crate::ecs::{DragRequestEvent, Part, Player, PlayerStorage, PlayerThrust, ThrustEvent}; use crate::server::part::SpawnPartRequest; @@ -6,14 +7,19 @@ use crate::server::world_config::WorldConfigResource; use crate::server::{ConnectedGameEntity, ConnectedNetworkEntity}; use bevy::prelude::*; use bevy_rapier2d::prelude::{ExternalForce, FixedJointBuilder, ImpulseJoint, Velocity}; -use bevy_replicon::prelude::FromClient; +use bevy_replicon::prelude::{ClientId, FromClient}; use std::f32::consts::PI; -use crate::attachment::{Joint, JointOf, Joints, PartInShip, Peer, SnapOf, SnapOfJoint}; pub fn player_management_plugin(app: &mut App) { app.add_systems( Update, - (handle_new_players, player_thrust, magic_fuel_regen, (reprocess_reattached_parts, dragging).chain()).in_set(PlayerInputSet), + ( + handle_new_players, + player_thrust, + magic_fuel_regen, + (reprocess_reattached_parts, dragging).chain(), + ) + .in_set(PlayerInputSet), ); } @@ -32,16 +38,22 @@ fn disconnect_part( trace!(?entity, ?joints, "recursive disconnect"); // recursive disconnect part for joint in &**joints { - let Ok((other_joint_handle, _)) = q_peer.get(*joint) else { continue }; + let Ok((other_joint_handle, _)) = q_peer.get(*joint) else { + continue; + }; let other_joint = other_joint_handle.0; commands.entity(*joint).remove::(); - let Ok((_, other_joint_of)) = q_peer.get(other_joint) else { continue }; + let Ok((_, other_joint_of)) = q_peer.get(other_joint) else { + continue; + }; commands.entity(other_joint).remove::(); - let Ok(joints) = q_joints.get(other_joint_of.0) else { continue }; + let Ok(joints) = q_joints.get(other_joint_of.0) else { + continue; + }; /*if other_joint != recursed_entity { disconnect_part(other_joint, entity, joints, q_joints, q_peer, commands.reborrow()); } TODO this loops forever? */ @@ -51,18 +63,37 @@ fn disconnect_part( } fn dragging( - mut events: EventReader>, - mut parts: Query<(&mut Transform, Option<&PartInShip>, Entity, &mut Velocity, &Joints), (With, Without)>, + mut events: MessageReader>, + mut parts: Query< + ( + &mut Transform, + Option<&PartInShip>, + Entity, + &mut Velocity, + &Joints, + ), + (With, Without), + >, snaps: Query<(&SnapOf, &SnapOfJoint)>, joints: Query<(&Joint, &JointOf, &Transform, Option<&Peer>, Entity)>, peer: Query<(&Peer, &JointOf)>, q_joints: Query<&Joints>, q_joint: Query<&ImpulseJoint>, clients: Query<&ConnectedNetworkEntity>, - mut commands: Commands + mut commands: Commands, ) { - for FromClient { event, client_entity } in events.read() { - let ConnectedNetworkEntity { game_entity: player_hearty_entity } = clients.get(*client_entity).unwrap(); + for FromClient { + client_id, + message: event, + } in events.read() + { + let client_entity = match client_id { + ClientId::Client(e) => e, + _ => continue, + }; + let ConnectedNetworkEntity { + game_entity: player_hearty_entity, + } = clients.get(*client_entity).unwrap(); debug!(?event, "got drag request event"); @@ -70,47 +101,70 @@ fn dragging( let mut teleport_to_rotation = Quat::from_rotation_z(0.0); let mut new_vel = None; - if let Some(snap_to) = event.snap_target && let Some(peer_snap) = event.peer_snap { - let Ok(snap_on_target) = snaps.get(snap_to) else { continue }; - let Ok(snap_on_source) = snaps.get(peer_snap) else { continue }; + if let Some(snap_to) = event.snap_target + && let Some(peer_snap) = event.peer_snap + { + let Ok(snap_on_target) = snaps.get(snap_to) else { + continue; + }; + let Ok(snap_on_source) = snaps.get(peer_snap) else { + continue; + }; - let Ok(target_joint) = joints.get(snap_on_target.1.0) else { continue }; - let Ok(source_joint) = joints.get(snap_on_source.1.0) else { continue }; + let Ok(target_joint) = joints.get(snap_on_target.1.0) else { + continue; + }; + let Ok(source_joint) = joints.get(snap_on_source.1.0) else { + continue; + }; // validation step 1: everything must match. if not, ignore the request if snap_on_target.0.0 != target_joint.1.0 { - warn!("drag request: mismatched target entities (potential manipulation?), ignoring"); + warn!( + "drag request: mismatched target entities (potential manipulation?), ignoring" + ); continue; } if snap_on_source.0.0 != source_joint.1.0 { - warn!("drag request: mismatched source entities (potential manipulation?), ignoring request"); + warn!( + "drag request: mismatched source entities (potential manipulation?), ignoring request" + ); continue; } // we've passed initial validation. // do not allow drags with the source or destination if they already have a peer (are attached) if target_joint.3.is_some() { - warn!("drag request: cannot attach to a joint that already has a peer, ignoring request"); + warn!( + "drag request: cannot attach to a joint that already has a peer, ignoring request" + ); continue; } if source_joint.3.is_some() { - warn!("drag request: dragging from a part that is already attached is currently not supported, ignoring request"); + warn!( + "drag request: dragging from a part that is already attached is currently not supported, ignoring request" + ); continue; } // great, the attachment appears to be valid // let's make sure this player is allowed to drag onto this part let target_part = { - let Ok(target_part) = parts.get(target_joint.1.0) else { continue }; - target_part.clone() + let Ok(target_part) = parts.get(target_joint.1.0) else { + continue; + }; + target_part }; let source_part = { - let Ok(source_part) = parts.get(source_joint.1.0) else { continue }; - source_part.clone() + let Ok(source_part) = parts.get(source_joint.1.0) else { + continue; + }; + source_part }; - let allowed = target_joint.1.0 == *player_hearty_entity || target_part.1.is_some_and(|u| u.0 == *player_hearty_entity); + let allowed = target_joint.1.0 == *player_hearty_entity + || target_part.1.is_some_and(|u| u.0 == *player_hearty_entity); if !allowed { warn!("drag request: this player cannot move this part, ignoring request"); continue; @@ -121,13 +175,18 @@ fn dragging( // great, we have a valid peering request let did_disconnect = q_joint.get(source_part.2).is_ok(); - disconnect_part(source_part.2, Entity::PLACEHOLDER, source_part.4, q_joints, peer, commands.reborrow()); + disconnect_part( + source_part.2, + Entity::PLACEHOLDER, + source_part.4, + q_joints, + peer, + commands.reborrow(), + ); // create the peering component... - commands.entity(source_joint.4) - .insert(Peer(target_joint.4)); - commands.entity(target_joint.4) - .insert(Peer(source_joint.4)); + commands.entity(source_joint.4).insert(Peer(target_joint.4)); + commands.entity(target_joint.4).insert(Peer(source_joint.4)); // propagate PartInShip... @@ -137,8 +196,7 @@ fn dragging( PartInShip(target_part.1.unwrap().0) // unwrap: checked above (during 'allowed' calculation) }; - commands.entity(source_part.2) - .insert(part_in_ship); + commands.entity(source_part.2).insert(part_in_ship); let target_position = target_part.0.mul_transform(*target_joint.2); @@ -148,14 +206,13 @@ fn dragging( // create the joint... let joint = FixedJointBuilder::new() .local_anchor1(target_joint.2.translation.xy()) - .local_basis1(target_joint.0.transform.rotation.to_euler(EulerRot::ZYX).0 + PI - - source_joint.0.transform.rotation.to_euler(EulerRot::ZYX).0); + .local_basis1( + target_joint.0.transform.rotation.to_euler(EulerRot::ZYX).0 + PI + - source_joint.0.transform.rotation.to_euler(EulerRot::ZYX).0, + ); commands.entity(source_part.2).remove::(); - if !did_disconnect { - commands.entity(source_part.2) - .insert(ImpulseJoint::new(target_part.2, joint)); - } else { + if did_disconnect { // we disconnected this part this tick, and are performing a "reattachment" // (dragging an already attached part from peering point A to peering point B) @@ -170,19 +227,35 @@ fn dragging( // we need to delay the creation of the new joint by 1 tick so it's noticed by Rapier // This component will be swapped out for a real ImpulseJoint on the next tick // by `reprocess_reattached_parts` (in this file) - commands.entity(source_part.2) + commands + .entity(source_part.2) .insert(JointNeedsCreation(ImpulseJoint::new(target_part.2, joint))); + } else { + commands + .entity(source_part.2) + .insert(ImpulseJoint::new(target_part.2, joint)); } teleport_to_translation = target_position.translation.xy(); - teleport_to_rotation = target_position.rotation * source_joint.0.transform.rotation.inverse() * Quat::from_rotation_z(PI); + teleport_to_rotation = target_position.rotation + * source_joint.0.transform.rotation.inverse() + * Quat::from_rotation_z(PI); new_vel = Some(*target_part.3); // and we're done! } else { - warn!("blindly accepting non-attachment request, someone should change this eventually"); + warn!( + "blindly accepting non-attachment request, someone should change this eventually" + ); warn!("dragging already attached entities may cause inconsistent behavior!!"); let source_part = parts.get(event.drag_target).unwrap(); - disconnect_part(source_part.2, Entity::PLACEHOLDER, source_part.4, q_joints, peer, commands.reborrow()); + disconnect_part( + source_part.2, + Entity::PLACEHOLDER, + source_part.4, + q_joints, + peer, + commands.reborrow(), + ); teleport_to_translation = event.drag_to; teleport_to_rotation = event.set_rotation; } @@ -201,16 +274,16 @@ fn dragging( // LOGIC: **MUST** run BEFORE `dragging` fn reprocess_reattached_parts( reattached: Query<(Entity, &JointNeedsCreation)>, - mut commands: Commands + mut commands: Commands, ) { for (e, j) in &reattached { - commands.entity(e) + commands + .entity(e) .remove::() .insert(j.0); } } - fn handle_new_players( mut commands: Commands, q_new_clients: Query>, @@ -262,26 +335,33 @@ fn handle_new_players( } } -fn magic_fuel_regen( - mut players: Query<&mut PlayerStorage, With>, - time: Res