diff --git a/.github/workflows/release-plz.yml b/.github/workflows/release-plz.yml index f7680063..bc4f2498 100644 --- a/.github/workflows/release-plz.yml +++ b/.github/workflows/release-plz.yml @@ -60,7 +60,7 @@ jobs: needs: [release-plz-release] permissions: contents: write - if: ${{ contains(needs.release-plz-release.outputs.releases, '"package_name":"vantablock-client"') }} + if: ${{ contains(needs.release-plz-release.outputs.releases, '"package_name":"vantablock-runner"') }} strategy: fail-fast: false matrix: @@ -87,46 +87,68 @@ jobs: with: tool: cargo-packager - - name: Build and Package + - name: Build and Package Game run: | - cargo build -p client --profile distribution --features distribution - cargo packager -p client --profile distribution + cargo build -p vantablock-runner --bin game --profile distribution --features distribution + cargo packager -p vantablock-runner --bin game --profile distribution - - name: Extract Client Release Tag - id: client_tag + - name: Build and Package Server shell: bash run: | - # extract tag from package_name='client' to append release assets to - TAG=$(echo '${{ needs.release-plz-release.outputs.releases }}' | jq -r '.[] | select(.package_name == "vantablock-client") | .tag') + cargo build -p vantablock-runner --bin server --profile distribution + + # Create server archive + mkdir -p target/distribution/server + if [[ "${{ matrix.os }}" == "windows-latest" ]]; then + cp target/distribution/server.exe target/distribution/server/VantablockServer.exe + cd target/distribution/server + 7z a ../VantablockServer-windows-x86_64.zip VantablockServer.exe + else + cp target/distribution/server target/distribution/server/VantablockServer + cd target/distribution/server + tar -czf ../VantablockServer-${{ matrix.os == 'macos-latest' && 'macos' || 'linux' }}-x86_64.tar.gz VantablockServer + fi + + - name: Extract Release Tag + id: release_tag + shell: bash + run: | + TAG=$(echo '${{ needs.release-plz-release.outputs.releases }}' | jq -r '.[] | select(.package_name == "vantablock-runner") | .tag') if [ -z "$TAG" ] || [ "$TAG" == "null" ]; then - echo "Error: Could not find tag for client package." + echo "Error: Could not find tag for runner package." exit 1 fi echo "tag=$TAG" >> $GITHUB_OUTPUT - - name: Rename client assets to Vantablock + - name: Rename and Filter assets shell: bash run: | cd target/distribution/ || exit 0 - # loop through all files starting with "client" and change to "Vantablock" - for file in client*; do + # Rename game assets + for file in game*; do if [[ -f "$file" ]]; then - mv "$file" "${file/client/Vantablock}" + mv "$file" "${file/game/Vantablock}" fi done + # Remove non-functional Windows exe (we want the installer) + if [[ "${{ matrix.os }}" == "windows-latest" ]]; then + rm -f Vantablock.exe + fi + - name: Upload Release Assets uses: softprops/action-gh-release@v2 with: - tag_name: ${{ steps.client_tag.outputs.tag }} + tag_name: ${{ steps.release_tag.outputs.tag }} files: | target/distribution/Vantablock*.dmg + target/distribution/Vantablock*.msi target/distribution/Vantablock*.exe - target/distribution/Vantablock*.AppImage - target/distribution/Vantablock*.tar.gz - target/distribution/Vantablock*.pkg target/distribution/Vantablock*.deb + target/distribution/Vantablock*.AppImage + target/distribution/VantablockServer*.tar.gz + target/distribution/VantablockServer*.zip fail_on_unmatched_files: false env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index af8023ce..368a8186 100644 --- a/.gitignore +++ b/.gitignore @@ -5,5 +5,5 @@ .direnv # project specific -/target -.dev_data +target +vantadev diff --git a/.vscode/settings.json b/.vscode/settings.json index 7b7a1d2b..403bb330 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,8 +1,15 @@ { "nixEnvSelector.nixFile": "${workspaceFolder}/flake.nix", "nixEnvSelector.useFlakes": true, - "rust-analyzer.cargo.features": ["tracy"], + + "rust-analyzer.cargo.features": ["tracy", "dev"], "rust-analyzer.cargo.allFeatures": false, "rust-analyzer.procMacro.enable": true, - "rust-analyzer.check.command": "clippy" + "rust-analyzer.check.command": "clippy", + + "rust-analyzer.check.extraArgs": ["--target-dir", "target/analyzer"], + "rust-analyzer.checkOnSave": false, + "rust-analyzer.lru.capacity": 256, + "rust-analyzer.inlayHints.enable": false, + "rust-analyzer.cargo.extraArgs": ["-j", "4"] } diff --git a/Cargo.lock b/Cargo.lock index 065794bb..03a9afe4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,6 +23,10 @@ name = "accesskit" version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf203f9d3bd8f29f98833d1fbef628df18f759248a547e7e01cfbf63cda36a99" +dependencies = [ + "enumn", + "serde", +] [[package]] name = "accesskit_consumer" @@ -81,6 +85,109 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + +[[package]] +name = "aeronet_io" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d50ca460ea143f90a3c1ecf36709b9cbb49752d5ddfbf2d67623b465fbfb81" +dependencies = [ + "anyhow", + "bevy_app", + "bevy_ecs", + "bevy_platform", + "bevy_reflect", + "bytes", + "derive_more", + "log", +] + +[[package]] +name = "aeronet_steam" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c9fea14c3de9d1f8c4cb7bdd8be3e304ae4a45be9f3a8c02008b033165df976" +dependencies = [ + "aeronet_io", + "anyhow", + "bevy_app", + "bevy_ecs", + "bevy_platform", + "blocking", + "bytes", + "derive_more", + "oneshot", + "steamworks", + "sync_wrapper", + "tracing", +] + +[[package]] +name = "aeronet_websocket" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab40ded6412a153f6e189620251f44cb74dc43a218eddea9f4fe4ba55a72e763" +dependencies = [ + "aeronet_io", + "bevy_app", + "bevy_ecs", + "bevy_platform", + "bytes", + "cfg-if", + "derive_more", + "futures", + "js-sys", + "rcgen", + "rustls", + "rustls-native-certs", + "tokio", + "tokio-rustls", + "tokio-tungstenite", + "tracing", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "aeronet_webtransport" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af4243f8320cca7bf4ce0e1e41aea4553007279685e181e3d566325260a49822" +dependencies = [ + "aeronet_io", + "base64", + "bevy_app", + "bevy_ecs", + "bevy_platform", + "bevy_reflect", + "bytes", + "cfg-if", + "derive_more", + "futures", + "gloo-timers", + "js-sys", + "spki", + "tokio", + "tracing", + "wasm-bindgen", + "wasm-bindgen-futures", + "wtransport", + "x509-cert", + "xwt-core", + "xwt-web", + "xwt-wtransport", +] + [[package]] name = "ahash" version = "0.8.12" @@ -103,6 +210,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "alsa" version = "0.9.1" @@ -110,7 +223,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed7572b7ba83a31e20d1b48970ee402d2e3e0537dcfe0a3ff4d6eb7508617d43" dependencies = [ "alsa-sys", - "bitflags 2.11.0", + "bitflags 2.11.1", "cfg-if", "libc", ] @@ -132,7 +245,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f2a1bb052857d5dd49572219344a7332b31b76405648eabac5bc68978251bcd" dependencies = [ "android-properties", - "bitflags 2.11.0", + "bitflags 2.11.1", "cc", "jni 0.22.4", "libc", @@ -239,6 +352,45 @@ dependencies = [ "libloading", ] +[[package]] +name = "asn1-rs" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56624a96882bb8c26d61312ae18cb45868e5a9992ea73c58e45c3101e56a1e60" +dependencies = [ + "asn1-rs-derive", + "asn1-rs-impl", + "displaydoc", + "nom", + "num-traits", + "rusticata-macros", + "thiserror 2.0.18", + "time", +] + +[[package]] +name = "asn1-rs-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "asn1-rs-impl" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "assert_type_match" version = "0.1.1" @@ -348,9 +500,9 @@ dependencies = [ [[package]] name = "atomicow" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52e8890bb9844440d0c412fa74b67fd2f14e85248b6e00708059b6da9e5f8bf" +checksum = "301801c08259e328a1c7da556608c0c22687708831b22024dbd3a57ea741e6de" dependencies = [ "portable-atomic", "portable-atomic-util", @@ -362,12 +514,103 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "avian2d" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "060ae40aced85ed01296f556ed1909fcafe81a5e5059889bed126339ccd55b43" +dependencies = [ + "approx", + "arrayvec", + "avian_derive", + "bevy", + "bevy_heavy", + "bevy_math", + "bevy_transform_interpolation", + "bitflags 2.11.1", + "derive_more", + "disqualified", + "glam_matrix_extras", + "itertools 0.13.0", + "slab", + "smallvec", + "thiserror 2.0.18", +] + +[[package]] +name = "avian3d" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b82608b43397affac139547dfa9beb3208034c53e1a3cfe5d4079db1af362104" +dependencies = [ + "approx", + "avian_derive", + "bevy", + "bevy_heavy", + "bevy_math", + "bevy_transform_interpolation", + "bitflags 2.11.1", + "derive_more", + "disqualified", + "glam_matrix_extras", + "itertools 0.13.0", + "slab", + "smallvec", + "thiserror 2.0.18", +] + +[[package]] +name = "avian_derive" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12b257f601a1535e0d4a7a7796f535e3a13de62fd422b16dff7c14d27f0d4048" +dependencies = [ + "proc-macro-error2", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "aws-lc-rs" +version = "1.16.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec6fb3fe69024a75fa7e1bfb48aa6cf59706a101658ea01bfd33b2b248a038f" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.40.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f50037ee5e1e41e7b8f9d161680a725bd1626cb6f8c7e901f91f942850852fe7" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", +] + +[[package]] +name = "az" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be5eb007b7cacc6c660343e96f650fedf4b5a77512399eb952ca6642cf8d13f7" + [[package]] name = "base64" version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + [[package]] name = "beef" version = "0.5.2" @@ -394,6 +637,7 @@ dependencies = [ "bevy_derive", "bevy_ecs", "bevy_reflect", + "serde", ] [[package]] @@ -515,7 +759,7 @@ dependencies = [ "bevy_reflect", "bevy_tasks", "bevy_utils", - "bitflags 2.11.0", + "bitflags 2.11.1", "blake3", "crossbeam-channel", "derive_more", @@ -632,7 +876,7 @@ dependencies = [ "bevy_transform", "bevy_utils", "bevy_window", - "bitflags 2.11.0", + "bitflags 2.11.1", "nonmax", "radsort", "smallvec", @@ -711,7 +955,7 @@ dependencies = [ "bevy_reflect", "bevy_tasks", "bevy_utils", - "bitflags 2.11.0", + "bitflags 2.11.1", "bumpalo", "concurrent-queue", "derive_more", @@ -748,6 +992,32 @@ dependencies = [ "encase_derive_impl", ] +[[package]] +name = "bevy_enhanced_input" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5e4981e85546349e7ccce7e68aaf9c36e6eed556f7f29087dee184ee7941fb9" +dependencies = [ + "bevy", + "bevy_enhanced_input_macros", + "bitflags 2.11.1", + "log", + "serde", + "smallvec", + "variadics_please", +] + +[[package]] +name = "bevy_enhanced_input_macros" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4680cc23f335f1b768caf91a94b1aa1d786149788644043fe8d49e5708b5cbcc" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "bevy_feathers" version = "0.18.1" @@ -886,6 +1156,17 @@ dependencies = [ "tracing", ] +[[package]] +name = "bevy_heavy" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc496d1d43b890896cf561d8ce3dcf7b7b8e4c03c4e837a49a83a530abccbc5e" +dependencies = [ + "bevy_math", + "bevy_reflect", + "glam_matrix_extras", +] + [[package]] name = "bevy_image" version = "0.18.1" @@ -900,7 +1181,7 @@ dependencies = [ "bevy_platform", "bevy_reflect", "bevy_utils", - "bitflags 2.11.0", + "bitflags 2.11.1", "bytemuck", "futures-lite", "guillotiere", @@ -928,6 +1209,7 @@ dependencies = [ "bevy_reflect", "derive_more", "log", + "serde", "smol_str", "thiserror 2.0.18", ] @@ -942,6 +1224,7 @@ dependencies = [ "bevy_ecs", "bevy_input", "bevy_math", + "bevy_picking", "bevy_reflect", "bevy_window", "log", @@ -981,6 +1264,7 @@ dependencies = [ "bevy_math", "bevy_mesh", "bevy_pbr", + "bevy_picking", "bevy_platform", "bevy_post_process", "bevy_ptr", @@ -1066,7 +1350,7 @@ dependencies = [ "glam", "itertools 0.14.0", "libm", - "rand 0.9.2", + "rand 0.9.4", "rand_distr", "serde", "thiserror 2.0.18", @@ -1089,10 +1373,11 @@ dependencies = [ "bevy_platform", "bevy_reflect", "bevy_transform", - "bitflags 2.11.0", + "bitflags 2.11.1", "bytemuck", "derive_more", "hexasphere", + "serde", "thiserror 2.0.18", "tracing", "wgpu-types", @@ -1129,7 +1414,7 @@ dependencies = [ "bevy_shader", "bevy_transform", "bevy_utils", - "bitflags 2.11.0", + "bitflags 2.11.1", "bytemuck", "derive_more", "fixedbitset", @@ -1205,7 +1490,7 @@ dependencies = [ "bevy_transform", "bevy_utils", "bevy_window", - "bitflags 2.11.0", + "bitflags 2.11.1", "nonmax", "radsort", "smallvec", @@ -1289,7 +1574,7 @@ dependencies = [ "bevy_transform", "bevy_utils", "bevy_window", - "bitflags 2.11.0", + "bitflags 2.11.1", "bytemuck", "derive_more", "downcast-rs 2.0.2", @@ -1411,7 +1696,7 @@ dependencies = [ "bevy_text", "bevy_transform", "bevy_utils", - "bitflags 2.11.0", + "bitflags 2.11.1", "bytemuck", "derive_more", "fixedbitset", @@ -1524,6 +1809,15 @@ dependencies = [ "thiserror 2.0.18", ] +[[package]] +name = "bevy_transform_interpolation" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88545c8b0fa8f3502b9a439c71fa6b596ee9e808bfb16f27a51c8c6f7405a657" +dependencies = [ + "bevy", +] + [[package]] name = "bevy_ui" version = "0.18.1" @@ -1551,6 +1845,7 @@ dependencies = [ "bevy_utils", "bevy_window", "derive_more", + "serde", "smallvec", "taffy", "thiserror 2.0.18", @@ -1673,13 +1968,23 @@ dependencies = [ "winit", ] +[[package]] +name = "bincode" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" +dependencies = [ + "serde", + "unty", +] + [[package]] name = "bindgen" version = "0.72.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "cexpr", "clang-sys", "itertools 0.13.0", @@ -1714,9 +2019,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.11.0" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" dependencies = [ "bytemuck", "serde_core", @@ -1724,9 +2029,9 @@ dependencies = [ [[package]] name = "blake3" -version = "1.8.4" +version = "1.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d2d5991425dfd0785aed03aedcf0b321d61975c9b5b3689c774a2610ae0b51e" +checksum = "0aa83c34e62843d924f905e0f5c866eb1dd6545fc4d719e803d9ba6030371fce" dependencies = [ "arrayref", "arrayvec", @@ -1825,6 +2130,10 @@ name = "bytes" version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +dependencies = [ + "portable-atomic", + "serde", +] [[package]] name = "calloop" @@ -1832,7 +2141,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "log", "polling", "rustix 0.38.44", @@ -1860,9 +2169,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.59" +version = "1.2.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7a4d3ec6524d28a329fc53654bbadc9bdd7b0431f5d65f1a56ffb28a1ee5283" +checksum = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d" dependencies = [ "find-msvc-tools", "jobserver", @@ -1897,6 +2206,43 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chacha20" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", +] + +[[package]] +name = "chacha20poly1305" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" +dependencies = [ + "aead", + "chacha20", + "cipher", + "poly1305", + "zeroize", +] + +[[package]] +name = "chrono" +version = "0.4.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link 0.2.1", +] + [[package]] name = "ciborium" version = "0.2.2" @@ -1924,6 +2270,17 @@ dependencies = [ "half", ] +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", + "zeroize", +] + [[package]] name = "clang-sys" version = "1.8.1" @@ -1937,9 +2294,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.6.0" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" dependencies = [ "clap_builder", ] @@ -1960,6 +2317,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" +[[package]] +name = "cmake" +version = "0.1.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" +dependencies = [ + "cc", +] + [[package]] name = "codespan-reporting" version = "0.12.0" @@ -2007,6 +2373,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32b13ea120a812beba79e34316b3942a857c86ec1593cb34f27bb28272ce2cca" +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + [[package]] name = "const_panic" version = "0.2.15" @@ -2102,7 +2474,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "core-foundation 0.10.1", "libc", ] @@ -2142,7 +2514,7 @@ version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4cadaea21e24c49c0c82116f2b465ae6a49d63c90e428b0f8d9ae1f638ac91f" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "fontdb", "harfrust", "linebender_resource_handle", @@ -2321,6 +2693,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", + "rand_core 0.6.4", "typenum", ] @@ -2342,16 +2715,68 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" [[package]] -name = "dasp_sample" +name = "dashmap" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[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.10.0" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "der_derive", + "flagset", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "der-parser" +version = "10.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6" +dependencies = [ + "asn1-rs", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", +] + +[[package]] +name = "der_derive" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" +checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "deranged" @@ -2428,12 +2853,23 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block2 0.6.2", "libc", "objc2 0.6.4", ] +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "disqualified" version = "1.0.0" @@ -2476,6 +2912,30 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "dyn-eq" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2d035d21af5cde1a6f5c7b444a5bf963520a9f142e5d06931178433d7d5388" + +[[package]] +name = "dyn-hash" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fdab65db9274e0168143841eb8f864a0a21f8b1b8d2ba6812bbe6024346e99e" + [[package]] name = "either" version = "1.15.0" @@ -2522,6 +2982,35 @@ dependencies = [ "syn", ] +[[package]] +name = "endian-type" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" + +[[package]] +name = "enum_dispatch" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa18ce2bc66555b3218614519ac839ddb759a7d6720732f979ef8d13be147ecd" +dependencies = [ + "once_cell", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "enumn" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -2609,12 +3098,31 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +[[package]] +name = "fixed" +version = "1.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9af2cbf772fa6d1c11358f92ef554cb6b386201210bcf0e91fb7fba8a907fb40" +dependencies = [ + "az", + "bytemuck", + "half", + "serde", + "typenum", +] + [[package]] name = "fixedbitset" version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" +[[package]] +name = "flagset" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7ac824320a75a52197e8f2d787f6a38b6718bb6897a35142d749af3c0e8f4fe" + [[package]] name = "flate2" version = "1.1.9" @@ -2654,9 +3162,9 @@ dependencies = [ [[package]] name = "font-types" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d9237c6d82152100c691fb77ea18037b402bcc7257d2c876a4ffac81bc22a1c" +checksum = "5b38ad915f6dadd993ced50848a8291a543bd41ca62bc10740d5e64e2ab4cfd7" dependencies = [ "bytemuck", ] @@ -2711,6 +3219,21 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "fsevent-sys" version = "4.1.0" @@ -2720,6 +3243,21 @@ dependencies = [ "libc", ] +[[package]] +name = "futures" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" version = "0.3.32" @@ -2727,6 +3265,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -2735,6 +3274,17 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +[[package]] +name = "futures-executor" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + [[package]] name = "futures-io" version = "0.3.32" @@ -2765,21 +3315,37 @@ dependencies = [ "syn", ] +[[package]] +name = "futures-sink" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" + [[package]] name = "futures-task" version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" + [[package]] name = "futures-util" version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ + "futures-channel", "futures-core", + "futures-io", "futures-macro", + "futures-sink", "futures-task", + "memchr", "pin-project-lite", "slab", ] @@ -2826,8 +3392,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", ] [[package]] @@ -2837,9 +3405,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi 5.3.0", "wasip2", + "wasm-bindgen", ] [[package]] @@ -2906,19 +3476,42 @@ version = "0.30.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19fc433e8437a212d1b6f1e68c7824af3aed907da60afa994e7f542d18d12aa9" dependencies = [ + "approx", "bytemuck", "encase", "libm", - "rand 0.9.2", + "rand 0.9.4", "serde_core", ] +[[package]] +name = "glam_matrix_extras" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4664468a60479272b880a8bfc00ad2915229b93d2b2d585556fb33f9ba80e72" +dependencies = [ + "bevy_reflect", + "glam", +] + [[package]] name = "glob" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + [[package]] name = "glow" version = "0.16.0" @@ -2976,13 +3569,36 @@ dependencies = [ "gl_generator", ] +[[package]] +name = "governor" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9efcab3c1958580ff1f25a2a41be1668f7603d849bb63af523b208a3cc1223b8" +dependencies = [ + "cfg-if", + "dashmap", + "futures-sink", + "futures-timer", + "futures-util", + "getrandom 0.3.4", + "hashbrown 0.16.1", + "nonzero_ext", + "parking_lot", + "portable-atomic", + "quanta", + "rand 0.9.4", + "smallvec", + "spinning_top", + "web-time", +] + [[package]] name = "gpu-alloc" version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "gpu-alloc-types", ] @@ -2992,7 +3608,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", ] [[package]] @@ -3013,7 +3629,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "gpu-descriptor-types", "hashbrown 0.15.5", ] @@ -3024,14 +3640,14 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", ] [[package]] name = "grid" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9e2d4c0a8296178d8802098410ca05d86b17a10bb5ab559b3fb404c1f948220" +checksum = "b40ca9252762c466af32d0b1002e91e4e1bc5398f77455e55474deb466355ff5" [[package]] name = "guillotiere" @@ -3061,7 +3677,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e0caaee032384c10dd597af4579c67dee16650d862a9ccbe1233ff1a379abc07" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "bytemuck", "core_maths", "read-fonts 0.36.0", @@ -3077,6 +3693,12 @@ dependencies = [ "byteorder", ] +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + [[package]] name = "hashbrown" version = "0.15.5" @@ -3092,12 +3714,19 @@ version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" dependencies = [ + "allocator-api2", "equivalent", "foldhash 0.2.0", "serde", "serde_core", ] +[[package]] +name = "hashbrown" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" + [[package]] name = "heapless" version = "0.9.2" @@ -3139,114 +3768,272 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" [[package]] -name = "id-arena" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" - -[[package]] -name = "image" -version = "0.25.10" +name = "httlib-huffman" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" -dependencies = [ - "bytemuck", - "byteorder-lite", - "moxcms", - "num-traits", - "png", -] +checksum = "1a9fcbcc408c5526c3ab80d534e5c86e7967c1fb7aa0a8c76abd1edc27deb877" [[package]] -name = "indexmap" -version = "2.13.1" +name = "http" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45a8a2b9cb3e0b0c1803dbb0758ffac5de2f425b23c28f518faabd9d805342ff" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ - "equivalent", - "hashbrown 0.16.1", - "serde", - "serde_core", + "bytes", + "itoa", ] [[package]] -name = "inflections" -version = "1.1.1" +name = "httparse" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] -name = "inotify" -version = "0.11.1" +name = "iana-time-zone" +version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd5b3eaf1a28b758ac0faa5a4254e8ab2705605496f1b1f3fbbc3988ad73d199" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ - "bitflags 2.11.0", - "inotify-sys", - "libc", + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.62.2", ] [[package]] -name = "inotify-sys" -version = "0.1.5" +name = "iana-time-zone-haiku" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ - "libc", + "cc", ] [[package]] -name = "inventory" -version = "0.3.24" +name = "icu_collections" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ - "rustversion", + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", ] [[package]] -name = "is-terminal" -version = "0.4.17" +name = "icu_locale_core" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.61.2", + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", ] [[package]] -name = "itertools" -version = "0.10.5" +name = "icu_normalizer" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ - "either", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", ] [[package]] -name = "itertools" -version = "0.13.0" +name = "icu_normalizer_data" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] -name = "itertools" -version = "0.14.0" +name = "icu_properties" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ - "either", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", ] [[package]] -name = "itoa" -version = "1.0.18" +name = "icu_properties_data" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "image" +version = "0.25.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" +dependencies = [ + "bytemuck", + "byteorder-lite", + "moxcms", + "num-traits", + "png", +] + +[[package]] +name = "indexmap" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" +dependencies = [ + "equivalent", + "hashbrown 0.17.0", + "serde", + "serde_core", +] + +[[package]] +name = "inflections" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a" + +[[package]] +name = "inotify" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd5b3eaf1a28b758ac0faa5a4254e8ab2705605496f1b1f3fbbc3988ad73d199" +dependencies = [ + "bitflags 2.11.1", + "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 = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "inventory" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b" +dependencies = [ + "rustversion", +] + +[[package]] +name = "is-terminal" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jni" @@ -3334,9 +4121,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.94" +version = "0.3.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9" +checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca" dependencies = [ "cfg-if", "futures-util", @@ -3396,7 +4183,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff7f53bdf698e7aa7ec916411bbdc8078135da11b66db5182675b2227f6c0d07" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", ] [[package]] @@ -3436,6 +4223,34 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "leafwing-input-manager" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed83d1d7334e742aab3409782cdbb2bc96cc017df9ff342dd5aeb80eed1b784" +dependencies = [ + "bevy", + "dyn-clone", + "dyn-eq", + "dyn-hash", + "itertools 0.14.0", + "leafwing_input_manager_macros", + "serde", + "serde_flexitos", +] + +[[package]] +name = "leafwing_input_manager_macros" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2226cb83129176a6c634f2ce0828c2c29896ea0898fc198636f98696b8056890" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "leb128fmt" version = "0.1.0" @@ -3484,72 +4299,719 @@ dependencies = [ ] [[package]] -name = "lexical-util" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2604dd126bb14f13fb5d1bd6a66155079cb9fa655b37f875b3a742c705dbed17" - -[[package]] -name = "lexical-write-float" -version = "1.0.6" +name = "lexical-util" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2604dd126bb14f13fb5d1bd6a66155079cb9fa655b37f875b3a742c705dbed17" + +[[package]] +name = "lexical-write-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c438c87c013188d415fbabbb1dceb44249ab81664efbd31b14ae55dabb6361" +dependencies = [ + "lexical-util", + "lexical-write-integer", +] + +[[package]] +name = "lexical-write-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "409851a618475d2d5796377cad353802345cba92c867d9fbcde9cf4eac4e14df" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "libc" +version = "0.2.186" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link 0.2.1", +] + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libredox" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" +dependencies = [ + "bitflags 2.11.1", + "libc", + "plain", + "redox_syscall 0.7.4", +] + +[[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 = "lightyear" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be51d4b8fe01a81efe7b0e53f1d5577719a507ca3bbd40cadcbf3ccaea82030d" +dependencies = [ + "aeronet_io", + "bevy_app", + "bevy_ecs", + "console_error_panic_hook", + "document-features", + "lightyear_aeronet", + "lightyear_avian2d", + "lightyear_avian3d", + "lightyear_connection", + "lightyear_core", + "lightyear_crossbeam", + "lightyear_frame_interpolation", + "lightyear_inputs", + "lightyear_inputs_bei", + "lightyear_inputs_leafwing", + "lightyear_inputs_native", + "lightyear_interpolation", + "lightyear_link", + "lightyear_messages", + "lightyear_metrics", + "lightyear_netcode", + "lightyear_prediction", + "lightyear_raw_connection", + "lightyear_replication", + "lightyear_serde", + "lightyear_steam", + "lightyear_sync", + "lightyear_transport", + "lightyear_udp", + "lightyear_ui", + "lightyear_utils", + "lightyear_web", + "lightyear_websocket", + "lightyear_webtransport", + "serde", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "lightyear_aeronet" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a8e7f2b66a63bba410403708bf9c98a7c8e0834a0a069db010e63e669e6735b" +dependencies = [ + "aeronet_io", + "bevy_app", + "bevy_ecs", + "bevy_reflect", + "lightyear_core", + "lightyear_link", + "tracing", +] + +[[package]] +name = "lightyear_avian2d" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3229fb076a2750bcf41037c6af553a8cb1dc59e3cdd1f7c8e0d6ae7cd855dc03" +dependencies = [ + "avian2d", + "bevy_app", + "bevy_ecs", + "bevy_math", + "bevy_time", + "bevy_transform", + "bevy_utils", + "lightyear_core", + "lightyear_frame_interpolation", + "lightyear_interpolation", + "lightyear_link", + "lightyear_prediction", + "lightyear_replication", + "tracing", +] + +[[package]] +name = "lightyear_avian3d" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca582724703dccafe64991bbe0d480e616de7e1056b07cd9c6862a48196b9ce0" +dependencies = [ + "avian3d", + "bevy_app", + "bevy_ecs", + "bevy_math", + "bevy_time", + "bevy_transform", + "bevy_utils", + "lightyear_core", + "lightyear_frame_interpolation", + "lightyear_interpolation", + "lightyear_link", + "lightyear_prediction", + "lightyear_replication", + "tracing", +] + +[[package]] +name = "lightyear_connection" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad7fa5c7b928074895a56e96d0154e78cbc4e751f37e1a9b0b5fda469eb28c74" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_platform", + "bevy_reflect", + "bytes", + "lightyear_core", + "lightyear_link", + "lightyear_serde", + "serde", + "smallvec", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "lightyear_core" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a310d13cb0059fd20f59ec60b24056403ffc2388daabbc663c8eb1d4a08ddf4" +dependencies = [ + "bevy_app", + "bevy_derive", + "bevy_ecs", + "bevy_platform", + "bevy_reflect", + "bevy_time", + "chrono", + "fixed", + "lightyear_serde", + "lightyear_utils", + "serde", + "tracing", +] + +[[package]] +name = "lightyear_crossbeam" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9b353e8b692034c99e6f9a89cc3c95ec4f7d123b32622228ccf680b849855fd" +dependencies = [ + "aeronet_io", + "bevy_app", + "bevy_ecs", + "bytes", + "crossbeam-channel", + "lightyear_core", + "lightyear_link", + "tracing", +] + +[[package]] +name = "lightyear_frame_interpolation" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66ce32814bfcd07d1b694443dd988d3e842976e87223ec48fc18283e8e0046ab" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_reflect", + "bevy_time", + "bevy_transform", + "bevy_utils", + "lightyear_connection", + "lightyear_core", + "lightyear_interpolation", + "lightyear_replication", + "serde", + "tracing", +] + +[[package]] +name = "lightyear_inputs" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4bbfad8e59fbd0d569a2e359be47a7a1b28fc8e494ae124eb2b5efbec54b8e2" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_platform", + "bevy_reflect", + "bevy_utils", + "lightyear_connection", + "lightyear_core", + "lightyear_interpolation", + "lightyear_link", + "lightyear_messages", + "lightyear_prediction", + "lightyear_replication", + "lightyear_sync", + "lightyear_transport", + "serde", + "tracing", +] + +[[package]] +name = "lightyear_inputs_bei" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2266633e2eeebfe5fcd5d3cea8984bc26b24b13942fd9c1aa9123da4de6c1a02" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_enhanced_input", + "bevy_reflect", + "bevy_utils", + "lightyear_connection", + "lightyear_core", + "lightyear_inputs", + "lightyear_link", + "lightyear_messages", + "lightyear_replication", + "lightyear_serde", + "serde", + "tracing", +] + +[[package]] +name = "lightyear_inputs_leafwing" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2cfbd794d8a42f06796acc6b8d4274d3fb53cd58f480881d2dd59176f076e49" +dependencies = [ + "bevy_app", + "bevy_derive", + "bevy_ecs", + "bevy_input", + "bevy_math", + "bevy_platform", + "bevy_reflect", + "bevy_utils", + "leafwing-input-manager", + "lightyear_core", + "lightyear_inputs", + "serde", + "tracing", +] + +[[package]] +name = "lightyear_inputs_native" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c992924e07b463528f34987fbd6b2248f37a66cfd41757dd9b9f8b5085765cdc" +dependencies = [ + "bevy_app", + "bevy_derive", + "bevy_ecs", + "bevy_reflect", + "lightyear_core", + "lightyear_inputs", + "serde", + "tracing", +] + +[[package]] +name = "lightyear_interpolation" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4545cb52f0232da161dd93836e5b4f23816850330ef322ba6bd3abba2a20f21" +dependencies = [ + "bevy_app", + "bevy_derive", + "bevy_ecs", + "bevy_math", + "bevy_platform", + "bevy_reflect", + "bevy_time", + "bevy_utils", + "lightyear_connection", + "lightyear_core", + "lightyear_messages", + "lightyear_replication", + "lightyear_serde", + "lightyear_sync", + "lightyear_utils", + "serde", + "tracing", +] + +[[package]] +name = "lightyear_link" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ede74a86374f21606be56aaf1c1bf9dd333f473866bd780ab449653f0caca24" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_reflect", + "bevy_utils", + "bytes", + "lightyear_core", + "lightyear_utils", + "rand 0.9.4", + "tracing", +] + +[[package]] +name = "lightyear_messages" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1141fb3d9895f5c9e8aa5d723d9b9bf9db800fd044ba8c8b542ac660beeab47" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_reflect", + "bevy_utils", + "bytes", + "lightyear_connection", + "lightyear_core", + "lightyear_link", + "lightyear_serde", + "lightyear_transport", + "lightyear_utils", + "serde", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "lightyear_metrics" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d3264ac1729043c949bf2c9526bfa712a1c7e683e4e0034ce7cac0f233c19db" +dependencies = [ + "bevy_app", + "bevy_color", + "bevy_ecs", + "bevy_platform", + "bevy_reflect", + "bevy_text", + "bevy_time", + "bevy_ui", + "bevy_utils", + "metrics", + "metrics-util", + "tracing", +] + +[[package]] +name = "lightyear_netcode" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db834d08f6826a2c25c9a355a33bb0db036da2da98b5f43b3982e6b5c41a0f4e" +dependencies = [ + "aeronet_io", + "bevy_app", + "bevy_ecs", + "bevy_reflect", + "bevy_time", + "bytes", + "chacha20poly1305", + "lightyear_connection", + "lightyear_core", + "lightyear_link", + "lightyear_serde", + "lightyear_transport", + "lightyear_utils", + "no_std_io2", + "rand 0.9.4", + "thiserror 2.0.18", + "tracing", + "web-time", +] + +[[package]] +name = "lightyear_prediction" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3ddda7d875590a2f91c082dd339507b79eb3221661f50fca18e6c2fdafbcc6c" +dependencies = [ + "bevy_app", + "bevy_derive", + "bevy_diagnostic", + "bevy_ecs", + "bevy_math", + "bevy_platform", + "bevy_reflect", + "bevy_time", + "bevy_utils", + "lightyear_connection", + "lightyear_core", + "lightyear_frame_interpolation", + "lightyear_interpolation", + "lightyear_messages", + "lightyear_replication", + "lightyear_sync", + "lightyear_utils", + "parking_lot", + "seahash", + "serde", + "tracing", +] + +[[package]] +name = "lightyear_raw_connection" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "631b5527b4f11d1e199f823ecdcd02585136fc55dd3261d5280e03bbcc29cdd3" +dependencies = [ + "aeronet_io", + "bevy_app", + "bevy_ecs", + "lightyear_connection", + "lightyear_core", + "lightyear_link", + "lightyear_transport", + "tracing", +] + +[[package]] +name = "lightyear_replication" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a451536b73e618035472548e8d7f1af51e193649f556318f7836ddc70e6f73d2" +dependencies = [ + "avian2d", + "avian3d", + "bevy_app", + "bevy_derive", + "bevy_ecs", + "bevy_math", + "bevy_platform", + "bevy_ptr", + "bevy_reflect", + "bevy_time", + "bevy_transform", + "bevy_utils", + "bytes", + "dashmap", + "indexmap", + "lightyear_connection", + "lightyear_core", + "lightyear_link", + "lightyear_messages", + "lightyear_serde", + "lightyear_sync", + "lightyear_transport", + "lightyear_utils", + "seahash", + "serde", + "smallvec", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "lightyear_serde" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c00dfe55ea4ba8413424616564b36c64d404fe9f5c68e4d71c4a97193da3d6e" +dependencies = [ + "bevy_derive", + "bevy_ecs", + "bevy_platform", + "bevy_ptr", + "bevy_reflect", + "bevy_utils", + "bincode", + "bytes", + "no_std_io2", + "serde", + "thiserror 2.0.18", + "tracing", + "variadics_please", +] + +[[package]] +name = "lightyear_steam" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b513c7aaeeaee3fbfe82e4ab7698cc3360d42526d167054af357920a166566" +dependencies = [ + "aeronet_io", + "aeronet_steam", + "bevy_app", + "bevy_ecs", + "lightyear_aeronet", + "lightyear_connection", + "lightyear_core", + "lightyear_link", + "thiserror 2.0.18", + "tracing", +] + +[[package]] +name = "lightyear_sync" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "834af4e025c9d7954c9684d82255e5ed639e0ce4482e3c674582687ce1f2dbfd" +dependencies = [ + "bevy_app", + "bevy_derive", + "bevy_diagnostic", + "bevy_ecs", + "bevy_reflect", + "bevy_time", + "bevy_utils", + "lightyear_connection", + "lightyear_core", + "lightyear_link", + "lightyear_messages", + "lightyear_serde", + "lightyear_transport", + "lightyear_utils", + "serde", + "tracing", +] + +[[package]] +name = "lightyear_transport" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c438c87c013188d415fbabbb1dceb44249ab81664efbd31b14ae55dabb6361" +checksum = "272b66fae233f66887cbef40c30d2a7673d299d327a9fdd2becbd3b2ae59336b" dependencies = [ - "lexical-util", - "lexical-write-integer", + "bevy_app", + "bevy_ecs", + "bevy_platform", + "bevy_reflect", + "bevy_time", + "bevy_utils", + "bytes", + "crossbeam-channel", + "enum_dispatch", + "governor", + "indexmap", + "lightyear_connection", + "lightyear_core", + "lightyear_link", + "lightyear_serde", + "lightyear_utils", + "nonzero_ext", + "ringbuffer", + "serde", + "thiserror 2.0.18", + "tracing", ] [[package]] -name = "lexical-write-integer" -version = "1.0.6" +name = "lightyear_udp" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "409851a618475d2d5796377cad353802345cba92c867d9fbcde9cf4eac4e14df" +checksum = "367cdb2e11ac6448bec036a26ce1aa7a97a695e1a50a28e2d3d4e3f8ae34c670" dependencies = [ - "lexical-util", + "aeronet_io", + "bevy_app", + "bevy_ecs", + "bevy_platform", + "bytes", + "lightyear_core", + "lightyear_link", + "thiserror 2.0.18", + "tracing", ] [[package]] -name = "libc" -version = "0.2.184" +name = "lightyear_ui" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" +checksum = "bd20cb05463553dd19006a2e318b86b2afb6db8e9e8e46931fc6592d8069e3c2" +dependencies = [ + "bevy_app", + "bevy_color", + "bevy_ecs", + "bevy_platform", + "bevy_reflect", + "bevy_text", + "bevy_time", + "bevy_ui", + "bevy_utils", + "lightyear_metrics", + "metrics", + "metrics-util", + "tracing", +] [[package]] -name = "libloading" -version = "0.8.9" +name = "lightyear_utils" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +checksum = "b9a54a63441f9001dc834fc8e6b4bb23eeb8f6b2ef28db8c65b4bfbf9496b139" dependencies = [ - "cfg-if", - "windows-link 0.2.1", + "bevy_ecs", + "bevy_platform", + "bevy_reflect", + "bevy_utils", + "hashbrown 0.16.1", + "paste", + "seahash", + "tracing", ] [[package]] -name = "libm" -version = "0.2.16" +name = "lightyear_web" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" +checksum = "72450d46e6c5052c174e3723e14fd78726ffca7e00e64b6f9342cdd642621eb6" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_winit", + "wasm-bindgen", + "web-sys", +] [[package]] -name = "libredox" -version = "0.1.15" +name = "lightyear_websocket" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ddbf48fd451246b1f8c2610bd3b4ac0cc6e149d89832867093ab69a17194f08" +checksum = "c3e5ee75b46e0be8f9e746f1b53464376715d400fbddb4a3faf8fb348eec2919" dependencies = [ - "bitflags 2.11.0", - "libc", - "plain", - "redox_syscall 0.7.3", + "aeronet_io", + "aeronet_websocket", + "bevy_app", + "bevy_ecs", + "bevy_reflect", + "lightyear_aeronet", + "lightyear_link", + "thiserror 2.0.18", + "tracing", ] [[package]] -name = "libudev-sys" -version = "0.1.4" +name = "lightyear_webtransport" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c8469b4a23b962c1396b9b451dda50ef5b283e8dd309d69033475fa9b334324" +checksum = "8c100a3f88ced77327f04ab3e583ecca627e53d93031c5aaf7c2260d6c9faf25" dependencies = [ - "libc", - "pkg-config", + "aeronet_io", + "aeronet_webtransport", + "bevy_app", + "bevy_ecs", + "bevy_reflect", + "lightyear_aeronet", + "lightyear_link", + "thiserror 2.0.18", + "tracing", ] [[package]] @@ -3570,6 +5032,12 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + [[package]] name = "litrs" version = "1.0.0" @@ -3638,6 +5106,12 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + [[package]] name = "mach2" version = "0.4.3" @@ -3686,7 +5160,7 @@ version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00c15a6f673ff72ddcc22394663290f870fb224c1bfce55734a75c414150e605" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block", "core-graphics-types 0.2.0", "foreign-types", @@ -3695,6 +5169,36 @@ dependencies = [ "paste", ] +[[package]] +name = "metrics" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5312e9ba3771cfa961b585728215e3d972c950a3eed9252aa093d6301277e8" +dependencies = [ + "ahash", + "portable-atomic", +] + +[[package]] +name = "metrics-util" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdfb1365fea27e6dd9dc1dbc19f570198bc86914533ad639dae939635f096be4" +dependencies = [ + "aho-corasick", + "crossbeam-epoch", + "crossbeam-utils", + "hashbrown 0.16.1", + "indexmap", + "metrics", + "ordered-float", + "quanta", + "radix_trie", + "rand 0.9.4", + "rand_xoshiro", + "sketches-ddsketch", +] + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -3741,7 +5245,7 @@ checksum = "066cf25f0e8b11ee0df221219010f213ad429855f57c494f995590c861a9a7d8" dependencies = [ "arrayvec", "bit-set", - "bitflags 2.11.0", + "bitflags 2.11.1", "cfg-if", "cfg_aliases", "codespan-reporting", @@ -3783,7 +5287,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "jni-sys 0.3.1", "log", "ndk-sys 0.5.0+25.2.9519653", @@ -3797,7 +5301,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "jni-sys 0.3.1", "log", "ndk-sys 0.6.0+11769913", @@ -3836,13 +5340,22 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" +[[package]] +name = "nibble_vec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a5d83df9f36fe23f0c3648c6bbb8b0298bb5f1939c8f2704431371f4b84d43" +dependencies = [ + "smallvec", +] + [[package]] name = "nix" version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "cfg-if", "cfg_aliases", "libc", @@ -3854,12 +5367,21 @@ version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d6d0705320c1e6ba1d912b5e37cf18071b6c2e9b7fa8215a1e8a7651966f5d3" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "cfg-if", "cfg_aliases", "libc", ] +[[package]] +name = "no_std_io2" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b51ed7824b6e07d354605f4abb3d9d300350701299da96642ee084f5ce631550" +dependencies = [ + "memchr", +] + [[package]] name = "noise" version = "0.9.0" @@ -3867,7 +5389,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6da45c8333f2e152fc665d78a380be060eb84fad8ca4c9f7ac8ca29216cff0cc" dependencies = [ "num-traits", - "rand 0.8.5", + "rand 0.8.6", "rand_xorshift", ] @@ -3887,13 +5409,19 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" +[[package]] +name = "nonzero_ext" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21" + [[package]] name = "notify" version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "fsevent-sys", "inotify", "kqueue", @@ -3924,7 +5452,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", ] [[package]] @@ -3945,6 +5473,16 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + [[package]] name = "num-conv" version = "0.2.1" @@ -3962,6 +5500,15 @@ dependencies = [ "syn", ] +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -4043,7 +5590,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block2 0.5.1", "libc", "objc2 0.5.2", @@ -4059,7 +5606,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block2 0.5.1", "objc2 0.5.2", "objc2-core-location", @@ -4083,7 +5630,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation", @@ -4095,7 +5642,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", ] [[package]] @@ -4134,7 +5681,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block2 0.5.1", "dispatch", "libc", @@ -4147,7 +5694,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "libc", "objc2-core-foundation", ] @@ -4170,7 +5717,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation", @@ -4182,7 +5729,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation", @@ -4205,7 +5752,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block2 0.5.1", "objc2 0.5.2", "objc2-cloud-kit", @@ -4237,7 +5784,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "block2 0.5.1", "objc2 0.5.2", "objc2-core-location", @@ -4267,6 +5814,12 @@ dependencies = [ "cc", ] +[[package]] +name = "octets" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8311fa8ab7a57759b4ff1f851a3048d9ef0effaa0130726426b742d26d8a88e7" + [[package]] name = "offset-allocator" version = "0.2.0" @@ -4277,18 +5830,45 @@ dependencies = [ "nonmax", ] +[[package]] +name = "oid-registry" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7" +dependencies = [ + "asn1-rs", +] + [[package]] name = "once_cell" version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" +[[package]] +name = "oneshot" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "269bca4c2591a28585d6bf10d9ed0332b7d76900a1b02bec41bdc3a2cdcda107" + [[package]] name = "oorandom" version = "11.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + [[package]] name = "option-ext" version = "0.2.0" @@ -4297,9 +5877,9 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "orbclient" -version = "0.3.51" +version = "0.3.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59aed3b33578edcfa1bc96a321d590d31832b6ad55a26f0313362ce687e9abd6" +checksum = "12c6933ddbbd16539a7672e697bb8d41ac3a4e99ac43eeb40c07236bd7fcb2dd" dependencies = [ "libc", "libredox", @@ -4358,6 +5938,31 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +[[package]] +name = "pastey" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" + +[[package]] +name = "pem" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" +dependencies = [ + "base64", + "serde_core", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.2" @@ -4435,9 +6040,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.32" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" [[package]] name = "plain" @@ -4479,7 +6084,7 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "crc32fast", "fdeflate", "flate2", @@ -4500,6 +6105,17 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures 0.2.17", + "opaque-debug", + "universal-hash", +] + [[package]] name = "portable-atomic" version = "1.13.1" @@ -4508,13 +6124,22 @@ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "091397be61a01d4be58e7841595bd4bfedb15f1cd54977d79b8271e94ed799a3" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" dependencies = [ "portable-atomic", ] +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -4570,6 +6195,28 @@ dependencies = [ "toml_edit 0.25.11+spec-1.1.0", ] +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "proc-macro2" version = "1.0.106" @@ -4587,17 +6234,87 @@ checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" [[package]] name = "pxfm" -version = "0.1.28" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0c5ccf5294c6ccd63a74f1565028353830a9c2f5eb0c682c355c471726a6e3f" + +[[package]] +name = "quanta" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3ab5a9d756f0d97bdc89019bd2e4ea098cf9cde50ee7564dde6b81ccc8f06c7" +dependencies = [ + "crossbeam-utils", + "libc", + "once_cell", + "raw-cpuid", + "wasi", + "web-sys", + "winapi", +] + +[[package]] +name = "quick-xml" +version = "0.39.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958f21e8e7ceb5a1aa7fa87fab28e7c75976e0bfe7e23ff069e0a260f894067d" +dependencies = [ + "memchr", +] + +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash 2.1.2", + "rustls", + "socket2 0.6.3", + "thiserror 2.0.18", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a041e753da8b807c9255f28de81879c78c876392ff2469cde94799b2896b9d" +checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.4", + "ring", + "rustc-hash 2.1.2", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.18", + "tinyvec", + "tracing", + "web-time", +] [[package]] -name = "quick-xml" -version = "0.39.2" +name = "quinn-udp" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "958f21e8e7ceb5a1aa7fa87fab28e7c75976e0bfe7e23ff069e0a260f894067d" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" dependencies = [ - "memchr", + "cfg_aliases", + "libc", + "once_cell", + "socket2 0.6.3", + "tracing", + "windows-sys 0.60.2", ] [[package]] @@ -4621,6 +6338,16 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" +[[package]] +name = "radix_trie" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c069c179fcdc6a2fe24d8d18305cf085fdbd4f922c041943e203685d6a1c58fd" +dependencies = [ + "endian-type", + "nibble_vec", +] + [[package]] name = "radsort" version = "0.1.1" @@ -4629,18 +6356,18 @@ checksum = "019b4b213425016d7d84a153c4c73afb0946fbb4840e4eece7ba8848b9d6da22" [[package]] name = "rand" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" dependencies = [ "rand_core 0.6.4", ] [[package]] name = "rand" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha", "rand_core 0.9.5", @@ -4661,6 +6388,9 @@ name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] [[package]] name = "rand_core" @@ -4678,7 +6408,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463" dependencies = [ "num-traits", - "rand 0.9.2", + "rand 0.9.4", ] [[package]] @@ -4690,6 +6420,15 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand_xoshiro" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f703f4665700daf5512dcca5f43afa6af89f09db47fb56be587f80636bda2d41" +dependencies = [ + "rand_core 0.9.5", +] + [[package]] name = "range-alloc" version = "0.1.5" @@ -4702,6 +6441,15 @@ version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "973443cf09a9c8656b574a866ab68dfa19f0867d0340648c7d2f6a71b8a8ea68" +[[package]] +name = "raw-cpuid" +version = "11.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" +dependencies = [ + "bitflags 2.11.1", +] + [[package]] name = "raw-window-handle" version = "0.6.2" @@ -4710,9 +6458,9 @@ checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" [[package]] name = "rayon" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" dependencies = [ "either", "rayon-core", @@ -4728,6 +6476,19 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "rcgen" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75e669e5202259b5314d1ea5397316ad400819437857b90861765f24c4cf80a2" +dependencies = [ + "pem", + "ring", + "rustls-pki-types", + "time", + "yasna", +] + [[package]] name = "read-fonts" version = "0.36.0" @@ -4746,7 +6507,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b634fabf032fab15307ffd272149b622260f55974d9fad689292a5d33df02e5" dependencies = [ "bytemuck", - "font-types 0.11.2", + "font-types 0.11.3", ] [[package]] @@ -4770,16 +6531,16 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", ] [[package]] name = "redox_syscall" -version = "0.7.3" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce70a74e890531977d37e532c34d45e9055d2409ed08ddba14529471ed0be16" +checksum = "f450ad9c3b1da563fb6948a8e0fb0fb9269711c9c73d9ea1de5058c79c8d643a" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", ] [[package]] @@ -4828,6 +6589,26 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "ringbuffer" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57b0b88a509053cbfd535726dcaaceee631313cef981266119527a1d110f6d2b" + [[package]] name = "rodio" version = "0.20.1" @@ -4844,7 +6625,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db09040cc89e461f1a265139777a2bde7f8d8c67c4936f700c63ce3e2904d468" dependencies = [ "base64", - "bitflags 2.11.0", + "bitflags 2.11.1", "serde", "serde_derive", "unicode-ident", @@ -4856,7 +6637,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4147b952f3f819eca0e99527022f7d6a8d05f111aeb0a62960c74eb283bec8fc" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "once_cell", "serde", "serde_derive", @@ -4891,13 +6672,22 @@ dependencies = [ "semver", ] +[[package]] +name = "rusticata-macros" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" +dependencies = [ + "nom", +] + [[package]] name = "rustix" version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "errno", "libc", "linux-raw-sys 0.4.15", @@ -4910,13 +6700,72 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "errno", "libc", "linux-raw-sys 0.12.1", "windows-sys 0.61.2", ] +[[package]] +name = "rustls" +version = "0.23.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c2c118cb077cca2822033836dfb1b975355dfb784b5e8da48f7b6c5db74e60e" +dependencies = [ + "aws-lc-rs", + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" +dependencies = [ + "aws-lc-rs", + "ring", + "rustls-pki-types", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.22" @@ -4941,6 +6790,15 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "scoped-tls" version = "1.0.1" @@ -4966,6 +6824,35 @@ dependencies = [ "tiny-skia", ] +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags 2.11.1", + "core-foundation 0.10.1", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "self_cell" version = "1.2.2" @@ -5014,6 +6901,16 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_flexitos" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3323d093d7597660758b742dd7a1525539613f6182b306a4e1dd6e01a89bada9" +dependencies = [ + "erased-serde", + "serde", +] + [[package]] name = "serde_json" version = "1.0.149" @@ -5027,11 +6924,33 @@ dependencies = [ "zmij", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest", +] + [[package]] name = "sha3" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +checksum = "77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874" dependencies = [ "digest", "keccak", @@ -5080,6 +6999,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" +[[package]] +name = "sketches-ddsketch" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c6f73aeb92d671e0cc4dca167e59b2deb6387c375391bc99ee743f326994a2b" + [[package]] name = "skrifa" version = "0.39.0" @@ -5120,6 +7045,9 @@ name = "smallvec" version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +dependencies = [ + "serde", +] [[package]] name = "smithay-client-toolkit" @@ -5127,7 +7055,7 @@ version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "calloop", "calloop-wayland-source", "cursor-icon", @@ -5155,6 +7083,26 @@ dependencies = [ "serde", ] +[[package]] +name = "socket2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "socket2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + [[package]] name = "spin" version = "0.10.0" @@ -5164,13 +7112,33 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "spinning_top" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d96d2d1d716fb500937168cc09353ffdc7a012be8475ac7308e1bdf0e3923300" +dependencies = [ + "lock_api", +] + [[package]] name = "spirv" version = "0.3.0+sdk-1.3.268.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", + "sha2", ] [[package]] @@ -5194,6 +7162,24 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "steamworks" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "722f54c70818b8debdc25b18618b77a0a69fa280012c29e7904d32f9136299fc" +dependencies = [ + "bitflags 2.11.1", + "paste", + "steamworks-sys", + "thiserror 2.0.18", +] + +[[package]] +name = "steamworks-sys" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42862065c9e685d08cc3d9f6c609d4b46bd9684ec7e9420688eb979213469582" + [[package]] name = "strict-num" version = "0.1.1" @@ -5212,6 +7198,12 @@ dependencies = [ "precomputed-hash", ] +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + [[package]] name = "svg_fmt" version = "0.4.5" @@ -5240,6 +7232,23 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "sys-locale" version = "0.3.2" @@ -5401,29 +7410,112 @@ dependencies = [ ] [[package]] -name = "tinytemplate" -version = "1.2.1" +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinytemplate" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "tinyvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +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 = "tls_codec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de2e01245e2bb89d6f05801c564fa27624dbd7b1846859876c7dad82e90bf6b" +dependencies = [ + "tls_codec_derive", + "zeroize", +] + +[[package]] +name = "tls_codec_derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d2e76690929402faae40aebdda620a2c0e25dd6d3b9afe48867dfd95991f4bd" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio" +version = "1.52.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67dee974fe86fd92cc45b7a95fdd2f99a36a6d7b0d431a231178d3d670bbcc6" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2 0.6.3", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ - "serde", - "serde_json", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "tinyvec" -version = "1.11.0" +name = "tokio-rustls" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "tinyvec_macros", + "rustls", + "tokio", ] [[package]] -name = "tinyvec_macros" -version = "0.1.1" +name = "tokio-tungstenite" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" +dependencies = [ + "futures-util", + "log", + "rustls", + "rustls-native-certs", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tungstenite", +] [[package]] name = "tokrepr" @@ -5487,7 +7579,7 @@ dependencies = [ "indexmap", "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", - "winnow 1.0.1", + "winnow 1.0.2", ] [[package]] @@ -5496,7 +7588,7 @@ version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow 1.0.1", + "winnow 1.0.2", ] [[package]] @@ -5625,6 +7717,25 @@ dependencies = [ "core_maths", ] +[[package]] +name = "tungstenite" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" +dependencies = [ + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.9.4", + "rustls", + "rustls-pki-types", + "sha1", + "thiserror 2.0.18", + "utf-8", +] + [[package]] name = "twox-hash" version = "2.1.2" @@ -5639,15 +7750,15 @@ checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" [[package]] name = "typewit" -version = "1.15.1" +version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc19094686c694eb41b3b99dcc2f2975d4b078512fa22ae6c63f7ca318bdcff7" +checksum = "214ca0b2191785cbc06209b9ca1861e048e39b5ba33574b3cedd58363d5bb5f6" [[package]] name = "unicode-bidi" @@ -5691,11 +7802,57 @@ version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +[[package]] +name = "universal-hash" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" +dependencies = [ + "crypto-common", + "subtle", +] + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "unty" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "uuid" -version = "1.23.0" +version = "1.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" +checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" dependencies = [ "getrandom 0.4.2", "js-sys", @@ -5722,9 +7879,11 @@ dependencies = [ "futures-lite", "glob", "image", + "leafwing-input-manager", + "lightyear", "noise", "offset-allocator", - "rand 0.9.2", + "rand 0.9.4", "ron 0.11.0", "serde", "sysinfo", @@ -5736,6 +7895,21 @@ dependencies = [ "vantablock-shared", "vantablock-utils", "wesl", + "zstd", +] + +[[package]] +name = "vantablock-runner" +version = "0.0.1" +dependencies = [ + "bevy", + "crossbeam-channel", + "lightyear", + "tracing", + "vantablock-client", + "vantablock-server", + "vantablock-shared", + "vantablock-utils", ] [[package]] @@ -5743,10 +7917,15 @@ name = "vantablock-server" version = "0.0.1" dependencies = [ "bevy", + "criterion", + "crossbeam", + "lightyear", + "noise", "tracing", "tracing-subscriber", "vantablock-shared", "vantablock-utils", + "zstd", ] [[package]] @@ -5758,19 +7937,21 @@ dependencies = [ "crossbeam", "derive_more", "futures-lite", + "leafwing-input-manager", + "lightyear", "noise", - "rand 0.9.2", + "rand 0.9.4", "ron 0.11.0", "serde", "tracing", "vantablock-utils", + "zstd", ] [[package]] name = "vantablock-utils" version = "0.0.1" dependencies = [ - "bevy", "directories", "sysinfo", "time", @@ -5821,11 +8002,11 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.2+wasi-0.2.9" +version = "1.0.3+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.57.1", ] [[package]] @@ -5834,14 +8015,14 @@ version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.51.0", ] [[package]] name = "wasm-bindgen" -version = "0.2.117" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0" +checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89" dependencies = [ "cfg-if", "once_cell", @@ -5852,9 +8033,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.67" +version = "0.4.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03623de6905b7206edd0a75f69f747f134b7f0a2323392d664448bf2d3c5d87e" +checksum = "f371d383f2fb139252e0bfac3b81b265689bf45b6874af544ffa4c975ac1ebf8" dependencies = [ "js-sys", "wasm-bindgen", @@ -5862,9 +8043,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.117" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be" +checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5872,9 +8053,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.117" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2" +checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904" dependencies = [ "bumpalo", "proc-macro2", @@ -5885,9 +8066,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.117" +version = "0.2.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b" +checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129" dependencies = [ "unicode-ident", ] @@ -5920,7 +8101,7 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "hashbrown 0.15.5", "indexmap", "semver", @@ -5946,7 +8127,7 @@ version = "0.31.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "645c7c96bb74690c3189b5c9cb4ca1627062bb23693a4fad9d8c3de958260144" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "rustix 1.1.4", "wayland-backend", "wayland-scanner", @@ -5958,7 +8139,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "cursor-icon", "wayland-backend", ] @@ -5980,7 +8161,7 @@ version = "0.32.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "563a85523cade2429938e790815fd7319062103b9f4a2dc806e9b53b95982d8f" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "wayland-backend", "wayland-client", "wayland-scanner", @@ -5992,7 +8173,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b6d8cf1eb2c1c31ed1f5643c88a6e53538129d4af80030c8cabd1f9fa884d91" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -6005,7 +8186,7 @@ version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "wayland-backend", "wayland-client", "wayland-protocols", @@ -6036,12 +8217,37 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.94" +version = "0.3.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f2dfbb17949fa2088e5d39408c48368947b86f7834484e87b73de55bc14d97d" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-sys-async-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65a1ea96a932ec2252276bc517eb4fccaebc0ecfea2faa49e242de769d188409" +dependencies = [ + "js-sys", + "tokio", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys-stream-utils" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd70027e39b12f0849461e08ffc50b9cd7688d942c1c8e3c7b22273236b4dd0a" +checksum = "90a913a6d558dbf153010d8add2f27bf5964427aa395299b57a7680a5e971cc7" dependencies = [ "js-sys", "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", ] [[package]] @@ -6054,6 +8260,19 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-wt-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2793e7e95a0f1564bf1e029e4f8ff397b95998fe03fa7f9dd72682f127473c68" +dependencies = [ + "js-sys", + "pastey", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + [[package]] name = "wesl" version = "0.2.0" @@ -6090,7 +8309,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfe68bac7cde125de7a731c3400723cadaaf1703795ad3f4805f187459cd7a77" dependencies = [ "arrayvec", - "bitflags 2.11.0", + "bitflags 2.11.1", "cfg-if", "cfg_aliases", "document-features", @@ -6119,7 +8338,7 @@ dependencies = [ "arrayvec", "bit-set", "bit-vec", - "bitflags 2.11.0", + "bitflags 2.11.1", "bytemuck", "cfg_aliases", "document-features", @@ -6179,7 +8398,7 @@ dependencies = [ "arrayvec", "ash", "bit-set", - "bitflags 2.11.0", + "bitflags 2.11.1", "block", "bytemuck", "cfg-if", @@ -6224,7 +8443,7 @@ version = "27.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afdcf84c395990db737f2dd91628706cb31e86d72e53482320d368e52b5da5eb" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "bytemuck", "js-sys", "log", @@ -6813,7 +9032,7 @@ dependencies = [ "ahash", "android-activity", "atomic-waker", - "bitflags 2.11.0", + "bitflags 2.11.1", "block2 0.5.1", "bytemuck", "calloop", @@ -6867,9 +9086,9 @@ dependencies = [ [[package]] name = "winnow" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" +checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0" dependencies = [ "memchr", ] @@ -6883,6 +9102,12 @@ dependencies = [ "wit-bindgen-rust-macro", ] +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + [[package]] name = "wit-bindgen-core" version = "0.51.0" @@ -6932,7 +9157,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.11.0", + "bitflags 2.11.1", "indexmap", "log", "serde", @@ -6962,6 +9187,49 @@ dependencies = [ "wasmparser", ] +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[package]] +name = "wtransport" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e5e745c8789c20095c9061d292098d4106660efe2d172efd8ae7a369fe28e3e" +dependencies = [ + "bytes", + "pem", + "quinn", + "rcgen", + "rustls", + "rustls-native-certs", + "rustls-pemfile", + "rustls-pki-types", + "sha2", + "socket2 0.5.10", + "thiserror 2.0.18", + "time", + "tokio", + "tracing", + "url", + "wtransport-proto", + "x509-parser", +] + +[[package]] +name = "wtransport-proto" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a09d89a8dba201c2439d9d5eca55a0faa08909d69da50decdb5ec00be0ac504" +dependencies = [ + "httlib-huffman", + "octets", + "thiserror 2.0.18", + "url", +] + [[package]] name = "x11-dl" version = "2.21.0" @@ -6994,6 +9262,35 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" +[[package]] +name = "x509-cert" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1301e935010a701ae5f8655edc0ad17c44bad3ac5ce8c39185f75453b720ae94" +dependencies = [ + "const-oid", + "der", + "spki", + "tls_codec", +] + +[[package]] +name = "x509-parser" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4569f339c0c402346d4a75a9e39cf8dad310e287eef1ff56d4c68e5067f53460" +dependencies = [ + "asn1-rs", + "data-encoding", + "der-parser", + "lazy_static", + "nom", + "oid-registry", + "rusticata-macros", + "thiserror 2.0.18", + "time", +] + [[package]] name = "xcursor" version = "0.3.10" @@ -7006,7 +9303,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.11.1", "dlib", "log", "once_cell", @@ -7025,12 +9322,79 @@ version = "0.8.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" +[[package]] +name = "xwt-core" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "647e17b66bd49bfebe8fe73d327358432f298bb41227600f47fb07fa4f7c1eef" + +[[package]] +name = "xwt-web" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f80997b90d89451537f2866130f52b1e4be4d29cfadf9183081b24542f1abdf0" +dependencies = [ + "js-sys", + "thiserror 2.0.18", + "tokio", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "web-sys-async-io", + "web-sys-stream-utils", + "web-wt-sys", + "xwt-core", +] + +[[package]] +name = "xwt-wtransport" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8623c2ddff8a7321feb12b484094be0341a9203dc46eb4060fc2e852841d8786" +dependencies = [ + "thiserror 2.0.18", + "wtransport", + "xwt-core", +] + +[[package]] +name = "yasna" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17bb3549cc1321ae1296b9cdc2698e2b6cb1992adfa19a8c72e5b7a738f44cd" +dependencies = [ + "time", +] + [[package]] name = "yazi" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01738255b5a16e78bbb83e7fbba0a1e7dd506905cfc53f4622d89015a03fbb5" +[[package]] +name = "yoke" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + [[package]] name = "zeno" version = "0.3.3" @@ -7057,8 +9421,110 @@ dependencies = [ "syn", ] +[[package]] +name = "zerofrom" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "zmij" version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.16+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/Cargo.toml b/Cargo.toml index 5b738dbd..9211277f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,11 @@ [workspace] -members = ["crates/shared", "crates/client", "crates/server", "crates/utils"] +members = [ + "crates/client", + "crates/runner", + "crates/server", + "crates/shared", + "crates/utils", +] resolver = "3" [workspace.package] @@ -9,6 +15,7 @@ publish = false [workspace.lints.clippy] type_complexity = "allow" +too_many_arguments = "allow" # INFO: -------------------------- # release profiles @@ -41,11 +48,16 @@ debug = false # ------------------------------ [workspace.dependencies] -# crate deps -utils = { path = "./crates/utils", package = "vantablock-utils" } +# other crates +client = { path = "./crates/client", package = "vantablock-client" } +server = { path = "./crates/server", package = "vantablock-server" } shared = { path = "./crates/shared", package = "vantablock-shared" } +utils = { path = "./crates/utils", package = "vantablock-utils" } -# logging/error handling deps +# development deps +criterion = { version = "0.5", features = ["html_reports"] } + +# core logging/error handling deps time = { version = "0.3.43", features = ["formatting", "macros"] } tracing = { version = "0.1.41", features = ["release_max_level_info"] } tracing-subscriber = { version = "0.3.20", features = [ @@ -58,31 +70,34 @@ tracing-tracy = "=0.11.4" # graphics deps wesl = "0.2.0" # shader compliation from WESL to WGSL -image = { version = "0.25.6", default-features = false, features = ["png"] } -bytemuck = { version = "1.13", features = ["derive"] } # gpu friendly data offset-allocator = "0.2.0" # gpu buffer allocation +bytemuck = { version = "1.13", features = ["derive"] } # gpu friendly data +image = { version = "0.25.6", default-features = false, features = ["png"] } -# simulation related deps +# game dependencies bevy = { version = "0.18.1", default-features = false, features = [ - "default_app", # core app/ecs/etc - "default_platform", # core OS features, windowing, input, etc - "3d_bevy_render", - "ui_bevy_render", - "bevy_asset", "bevy_state", ] } -futures-lite = "2.6.1" # future utils - -# util deps -sysinfo = { version = "0.37.2", default-features = false, features = [ - "system", +leafwing-input-manager = "0.20.0" +lightyear = { version = "0.26.4", default-features = false, features = [ + "replication", # allows replicating components between server and client + "leafwing", # leafwing input support with built-in rollback + "crossbeam", # enables crossbeam as an IO layer (for client as the host on same machine) + "netcode", # needed to manage distinct conns + "udp", # needed for dedicated/lan ] } + +# general utilities +futures-lite = "2.6.1" # future utils derive_more = { version = "2.0.1", features = ["deref", "deref_mut"] } serde = { version = "1.0.228", features = ["derive"] } # serializing rand = "0.9.2" # rng ron = "0.11.0" # parsing RON files +zstd = "0.13" noise = { version = "0.9.0", default-features = false } # gen random noise crossbeam = "0.8.4" # thread comms glob = "0.3.3" # reading dirs directories = "6.0" # platform-specific dirs -criterion = { version = "0.5", features = ["html_reports"] } +sysinfo = { version = "0.37.2", default-features = false, features = [ + "system", +] } diff --git a/assets/client/shader/ui/common.wesl b/assets/client/shader/ui/common.wesl deleted file mode 100644 index 4b05d24e..00000000 --- a/assets/client/shader/ui/common.wesl +++ /dev/null @@ -1,17 +0,0 @@ -// per-view data -@group(0) @binding(0) -var ortho_projection: mat4x4; - -// per-material data -struct Material { - color: vec4, -}; -@group(1) @binding(0) -var material: Material; - -// per-object data -struct Object { - model: mat4x4, -}; -@group(2) @binding(0) -var objects: array; diff --git a/assets/client/shader/ui/main_frag.wesl b/assets/client/shader/ui/main_frag.wesl deleted file mode 100644 index f8582ba4..00000000 --- a/assets/client/shader/ui/main_frag.wesl +++ /dev/null @@ -1,6 +0,0 @@ -import package::ui::common::{material, Material}; - -@fragment -fn fs_main() -> @location(0) vec4 { - return material.color; -} \ No newline at end of file diff --git a/assets/client/shader/ui/main_vert.wesl b/assets/client/shader/ui/main_vert.wesl deleted file mode 100644 index fece7619..00000000 --- a/assets/client/shader/ui/main_vert.wesl +++ /dev/null @@ -1,19 +0,0 @@ -import package::ui::common::{ortho_projection, Object, objects, material, Material}; - -struct VertexOutput { - @builtin(position) clip_position: vec4, -}; - -@vertex -fn vs_main( - @location(0) position: vec2, - @builtin(instance_index) instance_index: u32, -) -> VertexOutput { - var out: VertexOutput; - - // scale model matrix (screen space) by the orthographic projection to get clip space - let model = objects[instance_index].model; - out.clip_position = ortho_projection * model * vec4(position, 0.0, 1.0); - - return out; -} diff --git a/assets/client/shader/world/lib/vertex_pulling.wesl b/assets/client/shader/world/lib/vertex_pulling.wesl index 4ee9c93e..b31e327d 100644 --- a/assets/client/shader/world/lib/vertex_pulling.wesl +++ b/assets/client/shader/world/lib/vertex_pulling.wesl @@ -11,10 +11,10 @@ const QUAD_UVS: array, 6> = array, 6>( vec2(1.0, 0.0), // top-right vec2(1.0, 0.0), // top-right vec2(0.0, 0.0), // top-left - vec2(0.0, 1.0) // bottom-left + vec2(0.0, 1.0)// bottom-left ); -/// A lookup table for the 6 potential normal vectors of a voxel. +/// A lookup table for the 6 potential normal vectors of a block. const CUBE_NORMALS: array, 6> = array, 6>( vec3(0.0, 1.0, 0.0), // top face vec3(0.0, -1.0, 0.0), // bottom @@ -24,7 +24,7 @@ const CUBE_NORMALS: array, 6> = array, 6>( vec3(0.0, 0.0, -1.0), // back ); -/// A lookup table for the relative position of the 8 vertices of a voxel. +/// A lookup table for the relative position of the 8 vertices of a block. const CUBE_VERTICES: array, 8> = array, 8>( vec3(0.0, 0.0, 0.0), vec3(1.0, 0.0, 0.0), vec3(1.0, 1.0, 0.0), vec3(0.0, 1.0, 0.0), @@ -56,10 +56,9 @@ const AO_VALUES: array = array( /// Indices: 0=BottomLeft, 1=TopLeft, 2=BottomRight, 3=TopRight const QUAD_VERTEX_TO_CORNER: array = array( 0u, 1u, 2u, // triangle 1 - 2u, 3u, 0u // triangle 2 + 2u, 3u, 0u// triangle 2 ); - // INFO: --------------- // utils // --------------------- @@ -79,12 +78,12 @@ fn pull_global_vertex_position( return vec3(face_pos) + corner_offset + chunk_world_pos; } -/// Gets the UVs for a voxel given the vertex indice in the face quad. -fn get_voxel_uv(vert_idx_in_quad: u32) -> vec2 { +/// Gets the UVs for a block given the vertex indice in the face quad. +fn get_block_uv(vert_idx_in_quad: u32) -> vec2 { return QUAD_UVS[vert_idx_in_quad]; } -/// Gets the UVs for a voxel given the vertex indice in the face quad. +/// Gets the UVs for a block given the vertex indice in the face quad. fn get_ao_color(ao_vec: vec4, vert_idx_in_quad: u32) -> vec3 { let corner_idx = QUAD_VERTEX_TO_CORNER[vert_idx_in_quad]; let raw_level = u32(ao_vec[corner_idx]); @@ -93,6 +92,6 @@ fn get_ao_color(ao_vec: vec4, vert_idx_in_quad: u32) -> vec3 { } /// Gets the normal vector given the normal index from the unpacked vertex. -fn get_voxel_normal(normal_idx: u32) -> vec3 { +fn get_block_normal(normal_idx: u32) -> vec3 { return CUBE_NORMALS[normal_idx]; } diff --git a/assets/client/shader/world/main_passes/lib/environment_uniform.wesl b/assets/client/shader/world/main_passes/lib/environment_uniform.wesl index ed6ba2c3..578cb842 100644 --- a/assets/client/shader/world/main_passes/lib/environment_uniform.wesl +++ b/assets/client/shader/world/main_passes/lib/environment_uniform.wesl @@ -16,13 +16,13 @@ fn calculate_sky_color( /// environment parameters env: EnvironmentUniform ) -> vec3 { - // convert to [0.0, 1.0] range + // convert to [0.0, 1.0] range let vertical_gradient = (dir.y + 1.0) * 0.5; - // apply gradient curve + // apply gradient curve let eased_gradient = pow(vertical_gradient, 0.90); - // interpolate + // interpolate let sky_color = mix(env.horizon_color, env.zenith_color, eased_gradient); return sky_color; } diff --git a/assets/client/shader/world/main_passes/opaque/main_vert.wesl b/assets/client/shader/world/main_passes/opaque/main_vert.wesl index f449e052..5e778835 100644 --- a/assets/client/shader/world/main_passes/opaque/main_vert.wesl +++ b/assets/client/shader/world/main_passes/opaque/main_vert.wesl @@ -5,8 +5,8 @@ import package::world::main_passes::{ import package::world::lib::{ vertex_pulling::{ pull_global_vertex_position, - get_voxel_uv, - get_voxel_normal, + get_block_uv, + get_block_normal, get_ao_color, }, face_unpacking::{unpack_face} @@ -58,9 +58,9 @@ fn vs_main( out.clip_position = camera.view_proj * vec4(world_pos_vec3, 1.0); out.clip_pos_for_fog = out.clip_position; - out.normal = get_voxel_normal(face.normal_index); + out.normal = get_block_normal(face.normal_index); out.color = get_ao_color(face.ao_levels, vert_idx_in_quad); - out.tex_coords = get_voxel_uv(vert_idx_in_quad); + out.tex_coords = get_block_uv(vert_idx_in_quad); out.texture_index = face.texture_id; return out; diff --git a/assets/client/shader/world/main_passes/skybox/main_vert.wesl b/assets/client/shader/world/main_passes/skybox/main_vert.wesl index 80f14735..676de387 100644 --- a/assets/client/shader/world/main_passes/skybox/main_vert.wesl +++ b/assets/client/shader/world/main_passes/skybox/main_vert.wesl @@ -24,7 +24,7 @@ fn vs_main( let pos = vertices[in_vertex_index]; - // the full screen quad is at the maximum distance (0.0 for inverse z) + // the full screen quad is at the maximum distance (z=0.0 for inverse z) out.clip_position = vec4(pos, 0.0, 1.0); out.clip_pos_for_unproject = out.clip_position; diff --git a/assets/client/shader/world/main_passes/transparent/main_frag.wesl b/assets/client/shader/world/main_passes/transparent/main_frag.wesl index bfb7b9f6..0d531cc1 100644 --- a/assets/client/shader/world/main_passes/transparent/main_frag.wesl +++ b/assets/client/shader/world/main_passes/transparent/main_frag.wesl @@ -20,7 +20,7 @@ fn fs_main( let texture_color: vec4 = textureSample(texture_array, texture_sampler, tex_coords, texture_index); if texture_color.a < 0.01 { - discard; + discard; } // INFO: ------------- diff --git a/assets/client/shader/world/main_passes/transparent/main_vert.wesl b/assets/client/shader/world/main_passes/transparent/main_vert.wesl index 1ac3f384..7d03849b 100644 --- a/assets/client/shader/world/main_passes/transparent/main_vert.wesl +++ b/assets/client/shader/world/main_passes/transparent/main_vert.wesl @@ -5,8 +5,8 @@ import package::world::main_passes::{ import package::world::lib::{ vertex_pulling::{ pull_global_vertex_position, - get_voxel_uv, - get_voxel_normal + get_block_uv, + get_block_normal }, face_unpacking::{unpack_face} }; @@ -53,7 +53,7 @@ fn vs_main( var final_pos = world_pos_vec3; let wobble = sin((world_pos_vec3.x + world_pos_vec3.z) * 23.0 + environment.time) * 0.05; - final_pos.y += wobble - 0.05; // offset to ensure vertices below voxels next to it + final_pos.y += wobble - 0.05; // offset to ensure vertices below blocks next to it // INFO: ------------------------- // output for frag @@ -65,11 +65,10 @@ fn vs_main( out.clip_position = camera.view_proj * vec4(final_pos, 1.0); out.clip_pos_for_fog = out.clip_position; - out.normal = get_voxel_normal(face.normal_index); + out.normal = get_block_normal(face.normal_index); out.color = vec3(1.0, 1.0, 1.0); - out.tex_coords = get_voxel_uv(vert_idx_in_quad); + out.tex_coords = get_block_uv(vert_idx_in_quad); out.texture_index = face.texture_id; return out; } - diff --git a/crates/client/Cargo.toml b/crates/client/Cargo.toml index 001ef2eb..f1e7c69f 100644 --- a/crates/client/Cargo.toml +++ b/crates/client/Cargo.toml @@ -4,32 +4,20 @@ description = "client for vantablock" version.workspace = true edition.workspace = true publish.workspace = true -default-run = "client" - -[lints] -workspace = true - -[package.metadata.packager] -product-name = "Vantablock" -identifier = "com.masoniis.vantablock" -resources = ["../../assets", "../../readme.md"] -icons = ["../../assets/client/icon.png"] -binaries = [{ path = "client", main = true }] [lib] name = "client" path = "src/lib.rs" -[[bin]] -name = "client" -path = "src/main.rs" +[lints] +workspace = true [[bench]] -name = "generation_benchmarks" +name = "meshing_benchmarks" harness = false [features] -dev = ["bevy/dev"] +dev = ["bevy/dev", "bevy/bevy_dev_tools"] tracy = ["dep:tracy-client", "dep:tracing-tracy"] distribution = ["tracing/release_max_level_error"] @@ -74,7 +62,20 @@ offset-allocator = { workspace = true } # gpu buffer allocation # simulation logic # -------------------------------- -bevy = { workspace = true } +bevy = { workspace = true, features = [ + "default_app", # core app (input, window, state, etc) + "default_platform", # core OS features, windowing, input, etc + "3d_bevy_render", # bevy 3d render pass/graph and subapp + "ui_bevy_render", # additional bevy ui render support + "bevy_asset", # asset management + "bevy_state", # state machines +] } +leafwing-input-manager = { workspace = true } +lightyear = { workspace = true, features = [ + "client", # lightyear client core (plugin, etc) + "interpolation", # smoothing intended for more pleasing visuals + "prediction", # for local predictions agaisnt server to get snappy feedback +] } futures-lite = { workspace = true } # future utils # INFO: --------------- @@ -86,6 +87,7 @@ derive_more = { workspace = true } serde = { workspace = true } # serializing rand = { workspace = true } # rng ron = { workspace = true } # parsing RON files +zstd = { workspace = true } noise = { workspace = true } # gen random noise crossbeam = { workspace = true } # thread comms glob = { workspace = true } # reading dirs diff --git a/crates/client/benches/generation_benchmarks.rs b/crates/client/benches/generation_benchmarks.rs deleted file mode 100644 index 32b56e36..00000000 --- a/crates/client/benches/generation_benchmarks.rs +++ /dev/null @@ -1,236 +0,0 @@ -use bevy::ecs::prelude::World; -use client::prelude::*; -use client::render::chunk::meshing::build_chunk_mesh; -use client::render::{block::BlockRenderDataRegistry, texture::VoxelTextureProcessor}; -use client::settings::ClientSettings; -use criterion::{Criterion, criterion_group, criterion_main}; -use shared::simulation::{ - biome::biome_registry::BiomeRegistryResource, - block::{BlockRegistry, SOLID_BLOCK_ID}, - chunk::{ - ChunkDataOption, NeighborLODs, PaddedChunk, - components::{ChunkBlocksComponent, ChunkCoord}, - thread_buffer_pool::acquire_buffer, - types::ChunkLod, - }, - terrain::{ - BasicBiomeGenerator, BiomeGenerator, BiomeMapComponent, BiomeResultBuilder, - ClimateGenerator, ClimateNoiseGenerator, PaintResultBuilder, ShapeResultBuilder, - SimpleSurfacePainter, SinwaveShaper, TerrainPainter, TerrainShaper, - }, -}; -use utils::PersistentPaths; - -const CLIMATE_NOISE_SEED: u32 = 42; - -/// Each bench in this benchmark builds off the previous (conceptually speaking). -fn bench_chunk_generation(c: &mut Criterion) { - let mut group = c.benchmark_group("Chunk generation"); - - // INFO: --------------- - // setup - // --------------------- - - let persistent_paths = PersistentPaths::resolve(); - let block_registry = BlockRegistry::load_from_disk(&persistent_paths); - - let mut world = World::new(); - world.insert_resource(persistent_paths.clone()); - world.insert_resource(block_registry.clone()); - world.init_resource::(); - - let biome_registry = world.resource::().clone(); - - let origin_chunk_coord = ChunkCoord { - pos: IVec3::new(0, 0, 0), - }; - - // INFO: -------------------------- - // climate benching - // -------------------------------- - - let climate_noise_generator = ClimateNoiseGenerator::new(CLIMATE_NOISE_SEED); - group.bench_function("climate_noise", |b| { - b.iter(|| { - climate_noise_generator.generate(origin_chunk_coord.clone()); - }) - }); - - // INFO: ------------------------ - // biome benching - // ------------------------------ - - let biome_generator = BasicBiomeGenerator; - let origin_noise = climate_noise_generator.generate(origin_chunk_coord.clone()); - - group.bench_function("biome_mapping", |b| { - b.iter(|| { - // setup - let biome_map = BiomeMapComponent::new_empty(ChunkLod(0)); - let builder = BiomeResultBuilder::new(biome_map, origin_chunk_coord.clone()); - - // chunk gen - biome_generator.generate_biome_chunk(builder, &origin_noise, &biome_registry); - }) - }); - - // INFO: -------------------------------- - // sinwave shape benching - // -------------------------------------- - - let sinwave_shaper = SinwaveShaper::new(); - group.bench_function("sinwave_shaping", |b| { - b.iter(|| { - let clim_map = climate_noise_generator.generate(origin_chunk_coord.clone()); - let chunk_blocks = ChunkBlocksComponent::new_uniform_empty(ChunkLod(0)); - let shaper = ShapeResultBuilder::new(chunk_blocks, origin_chunk_coord.clone()); - - sinwave_shaper.shape_terrain_chunk(&clim_map, shaper) - }) - }); - - // INFO: ------------------------ - // paint benching - // ------------------------------ - - let surface_painter = SimpleSurfacePainter::new(); - group.bench_function("painting", |b| { - b.iter(|| { - let biome_map = BiomeMapComponent::new_empty(ChunkLod(0)); - - let blocks = ChunkBlocksComponent::new_uniform_solid(ChunkLod(0)); - let painter = - PaintResultBuilder::new(blocks, origin_chunk_coord.clone(), block_registry.clone()); - - surface_painter.paint_terrain_chunk( - painter, - &biome_map, - &block_registry, - &biome_registry, - ); - }) - }); - - group.finish(); -} - -fn bench_chunk_meshing(c: &mut Criterion) { - let mut group = c.benchmark_group("Chunk meshing"); - - // INFO: --------------- - // setup - // --------------------- - - let persistent_paths = PersistentPaths::resolve(); - let client_settings = ClientSettings::load_or_create(&persistent_paths); - - // meshing requires textures to resolve - let (_texture_array, texture_registry) = VoxelTextureProcessor::new( - persistent_paths.assets_dir.clone(), - &client_settings.texture_pack, - ) - .load_and_stitch() - .expect("Failed to load and stitch textures"); - - let block_registry = BlockRegistry::load_from_disk(&persistent_paths); - let render_registry = BlockRenderDataRegistry::load_from_disk( - &persistent_paths, - &block_registry, - &texture_registry, - ); - - // INFO: --------------------------------- - // dense meshing benchmark - // --------------------------------------- - - let mut dense_chunks: [[[ChunkDataOption; 3]; 3]; 3] = Default::default(); - let solid_chunk = - ChunkDataOption::Generated(ChunkBlocksComponent::new_uniform_solid(ChunkLod(0))); - - #[allow(clippy::needless_range_loop)] - for x in 0..3 { - for y in 0..3 { - for z in 0..3 { - if x == 1 && y == 1 && z == 1 { - continue; - } - dense_chunks[x][y][z] = solid_chunk.clone(); - } - } - } - - // default to water for more complex meshing with transparency - let mut center_chunk = ChunkBlocksComponent::new_uniform( - ChunkLod(0), - block_registry.get_block_id_by_name("water").unwrap(), - ); - let size = center_chunk.size(); - let mut writer = center_chunk.get_writer(); - // create a y=x "slope" chunk - for x in 0..size { - for y in 0..=x { - for z in 0..size { - writer.set_data(x, y, z, SOLID_BLOCK_ID); - } - } - } - dense_chunks[1][1][1] = ChunkDataOption::Generated(center_chunk); - - let dense_neighbor_lods = NeighborLODs::default(); - let texture_lut = render_registry.get_texture_lut(); - - group.bench_function("dense meshing", |b| { - b.iter(|| { - let buffer = acquire_buffer(); - let dense_padded_chunk = - PaddedChunk::new(&dense_chunks, ChunkLod(0), dense_neighbor_lods, buffer); - build_chunk_mesh( - "bench_chunk_dense", - &dense_padded_chunk, - &block_registry, - &render_registry, - texture_lut, - ) - }) - }); - - // INFO: -------------------------------- - // hull meshing benchmark - // -------------------------------------- - - let mut hull_chunks: [[[ChunkDataOption; 3]; 3]; 3] = Default::default(); - let empty_chunk = - ChunkDataOption::Generated(ChunkBlocksComponent::new_uniform_empty(ChunkLod(0))); - - #[allow(clippy::needless_range_loop)] - for x in 0..3 { - for y in 0..3 { - for z in 0..3 { - hull_chunks[x][y][z] = empty_chunk.clone(); - } - } - } - - hull_chunks[1][1][1] = - ChunkDataOption::Generated(ChunkBlocksComponent::new_uniform_solid(ChunkLod(0))); - - let hull_neighbor_lods = NeighborLODs::default(); - - group.bench_function("hull meshing", |b| { - b.iter(|| { - let buffer = acquire_buffer(); - let hull_padded_chunk = - PaddedChunk::new(&hull_chunks, ChunkLod(0), hull_neighbor_lods, buffer); - build_chunk_mesh( - "bench_chunk_hull", - &hull_padded_chunk, - &block_registry, - &render_registry, - texture_lut, - ) - }) - }); -} - -criterion_group!(benches, bench_chunk_generation, bench_chunk_meshing); -criterion_main!(benches); diff --git a/crates/client/benches/meshing_benchmarks.rs b/crates/client/benches/meshing_benchmarks.rs new file mode 100644 index 00000000..b8750704 --- /dev/null +++ b/crates/client/benches/meshing_benchmarks.rs @@ -0,0 +1,133 @@ +use client::render::chunk::meshing::build_chunk_mesh; +use client::render::{block::BlockRenderDataRegistry, texture::BlockTextureProcessor}; +use client::settings::ClientSettings; +use criterion::{Criterion, criterion_group, criterion_main}; +use shared::world::{ + block::{BlockRegistry, SOLID_BLOCK_ID}, + chunk::{ + ChunkDataOption, NeighborLODs, PaddedChunk, components::ChunkBlocksComponent, + thread_buffer_pool::acquire_buffer, types::ChunkLod, + }, +}; +use utils::PersistentPaths; + +fn bench_chunk_meshing(c: &mut Criterion) { + let mut group = c.benchmark_group("Chunk meshing"); + + // INFO: --------------- + // setup + // --------------------- + + let persistent_paths = PersistentPaths::resolve_client(); + let client_settings = ClientSettings::load_or_create(&persistent_paths); + + // meshing requires textures to resolve + let (_texture_array, texture_registry) = BlockTextureProcessor::new( + persistent_paths.assets_dir.clone(), + &client_settings.texture_pack, + ) + .load_and_stitch() + .expect("Failed to load and stitch textures"); + + let block_registry = BlockRegistry::load_from_disk(&persistent_paths); + let render_registry = BlockRenderDataRegistry::load_from_disk( + &persistent_paths, + &block_registry, + &texture_registry, + ); + + // INFO: --------------------------------- + // dense meshing benchmark + // --------------------------------------- + + let mut dense_chunks: [[[ChunkDataOption; 3]; 3]; 3] = Default::default(); + let solid_chunk = + ChunkDataOption::Generated(ChunkBlocksComponent::new_uniform_solid(ChunkLod(0))); + + #[allow(clippy::needless_range_loop)] + for x in 0..3 { + for y in 0..3 { + for z in 0..3 { + if x == 1 && y == 1 && z == 1 { + continue; + } + dense_chunks[x][y][z] = solid_chunk.clone(); + } + } + } + + // default to water for more complex meshing with transparency + let mut center_chunk = ChunkBlocksComponent::new_uniform( + ChunkLod(0), + block_registry.get_block_id_by_name("water").unwrap(), + ); + let size = center_chunk.size(); + let mut writer = center_chunk.get_writer(); + // create a y=x "slope" chunk + for x in 0..size { + for y in 0..=x { + for z in 0..size { + writer.set_data(x, y, z, SOLID_BLOCK_ID); + } + } + } + dense_chunks[1][1][1] = ChunkDataOption::Generated(center_chunk); + + let dense_neighbor_lods = NeighborLODs::default(); + let texture_lut = render_registry.get_texture_lut(); + + group.bench_function("dense meshing", |b| { + b.iter(|| { + let buffer = acquire_buffer(); + let dense_padded_chunk = + PaddedChunk::new(&dense_chunks, ChunkLod(0), dense_neighbor_lods, buffer); + build_chunk_mesh( + "bench_chunk_dense", + &dense_padded_chunk, + &block_registry, + &render_registry, + texture_lut, + ) + }) + }); + + // INFO: -------------------------------- + // hull meshing benchmark + // -------------------------------------- + + let mut hull_chunks: [[[ChunkDataOption; 3]; 3]; 3] = Default::default(); + let empty_chunk = + ChunkDataOption::Generated(ChunkBlocksComponent::new_uniform_empty(ChunkLod(0))); + + #[allow(clippy::needless_range_loop)] + for x in 0..3 { + for y in 0..3 { + for z in 0..3 { + hull_chunks[x][y][z] = empty_chunk.clone(); + } + } + } + + hull_chunks[1][1][1] = + ChunkDataOption::Generated(ChunkBlocksComponent::new_uniform_solid(ChunkLod(0))); + + let hull_neighbor_lods = NeighborLODs::default(); + + group.bench_function("hull meshing", |b| { + b.iter(|| { + let buffer = acquire_buffer(); + let hull_padded_chunk = + PaddedChunk::new(&hull_chunks, ChunkLod(0), hull_neighbor_lods, buffer); + build_chunk_mesh( + "bench_chunk_hull", + &hull_padded_chunk, + &block_registry, + &render_registry, + texture_lut, + ) + }) + }); +} + +criterion_group!(benches, bench_chunk_meshing); +criterion_main!(benches); diff --git a/crates/client/build.rs b/crates/client/build.rs index 50b17e99..7ebf223c 100644 --- a/crates/client/build.rs +++ b/crates/client/build.rs @@ -71,8 +71,4 @@ fn main() { &"package::world::shadow::main_vert".parse().unwrap(), "shadow_vert", ); - - // UI shaders - compiler.build_artifact(&"package::ui::main_vert".parse().unwrap(), "ui_vert"); - compiler.build_artifact(&"package::ui::main_frag".parse().unwrap(), "ui_frag"); } diff --git a/crates/client/readme.md b/crates/client/readme.md new file mode 100644 index 00000000..4e118ce0 --- /dev/null +++ b/crates/client/readme.md @@ -0,0 +1,9 @@ +# Vantablock Client (`vantablock-client`) + +The `vantablock-client` crate contains the graphical client for the Vantablock voxel engine. It is completely isolated from the authoritative server logic, communicating exclusively via the network protocol defined in the `shared` crate. + +## Features Flags + +- `dev`: Enables Bevy dev tools. +- `tracy`: Enables Tracy profiling for client-side performance tuning. +- `distribution`: Trims logging for release builds. diff --git a/crates/client/src/input/input_maps.rs b/crates/client/src/input/input_maps.rs new file mode 100644 index 00000000..0abef905 --- /dev/null +++ b/crates/client/src/input/input_maps.rs @@ -0,0 +1,60 @@ +use crate::input::local_actions::ClientAction; +use bevy::prelude::{KeyCode, MouseButton}; +use leafwing_input_manager::prelude::{InputMap, MouseMove}; +use shared::player::PlayerAction; + +/// Provides the default input mapping for the game. +pub fn get_default_player_action_input_map() -> InputMap { + let mut input_map = InputMap::default(); + + // movement + input_map.insert(PlayerAction::MoveForward, KeyCode::KeyW); + input_map.insert(PlayerAction::MoveBackward, KeyCode::KeyS); + input_map.insert(PlayerAction::MoveLeft, KeyCode::KeyA); + input_map.insert(PlayerAction::MoveRight, KeyCode::KeyD); + input_map.insert(PlayerAction::MoveFaster, KeyCode::ShiftLeft); + + // core player actions + input_map.insert(PlayerAction::PrimaryInteract, MouseButton::Left); + input_map.insert(PlayerAction::SecondaryInteract, MouseButton::Right); + + // game time control + input_map.insert(PlayerAction::JumpGameTimeForward, KeyCode::ArrowRight); + input_map.insert(PlayerAction::JumpGameTimeBackward, KeyCode::ArrowLeft); + input_map.insert(PlayerAction::PauseGameTime, KeyCode::Space); + + input_map +} + +/// Provides the default local input mapping for the game. +pub fn get_default_client_action_input_map() -> InputMap { + let mut input_map = InputMap::default(); + + // orientation + input_map.insert_dual_axis(ClientAction::Look, MouseMove::default()); + + // misc + input_map.insert(ClientAction::TogglePause, KeyCode::Escape); + + // debug/analysis tools + input_map.insert(ClientAction::ToggleDiagnostics, KeyCode::F1); + input_map.insert(ClientAction::ToggleDiagnostics, KeyCode::KeyU); + input_map.insert(ClientAction::ToggleDebugMenu, KeyCode::F3); + input_map.insert(ClientAction::ToggleOpaqueWireframeMode, KeyCode::F2); + input_map.insert(ClientAction::ToggleOpaqueWireframeMode, KeyCode::KeyO); + input_map.insert(ClientAction::ToggleChunkBorders, KeyCode::KeyB); + + // showcase actions + input_map.insert(ClientAction::Showcase0, KeyCode::Digit0); + input_map.insert(ClientAction::Showcase1, KeyCode::Digit1); + input_map.insert(ClientAction::Showcase2, KeyCode::Digit2); + input_map.insert(ClientAction::Showcase3, KeyCode::Digit3); + input_map.insert(ClientAction::Showcase4, KeyCode::Digit4); + input_map.insert(ClientAction::Showcase5, KeyCode::Digit5); + input_map.insert(ClientAction::Showcase6, KeyCode::Digit6); + input_map.insert(ClientAction::Showcase7, KeyCode::Digit7); + input_map.insert(ClientAction::Showcase8, KeyCode::Digit8); + input_map.insert(ClientAction::Showcase9, KeyCode::Digit9); + + input_map +} diff --git a/crates/client/src/input/local_actions.rs b/crates/client/src/input/local_actions.rs new file mode 100644 index 00000000..f655eec4 --- /dev/null +++ b/crates/client/src/input/local_actions.rs @@ -0,0 +1,31 @@ +use bevy::prelude::Reflect; +use leafwing_input_manager::Actionlike; + +/// Actions that are local to the client and do not affect the server's state or the player/character. +/// +/// These are typically used for UI toggles, debug views, etc. +#[derive(Actionlike, PartialEq, Eq, Clone, Copy, Hash, Debug, Reflect)] +pub enum ClientAction { + // continuous inputs + #[actionlike(DualAxis)] + Look, + + // random stuff + ToggleDiagnostics, + ToggleDebugMenu, + ToggleOpaqueWireframeMode, + ToggleChunkBorders, + TogglePause, + + // showcase actions + Showcase0, + Showcase1, + Showcase2, + Showcase3, + Showcase4, + Showcase5, + Showcase6, + Showcase7, + Showcase8, + Showcase9, +} diff --git a/crates/client/src/input/mod.rs b/crates/client/src/input/mod.rs index bb7b0a44..cae78f80 100644 --- a/crates/client/src/input/mod.rs +++ b/crates/client/src/input/mod.rs @@ -1,74 +1,91 @@ +pub mod input_maps; +pub mod local_actions; +pub mod resources; pub mod systems; // INFO: ----------------------------- // input module plugin // ----------------------------------- -use crate::input::systems::{ - toggle_chunk_borders::ChunkBoundsToggle, toggle_chunk_borders_system, toggle_cursor_system, - toggle_opaque_wireframe::OpaqueWireframeMode, toggle_opaque_wireframe_mode_system, +use crate::{ + input::{ + input_maps::get_default_client_action_input_map, + local_actions::ClientAction, + resources::CursorMovement, + systems::{ + lock_cursor_system, toggle_chunk_borders::ChunkBoundsToggle, + toggle_chunk_borders_system, toggle_opaque_wireframe::OpaqueRenderMode, + toggle_opaque_wireframe_mode_system, toggle_pause_system, unlock_cursor_system, + }, + }, + lifecycle::state::{ClientLifecycleState, InGameState}, }; -use bevy::app::{App, Plugin, PreUpdate, Update}; -use bevy::ecs::{schedule::IntoScheduleConfigs, system::Res}; -use shared::simulation::input::resources::{ - ActionStateResource, CursorMovement, InputActionMapResource, +use bevy::{ + app::{App, Plugin, PreUpdate, Update}, + prelude::{IntoScheduleConfigs, OnEnter, OnExit, SystemCondition, in_state}, + render::extract_resource::ExtractResourcePlugin, +}; +use leafwing_input_manager::{ + common_conditions::action_just_pressed, plugin::InputManagerPlugin, prelude::ActionState, }; -use systems::processing; -pub struct InputModulePlugin; +pub struct ClientInputPlugin; -impl Plugin for InputModulePlugin { +impl Plugin for ClientInputPlugin { fn build(&self, app: &mut App) { - // resources - app.insert_resource(InputActionMapResource::default()) - .insert_resource(ActionStateResource::default()); + // leafwing input manager for local actions + app.add_plugins(InputManagerPlugin::::default()); + app.init_resource::>() + .insert_resource(get_default_client_action_input_map()); + // INFO: ------------------------------------ + // resources & render plugins + // ------------------------------------------ app.insert_resource(CursorMovement::default()); + app.insert_resource(OpaqueRenderMode::default()); + app.insert_resource(ChunkBoundsToggle::default()); + app.add_plugins(ExtractResourcePlugin::::default()); + + // INFO: -------------------------------------------- + // state-transition cursor management + // -------------------------------------------------- + + // cursor management based on game state + app.add_systems(OnEnter(InGameState::Playing), lock_cursor_system) + .add_systems(OnExit(InGameState::Playing), unlock_cursor_system) + .add_systems( + OnEnter(ClientLifecycleState::MainMenu), + unlock_cursor_system, + ); - // schedules + // INFO: --------------------------------------- + // general keybind-based actions + // --------------------------------------------- + + // ensure device events (mouse movement) are only processed in-game app.add_systems( PreUpdate, - ( - processing::device_events_system, - processing::update_action_state_system.after(processing::device_events_system), - ), + systems::processing::device_events_system + .run_if(in_state(ClientLifecycleState::InGame)), ); - // INFO: ------------------------------------- - // keybind-based actions below - // ------------------------------------------- - - // set desired cursor state on pause action + // inputs that only run if in game state app.add_systems( Update, - toggle_cursor_system.run_if(|action_state: Res| { - action_state - .just_happened(shared::simulation::input::types::SimulationAction::TogglePause) - }), - ); - - // toggle opaque wireframe mode - app.insert_resource(OpaqueWireframeMode::default()) - .add_systems( - Update, - toggle_opaque_wireframe_mode_system.run_if( - |action_state: Res| { - action_state.just_happened( - shared::simulation::input::types::SimulationAction::ToggleOpaqueWireframeMode, - ) - }, + ( + // set desired cursor state on pause action + toggle_pause_system.run_if( + action_just_pressed(ClientAction::TogglePause) + .and(in_state(InGameState::Playing).or(in_state(InGameState::Paused))), ), - ); - - // toggle chunk borders - app.insert_resource(ChunkBoundsToggle::default()) - .add_systems( - Update, - toggle_chunk_borders_system.run_if(|action_state: Res| { - action_state.just_happened( - shared::simulation::input::types::SimulationAction::ToggleChunkBorders, - ) - }), - ); + // toggle opaque wireframe mode + toggle_opaque_wireframe_mode_system + .run_if(action_just_pressed(ClientAction::ToggleOpaqueWireframeMode)), + // toggle chunk borders + toggle_chunk_borders_system + .run_if(action_just_pressed(ClientAction::ToggleChunkBorders)), + ) + .run_if(in_state(ClientLifecycleState::InGame)), + ); } } diff --git a/crates/client/src/input/resources/cursor_movement.rs b/crates/client/src/input/resources/cursor_movement.rs new file mode 100644 index 00000000..4b9b4e0d --- /dev/null +++ b/crates/client/src/input/resources/cursor_movement.rs @@ -0,0 +1,25 @@ +use bevy::ecs::prelude::Resource; +use bevy::math::Vec2; + +#[derive(Debug, Resource, Default)] +pub struct CursorMovement { + /// mouse delta + pub delta: Vec2, + /// scroll delta + pub scroll_delta: Vec2, +} + +impl CursorMovement { + pub fn reset_deltas(&mut self) { + self.delta = Vec2::ZERO; + self.scroll_delta = Vec2::ZERO; + } + + pub fn adjust_mouse_delta(&mut self, delta: Vec2) { + self.delta += delta; + } + + pub fn adjust_scroll_delta(&mut self, delta: Vec2) { + self.scroll_delta += delta; + } +} diff --git a/crates/client/src/input/resources/mod.rs b/crates/client/src/input/resources/mod.rs new file mode 100644 index 00000000..3514192f --- /dev/null +++ b/crates/client/src/input/resources/mod.rs @@ -0,0 +1,3 @@ +pub mod cursor_movement; + +pub use cursor_movement::CursorMovement; diff --git a/crates/client/src/input/systems/extra_binds/mod.rs b/crates/client/src/input/systems/extra_binds/mod.rs index 56577a69..855caa82 100644 --- a/crates/client/src/input/systems/extra_binds/mod.rs +++ b/crates/client/src/input/systems/extra_binds/mod.rs @@ -1,7 +1,9 @@ pub mod toggle_chunk_borders; pub mod toggle_cursor; pub mod toggle_opaque_wireframe; +pub mod toggle_pause; pub use toggle_chunk_borders::toggle_chunk_borders_system; -pub use toggle_cursor::toggle_cursor_system; +pub use toggle_cursor::{lock_cursor_system, unlock_cursor_system}; pub use toggle_opaque_wireframe::toggle_opaque_wireframe_mode_system; +pub use toggle_pause::toggle_pause_system; diff --git a/crates/client/src/input/systems/extra_binds/toggle_chunk_borders.rs b/crates/client/src/input/systems/extra_binds/toggle_chunk_borders.rs index 15c33ec9..0f36cffb 100644 --- a/crates/client/src/input/systems/extra_binds/toggle_chunk_borders.rs +++ b/crates/client/src/input/systems/extra_binds/toggle_chunk_borders.rs @@ -1,7 +1,10 @@ use crate::prelude::*; -use bevy::ecs::{resource::Resource, system::ResMut}; +use bevy::{ + ecs::{resource::Resource, system::ResMut}, + render::extract_resource::ExtractResource, +}; -#[derive(Resource, Default)] +#[derive(Resource, ExtractResource, Default, Clone)] pub struct ChunkBoundsToggle { pub enabled: bool, } diff --git a/crates/client/src/input/systems/extra_binds/toggle_cursor.rs b/crates/client/src/input/systems/extra_binds/toggle_cursor.rs index f424912e..0966b603 100644 --- a/crates/client/src/input/systems/extra_binds/toggle_cursor.rs +++ b/crates/client/src/input/systems/extra_binds/toggle_cursor.rs @@ -1,18 +1,22 @@ use bevy::prelude::*; use bevy::window::{CursorGrabMode, CursorOptions, PrimaryWindow}; -/// Toggles the OS cursor visibility and lock state on the primary window. -pub fn toggle_cursor_system(mut cursor_query: Query<&mut CursorOptions, With>) { +/// Locks the OS cursor and hides it. +pub fn lock_cursor_system(mut cursor_query: Query<&mut CursorOptions, With>) { let Ok(mut cursor) = cursor_query.single_mut() else { return; }; - // toggle visibiility - cursor.visible = !cursor.visible; + cursor.visible = false; + cursor.grab_mode = CursorGrabMode::Locked; +} + +/// Unlocks the OS cursor and shows it. +pub fn unlock_cursor_system(mut cursor_query: Query<&mut CursorOptions, With>) { + let Ok(mut cursor) = cursor_query.single_mut() else { + return; + }; - if cursor.visible { - cursor.grab_mode = CursorGrabMode::None; - } else { - cursor.grab_mode = CursorGrabMode::Locked; - } + cursor.visible = true; + cursor.grab_mode = CursorGrabMode::None; } diff --git a/crates/client/src/input/systems/extra_binds/toggle_opaque_wireframe.rs b/crates/client/src/input/systems/extra_binds/toggle_opaque_wireframe.rs index bccc6469..26c9d7e5 100644 --- a/crates/client/src/input/systems/extra_binds/toggle_opaque_wireframe.rs +++ b/crates/client/src/input/systems/extra_binds/toggle_opaque_wireframe.rs @@ -1,13 +1,28 @@ use crate::prelude::*; -use bevy::ecs::{resource::Resource, system::ResMut}; +use bevy::{ + ecs::{resource::Resource, system::ResMut}, + render::extract_resource::ExtractResource, +}; -#[derive(Resource, Default)] -pub struct OpaqueWireframeMode { - pub enabled: bool, +/// A resource that defines the current opaque rendering polygon mode +#[derive(Resource, ExtractResource, Default, Debug, PartialEq, Eq, Hash, Clone, Copy)] +pub enum OpaqueRenderMode { + #[default] + Fill, + Wireframe, +} + +impl OpaqueRenderMode { + pub fn next(self) -> Self { + match self { + Self::Fill => Self::Wireframe, + Self::Wireframe => Self::Fill, + } + } } /// Toggle opaque wireframe mode on or off. -pub fn toggle_opaque_wireframe_mode_system(mut mode: ResMut) { - info!("Toggling opaque wireframe mode: {}", !mode.enabled); - mode.enabled = !mode.enabled; +pub fn toggle_opaque_wireframe_mode_system(mut mode: ResMut) { + *mode = mode.next(); + info!("Toggling opaque wireframe mode: {:?}", *mode); } diff --git a/crates/client/src/input/systems/extra_binds/toggle_pause.rs b/crates/client/src/input/systems/extra_binds/toggle_pause.rs new file mode 100644 index 00000000..5948ebfa --- /dev/null +++ b/crates/client/src/input/systems/extra_binds/toggle_pause.rs @@ -0,0 +1,17 @@ +use crate::lifecycle::state::InGameState; +use bevy::prelude::*; + +pub fn toggle_pause_system( + current_state: Res>, + mut next_state: ResMut>, +) { + match current_state.get() { + InGameState::Playing => { + next_state.set(InGameState::Paused); + } + InGameState::Paused => { + next_state.set(InGameState::Playing); + } + _ => {} + } +} diff --git a/crates/client/src/input/systems/processing/action_mapper.rs b/crates/client/src/input/systems/processing/action_mapper.rs deleted file mode 100644 index 99692866..00000000 --- a/crates/client/src/input/systems/processing/action_mapper.rs +++ /dev/null @@ -1,56 +0,0 @@ -use bevy::ecs::system::{Res, ResMut}; -use bevy::prelude::{ButtonInput, KeyCode, MouseButton}; -use shared::simulation::input::resources::{ - InputActionMapResource, action::ActionStateResource, input_action_map::Input, -}; -use tracing::instrument; - -/// A system that translates the raw state from Bevy's native input resources into abstract, -/// game-specific actions based on the current `InputActionMapResource`. -#[instrument(skip_all)] -pub fn update_action_state_system( - keyboard_input: Res>, - mouse_input: Res>, - action_map: Res, - mut action_state: ResMut, -) { - // INFO: ----------------------------------------- - // Update the actions - // ----------------------------------------------- - - // We clear the state of "one-shot" actions (just pressed/just released) - // before we update them again. - action_state.clear(); - - // We iterate through every bound action and update its state based on whether - // the associated key is pressed, was just pressed, or was just released. - for (input, action) in action_map.iter() { - let is_down = match input { - Input::Key(code) => keyboard_input.pressed(*code), - Input::MouseButton(button) => mouse_input.pressed(*button), - }; - - let just_pressed = match input { - Input::Key(code) => keyboard_input.just_pressed(*code), - Input::MouseButton(button) => mouse_input.just_pressed(*button), - }; - - let just_released = match input { - Input::Key(code) => keyboard_input.just_released(*code), - Input::MouseButton(button) => mouse_input.just_released(*button), - }; - - // update state - if is_down { - action_state.hold(*action); - } - - if just_pressed { - action_state.press(*action); - } - - if just_released { - action_state.release(*action); - } - } -} diff --git a/crates/client/src/input/systems/processing/device_events.rs b/crates/client/src/input/systems/processing/device_events.rs index b5e34474..b4427c46 100644 --- a/crates/client/src/input/systems/processing/device_events.rs +++ b/crates/client/src/input/systems/processing/device_events.rs @@ -1,7 +1,7 @@ +use crate::input::resources::CursorMovement; use crate::prelude::*; use bevy::ecs::prelude::{MessageReader, ResMut}; use bevy::input::mouse::{MouseMotion, MouseScrollUnit, MouseWheel}; -use shared::simulation::input::resources::CursorMovement; use tracing::instrument; /// A system to handle Bevy's native mouse motion and wheel events, @@ -10,14 +10,14 @@ use tracing::instrument; pub fn device_events_system( mut motion_events: MessageReader, mut wheel_events: MessageReader, - // State to modify (output) + // state to modify (output) mut movement: ResMut, ) { - // Clear previous stale state (without this mouse movement would "accumulate") + // clear previous stale state movement.reset_deltas(); for event in motion_events.read() { - movement.adjust_mouse_delta(event.delta.into()); + movement.adjust_mouse_delta(event.delta); } for event in wheel_events.read() { diff --git a/crates/client/src/input/systems/processing/mod.rs b/crates/client/src/input/systems/processing/mod.rs index d15cc06a..78ab4652 100644 --- a/crates/client/src/input/systems/processing/mod.rs +++ b/crates/client/src/input/systems/processing/mod.rs @@ -1,5 +1,3 @@ -pub mod action_mapper; pub mod device_events; -pub use action_mapper::update_action_state_system; pub use device_events::device_events_system; diff --git a/crates/client/src/lib.rs b/crates/client/src/lib.rs index c161cd04..7e076a13 100644 --- a/crates/client/src/lib.rs +++ b/crates/client/src/lib.rs @@ -1,11 +1,13 @@ +//! # The Vantablock Client Library + pub mod input; -pub mod load; +pub mod lifecycle; +pub mod network; pub mod player; pub mod prelude; pub mod render; pub mod settings; pub mod showcase; -pub mod state; pub mod ui; pub use prelude::*; @@ -14,21 +16,117 @@ pub use prelude::*; // client plugin group // ----------------------------------- -use bevy::app::PluginGroupBuilder; -use bevy::prelude::PluginGroup; +#[cfg(feature = "dev")] +use bevy::dev_tools::fps_overlay::{FpsOverlayConfig, FpsOverlayPlugin}; +use bevy::{ + MinimalPlugins, + asset::AssetApp, + image::Image, + input::InputPlugin, + log::LogPlugin, + prelude::{AssetPlugin, DefaultPlugins, Window, WindowPlugin, default}, + state::app::StatesPlugin, + window::WindowResolution, +}; -/// A group containing all client-side plugins. -pub struct ClientPlugins; +/// A plugin group containing client-side core plugins. +/// +/// Notably, this excludes high level bevy plugins meaning +/// that no windows will be spawned, etc. Good for testing. +pub struct CoreClientLogicPlugins; -impl PluginGroup for ClientPlugins { +impl PluginGroup for CoreClientLogicPlugins { fn build(self) -> PluginGroupBuilder { PluginGroupBuilder::start::() - .add(state::ClientLifecyclePlugin) - .add(load::ClientLoadPlugin) - .add(input::InputModulePlugin) + // internal crate plugins + .add(settings::ClientSettingsPlugin) + .add(input::ClientInputPlugin) + .add_group(lifecycle::LifecyclePlugins) + .add_group(network::ClientNetworkPlugins) .add(player::PlayerPlugin) .add(showcase::ShowcasePlugin) - .add(ui::VantablockUiPlugin) + } +} + +/// The complete plugin group for the playable game client. +pub struct DefaultClientPlugins; + +impl PluginGroup for DefaultClientPlugins { + fn build(self) -> PluginGroupBuilder { + let persistent_paths = utils::PersistentPaths::resolve_client(); + let asset_path = persistent_paths.assets_dir.to_string_lossy().to_string(); + + #[allow(unused_mut)] + let mut builder = PluginGroupBuilder::start::() + // bevy default setup + .add_group( + DefaultPlugins + .set(WindowPlugin { + primary_window: Some(Window { + title: format!("Vantablock v{}", env!("CARGO_PKG_VERSION")), + resolution: WindowResolution::new(1280, 720), + visible: false, + ..default() + }), + ..default() + }) + .set(AssetPlugin { + file_path: asset_path, + ..default() + }) + .disable::(), + ) + // external crate plugins + .add_group(shared::SharedPlugins) + // rendering plugins, these depend on bevy render app existing + // so they can't be a part of the core plugin set .add(render::VantablockRenderPlugin) + .add(ui::VantablockUiPlugin) + // core client + .add_group(CoreClientLogicPlugins); + + #[cfg(feature = "dev")] + { + builder = builder.add(FpsOverlayPlugin { + config: FpsOverlayConfig { ..default() }, + }); + } + + builder + } +} + +/// The lightweight plugin group for headless integration testing. +pub struct HeadlessClientPlugins; + +impl PluginGroup for HeadlessClientPlugins { + fn build(self) -> PluginGroupBuilder { + let persistent_paths = utils::PersistentPaths::resolve_client(); + let asset_path = persistent_paths.assets_dir.to_string_lossy().to_string(); + + PluginGroupBuilder::start::() + // bevy minimal setup + .add_group(MinimalPlugins) + // extra bevy plugins not included in minimal + .add(AssetPlugin { + file_path: asset_path, + ..default() + }) + .add(StatesPlugin) + .add(InputPlugin) + // ensure basic assets are registered + .add(AssetRegistrationPlugin) + // external crate plugins + .add_group(shared::SharedPlugins) + // core client + .add_group(CoreClientLogicPlugins) + } +} + +struct AssetRegistrationPlugin; + +impl Plugin for AssetRegistrationPlugin { + fn build(&self, app: &mut App) { + app.init_asset::(); } } diff --git a/crates/client/src/lifecycle/load/chunk_loading.rs b/crates/client/src/lifecycle/load/chunk_loading.rs new file mode 100644 index 00000000..c22c0100 --- /dev/null +++ b/crates/client/src/lifecycle/load/chunk_loading.rs @@ -0,0 +1,78 @@ +use crate::{ + prelude::*, + render::chunk::manager::{ClientChunkManager, ClientChunkState}, +}; +use bevy::{ + ecs::prelude::*, + math::IVec3, + prelude::{Camera, Camera3d}, +}; +use shared::world::chunk::{ChunkCoord, LOAD_DISTANCE, WORLD_MAX_Y_CHUNK, WORLD_MIN_Y_CHUNK}; +use std::collections::HashSet; + +/// A system that determines which chunks should be loaded based on camera position. +/// This system manages chunk lifecycle transitions from Unloaded to AwaitingData. +#[instrument(skip_all)] +pub fn manage_distance_based_chunk_loading_targets_system( + // input + camera_query: Query<(&Camera, &ChunkCoord), With>, + + // output + mut chunk_manager: ResMut, + mut commands: Commands, +) { + let mut active_camera_chunk_pos = None; + for (camera, chunk_coord) in camera_query.iter() { + if camera.is_active { + active_camera_chunk_pos = Some(chunk_coord.pos); + break; + } + } + + let Some(camera_chunk_pos) = active_camera_chunk_pos else { + return; + }; + + let mut desired_load_chunks = HashSet::new(); + + for y in WORLD_MIN_Y_CHUNK..=WORLD_MAX_Y_CHUNK { + for z in -LOAD_DISTANCE..=LOAD_DISTANCE { + for x in -LOAD_DISTANCE..=LOAD_DISTANCE { + let coord = IVec3::new(camera_chunk_pos.x + x, y, camera_chunk_pos.z + z); + desired_load_chunks.insert(coord); + } + } + } + + // handle unloading + let mut coords_to_remove = Vec::new(); + for (coord, state) in chunk_manager.chunk_states.iter() { + if !desired_load_chunks.contains(coord) { + // chunk is outside load distance, unload it completely + match state { + ClientChunkState::AwaitingData => { + // nothing to despawn + } + ClientChunkState::DataReady { entity } + | ClientChunkState::NeedsMeshing { entity } + | ClientChunkState::Meshing { entity } + | ClientChunkState::MeshComplete { entity } => { + debug!(target:"chunk_loading", "Unloading chunk at {:?} (Entity: {:?})", coord, entity); + commands.entity(*entity).despawn(); + } + } + coords_to_remove.push(*coord); + } + } + + for coord in coords_to_remove { + chunk_manager.mark_as_unloaded(coord); + } + + // identify new chunks to load + for coord in desired_load_chunks { + if !chunk_manager.is_chunk_present_or_loading(coord) { + chunk_manager.mark_as_awaiting_data(coord); + } + } +} diff --git a/crates/client/src/lifecycle/load/mod.rs b/crates/client/src/lifecycle/load/mod.rs new file mode 100644 index 00000000..cfd1dc06 --- /dev/null +++ b/crates/client/src/lifecycle/load/mod.rs @@ -0,0 +1,54 @@ +pub mod chunk_loading; +pub mod phases; + +// INFO: --------------------------- +// plugin definition +// --------------------------------- + +use crate::lifecycle::ClientLifecycleState; +use bevy::prelude::*; +use chunk_loading::manage_distance_based_chunk_loading_targets_system; +pub use phases::*; +use shared::{ + lifecycle::{ + load::{kickoff_loading_phase, loading_dag_is_complete, nuke_loading_dag}, + state::transition_to, + }, + world::chunk::ChunkCoord, +}; + +/// Plugin responsible for managing client-side asset and registry loading. +pub struct ClientLoadPlugin; + +impl Plugin for ClientLoadPlugin { + fn build(&self, app: &mut App) { + // kickoff client launch loading phase when launching + app.add_systems( + OnEnter(ClientLifecycleState::Launching), + kickoff_loading_phase::, + ); + + // transition to main menu when client launch tasks are complete + app.add_systems( + Update, + transition_to(ClientLifecycleState::MainMenu) + .run_if(in_state(ClientLifecycleState::Launching)) + .run_if(loading_dag_is_complete::), + ); + + // cleanup + app.add_systems( + OnExit(ClientLifecycleState::Launching), + nuke_loading_dag::, + ); + + app.add_systems( + PreUpdate, + manage_distance_based_chunk_loading_targets_system.run_if( + |q: Query<(&Camera, &ChunkCoord), (With, Changed)>| { + q.iter().any(|(c, _)| c.is_active) + }, + ), + ); + } +} diff --git a/crates/client/src/lifecycle/load/phases.rs b/crates/client/src/lifecycle/load/phases.rs new file mode 100644 index 00000000..42ce7d4f --- /dev/null +++ b/crates/client/src/lifecycle/load/phases.rs @@ -0,0 +1,11 @@ +use shared::lifecycle::load::LoadingDagPhase; + +/// Marker for the client launch loading phase. +/// +/// This loading phase handles the transition from `ClientLifecycleState::Launching` +/// to `ClientLifecycleState::MainMenu`. +pub struct ClientLaunchLoadingPhase; + +impl LoadingDagPhase for ClientLaunchLoadingPhase { + const PHASE_NAME: &'static str = "ClientLaunchLoading"; +} diff --git a/crates/client/src/lifecycle/mod.rs b/crates/client/src/lifecycle/mod.rs new file mode 100644 index 00000000..bbecb978 --- /dev/null +++ b/crates/client/src/lifecycle/mod.rs @@ -0,0 +1,25 @@ +pub mod load; +pub mod scheduling; +pub mod state; + +pub use load::*; +pub use scheduling::*; +pub use state::*; + +// INFO: --------------------------- +// plugin definition +// --------------------------------- + +use bevy::{app::PluginGroupBuilder, prelude::PluginGroup}; + +/// A plugin group containing client lifecycle stuff. +pub struct LifecyclePlugins; + +impl PluginGroup for LifecyclePlugins { + fn build(self) -> PluginGroupBuilder { + PluginGroupBuilder::start::() + .add(ClientLoadPlugin) + .add(ClientSchedulingPlugin) + .add(ClientStatePlugin) + } +} diff --git a/crates/client/src/lifecycle/scheduling/mod.rs b/crates/client/src/lifecycle/scheduling/mod.rs new file mode 100644 index 00000000..6d537b62 --- /dev/null +++ b/crates/client/src/lifecycle/scheduling/mod.rs @@ -0,0 +1,21 @@ +pub mod sets; + +pub use sets::RenderPrepSet; + +// INFO: --------------------------- +// plugin definition +// --------------------------------- + +use crate::lifecycle::state::ClientLifecycleState; +use bevy::prelude::*; + +pub struct ClientSchedulingPlugin; + +impl Plugin for ClientSchedulingPlugin { + fn build(&self, app: &mut App) { + app.configure_sets( + PostUpdate, + RenderPrepSet.run_if(in_state(ClientLifecycleState::InGame)), + ); + } +} diff --git a/crates/client/src/lifecycle/scheduling/sets.rs b/crates/client/src/lifecycle/scheduling/sets.rs new file mode 100644 index 00000000..49d1aba5 --- /dev/null +++ b/crates/client/src/lifecycle/scheduling/sets.rs @@ -0,0 +1,6 @@ +use bevy::ecs::prelude::SystemSet; + +/// Systems that prepare data for the render world. +/// These typically run at the very end of Bevy's native `PostUpdate` schedule. +#[derive(SystemSet, Debug, Hash, PartialEq, Eq, Clone)] +pub struct RenderPrepSet; diff --git a/crates/client/src/lifecycle/state/enums.rs b/crates/client/src/lifecycle/state/enums.rs new file mode 100644 index 00000000..d7e25c83 --- /dev/null +++ b/crates/client/src/lifecycle/state/enums.rs @@ -0,0 +1,51 @@ +use bevy::prelude::{StateSet, SubStates}; +use shared::lifecycle::state::AppState; + +/// High-level client state. +/// Sub-state of `AppState::Running`. +#[derive(SubStates, Debug, Clone, Copy, PartialEq, Eq, Hash, Default)] +#[source(AppState = AppState::Running)] +pub enum ClientLifecycleState { + /// Initial asset loading, shader compilation, and warmup. + #[default] + Launching, + /// User is in the main menu. + MainMenu, + /// A world session is active (local or remote). + InGame, + /// Terminal state for fatal errors/disconnects to clean up the session. + Error, +} + +/// Detailed session lifecycle. +/// Sub-state of `ClientState::InGame`. +#[derive(SubStates, Debug, Clone, Copy, PartialEq, Eq, Hash, Default)] +#[source(ClientLifecycleState = ClientLifecycleState::InGame)] +pub enum InGameState { + /// Establishing network connection or initializing local server. + #[default] + Connecting, + /// Receiving initial chunks and generating block meshes. + WorldLoading, + /// Active gameplay. + Playing, + /// Logic/Physics paused (single-player). + Paused, + /// Tearing down the world, closing sockets, and clearing VRAM. + Disconnecting, +} + +/// Tracks the network topology and authority level of the active session. +/// Sub-state of `ClientState::InGame`. +#[derive(SubStates, Debug, Clone, Copy, PartialEq, Eq, Hash, Default)] +#[source(ClientLifecycleState = ClientLifecycleState::InGame)] +pub enum SessionTopology { + /// The client is running a local background server (Singleplayer). + /// The client has Host authority to pause the game, run server commands, etc. + #[default] + Internal, + + /// The client is connected to a remote dedicated server (Multiplayer). + /// The client has standard permissions and cannot pause the simulation. + External, +} diff --git a/crates/client/src/lifecycle/state/mod.rs b/crates/client/src/lifecycle/state/mod.rs new file mode 100644 index 00000000..83bfd974 --- /dev/null +++ b/crates/client/src/lifecycle/state/mod.rs @@ -0,0 +1,47 @@ +mod enums; + +pub use enums::*; + +// INFO: --------------------------- +// plugin definition +// --------------------------------- + +use bevy::{prelude::*, state::app::AppExtStates, window::PrimaryWindow}; +use shared::{FixedUpdateSet, lifecycle::state::AppState}; + +pub struct ClientStatePlugin; + +impl Plugin for ClientStatePlugin { + fn build(&self, app: &mut App) { + app.add_sub_state::() + .add_sub_state::() + .add_sub_state::(); + + // INFO: ----------------------- + // async loading + // ----------------------------- + + // load cleanup to run after transitions + // (handled automatically by Bevy despawn_recursive now) + + // configure system sets to be state-bound + app.configure_sets( + FixedUpdate, + (FixedUpdateSet::PreUpdate, FixedUpdateSet::MainLogic) + .run_if(in_state(ClientLifecycleState::InGame)), + ); + + // INFO: --------------------------- + // state transitions + // --------------------------------- + + app.add_systems( + OnExit(AppState::StartingUp), + |mut window: Query<&mut Window, With>| { + if let Ok(mut win) = window.single_mut() { + win.visible = true; + } + }, + ); + } +} diff --git a/crates/client/src/load/mod.rs b/crates/client/src/load/mod.rs deleted file mode 100644 index 6121e987..00000000 --- a/crates/client/src/load/mod.rs +++ /dev/null @@ -1,14 +0,0 @@ -pub mod registries; - -use crate::load::registries::start_async_registry_initialization; -use bevy::app::{App, Plugin, Startup}; - -/// Plugin responsible for managing client-side asset and registry loading. -pub struct ClientLoadPlugin; - -impl Plugin for ClientLoadPlugin { - fn build(&self, app: &mut App) { - // start background registry initialization - app.add_systems(Startup, start_async_registry_initialization); - } -} diff --git a/crates/client/src/load/registries.rs b/crates/client/src/load/registries.rs deleted file mode 100644 index a265446d..00000000 --- a/crates/client/src/load/registries.rs +++ /dev/null @@ -1,79 +0,0 @@ -use crate::prelude::*; -use crate::render::{ - block::BlockRenderDataRegistry, - texture::{BlockTextureArray, VoxelTextureProcessor}, -}; -use bevy::{ - asset::Assets, - prelude::{Commands, Image, Res, World}, - tasks::AsyncComputeTaskPool, -}; -use crossbeam::channel::unbounded; -use shared::{ - load::{SimulationWorldLoadingTaskComponent, TaskResultCallback}, - simulation::block::BlockRegistry, -}; -use utils::PersistentPaths; - -/// A system that starts the asynchronous initialization of texture and block registries -pub fn start_async_registry_initialization( - mut commands: Commands, - client_settings: Res, - persistent_paths: Res, -) { - info!("Starting asynchronous simulation registry initialization..."); - - let (sender, _receiver) = unbounded(); - let receiver = _receiver; - let settings = client_settings.clone(); - let paths = persistent_paths.clone(); - - AsyncComputeTaskPool::get() - .spawn(async move { - info!("Initializing simulation registries in background..."); - - // texture stitching - let (texture_array_image, texture_registry) = - VoxelTextureProcessor::new(paths.assets_dir.clone(), &settings.texture_pack) - .load_and_stitch() - .expect("Failed to load and stitch textures"); - - // independent simulation block loading - let block_registry = BlockRegistry::load_from_disk(&paths); - - // independent client render block loading (resolves IDs via simulation registry) - let render_registry = - BlockRenderDataRegistry::load_from_disk(&paths, &block_registry, &texture_registry); - - // prepare callback to apply results on main thread - let callback: TaskResultCallback = Box::new(move |commands: &mut Commands| { - info!("Applying simulation registry results to the world."); - - // access world via commands to insert resources - commands.queue(move |world: &mut World| { - let mut image_assets = world.resource_mut::>(); - let texture_handle = image_assets.add(texture_array_image); - - // insert all registries - world.insert_resource(texture_registry); - world.insert_resource(block_registry); - world.insert_resource(render_registry); - - // insert texture array handle - world.insert_resource(BlockTextureArray { - handle: texture_handle, - }); - }); - - info!("Simulation registries initialized successfully."); - }); - - sender - .send(callback) - .expect("Failed to send registry task result"); - }) - .detach(); - - // register this as a loading task so the game waits for it - commands.spawn(SimulationWorldLoadingTaskComponent { receiver }); -} diff --git a/crates/client/src/main.rs b/crates/client/src/main.rs deleted file mode 100644 index 3840ddfa..00000000 --- a/crates/client/src/main.rs +++ /dev/null @@ -1,69 +0,0 @@ -#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] - -use bevy::{ - app::{App, FixedUpdate, PostUpdate}, - log::LogPlugin, - prelude::{ - AssetPlugin, ClearColor, Color, DefaultPlugins, IntoScheduleConfigs, PluginGroup, Window, - WindowPlugin, default, info, - }, - window::WindowResolution, -}; -use client::prelude::*; -use shared::{ - load::LoadingTracker, - simulation::scheduling::{FixedUpdateSet, RenderPrepSet}, -}; -use utils::PersistentPaths; - -#[instrument(skip_all, fields(name = "main"))] -fn main() { - attach_logger(); - - // setup default bevy app - let mut app = App::new(); - - // resolve platform paths - let persistent_paths = PersistentPaths::resolve(); - - // config of default bevy plugins - app.add_plugins( - DefaultPlugins - .set(WindowPlugin { - primary_window: Some(Window { - title: format!("Vantablock v{}", env!("CARGO_PKG_VERSION")), - resolution: WindowResolution::new(1280, 720), - visible: false, - ..default() - }), - ..default() - }) - .set(AssetPlugin { - file_path: persistent_paths.assets_dir.to_string_lossy().to_string(), - ..default() - }) - .disable::(), - ); - - // red clear color to prevent white screen flash - app.insert_resource(ClearColor(Color::linear_rgb(1.0, 0.0, 0.0))); - - // load config & loading trackers into main world - app.insert_resource(ClientSettings::load_or_create(&persistent_paths)); - app.insert_resource(persistent_paths); - app.insert_resource(LoadingTracker::default()); - - // configure schedule sets - app.configure_sets( - FixedUpdate, - (FixedUpdateSet::PreUpdate, FixedUpdateSet::MainLogic).chain(), - ); - - app.configure_sets(PostUpdate, RenderPrepSet); - - // initialize simulation and renderer - app.add_plugins((shared::SharedPlugins, client::ClientPlugins)); - - app.run(); - info!("App exited safely!"); -} diff --git a/crates/client/src/network/connection/initiate.rs b/crates/client/src/network/connection/initiate.rs new file mode 100644 index 00000000..de76df30 --- /dev/null +++ b/crates/client/src/network/connection/initiate.rs @@ -0,0 +1,75 @@ +use crate::lifecycle::{ClientLifecycleState, InGameState, SessionTopology}; +use crate::network::connection::{ConnectType, InitiateConnection, RequestSingleplayerSession}; +use bevy::prelude::*; +use lightyear::{netcode::Key, prelude::client::*, prelude::*}; +use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4}; + +/// Sets up a basic client. +/// +/// https://cbournhonesque.github.io/lightyear/book/tutorial/build_client_server.html#client +pub fn on_initiate_connection( + trigger: On, + mut commands: Commands, + mut next_client_state: ResMut>, + mut next_in_game_state: ResMut>, + mut next_session_topology: ResMut>, +) { + let event = trigger.event(); + + // handle session topology and singleplayer requests + match event.connect_type { + ConnectType::Singleplayer => { + next_session_topology.set(SessionTopology::Internal); + commands.trigger(RequestSingleplayerSession); + } + ConnectType::Multiplayer => { + next_session_topology.set(SessionTopology::External); + } + } + + let server_addr: SocketAddr = match event.server_addr.parse() { + Ok(addr) => addr, + Err(e) => { + error!( + "Failed to parse server address '{}': {}. Aborting connection.", + event.server_addr, e + ); + return; + } + }; + + let client_addr = SocketAddr::V4(SocketAddrV4::new(Ipv4Addr::UNSPECIFIED, 0)); + + info!("Connecting client to {}", server_addr); + + // netcode auth + let client_id = rand::random::(); + let auth = Authentication::Manual { + server_addr, + client_id, + private_key: Key::default(), + protocol_id: 0, + }; + + // main client ent + let client_entity = commands + .spawn(( + LocalAddr(client_addr), + PeerAddr(server_addr), + Link::new(None), + ReplicationReceiver::default(), + NetcodeClient::new(auth, NetcodeConfig::default()) + .expect("CRITICAL: Failed to create NetcodeClient!"), + UdpIo::default(), + )) + .id(); + + // trigger connection + commands.trigger(Connect { + entity: client_entity, + }); + + // transition to game state + next_client_state.set(ClientLifecycleState::InGame); + next_in_game_state.set(InGameState::Connecting); +} diff --git a/crates/client/src/network/connection/mod.rs b/crates/client/src/network/connection/mod.rs new file mode 100644 index 00000000..a4922013 --- /dev/null +++ b/crates/client/src/network/connection/mod.rs @@ -0,0 +1,22 @@ +mod initiate; +pub mod resources; +mod session; + +pub use resources::*; + +// INFO: --------------------------- +// plugin definition +// --------------------------------- + +use bevy::app::{App, Plugin, Update}; + +pub(crate) struct NetworkConnectionPlugin; + +impl Plugin for NetworkConnectionPlugin { + fn build(&self, app: &mut App) { + app.add_observer(initiate::on_initiate_connection); + + app.add_systems(Update, session::handle_disconnections) + .add_observer(session::handle_connections); + } +} diff --git a/crates/client/src/network/connection/resources.rs b/crates/client/src/network/connection/resources.rs new file mode 100644 index 00000000..cfe22801 --- /dev/null +++ b/crates/client/src/network/connection/resources.rs @@ -0,0 +1,24 @@ +use bevy::prelude::*; + +#[derive(Event, Debug, Clone)] +pub struct NetworkErrorEvent { + pub reason: String, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ConnectType { + Singleplayer, + Multiplayer, +} + +/// An event to initiate a connection to a specific server address. +#[derive(Event, Debug)] +pub struct InitiateConnection { + pub connect_type: ConnectType, + pub server_addr: String, +} + +/// Triggered by the client to request a local singleplayer server. +/// Handled by the runner (orchestrator) to spin up a background server. +#[derive(Event, Debug, Clone)] +pub struct RequestSingleplayerSession; diff --git a/crates/client/src/network/connection/session.rs b/crates/client/src/network/connection/session.rs new file mode 100644 index 00000000..e23fc25c --- /dev/null +++ b/crates/client/src/network/connection/session.rs @@ -0,0 +1,57 @@ +use crate::{ + lifecycle::{ClientLifecycleState, InGameState}, + network::connection::NetworkErrorEvent, +}; +use bevy::prelude::*; +use lightyear::prelude::{Connected, Connecting, Disconnected}; + +pub fn handle_connections( + trigger: On, + mut next_in_game_state: ResMut>, +) { + let server_entity = trigger.entity; + + // lightyear automatically adds message receiver and stuff on connection + // so currently no need to do that here + + info!( + "Client listening for messages from server! (entity {:?})", + server_entity + ); + + // TODO: eventually will enter world loading state here, but for now + // we just enter the raw world and wait for data as we play + next_in_game_state.set(InGameState::Playing); +} + +pub fn handle_disconnections( + // listen for entities that lost their active states + mut removed_connecting: RemovedComponents, + mut removed_connected: RemovedComponents, + // query to see if they were given the Disconnected state + disconnected_query: Query<&Disconnected>, + mut next_client_state: ResMut>, + mut commands: Commands, +) { + // did any entity stop connecting OR stop being connected this frame? + for entity in removed_connecting.read().chain(removed_connected.read()) { + // if the entity still exists and now has the Disconnected component, + // a genuine network failure or drop occurred. + if let Ok(disconnected) = disconnected_query.get(entity) { + let reason_str = disconnected + .reason + .as_deref() + .unwrap_or("Graceful or Unknown"); + + info!( + "Client actively disconnected from server! Showing error screen. (Reason: {})", + reason_str + ); + + next_client_state.set(ClientLifecycleState::Error); + commands.trigger(NetworkErrorEvent { + reason: reason_str.to_string(), + }); + } + } +} diff --git a/crates/client/src/network/graphics/mod.rs b/crates/client/src/network/graphics/mod.rs new file mode 100644 index 00000000..50af755b --- /dev/null +++ b/crates/client/src/network/graphics/mod.rs @@ -0,0 +1,21 @@ +pub mod smoothing; + +// INFO: --------------------------- +// plugin definition +// --------------------------------- + +use bevy::app::{App, Plugin, Update}; + +pub struct NetworkGraphicsPlugin; + +impl Plugin for NetworkGraphicsPlugin { + fn build(&self, app: &mut App) { + app.add_systems( + Update, + ( + smoothing::update_logical_position_smoothing, + smoothing::update_player_look_smoothing, + ), + ); + } +} diff --git a/crates/client/src/network/graphics/smoothing.rs b/crates/client/src/network/graphics/smoothing.rs new file mode 100644 index 00000000..c1233bcc --- /dev/null +++ b/crates/client/src/network/graphics/smoothing.rs @@ -0,0 +1,24 @@ +use bevy::prelude::*; +use shared::player::components::{LogicalPosition, PlayerLook}; + +/// Smoothly interpolates the visual Transform to match the LogicalPosition. +pub fn update_logical_position_smoothing( + time: Res