From 2f6290fa7197ea12e265ea573eac80a05c7060e1 Mon Sep 17 00:00:00 2001 From: Fyor Klein Gunnewiek Date: Sun, 25 May 2025 13:20:36 +0200 Subject: [PATCH 01/10] Bevy Sim 2D --- Cargo.lock | 372 +++++- Cargo.toml | 22 +- deploy/assets/motions/standup_back.json | 1 + deploy/assets/motions/standup_stomach.json | 1 + tools/simulation/Cargo.toml | 12 +- .../simulation/assets/fonts/FiraSans-Bold.ttf | Bin 0 -> 438028 bytes tools/simulation/src/main.rs | 1050 ++++++++--------- yggdrasil/Cargo.toml | 1 + yggdrasil/src/behavior/engine.rs | 24 +- yggdrasil/src/core/config/layout.rs | 6 + yggdrasil/src/core/config/showtime.rs | 2 +- yggdrasil/src/game_controller/mod.rs | 24 +- yggdrasil/src/localization/mod.rs | 8 +- yggdrasil/src/localization/odometry.rs | 1 + .../src/motion/walking_engine/step_context.rs | 6 +- yggdrasil/src/nao/mod.rs | 15 + yggdrasil/src/nao/sim_lola.rs | 176 +++ yggdrasil/src/sensor/orientation.rs | 4 +- 18 files changed, 1153 insertions(+), 572 deletions(-) create mode 100644 deploy/assets/motions/standup_back.json create mode 100644 deploy/assets/motions/standup_stomach.json create mode 100644 tools/simulation/assets/fonts/FiraSans-Bold.ttf create mode 100644 yggdrasil/src/nao/sim_lola.rs diff --git a/Cargo.lock b/Cargo.lock index 141575d6d..0cedec757 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -212,6 +212,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned-vec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + [[package]] name = "allocator-api2" version = "0.2.21" @@ -359,6 +365,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" + [[package]] name = "arboard" version = "3.5.0" @@ -379,6 +391,17 @@ dependencies = [ "x11rb", ] +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "array-init" version = "2.1.0" @@ -972,6 +995,29 @@ dependencies = [ "num-traits", ] +[[package]] +name = "av1-grain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98922d6a4cfbcb08820c69d8eeccc05bb1f29bfa06b4f5b1dbfe9a868bd7608e" +dependencies = [ + "arrayvec", +] + [[package]] name = "axum" version = "0.7.9" @@ -1374,8 +1420,11 @@ dependencies = [ "bevy_ptr", "bevy_reflect", "bevy_render", + "bevy_scene", + "bevy_sprite", "bevy_state", "bevy_tasks", + "bevy_text", "bevy_time", "bevy_transform", "bevy_utils", @@ -1636,6 +1685,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "682c343c354b191fe6669823bce3b0695ee1ae4ac36f582e29c436a72b67cdd5" dependencies = [ "bevy_app", + "bevy_asset", + "bevy_derive", "bevy_ecs", "bevy_platform", "bevy_reflect", @@ -1686,6 +1737,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "456369ca10f8e039aaf273332744674844827854833ee29e28f9e161702f2f55" dependencies = [ "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_derive", "bevy_ecs", "bevy_platform", "bevy_reflect", @@ -1753,6 +1807,7 @@ dependencies = [ "approx", "bevy_a11y", "bevy_app", + "bevy_asset", "bevy_derive", "bevy_ecs", "bevy_input", @@ -1764,12 +1819,14 @@ dependencies = [ "bevy_tasks", "bevy_utils", "bevy_window", + "bytemuck", "cfg-if", "crossbeam-channel", "raw-window-handle", "tracing", "wasm-bindgen", "web-sys", + "wgpu-types 23.0.0", "winit", ] @@ -1853,6 +1910,12 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" +[[package]] +name = "bit_field" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" + [[package]] name = "bitflags" version = "1.3.2" @@ -1869,6 +1932,12 @@ dependencies = [ "serde", ] +[[package]] +name = "bitstream-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" + [[package]] name = "blake3" version = "1.8.2" @@ -1953,6 +2022,12 @@ dependencies = [ "tokio", ] +[[package]] +name = "built" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" + [[package]] name = "bumpalo" version = "3.17.0" @@ -2127,6 +2202,16 @@ dependencies = [ "uuid", ] +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -2516,6 +2601,29 @@ dependencies = [ "bindgen", ] +[[package]] +name = "cosmic-text" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59fd57d82eb4bfe7ffa9b1cec0c05e2fd378155b47f255a67983cb4afe0e80c2" +dependencies = [ + "bitflags 2.9.0", + "fontdb", + "log", + "rangemap", + "rayon", + "rustc-hash 1.1.0", + "rustybuzz", + "self_cell", + "swash", + "sys-locale", + "ttf-parser 0.21.1", + "unicode-bidi", + "unicode-linebreak", + "unicode-script", + "unicode-segmentation", +] + [[package]] name = "cpal" version = "0.15.3" @@ -4507,13 +4615,37 @@ checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a" dependencies = [ "bytemuck", "byteorder-lite", + "color_quant", + "exr", + "gif", + "image-webp", "num-traits", "png", + "qoi", + "ravif", + "rayon", + "rgb", "tiff", "zune-core", "zune-jpeg", ] +[[package]] +name = "image-webp" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b77d01e822461baa8409e156015a1d91735549f0f2c17691bd2d996bef238f7f" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imgref" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" + [[package]] name = "immutable-chunkmap" version = "2.0.6" @@ -4656,6 +4788,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.13.0" @@ -4824,6 +4965,15 @@ dependencies = [ "libc", ] +[[package]] +name = "ktx2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87d65e08a9ec02e409d27a0139eaa6b9756b4d81fe7cde71f6941a83730ce838" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "kv-log-macro" version = "1.0.7" @@ -4839,6 +4989,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +[[package]] +name = "lebe" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" + [[package]] name = "lexical-core" version = "1.0.5" @@ -5040,6 +5196,15 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + [[package]] name = "lstsq" version = "0.6.0" @@ -5101,6 +5266,16 @@ dependencies = [ "rawpointer", ] +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + [[package]] name = "memchr" version = "2.7.4" @@ -5463,6 +5638,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c96aba5aa877601bb3f6dd6a63a969e1f82e60646e81e71b14496995e9853c91" +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + [[package]] name = "nidhogg" version = "0.1.0" @@ -5550,6 +5731,12 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + [[package]] name = "notify" version = "6.1.1" @@ -6160,7 +6347,7 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" dependencies = [ - "ttf-parser", + "ttf-parser 0.25.1", ] [[package]] @@ -6673,6 +6860,21 @@ dependencies = [ "unicase", ] +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + [[package]] name = "quick-xml" version = "0.30.0" @@ -6788,6 +6990,62 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" +[[package]] +name = "rangemap" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" + +[[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools 0.12.1", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand", + "rand_chacha", + "simd_helpers", + "system-deps", + "thiserror 1.0.69", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + [[package]] name = "raw-cpuid" version = "11.5.0" @@ -8617,6 +8875,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "rgb" +version = "0.8.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" + [[package]] name = "ring" version = "0.17.14" @@ -8680,6 +8944,12 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "roxmltree" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" + [[package]] name = "rstar" version = "0.12.2" @@ -9195,6 +9465,16 @@ dependencies = [ "walkdir", ] +[[package]] +name = "skrifa" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1c44ad1f6c5bdd4eefed8326711b7dbda9ea45dfd36068c427d332aa382cbe" +dependencies = [ + "bytemuck", + "read-fonts", +] + [[package]] name = "slab" version = "0.4.9" @@ -9564,12 +9844,31 @@ dependencies = [ "windows 0.52.0", ] +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare", +] + [[package]] name = "tap" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + [[package]] name = "tasks" version = "0.1.0" @@ -10238,7 +10537,7 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "ttf-parser" -version = "0.25.1" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" @@ -10314,6 +10613,24 @@ version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-bidi-mirroring" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cb788ffebc92c5948d0e997106233eeb1d8b9512f93f41651f52b6c5f5af86" + +[[package]] +name = "unicode-ccc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df77b101bcc4ea3d78dafc5ad7e4f58ceffe0b2b16bf446aeb50b6cb4157656" + [[package]] name = "unicode-ident" version = "1.0.18" @@ -10326,6 +10643,18 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" +[[package]] +name = "unicode-properties" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" + +[[package]] +name = "unicode-script" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb421b350c9aff471779e262955939f565ec18b86c15364e6bdf0d662ca7c1f" + [[package]] name = "unicode-segmentation" version = "1.12.0" @@ -10420,6 +10749,17 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "v_frame" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + [[package]] name = "valuable" version = "0.1.1" @@ -10452,6 +10792,12 @@ dependencies = [ "smallvec", ] +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + [[package]] name = "version_check" version = "0.9.5" @@ -11572,6 +11918,12 @@ version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32ac00cd3f8ec9c1d33fb3e7958a82df6989c42d747bd326c822b1d625283547" +[[package]] +name = "yazi" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c94451ac9513335b5e23d7a8a2b61a7102398b8cca5160829d313e84c9d98be1" + [[package]] name = "yggdrasil" version = "0.1.0" @@ -11589,6 +11941,7 @@ dependencies = [ "heimdall", "itertools 0.14.0", "kira", + "libc", "lstsq", "miette", "ml", @@ -11836,6 +12189,12 @@ dependencies = [ "zvariant 4.2.0", ] +[[package]] +name = "zeno" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd15f8e0dbb966fd9245e7498c7e9e5055d9e5c8b676b95bd67091cd11a1e697" + [[package]] name = "zerocopy" version = "0.7.35" @@ -11943,6 +12302,15 @@ version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + [[package]] name = "zune-jpeg" version = "0.4.14" diff --git a/Cargo.toml b/Cargo.toml index d6492f88c..0149fdd3b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace] -members = ["crates/*", "tools/sindri", "tools/yggdrasil_rerun", "yggdrasil"] +members = ["crates/*", "tools/*", "yggdrasil"] resolver = "2" [workspace.package] @@ -65,7 +65,23 @@ apodize = "1.0.0" async-std = "1.13.1" bevy = { version = "0.16.0", default-features = false, features = [ "bevy_state", + "bevy_asset", + "bevy_core_pipeline", + "bevy_pbr", + "bevy_mesh_picking_backend", + "bevy_sprite", + "bevy_window", + "bevy_winit", + "bevy_text", + "bevy_picking", + "android-game-activity", + "png", + "tonemapping_luts", + "webgl2", + "x11", + "wayland", ] } +bevy_egui = { version = "0.33.0"} byteorder = "1.5.0" cargo_toml = "0.22.1" chrono = "0.4.40" @@ -122,7 +138,9 @@ serde_json = "1.0.140" serde_with = "3.14.0" socket2 = "0.5.9" strum = { version = "0.27", features = ["derive"] } -syn = "2.0.100" + +CONFLICT (content): Merge conflict in Cargo.toml +Auto-merging yggdrasil/Cargo.toml0" thiserror = "2.0.12" tokio = "1.46.1" toml = "0.8.19" diff --git a/deploy/assets/motions/standup_back.json b/deploy/assets/motions/standup_back.json new file mode 100644 index 000000000..038462a6f --- /dev/null +++ b/deploy/assets/motions/standup_back.json @@ -0,0 +1 @@ +{"settings":{"interpolation_type":"Linear","exit_routine":"Standing","motion_order":["standup/on_back/ready_to_kick","standup/on_back/kick_up","standup/on_back/half_sit_to_crouch","standup/half_crouch_to_sit","standup/extend_legs"]},"submotions":{"standup/on_back/ready_to_kick":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.2,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.0,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.0,"left_elbow_yaw":0.0,"left_elbow_roll":0.0,"left_wrist_yaw":0.0,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":0.0,"left_knee_pitch":0.0,"left_ankle_pitch":0.0,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":0.0,"right_elbow_yaw":0.0,"right_elbow_roll":0.0,"right_wrist_yaw":0.0,"right_hip_roll":0.0,"right_hip_pitch":0.0,"right_knee_pitch":0.0,"right_ankle_pitch":0.0,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.6},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.0,"left_elbow_yaw":0.0,"left_elbow_roll":0.0,"left_wrist_yaw":0.113558054,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":-0.21940398,"left_knee_pitch":0.829936,"left_ankle_pitch":1.0937839,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":0.0,"right_elbow_yaw":0.0,"right_elbow_roll":0.0,"right_wrist_yaw":-0.113558054,"right_hip_roll":0.0,"right_hip_pitch":-0.21940398,"right_knee_pitch":0.829936,"right_ankle_pitch":1.0937839,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.3},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":2.146755,"left_shoulder_roll":0.0,"left_elbow_yaw":0.0,"left_elbow_roll":0.0,"left_wrist_yaw":0.113558054,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":0.55219793,"left_knee_pitch":1.1198621,"left_ankle_pitch":0.40655208,"left_ankle_roll":0.0,"right_shoulder_pitch":2.146755,"right_shoulder_roll":0.0,"right_elbow_yaw":0.0,"right_elbow_roll":0.0,"right_wrist_yaw":-0.113558054,"right_hip_roll":0.0,"right_hip_pitch":0.55219793,"right_knee_pitch":1.1198621,"right_ankle_pitch":0.40655208,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.3},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":0.55219793,"left_knee_pitch":1.1198621,"left_ankle_pitch":0.40655208,"left_ankle_roll":0.0,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":0.0,"right_hip_pitch":0.55219793,"right_knee_pitch":1.1198621,"right_ankle_pitch":0.40655208,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.3},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":0.0,"left_knee_pitch":1.9198622,"left_ankle_pitch":0.0,"left_ankle_roll":0.0,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":0.0,"right_hip_pitch":0.0,"right_knee_pitch":1.9198622,"right_ankle_pitch":0.0,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.3}]},"standup/half_crouch_to_sit":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.7453293,"left_shoulder_roll":0.36651915,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2617994,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.134464,"left_hip_roll":0.06981317,"left_hip_pitch":-0.55850536,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.012291,"left_ankle_roll":0.17453292,"right_shoulder_pitch":1.8675023,"right_shoulder_roll":-0.34906584,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.15707964,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.2617994,"right_hip_pitch":-0.31415927,"right_knee_pitch":-0.08726646,"right_ankle_pitch":0.9250245,"right_ankle_roll":0.06981317,"left_hand":0.0,"right_hand":0.0},"duration":0.7},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5707964,"left_shoulder_roll":0.36651915,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2617994,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.7592182,"left_hip_roll":0.20943952,"left_hip_pitch":-0.9599311,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.9773844,"left_ankle_roll":0.15707964,"right_shoulder_pitch":1.727876,"right_shoulder_roll":0.0,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.15707964,"right_wrist_yaw":1.5707964,"right_hip_roll":0.23561946,"right_hip_pitch":-0.7679449,"right_knee_pitch":1.6580628,"right_ankle_pitch":-0.27925268,"right_ankle_roll":0.2617994,"left_hand":0.0,"right_hand":0.0},"duration":0.5},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5184364,"left_shoulder_roll":0.33161256,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2443461,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.57595867,"left_hip_roll":-0.12217305,"left_hip_pitch":-1.0471976,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.8552113,"left_ankle_roll":0.1308997,"right_shoulder_pitch":1.4137167,"right_shoulder_roll":-0.19198622,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.13962634,"right_wrist_yaw":1.5707964,"right_hip_roll":0.15707964,"right_hip_pitch":-0.9948377,"right_knee_pitch":2.1118484,"right_ankle_pitch":-0.89011794,"right_ankle_roll":-0.15707964,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5184364,"left_shoulder_roll":0.33161256,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2443461,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.57595867,"left_hip_roll":-0.12217305,"left_hip_pitch":-1.0471976,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.8552113,"left_ankle_roll":0.1308997,"right_shoulder_pitch":1.4137167,"right_shoulder_roll":-0.19198622,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.13962634,"right_wrist_yaw":1.5707964,"right_hip_roll":0.15707964,"right_hip_pitch":-0.9948377,"right_knee_pitch":2.1118484,"right_ankle_pitch":-0.89011794,"right_ankle_roll":-0.15707964,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.43117,"left_shoulder_roll":0.2268928,"left_elbow_yaw":-1.4660766,"left_elbow_roll":-0.20943952,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":0.0,"left_hip_roll":-0.06981317,"left_hip_pitch":-0.9250245,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.1693707,"left_ankle_roll":0.034906585,"right_shoulder_pitch":1.3089969,"right_shoulder_roll":-0.12217305,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.12217305,"right_wrist_yaw":1.5707964,"right_hip_roll":0.10471976,"right_hip_pitch":-0.9075712,"right_knee_pitch":2.1118484,"right_ankle_pitch":-1.1693707,"right_ankle_roll":-0.08726646,"left_hand":0.0,"right_hand":0.0},"duration":0.2},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.43117,"left_shoulder_roll":0.2268928,"left_elbow_yaw":-1.4660766,"left_elbow_roll":-0.20943952,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":0.0,"left_hip_roll":-0.06981317,"left_hip_pitch":-0.9250245,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.1693707,"left_ankle_roll":0.034906585,"right_shoulder_pitch":1.3089969,"right_shoulder_roll":-0.12217305,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.12217305,"right_wrist_yaw":1.5707964,"right_hip_roll":0.10471976,"right_hip_pitch":-0.9075712,"right_knee_pitch":2.1118484,"right_ankle_pitch":-1.1693707,"right_ankle_roll":-0.08726646,"left_hand":0.0,"right_hand":0.0},"duration":0.2}]},"standup/on_back/kick_up":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.3,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":-1.5358897,"left_knee_pitch":-0.08726646,"left_ankle_pitch":0.0,"left_ankle_roll":0.0,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":0.0,"right_hip_pitch":-1.5358897,"right_knee_pitch":-0.08726646,"right_ankle_pitch":0.0,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.8},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":-1.5358897,"left_knee_pitch":-0.08726646,"left_ankle_pitch":0.0,"left_ankle_roll":0.0,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":0.0,"right_hip_pitch":-1.5358897,"right_knee_pitch":-0.08726646,"right_ankle_pitch":0.0,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.2},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.2268928,"left_hip_pitch":-0.27925268,"left_knee_pitch":-0.08726646,"left_ankle_pitch":1.0471976,"left_ankle_roll":0.08726646,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":-0.2268928,"right_hip_pitch":-0.27925268,"right_knee_pitch":-0.08726646,"right_ankle_pitch":1.0471976,"right_ankle_roll":-0.08726646,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":-1.3962634,"left_knee_pitch":-0.08726646,"left_ankle_pitch":0.0,"left_ankle_roll":0.0,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":0.0,"right_hip_pitch":-1.3962634,"right_knee_pitch":-0.08726646,"right_ankle_pitch":0.0,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.7}]},"standup/on_back/half_sit_to_crouch":{"joint_stifness":0.9,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[{"variable":"AngleY","min":-0.6,"max":0.6}],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":2.0943952,"left_shoulder_roll":-0.08726646,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.33161256,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.134464,"left_hip_roll":0.7330383,"left_hip_pitch":-1.3962634,"left_knee_pitch":1.3351768,"left_ankle_pitch":0.8552113,"left_ankle_roll":-0.12217305,"right_shoulder_pitch":2.1118484,"right_shoulder_roll":-0.017453292,"right_elbow_yaw":1.5184364,"right_elbow_roll":-0.38397244,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.567232,"right_hip_pitch":-1.4660766,"right_knee_pitch":1.43117,"right_ankle_pitch":0.82030475,"right_ankle_roll":0.017453292,"left_hand":0.0,"right_hand":0.0},"duration":0.5},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":2.024582,"left_shoulder_roll":-0.13962634,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.27925268,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.134464,"left_hip_roll":0.20943952,"left_hip_pitch":-0.5235988,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.715585,"left_ankle_roll":-0.33161256,"right_shoulder_pitch":2.1118484,"right_shoulder_roll":-0.6981317,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.13962634,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.34906584,"right_hip_pitch":-1.5358897,"right_knee_pitch":0.83775806,"right_ankle_pitch":0.9250245,"right_ankle_roll":-0.017453292,"left_hand":0.0,"right_hand":0.0},"duration":1.1}]},"standup/extend_legs":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.34906584,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.2,"left_elbow_yaw":-1.57,"left_elbow_roll":-0.008,"left_wrist_yaw":0.0,"left_hip_yaw_pitch":0.0138,"left_hip_roll":0.0,"left_hip_pitch":-0.3,"left_knee_pitch":0.93,"left_ankle_pitch":-0.6,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":-0.2,"right_elbow_yaw":1.57,"right_elbow_roll":0.008,"right_wrist_yaw":0.0,"right_hip_roll":0.0,"right_hip_pitch":-0.3,"right_knee_pitch":0.93,"right_ankle_pitch":-0.6,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.34906584,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.2,"left_elbow_yaw":-1.57,"left_elbow_roll":-0.008,"left_wrist_yaw":0.0,"left_hip_yaw_pitch":0.0138,"left_hip_roll":0.0,"left_hip_pitch":-0.3,"left_knee_pitch":0.93,"left_ankle_pitch":-0.6,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":-0.2,"right_elbow_yaw":1.57,"right_elbow_roll":0.008,"right_wrist_yaw":0.0,"right_hip_roll":0.0,"right_hip_pitch":-0.3,"right_knee_pitch":0.93,"right_ankle_pitch":-0.6,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.4}]}}} \ No newline at end of file diff --git a/deploy/assets/motions/standup_stomach.json b/deploy/assets/motions/standup_stomach.json new file mode 100644 index 000000000..3c405f6fc --- /dev/null +++ b/deploy/assets/motions/standup_stomach.json @@ -0,0 +1 @@ +{"settings":{"interpolation_type":"Linear","exit_routine":"Standing","motion_order":["standup/on_stomach/lying_to_yoga","standup/on_stomach/yoga_to_sitting","standup/on_stomach/sitting_to_half_crouch","standup/half_crouch_to_sit","standup/extend_legs"]},"submotions":{"standup/extend_legs":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.34906584,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.2,"left_elbow_yaw":-1.57,"left_elbow_roll":-0.008,"left_wrist_yaw":0.0,"left_hip_yaw_pitch":0.0138,"left_hip_roll":0.0,"left_hip_pitch":-0.3,"left_knee_pitch":0.93,"left_ankle_pitch":-0.6,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":-0.2,"right_elbow_yaw":1.57,"right_elbow_roll":0.008,"right_wrist_yaw":0.0,"right_hip_roll":0.0,"right_hip_pitch":-0.3,"right_knee_pitch":0.93,"right_ankle_pitch":-0.6,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.34906584,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.2,"left_elbow_yaw":-1.57,"left_elbow_roll":-0.008,"left_wrist_yaw":0.0,"left_hip_yaw_pitch":0.0138,"left_hip_roll":0.0,"left_hip_pitch":-0.3,"left_knee_pitch":0.93,"left_ankle_pitch":-0.6,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":-0.2,"right_elbow_yaw":1.57,"right_elbow_roll":0.008,"right_wrist_yaw":0.0,"right_hip_roll":0.0,"right_hip_pitch":-0.3,"right_knee_pitch":0.93,"right_ankle_pitch":-0.6,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.4}]},"standup/on_stomach/yoga_to_sitting":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.5,"left_shoulder_pitch":1.9495327,"left_shoulder_roll":-0.073303826,"left_elbow_yaw":1.5812683,"left_elbow_roll":0.006981317,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.51138145,"left_hip_roll":-0.02443461,"left_hip_pitch":-1.1885692,"left_knee_pitch":-0.012217305,"left_ankle_pitch":-0.3944444,"left_ankle_roll":0.286234,"right_shoulder_pitch":1.9198622,"right_shoulder_roll":0.045378562,"right_elbow_yaw":-1.3421582,"right_elbow_roll":0.15009831,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.040142573,"right_hip_pitch":-1.298525,"right_knee_pitch":0.022689281,"right_ankle_pitch":0.0017453292,"right_ankle_roll":-0.31066862,"left_hand":0.0,"right_hand":0.0},"duration":0.5},{"target_position":{"head_yaw":0.0,"head_pitch":0.5,"left_shoulder_pitch":2.0909045,"left_shoulder_roll":0.13613568,"left_elbow_yaw":-1.2409291,"left_elbow_roll":-0.54803336,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.98262036,"left_hip_roll":0.27576202,"left_hip_pitch":-0.87266463,"left_knee_pitch":-0.12042772,"left_ankle_pitch":0.15358898,"left_ankle_roll":-0.21642083,"right_shoulder_pitch":2.1223204,"right_shoulder_roll":-0.006981317,"right_elbow_yaw":1.5271631,"right_elbow_roll":0.3874631,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.33161256,"right_hip_pitch":-0.85695666,"right_knee_pitch":-0.12042772,"right_ankle_pitch":0.27925268,"right_ankle_roll":-0.082030475,"left_hand":0.0,"right_hand":0.0},"duration":0.693181818}]},"standup/half_crouch_to_sit":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.7453293,"left_shoulder_roll":0.36651915,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2617994,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.134464,"left_hip_roll":0.06981317,"left_hip_pitch":-0.55850536,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.012291,"left_ankle_roll":0.17453292,"right_shoulder_pitch":1.8675023,"right_shoulder_roll":-0.34906584,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.15707964,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.2617994,"right_hip_pitch":-0.31415927,"right_knee_pitch":-0.08726646,"right_ankle_pitch":0.9250245,"right_ankle_roll":0.06981317,"left_hand":0.0,"right_hand":0.0},"duration":0.7},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5707964,"left_shoulder_roll":0.36651915,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2617994,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.7592182,"left_hip_roll":0.20943952,"left_hip_pitch":-0.9599311,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.9773844,"left_ankle_roll":0.15707964,"right_shoulder_pitch":1.727876,"right_shoulder_roll":0.0,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.15707964,"right_wrist_yaw":1.5707964,"right_hip_roll":0.23561946,"right_hip_pitch":-0.7679449,"right_knee_pitch":1.6580628,"right_ankle_pitch":-0.27925268,"right_ankle_roll":0.2617994,"left_hand":0.0,"right_hand":0.0},"duration":0.5},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5184364,"left_shoulder_roll":0.33161256,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2443461,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.57595867,"left_hip_roll":-0.12217305,"left_hip_pitch":-1.0471976,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.8552113,"left_ankle_roll":0.1308997,"right_shoulder_pitch":1.4137167,"right_shoulder_roll":-0.19198622,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.13962634,"right_wrist_yaw":1.5707964,"right_hip_roll":0.15707964,"right_hip_pitch":-0.9948377,"right_knee_pitch":2.1118484,"right_ankle_pitch":-0.89011794,"right_ankle_roll":-0.15707964,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5184364,"left_shoulder_roll":0.33161256,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2443461,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.57595867,"left_hip_roll":-0.12217305,"left_hip_pitch":-1.0471976,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.8552113,"left_ankle_roll":0.1308997,"right_shoulder_pitch":1.4137167,"right_shoulder_roll":-0.19198622,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.13962634,"right_wrist_yaw":1.5707964,"right_hip_roll":0.15707964,"right_hip_pitch":-0.9948377,"right_knee_pitch":2.1118484,"right_ankle_pitch":-0.89011794,"right_ankle_roll":-0.15707964,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.43117,"left_shoulder_roll":0.2268928,"left_elbow_yaw":-1.4660766,"left_elbow_roll":-0.20943952,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":0.0,"left_hip_roll":-0.06981317,"left_hip_pitch":-0.9250245,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.1693707,"left_ankle_roll":0.034906585,"right_shoulder_pitch":1.3089969,"right_shoulder_roll":-0.12217305,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.12217305,"right_wrist_yaw":1.5707964,"right_hip_roll":0.10471976,"right_hip_pitch":-0.9075712,"right_knee_pitch":2.1118484,"right_ankle_pitch":-1.1693707,"right_ankle_roll":-0.08726646,"left_hand":0.0,"right_hand":0.0},"duration":0.2},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.43117,"left_shoulder_roll":0.2268928,"left_elbow_yaw":-1.4660766,"left_elbow_roll":-0.20943952,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":0.0,"left_hip_roll":-0.06981317,"left_hip_pitch":-0.9250245,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.1693707,"left_ankle_roll":0.034906585,"right_shoulder_pitch":1.3089969,"right_shoulder_roll":-0.12217305,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.12217305,"right_wrist_yaw":1.5707964,"right_hip_roll":0.10471976,"right_hip_pitch":-0.9075712,"right_knee_pitch":2.1118484,"right_ankle_pitch":-1.1693707,"right_ankle_roll":-0.08726646,"left_hand":0.0,"right_hand":0.0},"duration":0.2}]},"standup/on_stomach/sitting_to_half_crouch":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.7,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.6,"head_pitch":0.5,"left_shoulder_pitch":2.0926497,"left_shoulder_roll":-0.0837758,"left_elbow_yaw":-1.4887658,"left_elbow_roll":-0.32463124,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.134464,"left_hip_roll":0.7278023,"left_hip_pitch":-1.399754,"left_knee_pitch":1.3351768,"left_ankle_pitch":0.86044735,"left_ankle_roll":-0.12566371,"right_shoulder_pitch":2.1223204,"right_shoulder_roll":-0.015707964,"right_elbow_yaw":1.5254178,"right_elbow_roll":0.39095375,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.567232,"right_hip_pitch":-1.4660766,"right_knee_pitch":1.4276793,"right_ankle_pitch":0.8220501,"right_ankle_roll":0.019198623,"left_hand":0.0,"right_hand":0.0},"duration":0.693181818},{"target_position":{"head_yaw":0.0,"head_pitch":0.5,"left_shoulder_pitch":2.0210912,"left_shoulder_roll":-0.13264503,"left_elbow_yaw":-1.4765486,"left_elbow_roll":-0.27750736,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.2025318,"left_hip_roll":0.20420352,"left_hip_pitch":-0.51836276,"left_knee_pitch":2.1746802,"left_ankle_pitch":-0.71383965,"left_ankle_roll":-0.3298672,"right_shoulder_pitch":2.1066124,"right_shoulder_roll":-0.6928957,"right_elbow_yaw":1.7348573,"right_elbow_roll":0.143117,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.35430184,"right_hip_pitch":-1.5603243,"right_knee_pitch":0.8412487,"right_ankle_pitch":0.9180432,"right_ankle_roll":-0.017453292,"left_hand":0.0,"right_hand":0.0},"duration":0.9}]},"standup/on_stomach/lying_to_yoga":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":-0.672,"left_shoulder_pitch":-0.017453292,"left_shoulder_roll":1.1519173,"left_elbow_yaw":-1.5184364,"left_elbow_roll":-0.029670598,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":0.0,"left_knee_pitch":0.0,"left_ankle_pitch":1.0471976,"left_ankle_roll":0.0,"right_shoulder_pitch":0.017453292,"right_shoulder_roll":-1.1519173,"right_elbow_yaw":1.5184364,"right_elbow_roll":0.029670598,"right_wrist_yaw":1.5707964,"right_hip_roll":0.0,"right_hip_pitch":0.0,"right_knee_pitch":0.0,"right_ankle_pitch":1.0471976,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.6},{"target_position":{"head_yaw":0.0,"head_pitch":-0.672,"left_shoulder_pitch":1.881465,"left_shoulder_roll":1.298525,"left_elbow_yaw":-0.6230825,"left_elbow_roll":-1.399754,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.1833333,"left_hip_roll":0.68416905,"left_hip_pitch":0.4886922,"left_knee_pitch":-0.11868239,"left_ankle_pitch":-0.19896753,"left_ankle_roll":0.6143559,"right_shoulder_pitch":1.7208947,"right_shoulder_roll":-1.2863077,"right_elbow_yaw":0.08901179,"right_elbow_roll":1.2810717,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.75398225,"right_hip_pitch":0.4956735,"right_knee_pitch":-0.101229094,"right_ankle_pitch":-0.15707964,"right_ankle_roll":-0.62482786,"left_hand":0.0,"right_hand":0.0},"duration":0.45},{"target_position":{"head_yaw":0.0,"head_pitch":0.0,"left_shoulder_pitch":2.0385447,"left_shoulder_roll":-0.006981317,"left_elbow_yaw":1.9373155,"left_elbow_roll":-1.5568337,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.1920599,"left_hip_roll":0.72431165,"left_hip_pitch":-1.5376351,"left_knee_pitch":-0.06632251,"left_ankle_pitch":0.19373155,"left_ankle_roll":0.56548667,"right_shoulder_pitch":2.1101031,"right_shoulder_roll":0.34906584,"right_elbow_yaw":-1.3194689,"right_elbow_roll":1.558579,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.8045968,"right_hip_pitch":0.45204028,"right_knee_pitch":-0.082030475,"right_ankle_pitch":0.2984513,"right_ankle_roll":-0.5427974,"left_hand":0.0,"right_hand":0.0},"duration":0.272727272},{"target_position":{"head_yaw":0.0,"head_pitch":-0.672,"left_shoulder_pitch":2.0699606,"left_shoulder_roll":-0.006981317,"left_elbow_yaw":1.9477874,"left_elbow_roll":-1.558579,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.2025318,"left_hip_roll":0.699877,"left_hip_pitch":-1.5917403,"left_knee_pitch":-0.11519173,"left_ankle_pitch":0.19024089,"left_ankle_roll":0.56897736,"right_shoulder_pitch":2.1170843,"right_shoulder_roll":0.34906584,"right_elbow_yaw":-1.3159783,"right_elbow_roll":1.558579,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.68416905,"right_hip_pitch":-1.6126842,"right_knee_pitch":2.1275563,"right_ankle_pitch":0.23736478,"right_ankle_roll":-0.5375614,"left_hand":0.0,"right_hand":0.0},"duration":0.272727},{"target_position":{"head_yaw":0.0,"head_pitch":0.0,"left_shoulder_pitch":2.0804324,"left_shoulder_roll":-0.006981317,"left_elbow_yaw":1.9512781,"left_elbow_roll":-1.558579,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.2095132,"left_hip_roll":0.7347836,"left_hip_pitch":-1.5934856,"left_knee_pitch":-0.12217305,"left_ankle_pitch":0.20769419,"left_ankle_roll":0.567232,"right_shoulder_pitch":2.0909045,"right_shoulder_roll":0.34906584,"right_elbow_yaw":-1.3159783,"right_elbow_roll":1.5550884,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.7923795,"right_hip_pitch":-1.6109389,"right_knee_pitch":-0.12217305,"right_ankle_pitch":0.2565634,"right_ankle_roll":-0.40317106,"left_hand":0.0,"right_hand":0.0},"duration":0.554545455}]}}} \ No newline at end of file diff --git a/tools/simulation/Cargo.toml b/tools/simulation/Cargo.toml index 30cd71acd..1807970c2 100644 --- a/tools/simulation/Cargo.toml +++ b/tools/simulation/Cargo.toml @@ -15,8 +15,12 @@ workspace = true bifrost = { workspace = true } yggdrasil = { workspace = true } -eframe = "0.28.1" -egui = "0.28.1" -egui_extras = { version = "0.28.1", features = ["default", "image"] } -env_logger = "0.11.5" +bevy = { workspace = true } +bevy_egui = { workspace = true } nalgebra = { workspace = true } + +ml = { workspace = true } +tasks = { workspace = true } + +nidhogg = { workspace = true } +serde = { workspace = true } diff --git a/tools/simulation/assets/fonts/FiraSans-Bold.ttf b/tools/simulation/assets/fonts/FiraSans-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..95e16602406c4cba92fb24e6aea2560bf10a0f5e GIT binary patch literal 438028 zcmeFa4R};n)i%8Mnct+8LVhNb$t0wdQW`=CA%qYDgp^W5M5IV5B2tPJDMdu2v?5Z9 z6p>OyL_|s{MM@D7v0_E!L8OR?lm`(hQl!{YM2Zv<5i9fE>)z+=GYRRR`d*Lk`#m$) zUUSdA*IIk+-*aYWpEF7;rLrJ`s<_YX@4F4}vR4LNj+Xj8` z_VNoOUsK9?R_V?sZoB=%^>+@Pv03S=rAqam^TFFYR@`;uNLQsFDu(^2yYIVe(yw1! zTZZ>DmHJS>yQfYmzV4CUzfs{Qk0SrT*h%-?_e#!h&#CaLjY?hfwR`UR^d#^tkbe-b z(R(I5F!ocGKg?75z-|@H96#>kcZ~@>eqxsjy;O<(s&OE~PUidZegfXN8F$~5X&?XQ z^EcuBLZxm_PWa^Acg5z^4p-sudb}^b@2+W+u33KVpH#TxUg#H3yz9P?fAZcxzlir| zlnQs7^vO?8IsduNTUEHKol^IHYtrP8PkP@c`Zy}Qp&#^rh?Y^R8In>Xm7}gzLFcg2 z&Wp}b0`S-g+7H0y!Hmx-Cu2s&4B*eh-hutYz_T+R0iK&N7x;@AUj&|)F%S4l z84G|P%XkdF7G`_}cyY#8!7s`98t~GLrNCd$_&V^ijAg*z$oK~E@{Hxck7uj^egg4n z#P=lRs*F`&p2~O%cr_w+5b+wwr!$@gvo>QbN_i$@9hh&SCK@%_0QsGajbOf;@m=8W zWqcoUbH-*cKR`V->iJ{HZ5i9ZY|q#Z{F98I0Po1y0sK?6f|K!j#-AZCWc&rp#f-lK zU&^=y{I^U;Ihmo%3`jiC3(^mnx-xh`1^e_JFhnKpeqizhReI0lkKe0$PPl8zL^TNG z8IM$ougz6bm83CRU8f3F`!vSEs4G&Xs!nD0?)&~?HL&;aTZ`3*TY3*ER^x9O3_0!n zy@wa8IUo4ofMT_H&;aPH8vMZz6swIxL}%NO!C)||SYkl6RIOA8_gzqBsbW>;z6+^r zb-n87z6+}y)mmYO(JrEL)eWkX`!1?ts*S2}-({#gb))L+zROf`)mC8^(C!+QuWnLZ z+;`1XLbX#>?z?MMfx20BRn>P-`t&3{m~t59NXjvk<0&UmPNkeqIg4^GB|?_TE!%xunuk$=gOr-DR>b4iPr7kZ>3TAe@(zx((|#hm6y0Y0XTIDP6P5yxuv+ync3%3S&Xl+lQ$ziqJd8sBi$UyV@Ck*9gP^ z3`e6qtjEAP3jMLSCqO4f7c=R3=*DL=Q8p7_tZ|YLjGa;kla^Oe^Y(&{!Hqy z%1@m`d;Cv6GEL!#SfL&Y@tsS(f!D*r3)A#N^!-P}cRnv3Qg5IYq)pzS6oght*ZDt% z8*mLf zS@|9xXp8iAc#qcqq%eZ@ty2N$;B$=)ta1)`4jB9oz}}6 zsf~i6`x1H{zK~x8Z5au#L3<0{XUcoe;=R3Mg-a{TvrV}(g0qpHQJR!^LKsHll_+bf zVK6dTXPLb+iyK7*YokdIVuME}*I%i(l$e8aOFpDDgQP4$w9fHaFZbe-u2BL|k z#dJniIJcclZ<&ZQy?*p{#g$==a=_PsZ*4lI6*NHvNUPWFr$@lV@!y^n@jsBP`y>Hsij8n`hmxmYcVd^05=k=Rk zD~?c4@oisGs<+~^EO*YE*_G+eFmvXCvoODoTrH$$IhsuoD4+e~k2|gjGFPScJH7b$ zZZ8;b7R~^EL*{eC`7il+Zie>|wcS<_oIVoXwu1g_VcWTVXI2jSOShKu4)47|jMZ{p zo_Y0pu_4>&ot<~SXV)6%3-Uk@rj2UDy&LJzCwf7QXe*vwG>*%gk$wcM)z!5(?faUH zKF=51+J=Kw-dzoSUtZ}}>0N+^)^Ba#m3EbeZLy|3rLks2+8&e~H`hJVU*)?2fe5T^ zgN(O)^Dgym4G<5Gsu=s`h{Yr9TRMN&8D11-2ES{wf0H8S`ma()dB)*+^v|nMbJTVp zj(aDNuqps!?USPxwu+lgc3Mo4*X#OTC%0;HUAuR*)XDzOta%|xDe zjMry!6I(MZ6l{#*U?cVY%LC1o_P4wmT4y>&)kQn~Bi+aL1VE&40ys`4ws>pVFFq zNL{dM?ZfINtEH@jhq>a&7?mT4f8@xdhODu&R!U3A8Jw)I?xzY;`nocnHD{_TAJt9cw9O-B7z(V1Gvw}x-kPJTTbp5^|lvA(Un z^u6i-w;2WLeZ}5-8{NjGHL%U}KkLAc{cL1y#t3rfnXC!!`IF6efxl{@EoFr`qbh(7 zqbBZ3*VrQcz2DA;mG^JeC+T+o5!m^DP`-J8q340I_{FdaksnKKzzX+k)EwUgp=C1h z?cH@?WH#da2eb~3{>YW}`Y67IKZ4f6Q9N}JIR~IqiTvN;y?j@HIQ3(E1N0WH{@&_u zdhxy4q-!&xcUT!j-}I)@=KJ4)lhs;!)jMYK+XB(yv(Ygxy;OQ|tsC?2{k@6p-Pyg9 z?mOi-S<1VZ4Ps|!Wutj*`84OLBjyc`vrVplX{v-6Q%$#bqp}*?z1@2`8)zzD#`@K~ zoDmo{{d*fi2)l>D}W{%&Z2qYXbfnJ60N z;q#N1x#<3boIC5({(Jy{u=YJt!3KKJ#+PZxwV&1 z$>!mda-TIR*}`fZDH4^`{J@z+sh^2h!xJPKwhbh%kr$vD|)rb zb+Vz>yM5=D<+Vv8v&QSZx8|m|m6$XYk&Hw0@MeWqKaX$t>PFI#{HNd1oAd23&#T(J zumJm9umcc#7PcUE`3?=|l}Lkd9Fa4peHax**mK2iL+l9or%QjghN(Y@CR+I&RxO6tTTZ)`I*Zv}C`kHP5UZ{>KEPvYn-Vx|Ayx) zHv69deVecu)CBhql+*(KaSm#Bhed}l){t)rE~b8e)p|z7^m9IFc`K{@ z7IoE{DjuK#UQ8SM^WQ;(-)g7FA$EArwv{U2!M0}sb zlKBgU>j@;rcnOb718%-luTcxxi1j{FK|&YUzz8QvXQD-s3r0S{Xr`V(sGEP2>l|fN23+w>SDdM*3S`7@GtYh{JLs(oN@k1 zIpzojBqi}3`oulDV3e8P1^HW_H}-ws?+uw*f>NaC&3PrqfOz>=e7hd$RmL&PN&7_i zPx{tR#%2EDs)!`6FKUOYk1AD-s>Au)0Pfevb!*tQ|6ZiC@~C(`yzRv@{N8;Ne9I16 z{Dy#MjtWV?^J(_;%Wp5T*2{Wi_OD1oz0E`R6nGDQZ|VI8<&k(bXCSf)iC6Z78EtH} zG(`jdh4V+OB}XxO+~0$7{;T-u-YX(~6*gRxYq6&;vqMHPK4~ zMgzWePD8z>-lf;49ctA5Y9;ij>=Bbswq{?1eD=j&GiY+Of@SZ5_0FMWEjQ!9Kk9jB zT+(jl9H9UfC(wp6_npU^$@u$S@$ck#pAFw~#v^@s19!#XI}MDxB3$t(*9~3$Xrc`; z4*7}KRlWwFKiwVZWZas&v3v7L))*6=nTej3oEOOI;4GgbalSnBL;~{!*D`S2bDt;> z*IoP$N_2IQ!g!y0rG3&hnwlY2S3X~$hUO^DR`&ZX-AN9uH{HFnq+;E^}}0bPkQG||T% zbFo7CJQJs1%x=bl)e)tjG)QL|cNUykbmjoA@+=Wwc*>ptnWKNhI5o%if2L(5x_5ds z{h8#QtR$bc;Bhw#wc5xyTcDouy`LQY%z1-+a*$)QjAp5k?4gzYwX!c(81t>LjAmTh z{&k*Foe!UH!z*4D_E=m_UB-3ZDzzf@BK9!KH-sCoiu?grTRTfH%Sbw2|K~v%ee5}U zGv7nX2*jGSlxI|bK6fD#=V{Gg%~2sGH?AULn&DbhTrq6Cr)jVh z)?0t=_|oQBdz$HG>Tac49#J}L4AOX{Nk~({9d}<(0!uoB_tTMPA>qylSqs3O$LnIe z;{E|yxZ^?AN~ASN>s2so8(uddJ%=QCC-knQ`Pt*z?Z=HVa0PbOA-v*>*Q}#RXrnBQ zqpTS4c<4!dr;yHqOR8XY82AE`=(R?|(Fif>tjkKv!7-~$1+sCiQ&y#$Ujsf2T<0c? z8L3ki?j@0p*2-Q2jIy$^er4gzJv)w6gwzJ91gRXU3aJ*U9y)`W{P)Aa_d^3JUDPwH ze^wvn4$2wQnr+7*_>uwns~S%h_qTurRb)$1D@;G)5?Vebl!jE!;iM#jdw zXi{vdi>AkBxoB=|fr}Q$R-)Wxu{GJlV(VRQQ|vhxZL{3Y*dCYLA3JmvIvP9Sa;IWv zU34Mlu3UM_Foh*~;k;%Bry)N#D=%(xvy*x5YL?d~uf(+|&#Q7#ZC<^L`sEFD(U3fM zHOm{4H_C9iSMnyHOss7{lMTw7CY(I8Tjb5on;|G~ULMvkq9u9DU9>81t&29~xvNy( zmb~pQw<~Y2iw@)+cG0oCS6p;D@0^P+=Dlf9+=)kB)I9Fa-`HGfdwJ$_?#}6W zaU3&QdL~}#wM)DrUTrL5O^p)U`+2q=@t*NMu7&M$zo+B<;84~@I?GS+0D$49$f z_FL3MPsjW|KM)^hEb=UhPmDiUSQ5uvPeU`~^W$^CEb?m z@pZ1A9obmT&bTvlXB=~1=Bhv6a*HKbp1H-6E6-R>e6x%C#@&@6z9YWdWllig2lKj^B?efcvMSf*|jf?8?`?_dA{$Ljk%O7b_c3r-^M&ysrpXBCF z&7W>i%(i&`to*rd?gHy&asD!wTbaMcMeFl7xwa$opL4lw`8!>-Cx5>|d0X2DR9kh+E{Y8$Oq4lVEQYmL$p( zwUAgvfUttNsGmVOyAlIk&qET!T{J2&wh1($F&7)0m~1$pX$EE2CAhj^Z1+seb}i;5 zmLwJm&To-eg>siC)+WH2+^n3$27_{sB-}M8u_du9!Br=**Q;e3I*>T*dOntT#YLwR z=UjBryrP^p3mlj8kqxN{olh^u$J;H2r9 zf-_#57Mw4*WODscQgFo^C4TQ`Z%YP^Ue;)@w1W9weA3gV_x(OkW+q!0i)1XBG^nZG z&!3uXZE}6&w|#b9vYp9I*xrv#@?!Q;vMgCsSdy$nvdHhPWStkiKXx0&Y@+wavp+BM zFC_b#8JZkm=aE0(nt8pIXqFu8)^}LaU6B%_l4IPuaaIV2txPt2BB!d!rlT$51 zY4S{)3#XIQ4d>7Of<$tb;rzZ#&h>gVt^Mo_$lH)yU@Vf0lgnJRGP%Y@>yw)d%CTcN zYhv;_!};SXxh=WVaDGcB_ayhbUJfOX8kDyydBUK?#pEeBcR=#2LH@W(UPxXxT%jrq zn_h@rC~Rgpf88j|DvY~&MTKn)@+0v3Qt8xCd>NusRh0cH+fcrrauMY~O8IR}rwS>* zKv_rmRm!O%ul$4fcFG}?cThe~*_LvtNVSl1A{qG&Q>R8a*^nX149Y6XHk2Q7a3{-D z6=fUB8z~DZzd-q6%6mj!IZ51~@(#+IC_hVYUw3^ppd3JXkH{;3BkoTbr@Vu* zE#>2sLq)2moodL9PA5vizaahv`J==~iGNT0d*bQD(}`CSuO@z)_y?{OZ_f}v!`vgp zM+9GaL-$7f&r0iQd=~~eGKG7*>XA}YCr_}GCs_AmZa?A=5Pv{_1pEic$S*b8!8coA z+L0+CE+OXF&}=>R74kQeZy(qS{q8KWJDFVO?xi&4#;FqzJPyt0$v;m`Krk7^1BeF@ zR}*(7?nc}BWWGq|PU3@nd^zaMf@$| z8;EZp?n2y(_%`C78A;}5;x8LX<{9F(#0Q8E5X-OWS|24YAjbF9U^tu9IpGy&nWB|i zL}szHn0i9mR&Ai|_i6Qg;xghg;``bD_Y?n!{Evt^XZ1kh)#O(b_a^R5yqkD8@e<-C z#IF&*CRqJ7uo2NtATxovb%NDD0#}p{JS(LKHggu>+f-O7 zS;w=)eW*`5)$Cyuk+Ge(lp%ncAfMf{Z1SG`I9`0^c*%a`_A2Z?2eveu6nNd~`> zg5j}4b4}KtBl9`tE+Ae&%%hK9Dp;KtUU8jQeHEt+szuk zLFk*=BW6AP3O&bIN{qNIHQQ3>Ve$`?&!o>MoG-(}Wb%{A%kOJi7ZJ}To=ZH6coeaj zU&{rnE8<_B3v__h9F{eQ{7Zomn2)`L3G^mo>YGEI9QwhpIj|Z}ypH@j;%ee*Voh1Z z_*aR(Q^pbXHR06{=wY;;20WKN^)fYi#L;=Q&8D|(;uaix)7gf9r2L)aste3*=llWj z+)SOels8i6W#S-nL&P)4AEWIt+Fr|2@EZ<1l(An*Boe0$<1t6ZXNh?pqIm>YuhGM6 z^zcpEev|my#NQ^apzKSgFL9JOO#Be>L&V=?3~R`&AyY!8g!q2)_Y-GPu4e9P;`PMq zi8Cp0A#)4y&xwCd?9k64%Ag$mu`-BEl8Fa&L2ZdKJ5HBSD zvb2L*EG?#%)9Tao^J!w9mFbqmJS*1kC%%F50ct)#oJF~q%wpn+#1n}(5pNQVqw4$7 zVz-jHl}w8A#lSR#4tgxq)SEApSA&kBPG>>&Vm*?<3wP z7#>lh2VxJ5@_)(B-Jo;~d9j{Is8m{{CVT?iuFnIW6i-I!E265D35iD zCBPq7fxM}BFJ+xXelcFpAmL0Sb_ogRba_D}9O3d>AjP25mdSr#3O^yTeXO6$4U7$k-4LWvv9T^UAvP^GnR+u~vt4dpY@v&m#Fo2gRcx(` zHpHHF5xm5ABcNH+Np_O@s2Byr|2K%4_a& zIeEo-3Bh@7^D6R6iK_GZ;C)Y1kG%fm2IY;&8wz%G-nhJpuI-?_DF($R1XsTk7iBdgQI}>IR>y-CWzwdF%2vy0)A1wz_DC*M51s^AN8*^A6@6anbI) z;|8U*y=|+!lX>T%eFinMEuMEN9t3v<>0~_9;w!!J7hhu|SZ^cP zWFvUaMzGCBu+v7c$420z{qdvmLyYP~{A~Ob(S>{!zbq&}oS&87j3}PpCZFRyza+mZ zzg)Pqv0+C^erk zdNUDCID!(*6Ny9)QE{R)(YBGEwUAL~W=a~Gkf?BH#e_t)L5ZG;{)s;DJ18+UF*-2< zXk21qVv4kV;=#ns#Qek@phbzLiPeb}K=5LHV(}0?rOZU{PXs!7!7H=v~`_k={B~FvcsbV7yma!6dJ=f~j6< z1=GFK3TD~T=GxLMiq#h^aAR3qu*^j(3)Z-3eZeM!p!b~1Z7bO6qCExsU3946sEbY% zaK@lUXA3U4+~uS)C>c(2?iBA!W_e{K<4MjUaBY(1$r8L)C2NzIFY-+GOAd6=kR)c0 zJo7FkN4ebCB<7JklasxAB&Q`YqsYxpVm1*iOfGTJ@+9V#JPZ6tPbAki=Ffd(v`e zEIMz|C5x^YRIsNgXi=s`EiCd@sXawW%eA(soke99xvLaB*I2I3prXFsOfKqMB#-i~SO|odJ zMbj;sWzk%V7Fe{{Lw3DNTMvqsncQTXqLuE7)TU^SMe8lvWYKdTDm>$%qHPxKbWy*e zJ+9||Mf+Vex#*BZM?K_?$>ijs6CPJ|%A&I#^2Q|e+|@QY*&FvjTRpv^%N}Z_EDC$b zn=|RFUaMwq?($Yy7R4Xp;u2qReH)cW zKyEBRZY)4{cOdX!We&V7tB57QwMLt#%nMcDU7E*Wy5{ z!v^JTZgtG%UTJmOMex$<9K2mLo`ual(dtc;TkI4^uR_g>6X0@W#Vjs%bK4e|x~QVK z+C@E!`xw+zq&Z8A`7%eJ1I`bK7D74*)hVsB3JLS(0!=? zKH8eSAFYYaZ!Tuf$pGpMA|ECW6XTnA#BcVWaPNxwwOYN&+~(9w-*aMijF{ix)=GK>LZF5W`^({O6Z}RlZFLK+-bbs>WZ3TxesO^xGa5~AmIPKJh7#@)nUcaU8~R1c z<0749l*=g}qx>r6Jdv6s(=osJ?_=b@Vp;P<>R&Sk)(*d@NmP%Kd5kfz<()5+nMI}> zb!L;9OQsi@d1QjbL5_hSnQO>gL*^PX&y#tc40m2RKO^%qGC!jZe(ypgTgYr7vz^R# zGTVjGUuPW$QQjdk(2_EnGECV_q-G22FNz0uugF4r%cSgYFiUAh%=zUsV=4SC*kK)Y ziaH#b&aKo838TI$y@Sy!dwc#yeu_x_H|m?&!TmqZeCD2+RB>?vx`G1;EA<{Wf>PMvR4a?g_U6!o7Z6Bnu1NRK#uDMzx8;*<$8 zZxTDi=R|7ma@6IV(dDvh!rf;Ob5`UaNBokC`>f_j;r&90I*^tOmHeP>Yx8M9BL9X)iEQq-Sl z`zMxIM&_bus*7aUQ~CkwKfv6-Qva{aP1{SO%`E1=9W_sOp6Gm$?k)neyD3gTTwQVG zk~*R&=sc_C*K@OTX#nvD^&Q}UAX2wsiQM;vU)v?-6J$;h|Aij@!j|bz|NV)*JpfWl zmgwj#@`I=|jm$L0VD@WqH<#J7g#Amhi|NnQ@%Ca#%bR^%HGx}^dztbFl;5O0O1Vv> zZWH(cWC3Lx?h4DNj61KBm+_O&y*eM}Sh|U}uTd_d{5j>fMCvTsMkxD`2{QL5l;5E| zNx563E@QbjQkK!`2Flh_y4o!zs&&-=1f?lGmv{hW2g=3b0lg`5v3O8lq?}7X^8(`M zi&6{d;3{_ASFCi1wm+r(F6Alm<&5D*%0XmWPtH_qMEF}s7xsdy_&w&l%Yac|)1Xrp8 z?OOx4aP_dlmf#EvF*@yINEksS*fmpvBW?-KUrHpuKX|l6$sjjjjh8x=30`| zMp^A~##b@|ua!tONOeekk+4go{a~bFNF$*$n#q5U|50y025CGJc9XQ9iZmT*7SdcK z@wEVHG2(iV$!Wg~?^hzNL0XT5v%8Xs!HklUlJb(O`iu1!iE1sXx2PY{Ko1nJ25Q7Hx1Hn?m6cYysK)bGT4zyTLE6OkUw*a||Em~&LN}@H$U2oAQiwyT1a<`Ea zw3BEL(0vKC_x>`D+beK$T8qf?P;bvPj&!UAEE$Oh_ zwZ*7&(OQd)Kk>4G+_ScfhMu=ri|rQevdDPZ3-1TW9qw?f!z(uTG|@TaqI^g}Z)%=aI|SDD!Q7?htICfm$QAvs@WDKUYwt z@EOJ;?%8P6+^;jBvMphLw63g2_uY`Jn z$}Ot0$j^lpbm|*e^b<}-N%_D=7Feaqhm#wHqtz=GZLrAapaJc%>3Zc8$|r+sXuFDf z(>y)zXbL^7bLI1pW|uE?(GqgY$@#hP;OhCDi;yE|EiDkGtM@F>7M8o+a=U=AjzJ#4 zYJ*V$Wc_t)U4FP@yYgewF6D>IUlCM(y8K-E#qu`|*U9m6J4G#O-YLh;O<1njL%zRG zZJXdqh3iytb-5Bjr)uA#Q%^4{LB^sXXDmFfQy&kdMbO{#*J+T4+*}#YF=-8Y8S3SB z>SNIeL7hgU)%J^Cr*TLV1(o#ynj%Qf|2jQr(M*fxbeiwxF0vfg-A*fDv06BPR?y!% za()j2b=v50oi=yc3Jc+O2-j&h-kF{TSHjWWX&?B5*5Zgo$7yjAxo3#Z!`6%l*!o^N zVV#A}mHLYnL5t8zS8**Y7ZX&G^eie`1GN*b9ZISwV{Ro-T}9uD8X0vJ1IP^q8YZX& zEnG2@+!&zoM3aD~5={r1MKl*^0nuWhWkf51j6WZ(0k>XqOUG1fs(8+#Z5HjcXpf-s z4bW@E(RRPpJ7m#Oi%wW{s^YBcr4dIj7b-5BSURiDVHY*?Y&&OJ6t}2I5TmlucWz^I zODrn4s7g?W;q@0ga~$|cBIsQ2>G`eExu3^%9w?~u5G2^U@r^QE=dp(CJOR0r$qAZf z(F{T5SYJBNwrC!67kV6HSwe2PNTOB9T}!k92xHKV-so)sx1G6y;2p9dx0l?326~6d z9c#e7B3uQ=Q0LQv+UEeBqn`E0=-;e#I$x}e)?ch_F1eM^t4s(=%Pod2_0qVu&@1)y zDl5cGXQ{dISB>1B^w$TdzvRk{uN*{fsMQ+*ZZy3}?l|U71e(IA9t4_6B-|XL`9O;V zRm`niTDd|jh*n#)&Z3RykujP1FvkOpvU4T`C)LU23de9Z+B93K~E(7-$&L zNT4x-+M@Ka(A&ZV$biyLv_LOjyBVc=$xfg&g3+k{J$kftu6^N=zNp4jbsaZq4 zwA?J@#wE9G9K5i!sv>YDNNr@CR#hRDldBbusJ^Nn&_KMWUeyqw;Vf;GMZ%3GHvwoe z(X^@=RkJ;0R`e?2=6PJzLW`DIwA@2!7OR@zjOVrKWmIkO^s1hqxwP)9gu7dgy^#>Zn+@V0DyN>HRLRPb`Q@TFbbt3hQ#Y}L% ztwD3Z&9|Nx(ce<5w*qK2xphDrska$ut8ns7N7vn5_jTRT^&rp@<{k$+)AfAUlU*+X zT@g;sk*b3hWqQc;LUju-*GIlZ6~>i0?hC4piLK97qy4JQ*p=LNl3QJtZeeVzE5V~R zjcs)u_4=mkRS#&$RS))Z)6g(@8R>aRiwf-k&qdYat0z@YbzApAAvq>Po-Yuqx{S8sCBbJlj7MLR9pW6^#h@$5%>$mSlkXj1hFTMt3T z!s8Cv+@ltqvWT9m&!YWM3)jm9>-n;Wx+#mog1R+B%CZ)Ie6;8mM=sVUbM9?gQqG#I zr(26t)?XWoN{BEv%qrEb9A2u#Le8Jf*^;1cwI0{4UXXm|?AFiYIxl%ER5B2HNEqXg zo!=DHZ3t#F#v9OZB$SQPrvZ(%Xo4U)r|CA?a?rR+Zw9%wo^7|;@Vr2{Zu5{93hH#y z<}LwRZoRCco^QJWxzCc5a<>!h0@_P-0KK)|L){L0D2+Qt?iEkZKXP`1ZMV}+Sezq= z7+o)D9Us*=lIwe^iPm4N$*D=yG;b0WBe$(s)RbDi3X6Q(YT>BY(;~_3L(l!K#UQlg z0IN5YXoSrj4Kz+T`NUE)k-1ZV9weG6dPH-8<`XRfT1vD6XdTk(nvIZ~$!+yeWwd5T z)!3TdIGzL5>=RVJtL9+Mk(%Q!chcsbvFN--mn^#CA>Uv3U=v)XaOKm|%kAF6)9W7d zP}SJ(NiQlv#=_&ex3DN?QELySMbOUk*S*X`CRffL%&e7~cdztvySKKeMo{-U^h``z zt$SZ2_EGo2K*Pw51j0%RIUZ?}MN=)BZqY1@<`QA%bYD!g3}~gG%6&j<1j%>xW>(ao zSIt?PpziA>muQnk&k5?jt%2T7a(le!X|dm09AfTKcp67^0?3RjDdQA5soPni3-D6r zp>7jA7)SCe`uXbVW?9$diOUNw;T1B)LXoDd6^i=ySxh=KZ zYw-^61?{!yfJKLijv==(2MhDbmA0=~3t#WF<<8Yg8RDfeC*{7`!!Z%`i1ujiq8!h* zN5Z0Fi`o*2KO23IQkz?0QME-qE$ZW;G~50j*JF^N9zzj@?|Fo96_wyeTf{L$ZlZ8< zu4h`j9DQL>k14R=dX?5&=#L&V#lq)$%mFuFIHE-s`P@=+D;nsnwtDLX)owxVM$6Gw z&eD2pMcV9-FmgMDle4tOxz&9=uE%bmgGl>&9Pv2cOIq~Dk$Vzpa}Pmh1eIRyalXeT ziG}Ejhk6Dr%Jh)0*RzGk^^EmQ)?e(|y2ts(ocQb6t|uZVs_a?gqB?7f8o1m5LEiHbeHrVdzxxeSmo=tG_J9f`QqDOSpq7xRKvgoWuzQqOMdS0%-*h>lO z6-H_%r~^63RS8FgxO)}VV3ruYb_aXa_v$CMjnF{L4Y6pr zMWZYlYtaOYe1DUL>ou)G88fWjY>U{=-G)PNq2-oXM1S&Gve$CUtrFC0Ez$;yp0$Xa zjP_nzgd^H+kqc_DuzTYsp zbx!@ox~OpSyFpz}U81geT`^EwDUGOb*iF(2o{f75Ib$vYKb7`oGx&6~E{MvJIp(*VgC8!G5A=Q8z_U`L4PLYoD!~X;9r94|yDB1$#mC>gId7 zb&D)oYSD_i)i{G+2)#xeZP(Rpbj#RWx79^EtnF@#_E~h$q9cODvlkW0IBs)KdI-5^ zY(0Qn3y(W)bI)6J$wS7ooWImv@!F+#(DU3o)1np@#XRIkW%Nof*I(?NG+uyOThz|; zTzAQ{?OkS3rJ#}$Sk#D~9IblS36kFpdiS+xfS}%kk%n20xw2!S_ekbqjQ1Wds1`HK zJ>LN8J;~#GPxVk*?sVGDO1DVMoy*(>-nf!uvWbd_Q8nT)Z=kcRf!<2te7){_yj*{! zuEB`yy&h>zBeba@*ZaAv^?IWRd+(Goy1nV;$~SzyQ4ZvO%dG)AB%GXu_dY79CnD_$ z9_OJpf|8QnCwkZPJ|#T^bXHK0Idu>AD(`*4T5lemTO``&Fjm(-1>fkWbHI( z!+!e-S3gkNPtL>YhgdY+qEQx&wP=E%`pHPs1j*;$`Wb?{%UGT*sM8h5c@{0SXo*D_ z-FU7-^7YmVM=u)$(aWJK-;9rL*QSBOqq zi*rC6iLzh7oVEN%U8(l0>_Rp71ODH8Dl6W-4|iymdo#c5dn#+}7{xy2EViV3M`YfO z*t<69D`;VJm&eY*NrHoMk-S%KyMSDK@s$8}%Icc}qPZx5`=#lZg0lPjMrwYUjFx-o z;?9?kLzV`^kR^dt8WvdmpScanM5cqTUYe#S0e_%Zj{9ZH;jXXP>UIfk{q zhj%3$&AR`Rbst0jt!Qi$Vc@=Uby0xV2?f3?N* z>}5~ou%~7Uk2|eOPnr8z=d)hs&epBiJNfLLe6}sG+QGd!QKJS|1V$J?uf4-{B+@&) zO3A$k_BD)(*D9$C)XZmJBw1GaorXuVF5a~u($}L|uhH}{iuL*h>ouCTZKdVit7@*$ z=LhKD-1*yFD|tJa+u63aQ|E*9_5pf(j^4~wCcI0i{w+0sOU*8{ZEvJ7O( z_M617P=1rlVrk*@>rK@L)+L{H;gx@S0PA=gBfpJxS)d<-)mP|&_o8-IO6d--07L0A zA8(-k6VxUSp?um6+x=YMQmsU!wmn zvDbdiQh1G*9ze`18Ut10GjJ=T9Zdb(S&I*{^xJ9sLDA74V(x9!=k-;Awv1#j$KIXv zd61G<$GTUtdRJ7)xcUe^jNs@R!BXyI8}4Kq-pN_Ble1<7OB_b#r@}bRIfI6B2JN6u zXU-trhg*M?YuyM&JA!N7Xz5>PGVApbMtGb)kCPd}`SlUbuMt7qOHzMCr24g7KZ?5u zOSE@5zkwVcIL6!wl!!$CjCJIdj=Ge%l=@|?T}Q^iDB72S%lOTG z&8rv>@1d@aN}MYF{_Y*P65hnNTEw<0VqI{B2I5J-Cb)S@*0<(*IAlwf(vtnyl2Ns! z)y=fJnenuc6;D@^sU%~rwA(I>Gm^}0jQPXV;Waw?!@@fgncI)O*^g!2$_O_y!d9%^ zZ9Ed)8kBp}zK?y>k1-5n?<{it%i7hCEpQuq=Fu`GMqO9P3V8ht2hoLB?!mC9m(% z?Kz^N^q)ijF_xIecF1FEUqdT%Kj~|!(}MCdv^vk3%d1Fne{mUaycfGJX0EvgG0v;; zZY0BdqN`^F0Ly`aR%V@Jg?iyke|n;2LS| zzy-*bfrXTEFYuOuD#&Y@JI%p0F?v%#R-|dpS0S4P<`Y9-{Xy;&uFajfTe2Tpa(&1O zd=9+1?|VUD2yn|lE~L44dkbEv)-rH6n5%{_4UBvP zZF{kmdIyd`hpQPppF})cltlX&y*$X@h*Srq*0`fKupUbtbH{!2Ujzjl4{7&$R~My5Dn+Z5cy_NaK1;lcF=W!) zwQTwAY}N0utT%~s*ggT`0Aq`>tzvAe7+WdE`kL#HUu9IkrO)f==QT3s?(Z@BG5>7P zhNTztF7n0HPruXu4P51l15(p31?1X6bC3TdJ(#PaucwD3qxv54_gJF22KtvQ*IbFa zKx%=jaw{pNO&*iT-TxVQOnj=ZQ|If_U*Kg9u3=fvNbS@D={xmf`sCHs%G7iXb01~P z^ZyFeE_(Yp`KO83vbEQ-mD;mjyidP+Gu073|H0fJF#fCV@sI0bUq>Vv%;nYF>es|G z`ELMgSl<*|?`LFQC+cKSosYZc`(YF?twqty8?@;eyq7WzC+ zz8mEySo#E7{fhYW)LBjD3U!_(|3%`b**j}Fik_n9w#2;ahF-{I_6IQ z?HGf(TD^i+9VOTKCFOqR-pDI)7qP_jtJTd_!fiQL+tPnqj@8zj(T{RQ|BQ3_QO@P- zIhP;hT)x7&Z2lXeE!S#uE_V~xYI7BGxr`Hs#~u9thV;=BZtY~`+{l@J6OVdrDL=;u zIa?KvylNNg-ZrpD^m#3^>Dgb9FJ*l@u#V<>bo2iPH?x%Q87Z3h4*^Q*=M$gdtpBOh zLd|8l5Wrt#?qS;UpFPwW8Rv>;&dT&iko~yYSW$l|u|s^GelAN{>hEmTkgS%#GMoM` z(W(pLU-2Ji)OlL*t_%u*iUXrIOy9wzfJ zZFzqM{QxoV$AEvJ600C}LbNjf{$c(B;5zbQw&Zm@mhm4#)HyQEC<9#mIQP{t@vQ#H z5orE7!7y^&I)dX@6GWPZySs`$Sa<_hwc=;tL~?frM^{9UkK!^qcAa}62u zZx#G^4z+_;bI5;;nlItMxV-;ZxP!d8BEN{a<{uvR)Bk?v@@jkSF!vCpxtc!|kgL+e z0r@l(4wOTN#0vQPlvoY4L;gNTdi?3&b&&TtTOf7dyTs5`FUdbnzzY9>0lAX$eUOpB zD#&Im<+{KF9{1=EYt)fB9FZ16T=&x&lS2E@&Y4s#E%}Tg{d=Vw@o}zmY_n>Ak z{u{fDVvF%VL)^P7{Y9cue-%yV{i5m2qvZdMIGY6r zDrNjQ{i(A-q~^bB=$e3xhwiLhEo)cHmaJu*t;H7iDnNTGo{OqK(zY#SN9LyA>7kr$ z%lkLz3VN$xTfHEfig$fb3#CN$WhoKg;Yj3*sPhRK8{pAOV9<|h5y$h=farfi+6uh1 z)sLif_>mU-Ch=p^Ch7mgqE@gL<_;6(jKth=;qQ$30nVn!XlwqrC@c1;;sOq)!!iV4eE3t?nJ(vJ}cO^r;B2kn2wcI>M9n$x_^&MZ zZUW{6awGf` zJah>>4cU(TBFYw&EvfSe+vE{4=HFU6u{Ao8DWpy-j*W|qyqLMI7(*x8X0ZigocmcE zKWX>>Q0HlTo=4#~L|?r@&)14nZ}6CF?pD%<{MXse93i@$l)(+M4m) z%(;9Mzcngnw4J5JoT0S3iS1UxXxp*HN?a?njJiY}b61jSw0(e{AE3|AlbOjn&ZMRp zW9H5!=DsG^Q0H1&@y;bWlkJmD-rRj8#vZ(ebL5ZA&7ikT&XiMZlgpy7-eg<7$r*QA zG|@gH<)O2-Wru;AsU=F*g8fKxG&$-fS*gU=S)>a{@?P*|X>z16QZoS9X?)_>_&l!V zhy{C%&rQ0-<*>GEeD0Mbw#>)(G-9jkk@~r5AYO+clKqI{C`vnp(k`gW8YSswC}F>j z>muDom*{d`rE7J)?xzRpA$qtTrL*){Jps?jdYU}{qkelEmclt@sydYiIUt39(n$@( zx6?Y+HifFCM#v~njiziXV>*?s)1{wN1g2dIpDk0%uE_W1>m@cdmiQ@& zp=C`=SYb?DR^8Db>qc>p%DR-)zTBqLW=L~d)IK!P$&RAyxzOA0-%y4Eq^PGjw z5tL!{KH)&- zLh`e8>h{1^GAqe!guGGCgHx^KxR`oGzTr&`rOqeio8r^}`TUc*Q;vM8o8{YK_`xT} zRD1cP1gln%kI3hQ)G(I*X<4JeTo3tv`CODr$chXPcSE+7&l{;H0+S(!1^UWd6Dynp z!AgCXc&y~&b0*?ZGbA4MT;LwaZ}I4RBycbAcLR4p{!)%r>KIq^WAyMU&!uK?WnWL7 z=XgB$mK=@L5jhexAJZI1eaz*Ua+Fe7qg7l5RE|ohVnoF|i$daaPHLfilb-sLoKHZ4 zX|}34&c^Jq0rLdk#VWPTO)K%b25CLgCZv@veh#nOkai;NK@z+DNQaP)B8mM8q*F-3 zokhCfCb5f|M$~!SG8u*Yh!FFvtlL?TrpBxq*6Ck z;I$g5CsH4z{z!w6P!l}@X*AL}q=`sVkRC)5o0&*+kme&TLRyL>zE>cvMp}m?+(x9$ zNL!J1Aniulhjb9>2-0z+lSpTf&Ldq)d%c3yFNl=MRj|QoEB0@-;-Z{fJyMUsbG)9U zr|Ri?7M^q6=K{Pg#&elosn=*Zp8f9{_g>dHt|01RXD3G25$7k6FH@eNe2MZ^=Xvn= z%6$OUrzrRH_wd&Ov%r`Y$E-C+upT*>{XzMM$zX@z4|RR$PTWeejm7h$>V7;&;=8)J>SLIPi_|Er2+P#R)pGTOnt)Z{muixF zLA{KBr~JJRsV8(qcT+obca--R{UJRL#oUXL64wvnS)`X@Y_!6$cBgKwf1_X0H|XEt ziSG}cJpB5TaEf)g)7rU7cXe)dO7P9VC!9~{Ud|L}imr38*F*Pq_BsEp>z!XYhjB;7 zuLQoL2L#K4W%>ibPQfZYFjyU|)%=> z34U1L9lRs>5&iMtsNg6)J~$>gUf&y>5S*wd2PXw5>CXf|9lT#p4Necv(4P&?49?Uu zf^&mk)SnMN7F?nq3VuEKg#Kdi$>5WEVeqNoYW?Nl)4^})uLQpx+@O~RHwM3_mj#~- zZqX}(r-G;SlfetY3wl-Xa`3W#DijC>^y*NvP&56_P*x~QuL;FN`TFTld8m_qCe%4p zslOGf3RUTEhkAwT^oG!Fq1*Jv(ECI0*WV5OCUjJ93LOg_)6a#Dhfe4phF%H1s<(z- z3!T>6LT5r}^p4PEL3n|4ZFqP1nA1G`w@B2vG4lJ!@0~8uA<+*zRnbSH z^PKAFvgk6WHu_}rNvB7~)QqW4&y3v}yPaMcdo%Vrb(y#cnbSM7YbGxC#n|fR9CNS= zIj=acs(^FKIi*6*>3~+@Kmf<^qQH%T?y6Uy2kwA8G|(4E%aMV8xC8IU0u%Ag>Zri< zzzlU?U}0d9niN^sywa{{15Lz8tt*;NQ3vJY`Lz_a+>YGD94E<1-hJF;sg?8zV zq1~aqx;(T$^xwKm=vSd%>8_FMBW-ncq+O()?ineGlZkvt|Ez}S%lfjqQ@@E5k>QSmBhJTg&+!a38sC33Qy+I)IxW>bPJ8E8 zHO{%s8G%)Alrv6!-5HOw_fZ_qrUIVbskmE;SSo5scpDx_E*$@IUAjgYKNS6tDicX@qO7&=Q-!+>UrlEIP?CE z^P+Q9y%_8k?517{elqw;bu9SV;AhqEfY{H9bq#gZZA0Bc-SthO9-$t( zB-A@puiJ#Uok`ZZzk@%s=hxC-l(8y5znaG`y zJN4Aah{yy)u%$Yfz8G7s$;Ng zur4?#I5_yR;OOAJ!A}Jz2OkJN9Go4T7n~nl5ZoO6LFj!UoO7$pXrJf@ql2O!iGD14 zSM=`a$D{W|?*o5baC`9Q!CwYn4E{ERzl9HFhOP}|hjK%Cp<6!V^6SW<$ZsNt zQJRh%7nvb7)R{P6S32}Z%+5&o-tfIjg(rn4;j52n;c58r`B3;F6$sA{&sV|l)8YS8 zp~#WQ5mf}6=F#^>`$q>vKNKAroe`ZGofVxOofG|1^wEs_Gj_q7lX*>Mj#8Pi%$SnT z`Z`i2Y~)k~=iZTXkvCKXtdsHnjE_j!84qN9Ua5?SGM)f_GGn!Bo3SQiy(-Drkg-K| z%J^}{PgT#1*E2KKt&rnyJla+H_w;;KlZ*mKB_8x|CD>@o--v=k_=%&m;{oLM(9W|L7Lcr z0HPuyA|f_GrC1OZ5gTH6l~q($S$nTo*2TKYTF|v%M=U5RqN~_Yf6sYl^cPm$@9y`< zxBT&AK0LW|=FXjaXYP65=Y8JyoFldPO!{EG-^2d=C}%0DX34M6$B#q*KVGdtpMO&$ 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쩁>KCRMjZc^qGf4CMlar~J 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П;IU)!}uL{K*-hJ{?a*DUv+j_NnLYu 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 | -// // | .------------------------------------------------------------. | -// // | ^ | | | | -// // | | | <--G--> | | | -// // | | |----------. | .----------| | -// // | | | | ^ | | | | -// // | | | | | | | | | -// // | | |---. | | | | .---| | -// // | 2 | | ^ | | ----- | | | | -// // | 1 | | | | | / | \ | | | | -// // | 5 | | F 0 | H |<--J-->| | 0<--I-->| | -// // | | | | | | | \ | / | | | | -// // | | | | v | | ----- | | | | -// // | | |---. | | | | .---| | -// // | | | | | | | | | -// // | | | | v | | | | -// // | | |----------. | .----------| | -// // | | | | | | -// // | v | | |<--K-->| -// // | .------------------------------------------------------------. | -// // | ^ | -// // | K | -// // | v | -// // .---------------------------------------------------------------------------. -// 2811x2000 -// 702.75 x 500 -// 10.4x7.4 -// 270x270 - +use bevy::app::{AppLabel, MainSchedulePlugin}; +use bevy::ecs::event::EventRegistry; +use bevy::state::app::StatesPlugin; +use bevy::{prelude::*, render::camera::Viewport, window::PrimaryWindow}; +use bevy_egui::egui::{Direction, Layout, RichText, Ui}; +use bevy_egui::{egui, EguiContexts, EguiPlugin}; use bifrost::communication::{ CompetitionPhase, CompetitionType, GameControllerMessage, GamePhase, GameState, Half, Penalty, RobotInfo, SetPlay, TeamColor, TeamInfo, }; -use egui::{emath::RectTransform, Pos2, Rect}; -use egui::{ - Color32, Direction, Image, Layout, Painter, Response, RichText, Sense, Stroke, Ui, Vec2, -}; -use nalgebra::{Isometry2, Point2, Vector2}; -use std::time::Duration; -use yggdrasil::behavior::behaviors::ObserveBehaviorConfig; -use yggdrasil::behavior::engine::{BehaviorKind, Context}; -use yggdrasil::behavior::primary_state::{next_primary_state, PrimaryStateConfig}; -use yggdrasil::behavior::BehaviorConfig; -use yggdrasil::core::config::showtime::PlayerConfig; -use yggdrasil::core::config::yggdrasil::YggdrasilConfig; -use yggdrasil::core::debug::DebugContext; -use yggdrasil::core::whistle::WhistleState; -use yggdrasil::game_controller::GameControllerConfig; -use yggdrasil::localization::{next_robot_pose, RobotPose}; -use yggdrasil::motion::odometry::{Odometry, OdometryConfig}; -use yggdrasil::motion::step_planner::StepPlanner; -use yggdrasil::motion::walk::engine::WalkRequest; +use nalgebra::{Isometry2, Translation2, UnitComplex, Vector2}; +use tasks::TaskPlugin; +use yggdrasil::behavior::behaviors::Stand; +use yggdrasil::behavior::engine::CommandsBehaviorExt; +use yggdrasil::behavior::primary_state::PrimaryState; +use yggdrasil::core::audio::whistle_detection::Whistle; +use yggdrasil::core::config::layout::LayoutConfig; +use yggdrasil::core::config::layout::RobotPosition; +use yggdrasil::core::config::showtime::{self, PlayerConfig}; +use yggdrasil::core::{config, control, debug}; +use yggdrasil::localization::RobotPose; +use yggdrasil::motion::odometry::{self, Odometry}; +use yggdrasil::motion::walking_engine::step_context::StepContext; use yggdrasil::prelude::Config; -use yggdrasil::sensor::orientation::OrientationFilterConfig; -use yggdrasil::sensor::{ButtonConfig, FootBumperConfig, FsrConfig, SensorConfig}; -use yggdrasil::vision::camera::{CameraConfig, CameraSettings}; -use yggdrasil::vision::field_marks::FieldMarksConfig; -use yggdrasil::vision::VisionConfig; + +use yggdrasil::sensor::orientation::update_orientation; +use yggdrasil::vision::ball_detection::ball_tracker::BallTracker; +use yggdrasil::vision::referee::communication::ReceivedRefereePose; +use yggdrasil::vision::referee::recognize::RefereePoseRecognized; use yggdrasil::{ - behavior::{engine::Control, primary_state::PrimaryState, BehaviorEngine}, - core::config::layout::LayoutConfig, - motion::walk::engine::WalkingEngine, + behavior, game_controller, kinematics, localization, motion, nao, schedule, sensor, }; -#[derive(Default)] -struct OccupiedScreenSpace { - right: f32, - bottom: f32, -} +use bevy::ecs::schedule::ScheduleLabel; -fn main() -> eframe::Result<()> { - env_logger::init(); // Log to stderr (if you run with `RUST_LOG=debug`). - let options = eframe::NativeOptions { - viewport: egui::ViewportBuilder::default().with_fullscreen(true), - ..Default::default() - }; - eframe::run_native( - "Behavior Simulation", - options, - Box::new(|cc| { - // Provide image support: - egui_extras::install_image_loaders(&cc.egui_ctx); - - Ok(Box::::default()) - }), - ) +// Constants for field dimensions +const FIELD_WIDTH_METERS: f32 = 10.4; +const FIELD_HEIGHT_METERS: f32 = 7.4; +// Remove fixed visual dimensions since we'll calculate them dynamically +const PIXELS_PER_METER: f32 = 100.0; // Base scale factor, will be adjusted dynamically + // Robot size in meters +const ROBOT_SIZE_METERS: f32 = 0.5; // 50cm x 50cm robot + +// Scale factors to convert between meters and pixels - will be updated dynamically +#[derive(Resource)] +struct FieldScale { + pixels_per_meter: f32, } -const NUMBER_OF_PLAYERS: usize = 5; -const FRAMES_PER_SECOND: u64 = 120; - -struct Simulation { - occupied_screen_space: OccupiedScreenSpace, - gamecontrollermessage: GameControllerMessage, - penalties: [bool; NUMBER_OF_PLAYERS], - game_state: GameState, - robots: Vec, - layout_config: LayoutConfig, - global_ball: Option>, +#[derive(Component)] +struct PlayerNumber; + +#[derive(Resource)] +pub struct Simulation { + state: GameState, } impl Default for Simulation { fn default() -> Self { - let layout_config = LayoutConfig::load("../../deploy/config/").unwrap(); - - let gamecontrollermessage = GameControllerMessage { - competition_phase: CompetitionPhase::PlayOff, - - competition_type: CompetitionType::Normal, - - game_phase: GamePhase::Normal, - - state: GameState::Initial, - - set_play: SetPlay::None, - - first_half: Half::First, - - teams: [TeamInfo { - field_player_colour: TeamColor::Blue, - goalkeeper_colour: TeamColor::Blue, - players: [RobotInfo { - penalty: Penalty::None, - secs_till_unpenalised: 0, - }; 20], - team_number: 8, - goalkeeper: Default::default(), - score: Default::default(), - penalty_shot: Default::default(), - single_shots: Default::default(), - message_budget: Default::default(), - }; 2], - header: Default::default(), - version: Default::default(), - packet_number: Default::default(), - players_per_team: Default::default(), - kicking_team: Default::default(), - secs_remaining: Default::default(), - secondary_time: Default::default(), - }; - - let robots = (0..NUMBER_OF_PLAYERS) - .map(|i| { - Robot::new( - PlayerConfig { - player_number: (i + 1) as u8, - team_number: 8, - }, - layout_config - .initial_positions - .player((i + 1) as u8) - .isometry, - ) - }) - .collect(); - Self { - occupied_screen_space: OccupiedScreenSpace::default(), - gamecontrollermessage, - penalties: [false; NUMBER_OF_PLAYERS], - game_state: GameState::Initial, - robots, - layout_config, - global_ball: Some(Point2::new(0.0, 0.0)), + state: GameState::Initial, } } } -impl Simulation { - fn absolute_to_simulation(image_response: &Response, point: Point2) -> Pos2 { - let to_screen = RectTransform::from_to( - Rect::from_min_size(Pos2::ZERO, image_response.rect.size()), - image_response.rect, +fn main() { + let mut app = App::new(); + + app.insert_resource(ClearColor(Color::srgb(0.25, 0.25, 0.25))) + .insert_resource(FieldScale { + pixels_per_meter: PIXELS_PER_METER, + }) + .init_resource::() + .add_plugins((DefaultPlugins, EguiPlugin, MeshPickingPlugin)) + .add_systems(Startup, setup_system) + .add_systems( + Update, + ( + ui_main, + update_robot_positions, + update_field_scale, + update_position_markers, + ), ); - let field_scaler = image_response.rect.size().y / 7.4; - let field_center = image_response.rect.size().to_pos2() / 2.0; + app.insert_sub_app(Robot1, create_full_robot(1)); + app.insert_sub_app(Robot2, create_full_robot(2)); + app.insert_sub_app(Robot3, create_full_robot(3)); + app.insert_sub_app(Robot4, create_full_robot(4)); + app.insert_sub_app(Robot5, create_full_robot(5)); - let pos = - to_screen.transform_pos(field_center + field_scaler * Vec2::new(point.x, -point.y)); - Pos2::new(pos.x, pos.y) - } + app.run(); +} - fn simulation_to_absolute(image_response: &Response, pos: Pos2) -> Point2 { - let from_screen = RectTransform::from_to( - Rect::from_min_size(Pos2::ZERO, image_response.rect.size()), - image_response.rect, +macro_rules! define_robot_labels { + ($($name:ident),*) => { + $( + #[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, AppLabel)] + struct $name; + )* + }; +} + +define_robot_labels!(Robot1, Robot2, Robot3, Robot4, Robot5); + +#[derive(Resource)] +struct PlayNum(u8); + +fn create_full_robot(player_number: u8) -> SubApp { + let mut sub_app = SubApp::new(); + + sub_app.init_resource::(); + sub_app.init_resource::(); + sub_app.insert_resource(PlayNum(player_number)); + + sub_app + .add_plugins((MinimalPlugins, MainSchedulePlugin, StatesPlugin)) + .add_plugins(( + schedule::NaoSchedulePlugin, + game_controller::GameControllerPlugin, + nao::SimulationNaoPlugins, + TaskPlugin, + ml::MlPlugin, + config::ConfigPlugin, + debug::DebugPlugin, + control::ControlPlugin, + localization::LocalizationPlugin, + sensor::SensorPlugins, + behavior::BehaviorPlugins, + //TODO: Implement communication::CommunicationPlugins, + kinematics::KinematicsPlugin, + motion::MotionPlugins, + // Removed vision::VisionPlugins, + )) + .insert_resource(BallTracker::default()) + .insert_resource(Whistle::default()) + .insert_resource(initial_gamecontroller()) + .add_event::() + .add_event::() + .add_systems(PostStartup, (setup_robot, update_orientation)) + .add_systems( + PreUpdate, + (update_simulated_odometry + .after(odometry::update_odometry) + .before(localization::update_robot_pose),), ) - .inverse(); + .add_systems( + PreStartup, + set_player_number.after(showtime::configure_showtime), + ); - let field_scaler = image_response.rect.size().y / 7.4; - let field_center = image_response.rect.size().to_pos2() / 2.0; + fn setup_robot(mut commands: Commands) { + commands.insert_resource(PrimaryState::Initial); + commands.set_behavior(Stand); + } - let pos = (from_screen.transform_pos(pos) - field_center) / field_scaler; + fn set_player_number(mut commands: Commands, play_num: Res) { + commands.insert_resource(PlayerConfig { + player_number: play_num.0, + team_number: 8, + }); + } + + fn update_simulated_odometry(mut commands: Commands, step_context: Res) { + let step = step_context.requested_step; + + let translation = Vector2::new(step.forward, step.left); + let rotation = UnitComplex::from_angle(step.turn / 30.0); - Point2::new(pos.x, -pos.y) + let mut new_odom = Odometry::new(); + new_odom.offset_to_last = + Isometry2::from_parts(Translation2::from(translation * 0.2), rotation); + commands.insert_resource(new_odom); } - fn check_ball_collisions(&mut self) { - let ball = self.global_ball.unwrap(); + sub_app.set_extract(|main_world, sub_world| { + let simulation = main_world.resource_mut::(); + sub_world.resource_mut::().state = simulation.state; - for robot in self.robots.iter() { - let robot_pos = robot.pose.world_position(); - let robot_radius = 0.1; // Robot radius - let ball_radius = 0.05; // Ball radius + let robot_pose = sub_world.resource::(); - let distance = (robot_pos - ball).norm(); - if distance < robot_radius + ball_radius { - // Move the ball to the edge of the robot - let direction = (ball - robot_pos).normalize(); - let new_ball_pos = robot_pos + direction * (robot_radius + ball_radius); - self.global_ball = Some(new_ball_pos); + let player_config = sub_world.resource::(); + + for mut robot in main_world.query::<&mut Robot>().iter_mut(main_world) { + if robot.player_number == player_config.player_number { + robot.position = robot_pose.inner.translation.vector.into(); + robot.rotation = robot_pose.inner.rotation.angle(); } } - } + }); - fn draw_ball(&self, painter: &Painter, image_response: &Response) { - if let Some(ball) = self.global_ball { - painter.circle_filled( - Simulation::absolute_to_simulation(image_response, ball), - 12.0f32, - Color32::BLUE, - ); - } - } + sub_app.update_schedule = Some(Main.intern()); + sub_app.run_default_schedule(); - fn update_global_ball(&mut self, response: &Response) { - if let Some(pointer_pos) = response.interact_pointer_pos() { - self.global_ball = Some(Simulation::simulation_to_absolute(response, pointer_pos)); - } - self.check_ball_collisions(); - } + sub_app +} - fn ui_panel_top(&mut self, ui: &mut Ui) { - let layout = Layout { - main_dir: Direction::LeftToRight, - main_wrap: false, - cross_justify: false, - ..Default::default() - }; - ui.with_layout(layout, |ui| { - let mut button_size = ui.available_size(); - button_size.x /= 5.0; - - let layout = Layout::centered_and_justified(Direction::TopDown); - let game_states = [ - GameState::Initial, - GameState::Ready, - GameState::Set, - GameState::Playing, - GameState::Finished, - ]; - for state in &game_states { - ui.allocate_ui_with_layout(button_size, layout, |ui| { - ui.selectable_value( - &mut self.game_state, - *state, - RichText::new(format!("{:?}", state)) - .size(40.0) - .text_style(egui::TextStyle::Heading), - ); - }); - } - }); +fn initial_gamecontroller() -> GameControllerMessage { + GameControllerMessage { + header: Default::default(), + version: Default::default(), + packet_number: Default::default(), + players_per_team: Default::default(), + competition_phase: CompetitionPhase::RoundRobin, + competition_type: CompetitionType::Normal, + game_phase: GamePhase::Normal, + state: GameState::Initial, + set_play: SetPlay::None, + first_half: Half::First, + kicking_team: Default::default(), + secs_remaining: Default::default(), + secondary_time: Default::default(), + teams: [TeamInfo { + team_number: 8, + field_player_colour: TeamColor::Red, + goalkeeper_colour: TeamColor::Black, + goalkeeper: 1, + score: 0, + penalty_shot: 0, + single_shots: 0, + message_budget: 1200, + players: [RobotInfo { + penalty: Penalty::None, + secs_till_unpenalised: 0, + }; 20], + }; 2], } +} - fn ui_panel_right(&mut self, ui: &mut Ui) { - ui.label(RichText::new("Penalties").heading()); - ui.columns(NUMBER_OF_PLAYERS, |columns| { - for (i, column) in columns.iter_mut().enumerate() { - column.label(RichText::new(format!("{:?}", i + 1))); - column.checkbox(&mut self.penalties[i], ""); - } - }); - } +#[derive(Component)] +struct Field; - fn ui_panel_bottom(&mut self, ui: &mut Ui) { - ui.columns(NUMBER_OF_PLAYERS, |columns| { - self.robots.iter().enumerate().for_each(|(i, robot)| { - columns[i].label( - RichText::new(format!("Robot {:?}", robot.player_config.player_number)) - .strong(), - ); - columns[i].label(format!("{:?}", robot.primary_state)); - columns[i].label(format!("{:?}", robot.engine.behavior)); - columns[i].label(format!("{:?}", robot.engine.role)); - }); - }); - } +#[derive(Component)] +struct PositionCircle; - fn update_panel_top(&mut self, ctx: &egui::Context) { - egui::TopBottomPanel::top("top_panel") - .resizable(true) - .min_height(100.0) - .show(ctx, |ui| { - self.ui_panel_top(ui); - }); - } +// Real-world robot position in meters +#[derive(Component)] +struct Robot { + player_number: u8, + // Position in meters from field center + position: Vec2, + // Rotation in radians + rotation: f32, +} - fn update_panel_right(&mut self, ctx: &egui::Context) { - self.occupied_screen_space.right = egui::SidePanel::right("right_panel") - .resizable(true) - .min_width(500.0) - .show(ctx, |ui| { - self.ui_panel_right(ui); - }) - .response - .rect - .width(); +impl Robot { + fn new(player_number: u8, x_meters: f32, y_meters: f32, rotation_degrees: f32) -> Self { + Self { + player_number, + position: Vec2::new(x_meters, y_meters), + rotation: rotation_degrees.to_radians(), + } } - fn update_panel_bottom(&mut self, ctx: &egui::Context) { - self.occupied_screen_space.bottom = egui::TopBottomPanel::bottom("bottom_panel") - .resizable(true) - .min_height(250.0) - .show(ctx, |ui| { - self.ui_panel_bottom(ui); - }) - .response - .rect - .height(); + fn to_screen_position(&self, field_scale: &FieldScale) -> Vec3 { + Vec3::new( + self.position.x * field_scale.pixels_per_meter, + self.position.y * field_scale.pixels_per_meter, + 1.0, + ) } +} - fn update_panel_center(&mut self, ctx: &egui::Context) { - egui::CentralPanel::default().show(ctx, |ui| { - let img_source = egui::include_image!("./assets/field_simple.png"); - - let image_response = ui.add( - Image::new(img_source) - .sense(Sense::click_and_drag()) - .maintain_aspect_ratio(true) - .max_width(ui.available_width() - self.occupied_screen_space.right) - .max_height(ui.available_height() - self.occupied_screen_space.bottom) - .rounding(10.0), - ); - - let painter = ui.painter_at(image_response.rect); - - self.gamecontrollermessage.state = self.game_state; - - for (i, penalty) in self.penalties.iter().enumerate() { - if *penalty { - self.gamecontrollermessage.teams[0].players[i].penalty = Penalty::Manual; - } else { - self.gamecontrollermessage.teams[0].players[i].penalty = Penalty::None; - } - } +// System to update visual positions based on Robot components +fn update_robot_positions( + field_scale: Res, + mut query: Query<(&Robot, &mut Transform)>, + mut sprite_query: Query<&mut Sprite, With>, +) { + // Update positions + for (robot, mut transform) in query.iter_mut() { + transform.translation = robot.to_screen_position(&field_scale); + transform.rotation = Quat::from_rotation_z(robot.rotation); + } - for robot in self.robots.iter_mut() { - robot.update( - &self.gamecontrollermessage, - &self.global_ball, - &self.layout_config, - ); - robot.draw(ui, &painter, &image_response, &self.global_ball); - } - self.update_global_ball(&image_response); - self.draw_ball(&painter, &image_response); - }); + // Update sprite sizes + for mut sprite in sprite_query.iter_mut() { + sprite.custom_size = Some(Vec2::splat( + ROBOT_SIZE_METERS * field_scale.pixels_per_meter, + )); } } -impl eframe::App for Simulation { - fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { - ctx.request_repaint_after(Duration::from_millis(1000 / FRAMES_PER_SECOND)); - self.update_panel_top(ctx); - self.update_panel_center(ctx); - self.update_panel_right(ctx); - self.update_panel_bottom(ctx); - } +fn ui_main( + mut contexts: EguiContexts, + mut camera: Single<&mut Camera>, + mut simulation: ResMut, + window: Single<&mut Window, With>, +) { + let ctx = contexts.ctx_mut(); + + let top_height = egui::TopBottomPanel::top("top_panel") + .resizable(true) + .min_height(100.0) + .show(ctx, |ui| { + ui_panel_top(&mut simulation, ui); + }) + .response + .rect + .height(); + + // Set initial size to 25% of window width, max 50% + let right = egui::SidePanel::right("right_panel") + .default_width(window.width() * 0.25) + .max_width(window.width() * 0.5) + .resizable(true) + .show(ctx, |ui| { + ui.label("Right resizeable panel"); + ui.allocate_rect(ui.available_rect_before_wrap(), egui::Sense::hover()); + }) + .response + .rect + .width(); + + // Set initial size to 25% of window height, max 33% + let bottom = egui::TopBottomPanel::bottom("bottom_panel") + .default_height(window.height() * 0.25) + .max_height(window.height() * 0.33) + .resizable(true) + .show(ctx, |ui| { + ui.label("Bottom resizeable panel"); + ui.allocate_rect(ui.available_rect_before_wrap(), egui::Sense::hover()); + }) + .response + .rect + .height(); + + // Scale from logical units to physical units + let right_scaled = right * window.scale_factor(); + let bottom_scaled = bottom * window.scale_factor(); + let top_scaled = top_height * window.scale_factor(); + + let pos = UVec2::new(0, top_scaled as u32); + let size = UVec2::new(window.physical_width(), window.physical_height()) + - UVec2::new( + right_scaled as u32, + bottom_scaled as u32 + top_scaled as u32, + ); + + camera.viewport = Some(Viewport { + physical_position: pos, + physical_size: size, + ..default() + }); } -struct Robot { - player_config: PlayerConfig, - primary_state: PrimaryState, - pose: RobotPose, - engine: BehaviorEngine, - walking_engine: WalkingEngine, - step_planner: StepPlanner, - sees_ball: bool, +fn ui_panel_top(simulation: &mut Simulation, ui: &mut Ui) { + let layout = Layout { + main_dir: Direction::LeftToRight, + main_wrap: false, + cross_justify: false, + ..Default::default() + }; + ui.with_layout(layout, |ui| { + let mut button_size = ui.available_size(); + button_size.x /= 5.0; + + let layout = Layout::centered_and_justified(Direction::TopDown); + let game_states = [ + GameState::Initial, + GameState::Ready, + GameState::Set, + GameState::Playing, + GameState::Finished, + ]; + for state in &game_states { + ui.allocate_ui_with_layout(button_size, layout, |ui| { + ui.selectable_value( + &mut simulation.state, + *state, + RichText::new(format!("{:?}", state)) + .size(40.0) + .text_style(egui::TextStyle::Heading), + ); + }); + } + }); } -impl Robot { - fn new(player_config: PlayerConfig, isometry: Isometry2) -> Self { - Self { - walking_engine: WalkingEngine::default(), - step_planner: StepPlanner::default(), - engine: BehaviorEngine::default(), - primary_state: PrimaryState::Initial, - pose: RobotPose { inner: isometry }, - sees_ball: false, - player_config, +fn update_field_scale( + window: Query<&Window, With>, + mut field_scale: ResMut, + mut field_query: Query<&mut Sprite, With>, + camera: Query<&Camera>, +) { + let window = window.single(); + let camera = camera.single(); + + if let Some(viewport) = &camera.viewport { + let available_width = viewport.physical_size.x as f32 / window.scale_factor(); + let available_height = viewport.physical_size.y as f32 / window.scale_factor(); + + // Calculate scale factors to fit width and height + let scale_x = available_width / FIELD_WIDTH_METERS; + let scale_y = available_height / FIELD_HEIGHT_METERS; + + // Use the smaller scale to maintain aspect ratio + let new_scale = scale_x.min(scale_y); + field_scale.pixels_per_meter = new_scale; + + // Update field sprite size + if let Ok(mut sprite) = field_query.get_single_mut() { + sprite.custom_size = Some(Vec2::new( + FIELD_WIDTH_METERS * new_scale, + FIELD_HEIGHT_METERS * new_scale, + )); } } +} - fn update( - &mut self, - gamecontrollermessage: &GameControllerMessage, - ball: &Option>, - layout_config: &LayoutConfig, - ) { - self.primary_state = next_primary_state( - &self.primary_state, - &Some(gamecontrollermessage.clone()), - &Default::default(), - &Default::default(), - &self.player_config, - // &WhistleState::default(), - ); - let mut control = Control { - nao_manager: &mut Default::default(), - keyframe_executor: &mut Default::default(), - step_planner: &mut self.step_planner, - walking_engine: &mut self.walking_engine, - debug_context: &mut DebugContext::init("kaas", std::net::IpAddr::from([0, 0, 0, 0])) - .unwrap(), - }; - let (yggdrasil_config, behavior_config, game_controller_config) = create_default_configs(); - let context = Context { - robot_info: &Default::default(), - head_buttons: &Default::default(), - chest_button: &Default::default(), - contacts: &Default::default(), - behavior_config: &behavior_config, - // game_controller_config: &game_controller_config, - yggdrasil_config: &yggdrasil_config, - - fall_state: &Default::default(), - primary_state: &self.primary_state, - player_config: &self.player_config, - layout_config, - game_controller_message: Some(gamecontrollermessage), - pose: &self.pose, - current_behavior: BehaviorKind::Stand(Default::default()), - ball_position: if self.sees_ball { ball } else { &None }, - }; - - self.engine.step(context, &mut control); - - self.update_ball(ball); - self.walk(0.1, layout_config, gamecontrollermessage); +// Add new system to update position markers +fn update_position_markers( + field_scale: Res, + mut circle_query: Query<&mut Transform, (With, Without)>, + mut text_query: Query<(&mut Transform, &Parent), (With, Without)>, + robot_transforms: Query< + &Transform, + (With, Without, Without), + >, +) { + // Update circle transforms (they will inherit position from parent) + let circle_scale = ROBOT_SIZE_METERS * 0.30 * field_scale.pixels_per_meter; + for mut transform in circle_query.iter_mut() { + transform.scale = Vec3::splat(circle_scale); } - fn walk( - &mut self, - walk_scalar: f32, - layout_config: &LayoutConfig, - gamecontrollermessage: &GameControllerMessage, - ) { - let step = match self.walking_engine.request { - WalkRequest::Walk(step) => Some(step), - _ => None, - }; - let mut odometry = Odometry::default(); - odometry.offset_to_last = if let Some(step) = step { - Isometry2::new( - Vector2::new(step.forward, step.left) * walk_scalar, - step.turn / FRAMES_PER_SECOND as f32, - ) - } else { - Isometry2::identity() - }; - - self.pose = next_robot_pose( - &self.pose, - &odometry, - &self.primary_state, - layout_config, - &Some(gamecontrollermessage.clone()), - ); + // Update text transforms - counter-rotate against parent + for (mut transform, parent) in text_query.iter_mut() { + // Get the parent's rotation and apply the inverse to keep text upright + if let Ok(parent_transform) = robot_transforms.get(parent.get()) { + transform.rotation = parent_transform.rotation.inverse(); + } } +} - fn update_ball(&mut self, ball: &Option>) { - let Some(ball) = ball else { - self.sees_ball = false; - return; - }; - - let relative_ball = self.pose.world_to_robot(ball); - let angle = self.pose.angle_to(&ball); - - self.sees_ball = relative_ball.coords.norm() < 3.0 && angle.abs() < 45.0f32.to_radians(); +#[allow(dead_code)] +fn on_robot_drag( + drag: Trigger>, + mut robots: Query<(&mut Robot, &mut Transform)>, + field_scale: Res, +) { + // First try direct access (in case the Robot component is on the dragged entity) + if let Ok((mut robot, mut transform)) = robots.get_mut(drag.entity()) { + let world_delta = Vec2::new( + drag.delta.x / field_scale.pixels_per_meter, + -drag.delta.y / field_scale.pixels_per_meter, + ); + robot.position += world_delta; + transform.translation = robot.to_screen_position(&field_scale); } +} - fn draw( - &self, - ui: &mut Ui, - painter: &Painter, - image_response: &Response, - ball: &Option>, - ) { - let robot_rotation = self.pose.inner.rotation.inverse().angle(); - - let robot_pos_screen = - Simulation::absolute_to_simulation(image_response, self.pose.world_position()); - - painter.circle_filled(robot_pos_screen, 13.0f32, Color32::RED); - painter.text( - robot_pos_screen, - egui::Align2::CENTER_CENTER, - format!("{}", self.player_config.player_number), - egui::FontId { - size: 20.0, - family: egui::FontFamily::Proportional, +fn draw_robot( + commands: &mut Commands, + meshes: &mut ResMut>, + materials: &mut ResMut>, + config: &RobotPosition, + robot_texture: &Handle, + text_font: &TextFont, + text_justification: JustifyText, + field_scale: &FieldScale, +) { + let color = Color::srgba(0.2, 1.0, 0.2, 0.5); + + // Create the robot with proper initial position + let robot = Robot::new( + config.player_number as u8, + config.isometry.translation.vector.x, + config.isometry.translation.vector.y, + config.isometry.rotation.angle().to_degrees(), + ); + + // Calculate initial screen position + let screen_pos = robot.to_screen_position(field_scale); + + // Create robot entity with correct initial transform + let robot_entity = commands + .spawn(( + Transform::from_translation(screen_pos), + robot, + Visibility::default(), + InheritedVisibility::default(), + Sprite { + image: robot_texture.clone(), + custom_size: Some(Vec2::splat( + ROBOT_SIZE_METERS * field_scale.pixels_per_meter, + )), + ..default() }, - Color32::BLACK, - ); + )) + .id(); + + // Spawn the draggable circle + commands + .spawn(( + Mesh2d(meshes.add(Circle::new(1.0))), + MeshMaterial2d(materials.add(ColorMaterial::from_color(color))), + Transform::from_xyz(0.0, 0.0, 0.0), + PositionCircle, + )) + // .observe(|over: Trigger>| { + // println!("Over event triggered for circle: {}", over.entity()); + // }) + .set_parent(robot_entity); + + commands + .spawn(( + Text2d::new(config.player_number.to_string()), + text_font.clone(), + TextLayout::new_with_justify(text_justification), + Transform::from_xyz(0.0, 0.0, 0.2), + TextColor(Color::srgb(0.2, 0.2, 0.2)), + PlayerNumber, + )) + .set_parent(robot_entity); + + // Add drag observer directly to the robot entity + // commands.entity(robot_entity).observe(on_robot_drag); +} - ui.put( - Rect::from_center_size(robot_pos_screen, Vec2::splat(40.0)), - Image::new(egui::include_image!("./assets/nao.png")) - .max_width(40.0) - .rotate(robot_rotation, Vec2::splat(0.5)), +fn setup_system( + mut commands: Commands, + asset_server: Res, + mut meshes: ResMut>, + mut materials: ResMut>, + field_scale: Res, +) { + let field_texture = asset_server.load("field_simple.png"); + let robot_texture = asset_server.load("nao.png"); + let font = asset_server.load("fonts/FiraSans-Bold.ttf"); + let layout_config = LayoutConfig::load("config/").expect("Failed to load layout config"); + + let text_font = TextFont { + font: font.clone(), + font_size: 20.0, + ..default() + }; + let text_justification = JustifyText::Center; + + // Spawn the field + commands.spawn(( + Sprite { + image: field_texture.clone(), + custom_size: Some(Vec2::new( + FIELD_WIDTH_METERS * PIXELS_PER_METER, + FIELD_HEIGHT_METERS * PIXELS_PER_METER, + )), + ..default() + }, + Transform::from_xyz(0.0, 0.0, 0.0), + Field, + )); + + // Spawn all robots in a single loop + for i in 1..=layout_config.initial_positions.len() { + // Draw initial position robot + draw_robot( + &mut commands, + &mut meshes, + &mut materials, + &layout_config.initial_positions.player(i as u8), + &robot_texture, + &text_font, + text_justification, + &field_scale, // Pass field_scale here ); - - let Some(ball) = ball else { - return; - }; - if self.sees_ball { - painter.line_segment( - [ - robot_pos_screen, - Simulation::absolute_to_simulation(image_response, *ball), - ], - Stroke::new(2.0, Color32::GREEN), - ); - } } -} -fn create_default_configs() -> (YggdrasilConfig, BehaviorConfig, GameControllerConfig) { - ( - YggdrasilConfig { - // camera: CameraConfig { - // top: CameraSettings { - // path: Default::default(), - // width: 0, - // height: 0, - // calibration: Default::default(), - // exposure_auto: Default::default(), - // flip_horizontally: Default::default(), - // flip_vertically: Default::default(), - // focus_auto: Default::default(), - // num_buffers: 0, - // }, - // bottom: CameraSettings { - // path: Default::default(), - // width: 0, - // height: 0, - // calibration: Default::default(), - // exposure_auto: Default::default(), - // flip_horizontally: Default::default(), - // flip_vertically: Default::default(), - // focus_auto: Default::default(), - // num_buffers: 0, - // }, - // }, - filter: SensorConfig { - button: ButtonConfig { - activation_threshold: 0.0, - held_duration_threshold: Default::default(), - }, - fsr: FsrConfig { - ground_contact_threshold: 0.0, - }, - foot_bumpers: FootBumperConfig { - min_detection_count: 0, - max_inactivity_time: Default::default(), - malfunction_count: 0, - obstacle_angle: 0.0, - obstacle_distance: 0.0, - obstacle_radius: 0.0, - merge_distance: 0.0, - ttl: Default::default(), - }, - }, - game_controller: GameControllerConfig { - game_controller_return_delay: Default::default(), - game_controller_timeout: Default::default(), - }, - odometry: OdometryConfig { - scale_factor: Default::default(), - }, - orientation: OrientationFilterConfig { - acceleration_threshold: 0.0, - acceleration_weight: 0.0, - fsr_threshold: 0.0, - gyro_threshold: 0.0, - }, - primary_state: PrimaryStateConfig { - chest_blink_interval: Default::default(), - }, - // vision: VisionConfig { - // field_marks: FieldMarksConfig { - // angle_tolerance: 0.0, - // confidence_threshold: 0.0, - // distance_threshold: 0.0, - // patch_scale: 0.0, - // time_budget: 0, - // }, - // }, - }, - BehaviorConfig { - observe: ObserveBehaviorConfig { - head_pitch_max: 0.0, - head_rotation_speed: 0.0, - head_yaw_max: 0.0, - }, - }, - GameControllerConfig { - game_controller_timeout: Default::default(), - game_controller_return_delay: Default::default(), - }, - ) + commands.spawn(Camera2d); } diff --git a/yggdrasil/Cargo.toml b/yggdrasil/Cargo.toml index 9004e350e..72931963a 100644 --- a/yggdrasil/Cargo.toml +++ b/yggdrasil/Cargo.toml @@ -68,3 +68,4 @@ tracing-appender = { workspace = true } tracing-subscriber = { workspace = true, features = ["env-filter"] } tracing-tracy = { workspace = true, optional = true } vqf = { workspace = true } +libc = "0.2" \ No newline at end of file diff --git a/yggdrasil/src/behavior/engine.rs b/yggdrasil/src/behavior/engine.rs index 68b5a5a9f..0deba3e18 100644 --- a/yggdrasil/src/behavior/engine.rs +++ b/yggdrasil/src/behavior/engine.rs @@ -8,6 +8,7 @@ use ml::{ use nalgebra::Point2; use crate::{ + behavior::primary_state::PrimaryState, core::config::showtime::PlayerConfig, motion::walking_engine::Gait, sensor::{button::HeadButtons, falling::FallState, imu::IMUValues}, @@ -22,7 +23,6 @@ use super::{ VisualReferee, VisualRefereeBehaviorPlugin, WalkBehaviorPlugin, WalkToBallBehaviorPlugin, WalkToBehaviorPlugin, WalkToSet, WalkToSetBehaviorPlugin, }, - primary_state::PrimaryState, roles::{ Defender, DefenderRolePlugin, Goalkeeper, GoalkeeperRolePlugin, Striker, StrikerRolePlugin, }, @@ -54,7 +54,8 @@ impl Plugin for BehaviorEnginePlugin { WalkToBehaviorPlugin, WalkToSetBehaviorPlugin, )) - .add_systems(PostUpdate, role_base); + // .add_systems(Update, choose_ball) + .add_systems(Update, role_base); } } @@ -216,12 +217,12 @@ pub fn role_base( } else { commands.set_behavior(Stand); } - return; } if *primary_state == PrimaryState::Sitting { commands.set_behavior(Sitting); + return; } @@ -300,3 +301,20 @@ pub fn role_base( } } } + +// #[derive(Resource)] +// pub struct BestBall(pub Option>); + +// fn choose_ball( +// mut commands: Commands, +// top_balls: Res>, +// bottom_balls: Res>, +// ) { +// let most_confident_ball = bottom_balls +// .most_confident_ball() +// .map(|b| b.position) +// .or(top_balls.most_confident_ball().map(|b| b.position)); +// println!("Running behavior now!"); + +// commands.insert_resource(BestBall(most_confident_ball)); +// } diff --git a/yggdrasil/src/core/config/layout.rs b/yggdrasil/src/core/config/layout.rs index 18beca81d..0c85153d3 100644 --- a/yggdrasil/src/core/config/layout.rs +++ b/yggdrasil/src/core/config/layout.rs @@ -337,6 +337,12 @@ impl Index for FieldPositionsConfig { } } +impl FieldPositionsConfig { + pub fn len(&self) -> usize { + self.0.iter().len() + } +} + impl FieldPositionsConfig { #[must_use] pub fn player(&self, player_num: u8) -> &RobotPosition { diff --git a/yggdrasil/src/core/config/showtime.rs b/yggdrasil/src/core/config/showtime.rs index a8bbff840..48c5c01f2 100644 --- a/yggdrasil/src/core/config/showtime.rs +++ b/yggdrasil/src/core/config/showtime.rs @@ -30,7 +30,7 @@ pub struct PlayerConfig { pub team_number: u8, } -pub(super) fn configure_showtime( +pub fn configure_showtime( mut commands: Commands, showtime_config: Res, robot_info: Res, diff --git a/yggdrasil/src/game_controller/mod.rs b/yggdrasil/src/game_controller/mod.rs index c578b8b85..da63304c6 100644 --- a/yggdrasil/src/game_controller/mod.rs +++ b/yggdrasil/src/game_controller/mod.rs @@ -114,8 +114,28 @@ struct GameControllerSocket { impl GameControllerSocket { async fn bind() -> io::Result { - let socket = - Arc::new(UdpSocket::bind((Ipv4Addr::UNSPECIFIED, GAME_CONTROLLER_DATA_PORT)).await?); + // use std::os::linux::net::UnixSocketExt; + use std::os::unix::io::AsRawFd; + + let socket = UdpSocket::bind((Ipv4Addr::UNSPECIFIED, 0)).await?; + + // Get the underlying fd and set SO_REUSEADDR option + let fd = socket.as_raw_fd(); + unsafe { + let val: libc::c_int = 1; + libc::setsockopt( + fd, + libc::SOL_SOCKET, + libc::SO_REUSEADDR, + &val as *const _ as *const libc::c_void, + std::mem::size_of_val(&val) as libc::socklen_t, + ); + } + + // Now bind to desired port + async_std::net::UdpSocket::bind((Ipv4Addr::UNSPECIFIED, GAME_CONTROLLER_DATA_PORT)).await?; + + let socket = Arc::new(socket); let gc_address = std::env::var("GC_HOST") .ok() diff --git a/yggdrasil/src/localization/mod.rs b/yggdrasil/src/localization/mod.rs index e0f26295b..7aac78536 100644 --- a/yggdrasil/src/localization/mod.rs +++ b/yggdrasil/src/localization/mod.rs @@ -10,15 +10,15 @@ use correction::GradientDescentConfig; use correspondence::CorrespondenceConfig; use filter::CovarianceMatrix; use hypothesis::{ - HypothesisConfig, RobotPoseHypothesis, filter_hypotheses, line_update, odometry_update, - reset_hypotheses, + filter_hypotheses, line_update, odometry_update, reset_hypotheses, HypothesisConfig, + RobotPoseHypothesis, }; use odal::Config; use odometry::OdometryConfig; -pub use pose::RobotPose; use pose::initial_pose; +pub use pose::RobotPose; -use rerun::{Rotation3D, TimeColumn, components::RotationAxisAngle}; +use rerun::{components::RotationAxisAngle, Rotation3D, TimeColumn}; use serde::{Deserialize, Serialize}; use crate::{ diff --git a/yggdrasil/src/localization/odometry.rs b/yggdrasil/src/localization/odometry.rs index c95fefad2..9bfc35d00 100644 --- a/yggdrasil/src/localization/odometry.rs +++ b/yggdrasil/src/localization/odometry.rs @@ -42,6 +42,7 @@ pub fn update_odometry( fall_state: Res, ) { if !matches!(*fall_state, FallState::None) { + println!("We falllllinnn!"); // Don't update odometry if the robot is falling, or getting up odometry.offset_to_last = Isometry2::default(); return; diff --git a/yggdrasil/src/motion/walking_engine/step_context.rs b/yggdrasil/src/motion/walking_engine/step_context.rs index 2b465d601..5666f026e 100644 --- a/yggdrasil/src/motion/walking_engine/step_context.rs +++ b/yggdrasil/src/motion/walking_engine/step_context.rs @@ -2,20 +2,20 @@ use std::time::{Duration, Instant}; use crate::{ core::debug::{ - DebugContext, debug_system::{DebugAppExt, SystemToggle}, + DebugContext, }, kinematics::Kinematics, nao::Cycle, }; use super::{ - FootSwitchedEvent, config::WalkingEngineConfig, feet::FootPositions, gait::StandingHeight, schedule::{Gait, WalkingEngineSet}, step::{PlannedStep, Step}, + FootSwitchedEvent, }; use bevy::prelude::*; use nalgebra::Vector2; @@ -55,7 +55,7 @@ impl Plugin for StepContextPlugin { #[derive(Resource, Debug)] pub struct StepContext { requested_gait: Gait, - requested_step: Step, + pub requested_step: Step, pub requested_standing_height: Option, stand_return_start: Option, last_step: PlannedStep, diff --git a/yggdrasil/src/nao/mod.rs b/yggdrasil/src/nao/mod.rs index e2b7098ab..0f0016f69 100644 --- a/yggdrasil/src/nao/mod.rs +++ b/yggdrasil/src/nao/mod.rs @@ -7,6 +7,7 @@ mod cycle; mod lola; mod manager; mod robot_info; +mod sim_lola; pub use center_of_mass::*; pub use center_of_pressure::*; @@ -28,3 +29,17 @@ impl PluginGroup for NaoPlugins { .add(center_of_pressure::CenterOfPressurePlugin) } } + +pub struct SimulationNaoPlugins; + +impl PluginGroup for SimulationNaoPlugins { + fn build(self) -> PluginGroupBuilder { + PluginGroupBuilder::start::() + .add(sim_lola::SimLolaPlugin) + .add(cycle::CycleTimePlugin) + .add(battery_led::BatteryLedPlugin) + .add(manager::NaoManagerPlugin) + .add(center_of_mass::CenterOfMassPlugin) + .add(center_of_pressure::CenterOfPressurePlugin) + } +} diff --git a/yggdrasil/src/nao/sim_lola.rs b/yggdrasil/src/nao/sim_lola.rs new file mode 100644 index 000000000..dd33b69a2 --- /dev/null +++ b/yggdrasil/src/nao/sim_lola.rs @@ -0,0 +1,176 @@ +use bevy::{ecs::system::RunSystemOnce, prelude::*}; +use nidhogg::{ + types::{FillExt, JointArray}, + DisconnectExt, HardwareInfo, NaoBackend, NaoControlMessage, NaoState, Result, +}; + +use nidhogg::backend::{ConnectWithRetry, ReadHardwareInfo}; + +use crate::nao::RobotInfo; +use crate::prelude::*; + +const DEFAULT_STIFFNESS: f32 = 0.8; + +/// Plugin that adds systems for reading and writing to the `LoLA` socket using [`nidhogg`]. +pub(super) struct SimLolaPlugin; + +impl Plugin for SimLolaPlugin { + fn build(&self, app: &mut App) { + app.init_resource::(); + + app.world_mut() + .run_system_once(setup_lola) + .expect("failed to setup lola!"); + app.world_mut() + .run_system_once(initialize_nao) + .expect("failed to initialize nao resources!"); + + app.add_systems(Write, sync_hardware); + } +} + +/// Resource containing the [`SimLolaBackend`]. +#[derive(Resource, Debug, Deref, DerefMut)] +pub struct SimLola(SimLolaBackend); + +fn setup_lola(mut commands: Commands) { + commands.insert_resource(SimLola(SimLolaBackend)); +} + +fn initialize_nao(mut commands: Commands, mut lola: ResMut) { + // let info = RobotInfo::new(&mut lola.0).expect("failed to read robot info from LoLA"); + + let info = RobotInfo { + robot_name: "local".to_string(), + robot_id: 27, + head_id: Default::default(), + head_version: Default::default(), + body_id: Default::default(), + body_version: Default::default(), + initial_joint_positions: Default::default(), + }; + + // Read state and reply with a message. + let state = lola + .read_nao_state() + .expect("failed to read initial state from LoLA"); + let msg = NaoControlMessage { + position: info.initial_joint_positions.clone(), + stiffness: JointArray::fill(DEFAULT_STIFFNESS), + ..Default::default() + }; + lola.send_control_msg(msg) + .expect("failed to send initial control message to LoLA"); + + tracing::info!( + "Launched yggdrasil on {} with head_id: {}, body_id: {}", + info.robot_name, + info.head_id, + info.body_id + ); + + tracing::info!("Battery level: {}", state.battery.charge); + + commands.insert_resource(state); + commands.insert_resource(info); +} + +pub fn sync_hardware( + mut nao: ResMut, + mut robot_state: ResMut, + update: Res, +) { + nao.send_control_msg(update.clone()) + .expect("failed to send control message to LoLA"); + + *robot_state = nao + .read_nao_state() + .expect("failed to read state from LoLA"); +} + +/// `LoLA` backend that communicates with a real NAO V6 through the socket at `/tmp/robocup` +#[derive(Debug)] +pub struct SimLolaBackend; + +impl NaoBackend for SimLolaBackend { + /// Connects to a NAO backend + /// + /// # Examples + /// ```no_run + /// use nidhogg::{NaoBackend, backend::SimLolaBackend}; + /// + /// // We connect to a real NAO using the `LoLA` backend + /// let mut nao = SimLolaBackend::connect().expect("Could not connect to the NAO! 😪"); + /// ``` + fn connect() -> Result { + Ok(SimLolaBackend) + } + + /// Converts a control message to the format required by the backend and writes it to that backend. + /// + /// # Examples + /// ```no_run + /// use nidhogg::{NaoBackend, NaoControlMessage, backend::SimLolaBackend, types::color}; + /// + /// let mut nao = SimLolaBackend::connect().unwrap(); + /// + /// // First, create a new control message where we set the chest color + /// let msg = NaoControlMessage::builder().chest(color::f32::MAGENTA).build(); + /// + /// // Now we send it to the NAO! + /// nao.send_control_msg(msg).expect("Failed to write control message to backend!"); + /// ``` + fn send_control_msg( + &mut self, + _: NaoControlMessage, + ) -> std::result::Result<(), nidhogg::Error> { + Ok(()) + } + + /// Reads the current sensor data from the chosen backend + /// + /// # Examples + /// ```no_run + /// use nidhogg::{NaoBackend, backend::SimLolaBackend}; + /// + /// let mut nao = SimLolaBackend::connect().unwrap(); + /// + /// // Get the current state of the robot + /// let state = nao.read_nao_state().expect("Failed to retrieve sensor data!"); + /// ``` + fn read_nao_state(&mut self) -> Result { + Ok(NaoState { + position: Default::default(), + stiffness: Default::default(), + accelerometer: Default::default(), + gyroscope: Default::default(), + angles: Default::default(), + sonar: Default::default(), + fsr: Default::default(), + touch: Default::default(), + battery: Default::default(), + temperature: Default::default(), + current: Default::default(), + status: Default::default(), + }) + } +} + +impl DisconnectExt for SimLolaBackend { + fn disconnect(self) -> Result<()> { + Ok(()) + } +} + +impl ConnectWithRetry for SimLolaBackend {} + +impl ReadHardwareInfo for SimLolaBackend { + fn read_hardware_info(&mut self) -> Result { + Ok(HardwareInfo { + body_id: Default::default(), + body_version: Default::default(), + head_id: Default::default(), + head_version: Default::default(), + }) + } +} diff --git a/yggdrasil/src/sensor/orientation.rs b/yggdrasil/src/sensor/orientation.rs index 1b6c05139..0b5b38adf 100644 --- a/yggdrasil/src/sensor/orientation.rs +++ b/yggdrasil/src/sensor/orientation.rs @@ -37,14 +37,14 @@ pub struct RobotOrientation { /// /// See [`Vqf`] for more information. #[deref] - vqf: Vqf, + pub vqf: Vqf, /// Offset of the yaw angle in radians. /// /// The VQF algorithm cannot determine the yaw angle without a magnetometer, /// it will always be relative to some initial orientation, which can be computed /// from the accelerometer data. This offset is then stored here and added to /// the yaw angle to get the absolute orientation. - yaw_offset: Option>, + pub yaw_offset: Option>, } impl RobotOrientation { From 20094a1b9061aaef4e490f6dc1f7cb9db950784f Mon Sep 17 00:00:00 2001 From: Fyor Klein Gunnewiek Date: Sun, 25 May 2025 16:27:57 +0200 Subject: [PATCH 02/10] Rebase fixes for bevy 0.16 --- Cargo copy.lock | 12336 +++++++++++++++++++ Cargo.lock | 400 +- Cargo.toml | 4 +- deploy/assets/motions/standup_back.json | 2 +- deploy/assets/motions/standup_stomach.json | 2 +- tools/simulation/Cargo.toml | 2 +- tools/simulation/src/main.rs | 57 +- yggdrasil/src/nao/sim_lola.rs | 5 +- 8 files changed, 12757 insertions(+), 51 deletions(-) create mode 100644 Cargo copy.lock diff --git a/Cargo copy.lock b/Cargo copy.lock new file mode 100644 index 000000000..62f48b387 --- /dev/null +++ b/Cargo copy.lock @@ -0,0 +1,12336 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ab_glyph" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3672c180e71eeaaac3a541fbbc5f5ad4def8b747c595ad30d674e43049f7b0" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" + +[[package]] +name = "accesskit" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3d3b8f9bae46a948369bc4a03e815d4ed6d616bd00de4051133a5019dc31c5a" +dependencies = [ + "enumn", + "serde", +] + +[[package]] +name = "accesskit" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "becf0eb5215b6ecb0a739c31c21bd83c4f326524c9b46b7e882d77559b60a529" + +[[package]] +name = "accesskit_atspi_common" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c5dd55e6e94949498698daf4d48fb5659e824d7abec0d394089656ceaf99d4f" +dependencies = [ + "accesskit 0.17.1", + "accesskit_consumer 0.26.0", + "atspi-common", + "serde", + "thiserror 1.0.69", + "zvariant 4.2.0", +] + +[[package]] +name = "accesskit_consumer" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f47983a1084940ba9a39c077a8c63e55c619388be5476ac04c804cfbd1e63459" +dependencies = [ + "accesskit 0.17.1", + "hashbrown 0.15.3", + "immutable-chunkmap", +] + +[[package]] +name = "accesskit_consumer" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0bf66a7bf0b7ea4fd7742d50b64782a88f99217cf246b3f93b4162528dde520" +dependencies = [ + "accesskit 0.18.0", + "hashbrown 0.15.3", + "immutable-chunkmap", +] + +[[package]] +name = "accesskit_macos" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7329821f3bd1101e03a7d2e03bd339e3ac0dc64c70b4c9f9ae1949e3ba8dece1" +dependencies = [ + "accesskit 0.17.1", + "accesskit_consumer 0.26.0", + "hashbrown 0.15.3", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "accesskit_macos" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e230718177753b4e4ad9e1d9f6cfc2f4921212d4c1c480b253f526babb258d" +dependencies = [ + "accesskit 0.18.0", + "accesskit_consumer 0.27.0", + "hashbrown 0.15.3", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "accesskit_unix" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcee751cc20d88678c33edaf9c07e8b693cd02819fe89053776f5313492273f5" +dependencies = [ + "accesskit 0.17.1", + "accesskit_atspi_common", + "async-channel 2.3.1", + "async-executor", + "async-task", + "atspi", + "futures-lite", + "futures-util", + "serde", + "zbus 4.4.0", +] + +[[package]] +name = "accesskit_windows" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24fcd5d23d70670992b823e735e859374d694a3d12bfd8dd32bd3bd8bedb5d81" +dependencies = [ + "accesskit 0.17.1", + "accesskit_consumer 0.26.0", + "hashbrown 0.15.3", + "paste", + "static_assertions", + "windows 0.58.0", + "windows-core 0.58.0", +] + +[[package]] +name = "accesskit_windows" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65178f3df98a51e4238e584fcb255cb1a4f9111820848eeddd37663be40a625f" +dependencies = [ + "accesskit 0.18.0", + "accesskit_consumer 0.27.0", + "hashbrown 0.15.3", + "paste", + "static_assertions", + "windows 0.58.0", + "windows-core 0.58.0", +] + +[[package]] +name = "accesskit_winit" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6a48dad5530b6deb9fc7a52cc6c3bf72cdd9eb8157ac9d32d69f2427a5e879" +dependencies = [ + "accesskit 0.17.1", + "accesskit_macos 0.18.1", + "accesskit_unix", + "accesskit_windows 0.24.1", + "raw-window-handle", + "winit", +] + +[[package]] +name = "accesskit_winit" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34d941bb8c414caba6e206de669c7dc0dbeb305640ea890772ee422a40e6b89f" +dependencies = [ + "accesskit 0.18.0", + "accesskit_macos 0.19.0", + "accesskit_windows 0.25.0", + "raw-window-handle", + "winit", +] + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "const-random", + "getrandom 0.3.3", + "once_cell", + "serde", + "version_check", + "zerocopy 0.8.25", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "aligned-vec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed7572b7ba83a31e20d1b48970ee402d2e3e0537dcfe0a3ff4d6eb7508617d43" +dependencies = [ + "alsa-sys", + "bitflags 2.9.1", + "cfg-if", + "libc", +] + +[[package]] +name = "alsa-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "android-activity" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" +dependencies = [ + "android-properties", + "bitflags 2.9.1", + "cc", + "cesu8", + "jni", + "jni-sys", + "libc", + "log", + "ndk 0.9.0", + "ndk-context", + "ndk-sys 0.6.0+11769913", + "num_enum", + "thiserror 1.0.69", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_log-sys" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84521a3cf562bc62942e294181d9eef17eb38ceb8c68677bc49f144e4c3d4f8d" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6680de5231bd6ee4c6191b8a1325daa282b415391ec9d3a37bd34f2060dc73fa" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.59.0", +] + +[[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + +[[package]] +name = "apodize" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fca387cdc0a1f9c7a7c26556d584aa2d07fc529843082e4861003cde4ab914ed" + +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + +[[package]] +name = "arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" + +[[package]] +name = "arboard" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1df21f715862ede32a0c525ce2ca4d52626bb0007f8c18b87a384503ac33e70" +dependencies = [ + "clipboard-win", + "image 0.25.6", + "log", + "objc2 0.6.1", + "objc2-app-kit 0.3.1", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation 0.3.1", + "parking_lot", + "percent-encoding", + "windows-sys 0.59.0", + "x11rb", +] + +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "array-init" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d62b7694a562cdf5a74227903507c56ab2cc8bdd1f781ed5cb4cf9c9f810bfc" + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "arrow" +version = "54.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5ec52ba94edeed950e4a41f75d35376df196e8cb04437f7280a5aa49f20f796" +dependencies = [ + "arrow-arith", + "arrow-array", + "arrow-buffer", + "arrow-cast", + "arrow-data", + "arrow-ipc", + "arrow-ord", + "arrow-row", + "arrow-schema", + "arrow-select", + "arrow-string", +] + +[[package]] +name = "arrow-arith" +version = "54.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc766fdacaf804cb10c7c70580254fcdb5d55cdfda2bc57b02baf5223a3af9e" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "chrono", + "num", +] + +[[package]] +name = "arrow-array" +version = "54.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12fcdb3f1d03f69d3ec26ac67645a8fe3f878d77b5ebb0b15d64a116c212985" +dependencies = [ + "ahash", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "chrono", + "half", + "hashbrown 0.15.3", + "num", +] + +[[package]] +name = "arrow-buffer" +version = "54.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "263f4801ff1839ef53ebd06f99a56cecd1dbaf314ec893d93168e2e860e0291c" +dependencies = [ + "bytes", + "half", + "num", +] + +[[package]] +name = "arrow-cast" +version = "54.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ede6175fbc039dfc946a61c1b6d42fd682fcecf5ab5d148fbe7667705798cac9" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", + "atoi", + "base64 0.22.1", + "chrono", + "half", + "lexical-core", + "num", + "ryu", +] + +[[package]] +name = "arrow-data" +version = "54.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61cfdd7d99b4ff618f167e548b2411e5dd2c98c0ddebedd7df433d34c20a4429" +dependencies = [ + "arrow-buffer", + "arrow-schema", + "half", + "num", +] + +[[package]] +name = "arrow-ipc" +version = "54.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62ff528658b521e33905334723b795ee56b393dbe9cf76c8b1f64b648c65a60c" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "flatbuffers", +] + +[[package]] +name = "arrow-ord" +version = "54.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0a3334a743bd2a1479dbc635540617a3923b4b2f6870f37357339e6b5363c21" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", +] + +[[package]] +name = "arrow-row" +version = "54.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d1d7a7291d2c5107e92140f75257a99343956871f3d3ab33a7b41532f79cb68" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "half", +] + +[[package]] +name = "arrow-schema" +version = "54.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cfaf5e440be44db5413b75b72c2a87c1f8f0627117d110264048f2969b99e9" + +[[package]] +name = "arrow-select" +version = "54.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69efcd706420e52cd44f5c4358d279801993846d1c2a8e52111853d61d55a619" +dependencies = [ + "ahash", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "num", +] + +[[package]] +name = "arrow-string" +version = "54.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21546b337ab304a32cfc0770f671db7411787586b45b78b4593ae78e64e2b03" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", + "memchr", + "num", + "regex", + "regex-syntax 0.8.5", +] + +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + +[[package]] +name = "ascii" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" + +[[package]] +name = "ash" +version = "0.38.0+1.3.281" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" +dependencies = [ + "libloading", +] + +[[package]] +name = "ashpd" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cbdf310d77fd3aaee6ea2093db7011dc2d35d2eb3481e5607f1f8d942ed99df" +dependencies = [ + "async-fs", + "async-net", + "enumflags2", + "futures-channel", + "futures-util", + "rand 0.9.1", + "raw-window-handle", + "serde", + "serde_repr", + "url", + "zbus 5.7.1", +] + +[[package]] +name = "assert_matches" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" + +[[package]] +name = "assert_type_match" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f548ad2c4031f2902e3edc1f29c29e835829437de49562d8eb5dc5584d3a1043" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener 5.4.0", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-fs" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" +dependencies = [ + "async-lock", + "blocking", + "futures-lite", +] + +[[package]] +name = "async-global-executor" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" +dependencies = [ + "async-channel 2.3.1", + "async-executor", + "async-io", + "async-lock", + "blocking", + "futures-lite", + "once_cell", +] + +[[package]] +name = "async-io" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +dependencies = [ + "async-lock", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix 0.38.44", + "slab", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener 5.4.0", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-net" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" +dependencies = [ + "async-io", + "blocking", + "futures-lite", +] + +[[package]] +name = "async-process" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" +dependencies = [ + "async-channel 2.3.1", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener 5.4.0", + "futures-lite", + "rustix 0.38.44", + "tracing", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "async-signal" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 0.38.44", + "signal-hook-registry", + "slab", + "windows-sys 0.59.0", +] + +[[package]] +name = "async-std" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "730294c1c08c2e0f85759590518f6333f0d5a0a766a27d519c1b244c3dfd8a24" +dependencies = [ + "async-channel 1.9.0", + "async-global-executor", + "async-io", + "async-lock", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "async-trait" +version = "0.1.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "atomicow" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52e8890bb9844440d0c412fa74b67fd2f14e85248b6e00708059b6da9e5f8bf" +dependencies = [ + "portable-atomic", + "portable-atomic-util", +] + +[[package]] +name = "atomig" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0f41f4bb89f5c6450325e283fb78c4a3d042181b54f3855ee2f872919f9863" +dependencies = [ + "atomig-macro", +] + +[[package]] +name = "atomig-macro" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49c98dba06b920588de7d63f6acc23f1e6a9fade5fd6198e564506334fb5a4f5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "atspi" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be534b16650e35237bb1ed189ba2aab86ce65e88cc84c66f4935ba38575cecbf" +dependencies = [ + "atspi-common", + "atspi-connection", + "atspi-proxies", +] + +[[package]] +name = "atspi-common" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1909ed2dc01d0a17505d89311d192518507e8a056a48148e3598fef5e7bb6ba7" +dependencies = [ + "enumflags2", + "serde", + "static_assertions", + "zbus 4.4.0", + "zbus-lockstep", + "zbus-lockstep-macros", + "zbus_names 3.0.0", + "zvariant 4.2.0", +] + +[[package]] +name = "atspi-connection" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "430c5960624a4baaa511c9c0fcc2218e3b58f5dbcc47e6190cafee344b873333" +dependencies = [ + "atspi-common", + "atspi-proxies", + "futures-lite", + "zbus 4.4.0", +] + +[[package]] +name = "atspi-proxies" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e6c5de3e524cf967569722446bcd458d5032348554d9a17d7d72b041ab7496" +dependencies = [ + "atspi-common", + "serde", + "zbus 4.4.0", + "zvariant 4.2.0", +] + +[[package]] +name = "autocfg" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" + +[[package]] +name = "av-data" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fca67ba5d317924c02180c576157afd54babe48a76ebc66ce6d34bb8ba08308e" +dependencies = [ + "byte-slice-cast", + "bytes", + "num-derive", + "num-rational", + "num-traits", +] + +[[package]] +name = "av1-grain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98922d6a4cfbcb08820c69d8eeccc05bb1f29bfa06b4f5b1dbfe9a868bd7608e" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "axum" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +dependencies = [ + "async-trait", + "axum-core", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower 0.5.2", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "rustversion", + "sync_wrapper", + "tower-layer", + "tower-service", +] + +[[package]] +name = "az" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" + +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "backtrace-ext" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "537beee3be4a18fb023b570f80e3ae28003db9167a751266b259926e25539d50" +dependencies = [ + "backtrace", +] + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bevy" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a5cd3b24a5adb7c7378da7b3eea47639877643d11b6b087fc8a8094f2528615" +dependencies = [ + "bevy_internal", + "tracing", +] + +[[package]] +name = "bevy_a11y" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ed969a58fbe449ef35ebec58ab19578302537f34ee8a35d04e5a038b3c40f5" +dependencies = [ + "accesskit 0.18.0", + "bevy_app", + "bevy_derive", + "bevy_ecs", + "bevy_reflect", +] + +[[package]] +name = "bevy_app" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2b6267ac23a9947d5b2725ff047a1e1add70076d85fa9fb73d044ab9bea1f3c" +dependencies = [ + "bevy_derive", + "bevy_ecs", + "bevy_platform", + "bevy_reflect", + "bevy_tasks", + "bevy_utils", + "cfg-if", + "console_error_panic_hook", + "ctrlc", + "downcast-rs 2.0.1", + "log", + "thiserror 2.0.12", + "tracing", + "variadics_please", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "bevy_asset" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0698040d63199391ea77fd02e039630748e3e335c3070c6d932fd96cbf80f5d6" +dependencies = [ + "async-broadcast", + "async-fs", + "async-lock", + "atomicow", + "bevy_app", + "bevy_asset_macros", + "bevy_ecs", + "bevy_platform", + "bevy_reflect", + "bevy_tasks", + "bevy_utils", + "bevy_window", + "bitflags 2.9.1", + "blake3", + "crossbeam-channel", + "derive_more", + "disqualified", + "downcast-rs 2.0.1", + "either", + "futures-io", + "futures-lite", + "js-sys", + "parking_lot", + "ron", + "serde", + "stackfuture", + "thiserror 2.0.12", + "tracing", + "uuid", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "bevy_asset_macros" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf8c00b5d532f8e5ac7b49af10602f9f7774a2d522cf0638323b5dfeee7b31c" +dependencies = [ + "bevy_macro_utils", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "bevy_color" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddf6a5ad35496bbc41713efbcf06ab72b9a310fabcab0f9db1debb56e8488c6e" +dependencies = [ + "bevy_math", + "bevy_reflect", + "bytemuck", + "derive_more", + "encase", + "serde", + "thiserror 2.0.12", + "wgpu-types", +] + +[[package]] +name = "bevy_core_pipeline" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55c2310717b9794e4a45513ee5946a7be0838852a4c1e185884195e1a8688ff3" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_derive", + "bevy_diagnostic", + "bevy_ecs", + "bevy_image", + "bevy_math", + "bevy_platform", + "bevy_reflect", + "bevy_render", + "bevy_transform", + "bevy_utils", + "bevy_window", + "bitflags 2.9.1", + "bytemuck", + "nonmax", + "radsort", + "serde", + "smallvec", + "thiserror 2.0.12", + "tracing", +] + +[[package]] +name = "bevy_derive" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f626531b9c05c25a758ede228727bd11c2c2c8498ecbed9925044386d525a2a3" +dependencies = [ + "bevy_macro_utils", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "bevy_diagnostic" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "048a1ff3944a534b8472516866284181eef0a75b6dd4d39b6e5925715e350766" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_platform", + "bevy_tasks", + "bevy_time", + "bevy_utils", + "const-fnv1a-hash", + "log", + "serde", +] + +[[package]] +name = "bevy_ecs" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9e807b5d9aab3bb8dfe47e7a44c9ff088bad2ceefe299b80ac77609a87fe9d4" +dependencies = [ + "arrayvec", + "bevy_ecs_macros", + "bevy_platform", + "bevy_ptr", + "bevy_reflect", + "bevy_tasks", + "bevy_utils", + "bitflags 2.9.1", + "bumpalo", + "concurrent-queue", + "derive_more", + "disqualified", + "fixedbitset", + "indexmap 2.9.0", + "log", + "nonmax", + "serde", + "smallvec", + "thiserror 2.0.12", + "tracing", + "variadics_please", +] + +[[package]] +name = "bevy_ecs_macros" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "467d7bb98aeb8dd30f36e6a773000c12a891d4f1bee2adc3841ec89cc8eaf54e" +dependencies = [ + "bevy_macro_utils", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "bevy_encase_derive" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb31dc1090c6f8fabbf6b21994d19a12766e786885ee48ffc547f0f1fa7863" +dependencies = [ + "bevy_macro_utils", + "encase_derive_impl", +] + +[[package]] +name = "bevy_image" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "840b25f7f58894c641739f756959028a04f519c448db7e2cd3e2e29fc5fd188d" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_math", + "bevy_platform", + "bevy_reflect", + "bevy_utils", + "bitflags 2.9.1", + "bytemuck", + "futures-lite", + "guillotiere", + "half", + "image 0.25.6", + "rectangle-pack", + "serde", + "thiserror 2.0.12", + "tracing", + "wgpu-types", +] + +[[package]] +name = "bevy_input" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763410715714f3d4d2dcdf077af276e2e4ea93fd8081b183d446d060ea95baaa" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_math", + "bevy_platform", + "bevy_reflect", + "bevy_utils", + "derive_more", + "log", + "smol_str", + "thiserror 2.0.12", +] + +[[package]] +name = "bevy_input_focus" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7e7b4ed65e10927a39a987cf85ef98727dd319aafb6e6835f2cb05b883c6d66" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_input", + "bevy_math", + "bevy_reflect", + "bevy_window", + "log", + "thiserror 2.0.12", +] + +[[package]] +name = "bevy_internal" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "526ffd64c58004cb97308826e896c07d0e23dc056c243b97492e31cdf72e2830" +dependencies = [ + "bevy_a11y", + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_core_pipeline", + "bevy_derive", + "bevy_diagnostic", + "bevy_ecs", + "bevy_input", + "bevy_input_focus", + "bevy_log", + "bevy_math", + "bevy_pbr", + "bevy_platform", + "bevy_ptr", + "bevy_reflect", + "bevy_render", + "bevy_scene", + "bevy_sprite", + "bevy_state", + "bevy_tasks", + "bevy_text", + "bevy_time", + "bevy_transform", + "bevy_utils", + "bevy_window", + "bevy_winit", +] + +[[package]] +name = "bevy_log" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7156df8d2f11135cf71c03eb4c11132b65201fd4f51648571e59e39c9c9ee2f6" +dependencies = [ + "android_log-sys", + "bevy_app", + "bevy_ecs", + "bevy_utils", + "tracing", + "tracing-error", + "tracing-log", + "tracing-oslog", + "tracing-subscriber", + "tracing-wasm", +] + +[[package]] +name = "bevy_macro_utils" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2473db70d8785b5c75d6dd951a2e51e9be2c2311122db9692c79c9d887517b" +dependencies = [ + "parking_lot", + "proc-macro2", + "quote", + "syn 2.0.101", + "toml_edit", +] + +[[package]] +name = "bevy_math" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a3a926d02dc501c6156a047510bdb538dcb1fa744eeba13c824b73ba88de55" +dependencies = [ + "approx", + "bevy_reflect", + "derive_more", + "glam 0.29.3", + "itertools 0.14.0", + "libm", + "rand 0.8.5", + "rand_distr", + "serde", + "smallvec", + "thiserror 2.0.12", + "variadics_please", +] + +[[package]] +name = "bevy_mesh" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12af58280c7453e32e2f083d86eaa4c9b9d03ea8683977108ded8f1930c539f2" +dependencies = [ + "bevy_asset", + "bevy_derive", + "bevy_ecs", + "bevy_image", + "bevy_math", + "bevy_mikktspace", + "bevy_platform", + "bevy_reflect", + "bevy_transform", + "bevy_utils", + "bitflags 2.9.1", + "bytemuck", + "hexasphere 15.1.0", + "serde", + "thiserror 2.0.12", + "tracing", + "wgpu-types", +] + +[[package]] +name = "bevy_mikktspace" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75e0258423c689f764556e36b5d9eebdbf624b29a1fd5b33cd9f6c42dcc4d5f3" +dependencies = [ + "glam 0.29.3", +] + +[[package]] +name = "bevy_pbr" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9fe0de43b68bf9e5090a33efc963f125e9d3f9d97be9ebece7bcfdde1b6da80" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_core_pipeline", + "bevy_derive", + "bevy_diagnostic", + "bevy_ecs", + "bevy_image", + "bevy_math", + "bevy_platform", + "bevy_reflect", + "bevy_render", + "bevy_transform", + "bevy_utils", + "bevy_window", + "bitflags 2.9.1", + "bytemuck", + "derive_more", + "fixedbitset", + "nonmax", + "offset-allocator", + "radsort", + "smallvec", + "static_assertions", + "thiserror 2.0.12", + "tracing", +] + +[[package]] +name = "bevy_platform" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704db2c11b7bc31093df4fbbdd3769f9606a6a5287149f4b51f2680f25834ebc" +dependencies = [ + "cfg-if", + "critical-section", + "foldhash", + "getrandom 0.2.16", + "hashbrown 0.15.3", + "portable-atomic", + "portable-atomic-util", + "serde", + "spin", + "web-time", +] + +[[package]] +name = "bevy_ptr" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86f1275dfb4cfef4ffc90c3fa75408964864facf833acc932413d52aa5364ba4" + +[[package]] +name = "bevy_reflect" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "607ebacc31029cf2f39ac330eabf1d4bc411b159528ec08dbe6b0593eaccfd41" +dependencies = [ + "assert_type_match", + "bevy_platform", + "bevy_ptr", + "bevy_reflect_derive", + "bevy_utils", + "derive_more", + "disqualified", + "downcast-rs 2.0.1", + "erased-serde", + "foldhash", + "glam 0.29.3", + "serde", + "smallvec", + "smol_str", + "thiserror 2.0.12", + "uuid", + "variadics_please", + "wgpu-types", +] + +[[package]] +name = "bevy_reflect_derive" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf35e45e4eb239018369f63f2adc2107a54c329f9276d020e01eee1625b0238b" +dependencies = [ + "bevy_macro_utils", + "proc-macro2", + "quote", + "syn 2.0.101", + "uuid", +] + +[[package]] +name = "bevy_render" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85a7306235b3343b032801504f3e884b93abfb7ba58179fc555c479df509f349" +dependencies = [ + "async-channel 2.3.1", + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_derive", + "bevy_diagnostic", + "bevy_ecs", + "bevy_encase_derive", + "bevy_image", + "bevy_math", + "bevy_mesh", + "bevy_platform", + "bevy_reflect", + "bevy_render_macros", + "bevy_tasks", + "bevy_time", + "bevy_transform", + "bevy_utils", + "bevy_window", + "bitflags 2.9.1", + "bytemuck", + "codespan-reporting", + "derive_more", + "downcast-rs 2.0.1", + "encase", + "fixedbitset", + "futures-lite", + "image 0.25.6", + "indexmap 2.9.0", + "js-sys", + "naga", + "naga_oil", + "nonmax", + "offset-allocator", + "profiling", + "send_wrapper", + "serde", + "smallvec", + "thiserror 2.0.12", + "tracing", + "variadics_please", + "wasm-bindgen", + "web-sys", + "wgpu", +] + +[[package]] +name = "bevy_render_macros" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b85c4fb26b66d3a257b655485d11b9b6df9d3c85026493ba8092767a5edfc1b2" +dependencies = [ + "bevy_macro_utils", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "bevy_state" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "682c343c354b191fe6669823bce3b0695ee1ae4ac36f582e29c436a72b67cdd5" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_derive", + "bevy_ecs", + "bevy_platform", + "bevy_reflect", + "bevy_state_macros", + "bevy_utils", + "log", + "variadics_please", +] + +[[package]] +name = "bevy_state_macros" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55b4bf3970c4f0e60572901df4641656722172c222d71a80c430d36b0e31426c" +dependencies = [ + "bevy_macro_utils", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "bevy_tasks" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "444c450b65e108855f42ecb6db0c041a56ea7d7f10cc6222f0ca95e9536a7d19" +dependencies = [ + "async-channel 2.3.1", + "async-executor", + "async-task", + "atomic-waker", + "bevy_platform", + "cfg-if", + "concurrent-queue", + "crossbeam-queue", + "derive_more", + "futures-channel", + "futures-lite", + "heapless", + "pin-project", + "wasm-bindgen-futures", +] + +[[package]] +name = "bevy_time" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456369ca10f8e039aaf273332744674844827854833ee29e28f9e161702f2f55" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_derive", + "bevy_ecs", + "bevy_platform", + "bevy_reflect", + "crossbeam-channel", + "log", + "serde", +] + +[[package]] +name = "bevy_transform" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8479cdd5461246943956a7c8347e4e5d6ff857e57add889fb50eee0b5c26ab48" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_log", + "bevy_math", + "bevy_reflect", + "bevy_tasks", + "bevy_utils", + "derive_more", + "serde", + "thiserror 2.0.12", +] + +[[package]] +name = "bevy_utils" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac2da3b3c1f94dadefcbe837aaa4aa119fcea37f7bdc5307eb05b4ede1921e24" +dependencies = [ + "bevy_platform", + "thread_local", +] + +[[package]] +name = "bevy_window" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d83327cc5584da463d12b7a88ddb97f9e006828832287e1564531171fffdeb4" +dependencies = [ + "android-activity", + "bevy_app", + "bevy_ecs", + "bevy_input", + "bevy_math", + "bevy_platform", + "bevy_reflect", + "bevy_utils", + "log", + "raw-window-handle", + "serde", + "smol_str", +] + +[[package]] +name = "bevy_winit" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57b14928923ae4274f4b867dce3d0e7b2c8a31bebcb0f6e65a4261c3e0765064" +dependencies = [ + "accesskit 0.18.0", + "accesskit_winit 0.25.0", + "approx", + "bevy_a11y", + "bevy_app", + "bevy_asset", + "bevy_derive", + "bevy_ecs", + "bevy_input", + "bevy_input_focus", + "bevy_log", + "bevy_math", + "bevy_platform", + "bevy_reflect", + "bevy_tasks", + "bevy_utils", + "bevy_window", + "bytemuck", + "cfg-if", + "crossbeam-channel", + "raw-window-handle", + "tracing", + "wasm-bindgen", + "web-sys", + "wgpu-types 23.0.0", + "winit", +] + +[[package]] +name = "bifrost" +version = "0.1.0" +dependencies = [ + "bevy", + "bifrost_derive", + "byteorder", + "nalgebra", + "strum 0.27.1", + "thiserror 2.0.12", +] + +[[package]] +name = "bifrost_derive" +version = "0.1.0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bindgen" +version = "0.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" +dependencies = [ + "bitflags 2.9.1", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash 1.1.0", + "shlex", + "syn 2.0.101", +] + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec 0.6.3", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec 0.8.0", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bit_field" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +dependencies = [ + "bytemuck", + "serde", +] + +[[package]] +name = "bitstream-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" + +[[package]] +name = "blake3" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2 0.5.2", +] + +[[package]] +name = "block2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "340d2f0bdb2a43c1d3cd40513185b2bd7def0aa1052f956455114bc98f82dcf2" +dependencies = [ + "objc2 0.6.1", +] + +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel 2.3.1", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "bstr" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4" +dependencies = [ + "memchr", + "regex-automata 0.4.9", + "serde", +] + +[[package]] +name = "build_utils" +version = "0.1.0" +dependencies = [ + "cargo_toml", + "clap", + "colored 3.0.0", + "glob", + "miette", + "serde_json", + "thiserror 2.0.12", + "tokio", +] + +[[package]] +name = "built" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" + +[[package]] +name = "bumpalo" +version = "3.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" + +[[package]] +name = "byte-slice-cast" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + +[[package]] +name = "bytecount" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" + +[[package]] +name = "bytemuck" +version = "1.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "calloop" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" +dependencies = [ + "bitflags 2.9.1", + "log", + "polling", + "rustix 0.38.44", + "slab", + "thiserror 1.0.69", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" +dependencies = [ + "calloop", + "rustix 0.38.44", + "wayland-backend", + "wayland-client", +] + +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", +] + +[[package]] +name = "cargo_metadata" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "cargo_toml" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02260d489095346e5cafd04dea8e8cb54d1d74fcd759022a9b72986ebe9a1257" +dependencies = [ + "serde", + "toml", +] + +[[package]] +name = "cc" +version = "1.2.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16595d3be041c03b09d08d0858631facccee9221e579704070e6e9e4915d3bc7" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "cgl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" +dependencies = [ + "libc", +] + +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "chunked_transfer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e4de3bc4ea267985becf712dc6d9eed8b04c953b3fcfb339ebc87acd9804901" + +[[package]] +name = "clang-format" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "696283b40e1a39d208ee614b92e5f6521d16962edeb47c48372585ec92419943" +dependencies = [ + "thiserror 1.0.69", +] + +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "clap" +version = "4.5.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed93b9805f8ba930df42c2590f05453d5ec36cbb85d018868a5b24d31f6ac000" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "379026ff283facf611b0ea629334361c4211d1b12ee01024eec1591133b04120" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "clap_lex" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" + +[[package]] +name = "clean-path" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaa6b4b263a5d737e9bf6b7c09b72c41a5480aec4d7219af827f6564e950b6a5" + +[[package]] +name = "clipboard-win" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" +dependencies = [ + "error-code", +] + +[[package]] +name = "cmake" +version = "0.1.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" +dependencies = [ + "cc", +] + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width 0.1.14", +] + +[[package]] +name = "color-hex" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecdffb913a326b6c642290a0d0ec8e8d6597291acdc07cc4c9cb4b3635d44cf9" + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "colored" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" +dependencies = [ + "lazy_static", + "windows-sys 0.59.0", +] + +[[package]] +name = "colored" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fde0e0ec90c9dfb3b4b1a0891a7dcd0e2bffde2f7efed5fe7c9bb00e5bfb915e" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "comfy-table" +version = "7.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a65ebfec4fb190b6f90e944a817d60499ee0744e582530e2c9900a22e591d9a" +dependencies = [ + "crossterm", + "unicode-segmentation", + "unicode-width 0.2.0", +] + +[[package]] +name = "concat-idents" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f76990911f2267d837d9d0ad060aa63aaad170af40904b29461734c339030d4d" +dependencies = [ + "quote", + "syn 2.0.101", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", + "portable-atomic", +] + +[[package]] +name = "console" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" +dependencies = [ + "encode_unicode", + "libc", + "once_cell", + "unicode-width 0.2.0", + "windows-sys 0.59.0", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "const-fnv1a-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b13ea120a812beba79e34316b3942a857c86ec1593cb34f27bb28272ce2cca" + +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom 0.2.16", + "once_cell", + "tiny-keccak", +] + +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "const_panic" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2459fc9262a1aa204eb4b5764ad4f189caec88aea9634389c0a25f8be7f6265e" + +[[package]] +name = "const_soft_float" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ca1caa64ef4ed453e68bb3db612e51cf1b2f5b871337f0fcab1c8f87cc3dff" + +[[package]] +name = "constant_time_eq" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" + +[[package]] +name = "constgebra" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1aaf9b65849a68662ac6c0810c8893a765c960b907dd7cfab9c4a50bf764fbc" +dependencies = [ + "const_soft_float", +] + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "libc", +] + +[[package]] +name = "coreaudio-rs" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" +dependencies = [ + "bitflags 1.3.2", + "core-foundation-sys", + "coreaudio-sys", +] + +[[package]] +name = "coreaudio-sys" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ce857aa0b77d77287acc1ac3e37a05a8c95a2af3647d23b15f263bdaeb7562b" +dependencies = [ + "bindgen", +] + +[[package]] +name = "cosmic-text" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59fd57d82eb4bfe7ffa9b1cec0c05e2fd378155b47f255a67983cb4afe0e80c2" +dependencies = [ + "bitflags 2.9.0", + "fontdb", + "log", + "rangemap", + "rayon", + "rustc-hash 1.1.0", + "rustybuzz", + "self_cell", + "swash", + "sys-locale", + "ttf-parser 0.21.1", + "unicode-bidi", + "unicode-linebreak", + "unicode-script", + "unicode-segmentation", +] + +[[package]] +name = "cpal" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "873dab07c8f743075e57f524c583985fbaf745602acbe916a01539364369a779" +dependencies = [ + "alsa", + "core-foundation-sys", + "coreaudio-rs", + "dasp_sample", + "jni", + "js-sys", + "libc", + "mach2", + "ndk 0.8.0", + "ndk-context", + "oboe", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.54.0", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + +[[package]] +name = "crossbeam" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crossterm" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" +dependencies = [ + "bitflags 2.9.1", + "crossterm_winapi", + "parking_lot", + "rustix 0.38.44", + "winapi", +] + +[[package]] +name = "crossterm_winapi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +dependencies = [ + "winapi", +] + +[[package]] +name = "crunchy" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "ctrlc" +version = "3.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46f93780a459b7d656ef7f071fe699c4d3d2cb201c4b24d085b6ddc505276e73" +dependencies = [ + "nix 0.30.1", + "windows-sys 0.59.0", +] + +[[package]] +name = "cursor-icon" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.101", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.101", +] + +[[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.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" + +[[package]] +name = "deprecate-until" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a3767f826efbbe5a5ae093920b58b43b01734202be697e1354914e862e8e704" +dependencies = [ + "proc-macro2", + "quote", + "semver", + "syn 2.0.101", +] + +[[package]] +name = "deranged" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "unicode-xid", +] + +[[package]] +name = "dialoguer" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" +dependencies = [ + "console", + "shell-words", + "tempfile", + "thiserror 1.0.69", + "zeroize", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "directories" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a49173b84e034382284f27f1af4dcbbd231ffa358c0fe316541a7337f376a35" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dispatch2" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a0d569e003ff27784e0e14e4a594048698e0c0f0b66cabcb51511be55a7caa0" +dependencies = [ + "bitflags 2.9.1", + "block2 0.6.1", + "libc", + "objc2 0.6.1", +] + +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.9.1", + "objc2 0.6.1", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "disqualified" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9c272297e804878a2a4b707cfcfc6d2328b5bb936944613b4fdf2b9269afdfd" + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading", +] + +[[package]] +name = "document-features" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" +dependencies = [ + "litrs", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "downcast-rs" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea8a8b81cacc08888170eef4d13b775126db426d0b348bee9d18c2c1eaf123cf" + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" + +[[package]] +name = "earcutr" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79127ed59a85d7687c409e9978547cffb7dc79675355ed22da6b66fd5f6ead01" +dependencies = [ + "itertools 0.11.0", + "num-traits", +] + +[[package]] +name = "ecolor" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc4feb366740ded31a004a0e4452fbf84e80ef432ecf8314c485210229672fd1" +dependencies = [ + "bytemuck", + "color-hex", + "emath", + "serde", +] + +[[package]] +name = "econtext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18aade80d5e09429040243ce1143ddc08a92d7a22820ac512610410a4dd5214f" + +[[package]] +name = "eframe" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0dfe0859f3fb1bc6424c57d41e10e9093fe938f426b691e42272c2f336d915c" +dependencies = [ + "ahash", + "bytemuck", + "document-features", + "egui", + "egui-wgpu", + "egui-winit", + "egui_glow", + "glow", + "glutin", + "glutin-winit", + "home", + "image 0.25.6", + "js-sys", + "log", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", + "parking_lot", + "percent-encoding", + "pollster", + "profiling", + "raw-window-handle", + "ron", + "serde", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "web-time", + "wgpu", + "winapi", + "windows-sys 0.59.0", + "winit", +] + +[[package]] +name = "egui" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25dd34cec49ab55d85ebf70139cb1ccd29c977ef6b6ba4fe85489d6877ee9ef3" +dependencies = [ + "accesskit 0.17.1", + "ahash", + "backtrace", + "bitflags 2.9.1", + "emath", + "epaint", + "log", + "nohash-hasher", + "profiling", + "ron", + "serde", +] + +[[package]] +name = "egui-wgpu" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d319dfef570f699b6e9114e235e862a2ddcf75f0d1a061de9e1328d92146d820" +dependencies = [ + "ahash", + "bytemuck", + "document-features", + "egui", + "epaint", + "log", + "profiling", + "thiserror 1.0.69", + "type-map", + "web-time", + "wgpu", + "winit", +] + +[[package]] +name = "egui-winit" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d9dfbb78fe4eb9c3a39ad528b90ee5915c252e77bbab9d4ebc576541ab67e13" +dependencies = [ + "accesskit_winit 0.23.1", + "ahash", + "arboard", + "bytemuck", + "egui", + "log", + "profiling", + "raw-window-handle", + "serde", + "smithay-clipboard", + "web-time", + "webbrowser", + "winit", +] + +[[package]] +name = "egui_animation" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46505945185b7ec0ecfac9aee8dfc824c7ab9aeecee89a0bc3cc80d072f5f73d" +dependencies = [ + "egui", + "hello_egui_utils", + "simple-easing", +] + +[[package]] +name = "egui_commonmark" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a1e5d9a91b1b7a320c9b7f56d1878416d7c9bab3eaf337b036e0ddfabf58623" +dependencies = [ + "egui", + "egui_commonmark_backend", + "egui_extras", + "pulldown-cmark 0.12.2", +] + +[[package]] +name = "egui_commonmark_backend" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efb41b6833a6aaa99ca5c4f8e75b2410d69a7b3e30148d413f541147404a0dfa" +dependencies = [ + "egui", + "egui_extras", + "pulldown-cmark 0.12.2", +] + +[[package]] +name = "egui_dnd" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85cbf1f1f9276b83eedb1259495570b8608437270c5cc729b734530e7f20d634" +dependencies = [ + "egui", + "egui_animation", + "simple-easing", + "web-time", +] + +[[package]] +name = "egui_extras" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624659a2e972a46f4d5f646557906c55f1cd5a0836eddbe610fdf1afba1b4226" +dependencies = [ + "ahash", + "egui", + "ehttp", + "enum-map", + "image 0.25.6", + "log", + "mime_guess2", + "profiling", + "serde", +] + +[[package]] +name = "egui_glow" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "910906e3f042ea6d2378ec12a6fd07698e14ddae68aed2d819ffe944a73aab9e" +dependencies = [ + "ahash", + "bytemuck", + "egui", + "glow", + "log", + "memoffset 0.9.1", + "profiling", + "wasm-bindgen", + "web-sys", + "winit", +] + +[[package]] +name = "egui_plot" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14ae092b46ea532f6c69d3e71036fb3b688fd00fd09c2a1e43d17051a8ae43e6" +dependencies = [ + "ahash", + "egui", + "emath", +] + +[[package]] +name = "egui_table" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "448481435bd5741d1636fcd52775bef23eb25692927c8f2d06e72c0c2836b9ab" +dependencies = [ + "egui", + "serde", + "vec1", +] + +[[package]] +name = "egui_tiles" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67756b63b283a65bd0534b0c2a5fb1a12a5768bb6383d422147cc93193d09cfc" +dependencies = [ + "ahash", + "egui", + "itertools 0.13.0", + "log", + "serde", +] + +[[package]] +name = "ehttp" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59a81c221a1e4dad06cb9c9deb19aea1193a5eea084e8cd42d869068132bf876" +dependencies = [ + "document-features", + "futures-util", + "js-sys", + "ureq", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "emath" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e4cadcff7a5353ba72b7fea76bf2122b5ebdbc68e8155aa56dfdea90083fe1b" +dependencies = [ + "bytemuck", + "serde", +] + +[[package]] +name = "encase" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0a05902cf601ed11d564128448097b98ebe3c6574bd7b6a653a3d56d54aa020" +dependencies = [ + "const_panic", + "encase_derive", + "glam 0.29.3", + "thiserror 1.0.69", +] + +[[package]] +name = "encase_derive" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "181d475b694e2dd56ae919ce7699d344d1fd259292d590c723a50d1189a2ea85" +dependencies = [ + "encase_derive_impl", +] + +[[package]] +name = "encase_derive_impl" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f97b51c5cc57ef7c5f7a0c57c250251c49ee4c28f819f87ac32f4aceabc36792" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "encode_unicode" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "endi" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" + +[[package]] +name = "enum-map" +version = "2.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9" +dependencies = [ + "enum-map-derive", + "serde", +] + +[[package]] +name = "enum-map-derive" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "enumflags2" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "enumn" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "enumset" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11a6b7c3d347de0a9f7bfd2f853be43fe32fa6fac30c70f6d6d67a1e936b87ee" +dependencies = [ + "enumset_derive", +] + +[[package]] +name = "enumset_derive" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6da3ea9e1d1a3b1593e15781f930120e72aa7501610b2f82e5b6739c72e8eac5" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "env_filter" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "jiff", + "log", +] + +[[package]] +name = "epaint" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fcc0f5a7c613afd2dee5e4b30c3e6acafb8ad6f0edb06068811f708a67c562" +dependencies = [ + "ab_glyph", + "ahash", + "bytemuck", + "ecolor", + "emath", + "epaint_default_fonts", + "log", + "nohash-hasher", + "parking_lot", + "profiling", + "rayon", + "serde", +] + +[[package]] +name = "epaint_default_fonts" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7e7a64c02cf7a5b51e745a9e45f60660a286f151c238b9d397b3e923f5082f" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" +dependencies = [ + "serde", + "typeid", +] + +[[package]] +name = "errno" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "error-chain" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" +dependencies = [ + "version_check", +] + +[[package]] +name = "error-code" +version = "3.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" + +[[package]] +name = "euclid" +version = "0.22.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad9cdb4b747e485a12abb0e6566612956c7a1bafa3bdb8d682c5b6d403589e48" +dependencies = [ + "num-traits", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener 5.4.0", + "pin-project-lite", +] + +[[package]] +name = "extended" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af9673d8203fcb076b19dfd17e38b3d4ae9f44959416ea532ce72415a6020365" + +[[package]] +name = "fast-math" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2465292146cdfc2011350fe3b1c616ac83cf0faeedb33463ba1c332ed8948d66" +dependencies = [ + "ieee754", +] + +[[package]] +name = "fast_image_resize" +version = "5.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d372ab3252d8f162d858d675a3d88a8c33ba24a6238837c50c8851911c7e89cd" +dependencies = [ + "cfg-if", + "document-features", + "num-traits", + "thiserror 1.0.69", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "ffmpeg-sidecar" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57523e081f3afa5731b47829968beb2ed787fcc2ace71a055b0a93a5ea6b3ebb" +dependencies = [ + "anyhow", +] + +[[package]] +name = "filetime" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35c0522e981e68cbfa8c3f978441a5f34b30b96e146b33cd3359176b50fe8586" +dependencies = [ + "cfg-if", + "libc", + "libredox", + "windows-sys 0.59.0", +] + +[[package]] +name = "filter" +version = "0.1.0" +dependencies = [ + "nalgebra", + "plotters", + "rand 0.9.1", + "thiserror 2.0.12", +] + +[[package]] +name = "fixed" +version = "1.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707070ccf8c4173548210893a0186e29c266901b71ed20cd9e2ca0193dfe95c3" +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 = "fjadra" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1671b620ba6e60c11c62b0ea5fec4f8621991e7b1229fa13c010a2cd04e4342" + +[[package]] +name = "flatbuffers" +version = "24.12.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f1baf0dbf96932ec9a3038d57900329c015b0bfb7b63d904f3bc27e2b02a096" +dependencies = [ + "bitflags 1.3.2", + "rustc_version", +] + +[[package]] +name = "flate2" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "float_next_after" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bf7cc16383c4b8d58b9905a8509f02926ce3058053c056376248d958c9df1e8" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fsevent-sys" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2" +dependencies = [ + "libc", +] + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-lite" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "gcd" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a" + +[[package]] +name = "generator" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d18470a76cb7f8ff746cf1f7470914f900252ec36bbc40b569d74b1258446827" +dependencies = [ + "cc", + "cfg-if", + "libc", + "log", + "rustversion", + "windows 0.61.1", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "geo" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4416397671d8997e9a3e7ad99714f4f00a22e9eaa9b966a5985d2194fc9e02e1" +dependencies = [ + "earcutr", + "float_next_after", + "geo-types", + "geographiclib-rs", + "i_overlay", + "log", + "num-traits", + "robust", + "rstar", + "spade", +] + +[[package]] +name = "geo-types" +version = "0.7.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62ddb1950450d67efee2bbc5e429c68d052a822de3aad010d28b351fbb705224" +dependencies = [ + "approx", + "num-traits", + "rayon", + "rstar", + "serde", +] + +[[package]] +name = "geographiclib-rs" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f611040a2bb37eaa29a78a128d1e92a378a03e0b6e66ae27398d42b1ba9a7841" +dependencies = [ + "libm", +] + +[[package]] +name = "gethostname" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" +dependencies = [ + "libc", + "windows-targets 0.48.5", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glam" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "779ae4bf7e8421cf91c0b3b64e7e8b40b862fba4d393f59150042de7c4965a94" +dependencies = [ + "bytemuck", + "serde", +] + +[[package]] +name = "glam" +version = "0.29.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8babf46d4c1c9d92deac9f7be466f76dfc4482b6452fc5024b5e8daf6ffeb3ee" +dependencies = [ + "bytemuck", + "libm", + "mint", + "rand 0.8.5", + "serde", +] + +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gltf" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ce1918195723ce6ac74e80542c5a96a40c2b26162c1957a5cd70799b8cacf7" +dependencies = [ + "base64 0.13.1", + "byteorder", + "gltf-json", + "image 0.25.6", + "lazy_static", + "serde_json", + "urlencoding", +] + +[[package]] +name = "gltf-derive" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14070e711538afba5d6c807edb74bcb84e5dbb9211a3bf5dea0dfab5b24f4c51" +dependencies = [ + "inflections", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "gltf-json" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6176f9d60a7eab0a877e8e96548605dedbde9190a7ae1e80bbcc1c9af03ab14" +dependencies = [ + "gltf-derive", + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "glutin" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12124de845cacfebedff80e877bb37b5b75c34c5a4c89e47e1cdd67fb6041325" +dependencies = [ + "bitflags 2.9.1", + "cfg_aliases", + "cgl", + "dispatch2 0.3.0", + "glutin_egl_sys", + "glutin_glx_sys", + "glutin_wgl_sys", + "libloading", + "objc2 0.6.1", + "objc2-app-kit 0.3.1", + "objc2-core-foundation", + "objc2-foundation 0.3.1", + "once_cell", + "raw-window-handle", + "wayland-sys", + "windows-sys 0.52.0", + "x11-dl", +] + +[[package]] +name = "glutin-winit" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85edca7075f8fc728f28cb8fbb111a96c3b89e930574369e3e9c27eb75d3788f" +dependencies = [ + "cfg_aliases", + "glutin", + "raw-window-handle", + "winit", +] + +[[package]] +name = "glutin_egl_sys" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c4680ba6195f424febdc3ba46e7a42a0e58743f2edb115297b86d7f8ecc02d2" +dependencies = [ + "gl_generator", + "windows-sys 0.52.0", +] + +[[package]] +name = "glutin_glx_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7bb2938045a88b612499fbcba375a77198e01306f52272e692f8c1f3751185" +dependencies = [ + "gl_generator", + "x11-dl", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "gpu-alloc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" +dependencies = [ + "bitflags 2.9.1", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +dependencies = [ + "bitflags 2.9.1", +] + +[[package]] +name = "gpu-allocator" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" +dependencies = [ + "log", + "presser", + "thiserror 1.0.69", + "windows 0.58.0", +] + +[[package]] +name = "gpu-descriptor" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" +dependencies = [ + "bitflags 2.9.1", + "gpu-descriptor-types", + "hashbrown 0.15.3", +] + +[[package]] +name = "gpu-descriptor-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" +dependencies = [ + "bitflags 2.9.1", +] + +[[package]] +name = "guillotiere" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62d5865c036cb1393e23c50693df631d3f5d7bcca4c04fe4cc0fd592e74a782" +dependencies = [ + "euclid", + "svg_fmt", +] + +[[package]] +name = "h2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap 2.9.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" +dependencies = [ + "bytemuck", + "cfg-if", + "crunchy", + "num-traits", +] + +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", + "serde", +] + +[[package]] +name = "heapless" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" +dependencies = [ + "hash32", + "portable-atomic", + "stable_deref_trait", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "heimdall" +version = "0.1.0" +dependencies = [ + "bevy", + "bifrost", + "fast-math", + "fast_image_resize", + "itertools 0.14.0", + "linuxvideo", + "miette", + "nalgebra", + "thiserror 2.0.12", + "turbojpeg", +] + +[[package]] +name = "hello_egui_utils" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "231af567fb0427750cfd0758c9e2793f303bfcb9e061ab2db63d388db22414b9" +dependencies = [ + "concat-idents", + "eframe", + "egui", +] + +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hexasphere" +version = "14.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "344d5bf5d6b6da1020fcfd4014d44e0cc695356c603db9c774b30bd6d385ad2b" +dependencies = [ + "constgebra", + "glam 0.28.0", +] + +[[package]] +name = "hexasphere" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c9e718d32b6e6b2b32354e1b0367025efdd0b11d6a740b905ddf5db1074679" +dependencies = [ + "constgebra", + "glam 0.29.3", + "tinyvec", +] + +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-timeout" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" +dependencies = [ + "hyper", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9f1e950e0d9d1d3c47184416723cf29c0d1f93bd8cccf37e4beb6b44f31710" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "libc", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "i_float" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85df3a416829bb955fdc2416c7b73680c8dcea8d731f2c7aa23e1042fe1b8343" +dependencies = [ + "serde", +] + +[[package]] +name = "i_key_sort" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "347c253b4748a1a28baf94c9ce133b6b166f08573157e05afe718812bc599fcd" + +[[package]] +name = "i_overlay" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0542dfef184afdd42174a03dcc0625b6147fb73e1b974b1a08a2a42ac35cee49" +dependencies = [ + "i_float", + "i_key_sort", + "i_shape", + "i_tree", + "rayon", +] + +[[package]] +name = "i_shape" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a38f5a42678726718ff924f6d4a0e79b129776aeed298f71de4ceedbd091bce" +dependencies = [ + "i_float", + "serde", +] + +[[package]] +name = "i_tree" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "155181bc97d770181cf9477da51218a19ee92a8e5be642e796661aee2b601139" + +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core 0.61.2", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +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 = "ieee754" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9007da9cacbd3e6343da136e98b0d2df013f553d35bdec8b518f07bea768e19c" + +[[package]] +name = "image" +version = "0.24.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "jpeg-decoder", + "num-traits", + "png", +] + +[[package]] +name = "image" +version = "0.25.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a" +dependencies = [ + "bytemuck", + "byteorder-lite", + "color_quant", + "exr", + "gif", + "image-webp", + "num-traits", + "png", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b77d01e822461baa8409e156015a1d91735549f0f2c17691bd2d996bef238f7f" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imgref" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" + +[[package]] +name = "immutable-chunkmap" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f97096f508d54f8f8ab8957862eee2ccd628847b6217af1a335e1c44dee578" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "indent" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f1a0777d972970f204fdf8ef319f1f4f8459131636d7e3c96c5d59570d0fa6" + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +dependencies = [ + "equivalent", + "hashbrown 0.15.3", + "serde", +] + +[[package]] +name = "indicatif" +version = "0.17.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" +dependencies = [ + "console", + "number_prefix", + "portable-atomic", + "tokio", + "unicode-width 0.2.0", + "web-time", +] + +[[package]] +name = "infer" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc150e5ce2330295b8616ce0e3f53250e53af31759a9dbedad1621ba29151847" +dependencies = [ + "cfb", +] + +[[package]] +name = "inflections" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a" + +[[package]] +name = "inotify" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" +dependencies = [ + "bitflags 1.3.2", + "inotify-sys", + "libc", +] + +[[package]] +name = "inotify-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +dependencies = [ + "libc", +] + +[[package]] +name = "integer-encoding" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" + +[[package]] +name = "integer-sqrt" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" +dependencies = [ + "num-traits", +] + +[[package]] +name = "is_ci" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[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.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +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.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jiff" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a194df1107f33c79f4f93d02c80798520551949d59dfad22b6157048a88cca93" +dependencies = [ + "jiff-static", + "jiff-tzdb-platform", + "js-sys", + "log", + "portable-atomic", + "portable-atomic-util", + "serde", + "wasm-bindgen", + "windows-sys 0.59.0", +] + +[[package]] +name = "jiff-static" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c6e1db7ed32c6c71b759497fae34bf7933636f75a251b9e736555da426f6442" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "jiff-tzdb" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1283705eb0a21404d2bfd6eef2a7593d240bc42a0bdb39db0ad6fa2ec026524" + +[[package]] +name = "jiff-tzdb-platform" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" +dependencies = [ + "jiff-tzdb", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +dependencies = [ + "getrandom 0.3.3", + "libc", +] + +[[package]] +name = "jpeg-decoder" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "khronos-egl" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" +dependencies = [ + "libc", + "libloading", + "pkg-config", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[package]] +name = "kira" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a9f9dff5e262540b628b00d5e1a772270a962d6869f8695bb24832ff3b394" +dependencies = [ + "cpal", + "glam 0.29.3", + "mint", + "paste", + "ringbuf", + "send_wrapper", + "symphonia", + "triple_buffer", +] + +[[package]] +name = "kqueue" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a" +dependencies = [ + "kqueue-sys", + "libc", +] + +[[package]] +name = "kqueue-sys" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" +dependencies = [ + "bitflags 1.3.2", + "libc", +] + +[[package]] +name = "ktx2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87d65e08a9ec02e409d27a0139eaa6b9756b4d81fe7cde71f6941a83730ce838" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lebe" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" + +[[package]] +name = "lexical-core" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b765c31809609075565a70b4b71402281283aeda7ecaf4818ac14a7b2ade8958" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de6f9cb01fb0b08060209a057c048fcbab8717b4c1ecd2eac66ebfe39a65b0f2" +dependencies = [ + "lexical-parse-integer", + "lexical-util", + "static_assertions", +] + +[[package]] +name = "lexical-parse-integer" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72207aae22fc0a121ba7b6d479e42cbfea549af1479c3f3a4f12c70dd66df12e" +dependencies = [ + "lexical-util", + "static_assertions", +] + +[[package]] +name = "lexical-util" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a82e24bf537fd24c177ffbbdc6ebcc8d54732c35b50a3f28cc3f4e4c949a0b3" +dependencies = [ + "static_assertions", +] + +[[package]] +name = "lexical-write-float" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5afc668a27f460fb45a81a757b6bf2f43c2d7e30cb5a2dcd3abf294c78d62bd" +dependencies = [ + "lexical-util", + "lexical-write-integer", + "static_assertions", +] + +[[package]] +name = "lexical-write-integer" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "629ddff1a914a836fb245616a7888b62903aae58fa771e1d83943035efa0f978" +dependencies = [ + "lexical-util", + "static_assertions", +] + +[[package]] +name = "libc" +version = "0.2.172" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "libloading" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a793df0d7afeac54f95b471d3af7f0d4fb975699f972341a4b76988d49cdf0c" +dependencies = [ + "cfg-if", + "windows-targets 0.53.0", +] + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "libmimalloc-sys" +version = "0.1.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec9d6fac27761dabcd4ee73571cdb06b7022dc99089acbe5435691edffaac0f4" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.9.1", + "libc", + "redox_syscall 0.5.12", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "linuxvideo" +version = "0.3.3" +source = "git+ssh://git@github.com/IntelligentRoboticsLab/linuxvideo?rev=b8536cf4da325de79f398e70a74cee5bf426f64c#b8536cf4da325de79f398e70a74cee5bf426f64c" +dependencies = [ + "bitflags 1.3.2", + "log", + "nix 0.26.4", +] + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[package]] +name = "litrs" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" + +[[package]] +name = "local-ip-address" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "656b3b27f8893f7bbf9485148ff9a65f019e3f33bd5cdc87c83cab16b3fd9ec8" +dependencies = [ + "libc", + "neli", + "thiserror 2.0.12", + "windows-sys 0.59.0", +] + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", + "serde", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +dependencies = [ + "value-bag", +] + +[[package]] +name = "log-once" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d8a05e3879b317b1b6dbf353e5bba7062bedcc59815267bb23eaa0c576cebf0" +dependencies = [ + "log", +] + +[[package]] +name = "loom" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + +[[package]] +name = "lstsq" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0767b5d1bcb5c7a99647520963706322bdabd5e5ba18530fd9c9c02ab04029e" +dependencies = [ + "nalgebra", +] + +[[package]] +name = "lz4_flex" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75761162ae2b0e580d7e7c390558127e5f01b4194debd6221fd8c207fc80e3f5" +dependencies = [ + "twox-hash", +] + +[[package]] +name = "mach2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" +dependencies = [ + "libc", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "matrixmultiply" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" +dependencies = [ + "autocfg", + "rawpointer", +] + +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memmap2" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memory-stats" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c73f5c649995a115e1a0220b35e4df0a1294500477f97a91d0660fb5abeb574a" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "metal" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f569fb946490b5743ad69813cb19629130ce9374034abe31614a36402d18f99e" +dependencies = [ + "bitflags 2.9.1", + "block", + "core-graphics-types", + "foreign-types", + "log", + "objc", + "paste", +] + +[[package]] +name = "miette" +version = "7.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f98efec8807c63c752b5bd61f862c165c115b0a35685bdcfd9238c7aeb592b7" +dependencies = [ + "backtrace", + "backtrace-ext", + "cfg-if", + "miette-derive", + "owo-colors", + "supports-color", + "supports-hyperlinks", + "supports-unicode", + "terminal_size", + "textwrap", + "unicode-width 0.1.14", +] + +[[package]] +name = "miette-derive" +version = "7.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "mimalloc" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "995942f432bbb4822a7e9c3faa87a695185b0d09273ba85f097b54f4e458f2af" +dependencies = [ + "libmimalloc-sys", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess2" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1706dc14a2e140dec0a7a07109d9a3d5890b81e85bd6c60b906b249a77adf0ca" +dependencies = [ + "mime", + "phf", + "phf_shared", + "unicase", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mint" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e53debba6bda7a793e5f99b8dacf19e626084f525f7829104ba9898f367d85ff" + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "log", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.48.0", +] + +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.59.0", +] + +[[package]] +name = "ml" +version = "0.1.0" +dependencies = [ + "bevy", + "fast_image_resize", + "itertools 0.14.0", + "miette", + "ndarray", + "openvino", + "tasks", + "thiserror 2.0.12", + "variadics_please", +] + +[[package]] +name = "naga" +version = "24.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e380993072e52eef724eddfcde0ed013b0c023c3f0417336ed041aa9f076994e" +dependencies = [ + "arrayvec", + "bit-set 0.8.0", + "bitflags 2.9.1", + "cfg_aliases", + "codespan-reporting", + "hexf-parse", + "indexmap 2.9.0", + "log", + "pp-rs", + "rustc-hash 1.1.0", + "spirv", + "strum 0.26.3", + "termcolor", + "thiserror 2.0.12", + "unicode-xid", +] + +[[package]] +name = "naga_oil" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2464f7395decfd16bb4c33fb0cb3b2c645cc60d051bc7fb652d3720bfb20f18" +dependencies = [ + "bit-set 0.5.3", + "codespan-reporting", + "data-encoding", + "indexmap 2.9.0", + "naga", + "once_cell", + "regex", + "regex-syntax 0.8.5", + "rustc-hash 1.1.0", + "thiserror 1.0.69", + "tracing", + "unicode-ident", +] + +[[package]] +name = "nalgebra" +version = "0.33.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26aecdf64b707efd1310e3544d709c5c0ac61c13756046aaaba41be5c4f66a3b" +dependencies = [ + "approx", + "glam 0.28.0", + "glam 0.29.3", + "matrixmultiply", + "nalgebra-macros", + "num-complex", + "num-rational", + "num-traits", + "serde", + "simba", + "typenum", +] + +[[package]] +name = "nalgebra-macros" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "nasm-rs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12fcfa1bd49e0342ec1d07ed2be83b59963e7acbeb9310e1bb2c07b69dadd959" +dependencies = [ + "jobserver", +] + +[[package]] +name = "natord" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308d96db8debc727c3fd9744aac51751243420e46edf401010908da7f8d5e57c" + +[[package]] +name = "ndarray" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "882ed72dce9365842bf196bdeedf5055305f11fc8c03dee7bb0194a6cad34841" +dependencies = [ + "matrixmultiply", + "num-complex", + "num-integer", + "num-traits", + "portable-atomic", + "portable-atomic-util", + "rawpointer", +] + +[[package]] +name = "ndk" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" +dependencies = [ + "bitflags 2.9.1", + "jni-sys", + "log", + "ndk-sys 0.5.0+25.2.9519653", + "num_enum", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.9.1", + "jni-sys", + "log", + "ndk-sys 0.6.0+11769913", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.5.0+25.2.9519653" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "neli" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93062a0dce6da2517ea35f301dfc88184ce18d3601ec786a727a87bf535deca9" +dependencies = [ + "byteorder", + "libc", + "log", + "neli-proc-macros", +] + +[[package]] +name = "neli-proc-macros" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c8034b7fbb6f9455b2a96c19e6edf8dc9fc34c70449938d8ee3b4df363f61fe" +dependencies = [ + "either", + "proc-macro2", + "quote", + "serde", + "syn 1.0.109", +] + +[[package]] +name = "never" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96aba5aa877601bb3f6dd6a63a969e1f82e60646e81e71b14496995e9853c91" + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nidhogg" +version = "0.1.0" +dependencies = [ + "bevy", + "miette", + "nalgebra", + "nidhogg_derive", + "num", + "rmp-serde", + "serde", + "thiserror 2.0.12", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "nidhogg_derive" +version = "0.4.0" +dependencies = [ + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.7.1", + "pin-utils", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.9.1", + "cfg-if", + "cfg_aliases", + "libc", + "memoffset 0.9.1", +] + +[[package]] +name = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags 2.9.1", + "cfg-if", + "cfg_aliases", + "libc", + "memoffset 0.9.1", +] + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nonmax" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" + +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + +[[package]] +name = "notify" +version = "6.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" +dependencies = [ + "bitflags 2.9.1", + "crossbeam-channel", + "filetime", + "fsevent-sys", + "inotify", + "kqueue", + "libc", + "log", + "mio 0.8.11", + "walkdir", + "windows-sys 0.48.0", +] + +[[package]] +name = "ntapi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +dependencies = [ + "winapi", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[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-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", + "serde", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[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-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", + "serde", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "num_threads" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" +dependencies = [ + "libc", +] + +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.9.1", + "block2 0.5.1", + "libc", + "objc2 0.5.2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation 0.2.2", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" +dependencies = [ + "bitflags 2.9.1", + "block2 0.6.1", + "objc2 0.6.1", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation 0.3.1", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +dependencies = [ + "bitflags 2.9.1", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-core-location", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.9.1", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" +dependencies = [ + "bitflags 2.9.1", + "dispatch2 0.3.0", + "objc2 0.6.1", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" +dependencies = [ + "bitflags 2.9.1", + "dispatch2 0.3.0", + "objc2 0.6.1", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal", +] + +[[package]] +name = "objc2-core-location" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-contacts", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.9.1", + "block2 0.5.1", + "dispatch", + "libc", + "objc2 0.5.2", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" +dependencies = [ + "bitflags 2.9.1", + "objc2 0.6.1", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" +dependencies = [ + "bitflags 2.9.1", + "objc2 0.6.1", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.9.1", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.9.1", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal", +] + +[[package]] +name = "objc2-symbols" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +dependencies = [ + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +dependencies = [ + "bitflags 2.9.1", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-image", + "objc2-core-location", + "objc2-foundation 0.2.2", + "objc2-link-presentation", + "objc2-quartz-core", + "objc2-symbols", + "objc2-uniform-type-identifiers", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-uniform-type-identifiers" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.9.1", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-core-location", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "oboe" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8b61bebd49e5d43f5f8cc7ee2891c16e0f41ec7954d36bcb6c14c5e0de867fb" +dependencies = [ + "jni", + "ndk 0.8.0", + "ndk-context", + "num-derive", + "num-traits", + "oboe-sys", +] + +[[package]] +name = "oboe-sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8bb09a4a2b1d668170cfe0a7d5bc103f8999fb316c98099b6a9939c9f2e79d" +dependencies = [ + "cc", +] + +[[package]] +name = "odal" +version = "0.1.0" +dependencies = [ + "miette", + "serde", + "thiserror 2.0.12", + "toml", +] + +[[package]] +name = "offset-allocator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e234d535da3521eb95106f40f0b73483d80bfb3aacf27c40d7e2b72f1a3e00a2" +dependencies = [ + "log", + "nonmax", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openvino" +version = "0.9.0" +source = "git+https://github.com/Rickvanderveen/openvino-rs.git?rev=eef188a4f0fd52020bfe95822ead35f37ee4efaf#eef188a4f0fd52020bfe95822ead35f37ee4efaf" +dependencies = [ + "openvino-finder", + "openvino-sys", +] + +[[package]] +name = "openvino-finder" +version = "0.9.0" +source = "git+https://github.com/Rickvanderveen/openvino-rs.git?rev=eef188a4f0fd52020bfe95822ead35f37ee4efaf#eef188a4f0fd52020bfe95822ead35f37ee4efaf" +dependencies = [ + "cfg-if", + "log", +] + +[[package]] +name = "openvino-sys" +version = "0.9.0" +source = "git+https://github.com/Rickvanderveen/openvino-rs.git?rev=eef188a4f0fd52020bfe95822ead35f37ee4efaf#eef188a4f0fd52020bfe95822ead35f37ee4efaf" +dependencies = [ + "env_logger", + "libloading", + "once_cell", + "openvino-finder", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "orbclient" +version = "0.3.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" +dependencies = [ + "libredox", +] + +[[package]] +name = "ordered-float" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" +dependencies = [ + "num-traits", +] + +[[package]] +name = "ordered-float" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" +dependencies = [ + "num-traits", +] + +[[package]] +name = "ordered-float" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2c1f9f56e534ac6a9b8a4600bdf0f530fb393b5f393e7b4d03489c3cf0c3f01" +dependencies = [ + "num-traits", +] + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "owned_ttf_parser" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" +dependencies = [ + "ttf-parser 0.25.1", +] + +[[package]] +name = "owo-colors" +version = "4.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26995317201fa17f3656c36716aed4a7c81743a9634ac4c99c0eeda495db0cec" + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.12", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "parquet" +version = "54.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfb15796ac6f56b429fd99e33ba133783ad75b27c36b4b5ce06f1f82cc97754e" +dependencies = [ + "ahash", + "arrow-array", + "arrow-buffer", + "arrow-cast", + "arrow-data", + "arrow-ipc", + "arrow-schema", + "arrow-select", + "base64 0.22.1", + "bytes", + "chrono", + "half", + "hashbrown 0.15.3", + "num", + "num-bigint", + "paste", + "seq-macro", + "snap", + "thrift", + "twox-hash", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + +[[package]] +name = "pathfinding" +version = "4.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ac35caa284c08f3721fb33c2741b5f763decaf42d080c8a6a722154347017e" +dependencies = [ + "deprecate-until", + "indexmap 2.9.0", + "integer-sqrt", + "num-traits", + "rustc-hash 2.1.1", + "thiserror 2.0.12", +] + +[[package]] +name = "peg" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f76678828272f177ac33b7e2ac2e3e73cc6c1cd1e3e387928aa69562fa51367" +dependencies = [ + "peg-macros", + "peg-runtime", +] + +[[package]] +name = "peg-macros" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "636d60acf97633e48d266d7415a9355d4389cea327a193f87df395d88cd2b14d" +dependencies = [ + "peg-runtime", + "proc-macro2", + "quote", +] + +[[package]] +name = "peg-runtime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9555b1514d2d99d78150d3c799d4c357a3e2c2a8062cd108e93a06d9057629c5" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "petgraph" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a98c6720655620a521dcc722d0ad66cd8afd5d86e34a89ef691c50b7b24de06" +dependencies = [ + "fixedbitset", + "hashbrown 0.15.3", + "indexmap 2.9.0", + "serde", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.101", + "unicase", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", + "unicase", +] + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plotters" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" +dependencies = [ + "num-traits", + "plotters-backend", + "plotters-bitmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "plotters-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" + +[[package]] +name = "plotters-bitmap" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ce181e3f6bf82d6c1dc569103ca7b1bd964c60ba03d7e6cdfbb3e3eb7f7405" +dependencies = [ + "image 0.24.9", + "plotters-backend", +] + +[[package]] +name = "ply-rs" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbadf9cb4a79d516de4c64806fe64ffbd8161d1ac685d000be789fb628b88963" +dependencies = [ + "byteorder", + "linked-hash-map", + "peg", + "skeptic", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "poll-promise" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6a58fecbf9da8965bcdb20ce4fd29788d1acee68ddbb64f0ba1b81bccdb7df" +dependencies = [ + "document-features", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", +] + +[[package]] +name = "polling" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix 0.38.44", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "pollster" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" + +[[package]] +name = "portable-atomic" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e" + +[[package]] +name = "portable-atomic-util" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "potential_utf" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "pp-rs" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb458bb7f6e250e6eb79d5026badc10a3ebb8f9a15d1fff0f13d17c71f4d6dee" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy 0.8.25", +] + +[[package]] +name = "presser" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" + +[[package]] +name = "prettyplease" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" +dependencies = [ + "proc-macro2", + "syn 2.0.101", +] + +[[package]] +name = "primal-check" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc0d895b311e3af9902528fbb8f928688abbd95872819320517cc24ca6b2bd08" +dependencies = [ + "num-integer", +] + +[[package]] +name = "proc-macro-crate" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" +dependencies = [ + "profiling-procmacros", + "puffin", + "tracing", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" +dependencies = [ + "quote", + "syn 2.0.101", +] + +[[package]] +name = "prost" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "prost-types" +version = "0.13.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" +dependencies = [ + "prost", +] + +[[package]] +name = "puffin" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa9dae7b05c02ec1a6bc9bcf20d8bc64a7dcbf57934107902a872014899b741f" +dependencies = [ + "anyhow", + "bincode", + "byteorder", + "cfg-if", + "itertools 0.10.5", + "lz4_flex", + "once_cell", + "parking_lot", + "serde", +] + +[[package]] +name = "puffin_http" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "739a3c7f56604713b553d7addd7718c226e88d598979ae3450320800bd0e9810" +dependencies = [ + "anyhow", + "crossbeam-channel", + "log", + "parking_lot", + "puffin", +] + +[[package]] +name = "pulldown-cmark" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" +dependencies = [ + "bitflags 2.9.1", + "memchr", + "unicase", +] + +[[package]] +name = "pulldown-cmark" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f86ba2052aebccc42cbbb3ed234b8b13ce76f75c3551a303cb2bcffcff12bb14" +dependencies = [ + "bitflags 2.9.1", + "memchr", + "unicase", +] + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + +[[package]] +name = "quick-xml" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quick-xml" +version = "0.37.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + +[[package]] +name = "radsort" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "019b4b213425016d7d84a153c4c73afb0946fbb4840e4eece7ba8848b9d6da22" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.3", +] + +[[package]] +name = "rand_distr" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "range-alloc" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" + +[[package]] +name = "rangemap" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" + +[[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools 0.12.1", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand", + "rand_chacha", + "simd_helpers", + "system-deps", + "thiserror 1.0.69", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + +[[package]] +name = "raw-cpuid" +version = "11.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6df7ab838ed27997ba19a4664507e6f82b41fe6e20be42929332156e5e85146" +dependencies = [ + "bitflags 2.9.1", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "re_analytics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d3009a0d4a33c1b5a972661ed1f58ed8af4755f7f0ee0f1b26b2f62b0d3eb86" +dependencies = [ + "crossbeam", + "directories", + "ehttp", + "re_build_info", + "re_build_tools", + "re_log", + "serde", + "serde_json", + "sha2", + "thiserror 1.0.69", + "time", + "url", + "uuid", + "web-sys", +] + +[[package]] +name = "re_arrow_util" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a46ccdd58409e0f1ed8303aac523b46d014587b85cfb9bc22db475ebacd0429f" +dependencies = [ + "anyhow", + "arrow", + "half", + "itertools 0.14.0", + "re_log", + "re_tracing", +] + +[[package]] +name = "re_blueprint_tree" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5c4075259c004ed65fec87f45be6b319193736cb65c25e0ad8b525e4cb4f17c" +dependencies = [ + "egui", + "egui_tiles", + "itertools 0.14.0", + "re_context_menu", + "re_data_ui", + "re_entity_db", + "re_log", + "re_log_types", + "re_tracing", + "re_types", + "re_ui", + "re_viewer_context", + "re_viewport_blueprint", + "smallvec", +] + +[[package]] +name = "re_build_info" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05afdb561ac1bc64adf5abd3c48585976d367c61cac418fdfe05d9c216fc8342" +dependencies = [ + "re_byte_size", + "serde", +] + +[[package]] +name = "re_build_tools" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e63b110809fd7706d348ced4367454c4f543bab148213c2e449d5a458c032d7" +dependencies = [ + "anyhow", + "cargo_metadata 0.18.1", + "glob", + "sha2", + "time", + "unindent", + "walkdir", +] + +[[package]] +name = "re_byte_size" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f10d7fb5832ae7b40ab2de1e1136b5b684bbdafd2db98e5e887b54942ec8c4e5" +dependencies = [ + "arrow", + "half", + "smallvec", +] + +[[package]] +name = "re_capabilities" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d613b968dba3e1242fa387b0d48b711558e64f688d1e8639f2562f721269ceae" +dependencies = [ + "document-features", + "egui", + "static_assertions", +] + +[[package]] +name = "re_case" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8656ca155b93aa52cc012e5776139618adcd1dd6125cb1b6c174b53f80977fe2" +dependencies = [ + "convert_case", +] + +[[package]] +name = "re_chunk" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d90dcdfcf47104c91d8d313955e4422c90af12615ac4d1ebcdc688b47ec674" +dependencies = [ + "ahash", + "anyhow", + "arrow", + "bytemuck", + "crossbeam", + "document-features", + "half", + "itertools 0.14.0", + "nohash-hasher", + "rand 0.8.5", + "re_arrow_util", + "re_byte_size", + "re_error", + "re_format", + "re_format_arrow", + "re_log", + "re_log_types", + "re_sorbet", + "re_tracing", + "re_tuid", + "re_types_core", + "similar-asserts", + "thiserror 1.0.69", +] + +[[package]] +name = "re_chunk_store" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e55c95fd089e622cb46ed1045e8bdaef371c8099ac1c6976361a21aa942eff" +dependencies = [ + "ahash", + "anyhow", + "arrow", + "document-features", + "indent", + "itertools 0.14.0", + "nohash-hasher", + "once_cell", + "parking_lot", + "re_arrow_util", + "re_byte_size", + "re_chunk", + "re_format", + "re_log", + "re_log_encoding", + "re_log_types", + "re_protos", + "re_sorbet", + "re_tracing", + "re_types_core", + "tap", + "thiserror 1.0.69", + "web-time", +] + +[[package]] +name = "re_chunk_store_ui" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdf77dea95284a8ebb00a709ef99f25259cd8d6ed7a7fe66a89e6e79b9b70b31" +dependencies = [ + "arrow", + "egui", + "egui_extras", + "itertools 0.14.0", + "re_byte_size", + "re_chunk_store", + "re_format", + "re_log_types", + "re_types", + "re_ui", + "re_viewer_context", +] + +[[package]] +name = "re_component_ui" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2645bdd146f30def127842f5f09a3a950e156d4f2af42d21c6bae4d263642cec" +dependencies = [ + "arrow", + "egui", + "egui_extras", + "egui_plot", + "re_data_ui", + "re_format", + "re_log_types", + "re_tracing", + "re_types", + "re_types_core", + "re_ui", + "re_viewer_context", +] + +[[package]] +name = "re_context_menu" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6caa1f59e80e1186a685009d9f483295c85bcc54f000ad6e8f5b6cb467d4f53" +dependencies = [ + "egui", + "egui_tiles", + "itertools 0.14.0", + "nohash-hasher", + "once_cell", + "re_entity_db", + "re_log", + "re_log_types", + "re_smart_channel", + "re_tracing", + "re_types", + "re_ui", + "re_uri", + "re_viewer_context", + "re_viewport_blueprint", + "static_assertions", +] + +[[package]] +name = "re_control" +version = "0.12.0" +dependencies = [ + "bifrost", + "build_utils", + "clap", + "heimdall", + "miette", + "mimalloc", + "nalgebra", + "re_control_comms", + "re_crash_handler", + "rerun", + "sindri", + "strum 0.27.1", + "thiserror 2.0.12", + "tokio", + "tracing", +] + +[[package]] +name = "re_control_comms" +version = "0.1.0" +dependencies = [ + "async-std", + "bevy", + "bifrost", + "futures", + "heimdall", + "miette", + "nalgebra", + "socket2", + "tokio", + "tracing", +] + +[[package]] +name = "re_crash_handler" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5f499c760b1ba5b85ff15e70293c0946a03833bdf3ba3e2e359fb3527db3a2a" +dependencies = [ + "backtrace", + "econtext", + "itertools 0.14.0", + "libc", + "parking_lot", + "re_analytics", + "re_build_info", +] + +[[package]] +name = "re_data_loader" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa80ff52ff0ec30cb60b987ebfc54c26b4b9f9a6ff743eaea8f51461f0880c1" +dependencies = [ + "ahash", + "anyhow", + "arrow", + "crossbeam", + "image 0.25.6", + "itertools 0.14.0", + "notify", + "once_cell", + "parking_lot", + "parquet", + "rayon", + "re_arrow_util", + "re_build_info", + "re_chunk", + "re_crash_handler", + "re_log", + "re_log_encoding", + "re_log_types", + "re_smart_channel", + "re_tracing", + "re_types", + "serde", + "serde_json", + "thiserror 1.0.69", + "walkdir", +] + +[[package]] +name = "re_data_source" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80470b3433d216bbcc071102e87b57693a118a4392b8d2c16726daaa6d69fdf5" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "rayon", + "re_build_tools", + "re_data_loader", + "re_error", + "re_grpc_client", + "re_log", + "re_log_encoding", + "re_log_types", + "re_smart_channel", + "re_tracing", + "re_uri", + "tokio", + "wasm-bindgen-futures", +] + +[[package]] +name = "re_data_ui" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a01a35abe9db73be47822150c843efe309fb736d2acbbedbf9057b0cd67d83" +dependencies = [ + "ahash", + "anyhow", + "bytemuck", + "egui", + "egui_extras", + "egui_plot", + "itertools 0.14.0", + "nohash-hasher", + "re_byte_size", + "re_capabilities", + "re_chunk_store", + "re_entity_db", + "re_format", + "re_log", + "re_log_types", + "re_renderer", + "re_smart_channel", + "re_tracing", + "re_types", + "re_types_core", + "re_ui", + "re_video", + "re_viewer_context", + "rexif", + "unindent", +] + +[[package]] +name = "re_dataframe" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c627a7cd70237dc2346b82da8e34db5f3de9a755208bdbcbb8178902528367" +dependencies = [ + "anyhow", + "arrow", + "itertools 0.14.0", + "nohash-hasher", + "rayon", + "re_arrow_util", + "re_chunk", + "re_chunk_store", + "re_format_arrow", + "re_log", + "re_log_types", + "re_query", + "re_sorbet", + "re_tracing", + "re_types_core", +] + +[[package]] +name = "re_dataframe_ui" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d8f8b483243e072667d447a846380e0b69c333bbec38b0545aa1515a7511bf" +dependencies = [ + "ahash", + "arrow", + "egui", + "egui_dnd", + "re_arrow_util", + "re_chunk_store", + "re_dataframe", + "re_log_types", + "re_sorbet", + "re_tracing", + "re_types", + "re_types_core", + "re_ui", + "re_viewer_context", + "serde", + "thiserror 1.0.69", +] + +[[package]] +name = "re_entity_db" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3793d1a3d46195682132da25057e71edc53485272defff94a2e57d9946628cbf" +dependencies = [ + "ahash", + "document-features", + "emath", + "itertools 0.14.0", + "nohash-hasher", + "parking_lot", + "re_build_info", + "re_byte_size", + "re_chunk", + "re_chunk_store", + "re_format", + "re_int_histogram", + "re_log", + "re_log_encoding", + "re_log_types", + "re_query", + "re_smart_channel", + "re_tracing", + "re_types_core", + "serde", + "thiserror 1.0.69", + "web-time", +] + +[[package]] +name = "re_error" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "541038233b8815aebec059bf257dddedec5589af8f8b5dbb0cae898496f0dca1" + +[[package]] +name = "re_format" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2116166c8639ada4385f7b5da8d0cf78a4aed23d9ef059a2efcc8d83440dbb55" +dependencies = [ + "num-traits", +] + +[[package]] +name = "re_format_arrow" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b2d59084af87fb7fb2de608a69969e16094c79148c5261ef06ced93bfb3eb8" +dependencies = [ + "arrow", + "comfy-table", + "itertools 0.14.0", + "re_arrow_util", + "re_tuid", + "re_types_core", + "serde_json", +] + +[[package]] +name = "re_grpc_client" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ec52a44dc780937a1974812e5487caffd89543af3f43904f0dd28734aab05b" +dependencies = [ + "async-stream", + "re_chunk", + "re_error", + "re_log", + "re_log_encoding", + "re_log_types", + "re_protos", + "re_smart_channel", + "re_sorbet", + "re_uri", + "thiserror 1.0.69", + "tokio", + "tokio-stream", + "tonic", + "tonic-web-wasm-client", + "url", + "wasm-bindgen-futures", +] + +[[package]] +name = "re_grpc_server" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5341dde79c171736a8d55bd8e58ea4b9d8793b17141d47c902d730eeb7368c" +dependencies = [ + "anyhow", + "crossbeam", + "parking_lot", + "re_build_info", + "re_byte_size", + "re_chunk", + "re_format", + "re_log", + "re_log_encoding", + "re_log_types", + "re_memory", + "re_protos", + "re_smart_channel", + "re_tracing", + "re_types", + "re_uri", + "tokio", + "tokio-stream", + "tokio-util", + "tonic", + "tonic-web", + "tower-http", +] + +[[package]] +name = "re_int_histogram" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae2c45160fe2314d2bd4ff7a81bdd5a089b9984002e8423be69af6bc28ac327" +dependencies = [ + "smallvec", + "static_assertions", +] + +[[package]] +name = "re_log" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b735681453f801fd05b9d3d57e86a253a77e742ec674be06ead3af1fff2bd79" +dependencies = [ + "env_filter", + "env_logger", + "js-sys", + "log", + "log-once", + "parking_lot", + "tracing", + "wasm-bindgen", +] + +[[package]] +name = "re_log_encoding" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e09448f032ba972d4ed04617c255925a28f820623c9280cca50b1aeefd1eef" +dependencies = [ + "arrow", + "bytes", + "ehttp", + "js-sys", + "lz4_flex", + "parking_lot", + "re_build_info", + "re_chunk", + "re_log", + "re_log_types", + "re_protos", + "re_smart_channel", + "re_tracing", + "rmp-serde", + "serde", + "serde_bytes", + "thiserror 1.0.69", + "tokio", + "tokio-stream", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "web-time", +] + +[[package]] +name = "re_log_types" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e04f26c33ff11c87cfb2def7832f56191e0381446b7e6ec537d914727843c90" +dependencies = [ + "ahash", + "arrow", + "backtrace", + "bytemuck", + "clean-path", + "document-features", + "fixed", + "half", + "itertools 0.14.0", + "jiff", + "natord", + "nohash-hasher", + "num-derive", + "num-traits", + "re_arrow_util", + "re_build_info", + "re_byte_size", + "re_format", + "re_log", + "re_string_interner", + "re_tracing", + "re_tuid", + "re_types_core", + "serde", + "static_assertions", + "thiserror 1.0.69", + "typenum", + "uuid", + "web-time", +] + +[[package]] +name = "re_math" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "999db5029a2879efeddb538f2e486aabf33adf7a0b3708c6df5c1cae13b3af49" +dependencies = [ + "glam 0.28.0", + "serde", +] + +[[package]] +name = "re_memory" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40d8847aebe627990c324e52aecf53d2260c0a0be1d320029830c9d5e40242ac" +dependencies = [ + "ahash", + "backtrace", + "emath", + "itertools 0.14.0", + "memory-stats", + "nohash-hasher", + "once_cell", + "parking_lot", + "re_format", + "re_log", + "re_tracing", + "smallvec", + "sysinfo", + "wasm-bindgen", + "web-time", +] + +[[package]] +name = "re_mp4" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "751650322999417b64a5a89b034b4e34e4596826e5dfee9327856db77ca511e3" +dependencies = [ + "byteorder", + "bytes", + "num-rational", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "re_protos" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ae6dfedbff126ecc8557c3d71d2d108361fac3ac0c3407dfe1b7f4cb2dab79a" +dependencies = [ + "arrow", + "jiff", + "prost", + "prost-types", + "re_build_info", + "re_byte_size", + "re_chunk", + "re_log_types", + "re_sorbet", + "re_tuid", + "serde", + "thiserror 1.0.69", + "tonic", + "url", +] + +[[package]] +name = "re_query" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7ef4c0e8c859bc2224f017f2f9239119d24034e64c0b335013c98980bf1d23d" +dependencies = [ + "ahash", + "anyhow", + "arrow", + "backtrace", + "indent", + "itertools 0.14.0", + "nohash-hasher", + "parking_lot", + "paste", + "re_arrow_util", + "re_byte_size", + "re_chunk", + "re_chunk_store", + "re_error", + "re_format", + "re_log", + "re_log_types", + "re_tracing", + "re_types_core", + "seq-macro", + "thiserror 1.0.69", +] + +[[package]] +name = "re_rav1d" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5eb64c43c68024d96d99d52ef0525030d17bdcc6a6b4ddba048ec8f713c91fc" +dependencies = [ + "assert_matches", + "atomig", + "av-data", + "bitflags 2.9.1", + "cc", + "cfg-if", + "libc", + "nasm-rs", + "parking_lot", + "paste", + "raw-cpuid", + "static_assertions", + "strum 0.26.3", + "to_method", + "zerocopy 0.7.35", +] + +[[package]] +name = "re_redap_browser" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625f9ab8ddc234256db103dcb127245a18441af63ecf165823e80ae57b7dc49d" +dependencies = [ + "ahash", + "arrow", + "egui", + "egui_table", + "itertools 0.14.0", + "once_cell", + "re_arrow_util", + "re_data_ui", + "re_dataframe_ui", + "re_grpc_client", + "re_log", + "re_log_encoding", + "re_log_types", + "re_protos", + "re_smart_channel", + "re_sorbet", + "re_types", + "re_types_core", + "re_ui", + "re_uri", + "re_viewer_context", + "serde", + "thiserror 1.0.69", + "tokio-stream", + "tonic", + "url", +] + +[[package]] +name = "re_renderer" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aadff9899749013585ff7da162403303a8cc18723f6e6f73462148a0313c765f" +dependencies = [ + "ahash", + "anyhow", + "bitflags 2.9.1", + "bytemuck", + "cfg-if", + "cfg_aliases", + "clean-path", + "crossbeam", + "document-features", + "ecolor", + "enumset", + "getrandom 0.2.16", + "glam 0.28.0", + "gltf", + "half", + "itertools 0.14.0", + "js-sys", + "never", + "notify", + "ordered-float 4.6.0", + "parking_lot", + "pathdiff", + "profiling", + "re_build_tools", + "re_error", + "re_log", + "re_math", + "re_tracing", + "re_video", + "serde", + "slotmap", + "smallvec", + "static_assertions", + "thiserror 1.0.69", + "tinystl", + "tobj", + "type-map", + "walkdir", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "web-time", + "wgpu", +] + +[[package]] +name = "re_sdk" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0265781513820aa2620d04fb7a6b49567bbd6e63ca86d616c921b89d70adbb6" +dependencies = [ + "ahash", + "const_format", + "crossbeam", + "document-features", + "itertools 0.14.0", + "libc", + "nohash-hasher", + "once_cell", + "parking_lot", + "percent-encoding", + "re_build_info", + "re_build_tools", + "re_byte_size", + "re_chunk", + "re_grpc_client", + "re_grpc_server", + "re_log", + "re_log_encoding", + "re_log_types", + "re_memory", + "re_smart_channel", + "re_types", + "re_uri", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "re_selection_panel" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0abadd067175d31a29ba93df2238e0e190acaf05f3eaf4467e620d1312b79237" +dependencies = [ + "arrow", + "egui", + "egui_tiles", + "itertools 0.14.0", + "nohash-hasher", + "re_case", + "re_chunk", + "re_chunk_store", + "re_context_menu", + "re_data_ui", + "re_entity_db", + "re_format", + "re_log", + "re_log_types", + "re_tracing", + "re_types", + "re_types_core", + "re_ui", + "re_view", + "re_viewer_context", + "re_viewport_blueprint", + "serde", + "smallvec", + "static_assertions", +] + +[[package]] +name = "re_smart_channel" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4edd696f576dfa2bc64b84b965c4e9fe69f0bd2288b1dd741fa80ddfaa84bae5" +dependencies = [ + "crossbeam", + "parking_lot", + "re_tracing", + "re_uri", + "serde", + "web-time", +] + +[[package]] +name = "re_sorbet" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30e4aec69da9ac5c398a8ad38c417ebefd978038ff0257d35f54abc5d4d32c71" +dependencies = [ + "arrow", + "itertools 0.14.0", + "nohash-hasher", + "re_arrow_util", + "re_format_arrow", + "re_log", + "re_log_types", + "re_tracing", + "re_tuid", + "re_types_core", + "thiserror 1.0.69", +] + +[[package]] +name = "re_string_interner" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7844c02fe3825b6423dabe1677c086240d4374f2009e6cce9b32d363e3e11db5" +dependencies = [ + "ahash", + "nohash-hasher", + "once_cell", + "parking_lot", + "serde", + "static_assertions", +] + +[[package]] +name = "re_time_panel" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "919eb4c4274c0dc479fa22856867c902e920bf019a94b3221cc32d0f2421e356" +dependencies = [ + "egui", + "itertools 0.14.0", + "nohash-hasher", + "once_cell", + "re_chunk_store", + "re_context_menu", + "re_data_ui", + "re_entity_db", + "re_format", + "re_int_histogram", + "re_log", + "re_log_types", + "re_tracing", + "re_types", + "re_types_core", + "re_ui", + "re_viewer_context", + "re_viewport_blueprint", + "serde", + "smallvec", + "vec1", +] + +[[package]] +name = "re_tracing" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaccafe50a31e369e525d23dd0b8841c0e848eff1c712e3ab8ac6e4fd45929cb" +dependencies = [ + "puffin", + "puffin_http", + "re_log", + "rfd", + "wayland-sys", +] + +[[package]] +name = "re_tuid" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42515b9ec14da2fa3a310846030e4d46a08f3f90dc958b2b3bc650b7e0cb4bf" +dependencies = [ + "bytemuck", + "document-features", + "getrandom 0.2.16", + "once_cell", + "re_byte_size", + "serde", + "web-time", +] + +[[package]] +name = "re_types" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "336da544bf9ef903f176212c65cb6c4541243baffb55c41b626a2a5e690ec94c" +dependencies = [ + "anyhow", + "array-init", + "arrow", + "bytemuck", + "document-features", + "ecolor", + "egui_plot", + "emath", + "glam 0.28.0", + "half", + "image 0.25.6", + "infer", + "itertools 0.14.0", + "linked-hash-map", + "mime_guess2", + "ndarray", + "nohash-hasher", + "once_cell", + "ply-rs", + "rayon", + "re_build_tools", + "re_byte_size", + "re_error", + "re_format", + "re_log", + "re_log_types", + "re_math", + "re_tracing", + "re_types_builder", + "re_types_core", + "re_video", + "smallvec", + "thiserror 1.0.69", + "tiff", + "uuid", +] + +[[package]] +name = "re_types_builder" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05138faac679b8c7e9b5b918730308c24a17b6779199b5c3954c1eef69e1d5b" +dependencies = [ + "anyhow", + "camino", + "clang-format", + "colored 2.2.0", + "flatbuffers", + "indent", + "itertools 0.14.0", + "prettyplease", + "proc-macro2", + "quote", + "rayon", + "re_build_tools", + "re_case", + "re_error", + "re_log", + "re_tracing", + "rust-format", + "serde", + "syn 2.0.101", + "tempfile", + "toml", + "unindent", + "xshell", +] + +[[package]] +name = "re_types_core" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34e82d176897368adb101f44eee81bc1d3f493d27f6742e0c33d8659ac58e3c5" +dependencies = [ + "anyhow", + "arrow", + "backtrace", + "bytemuck", + "document-features", + "half", + "itertools 0.14.0", + "nohash-hasher", + "once_cell", + "re_arrow_util", + "re_byte_size", + "re_case", + "re_error", + "re_log", + "re_string_interner", + "re_tracing", + "re_tuid", + "serde", + "thiserror 1.0.69", +] + +[[package]] +name = "re_ui" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d9651f53c7bcd0b29e658bbd242d91b9d572d6c695072bcea122d3aae83d8a" +dependencies = [ + "ahash", + "arrow", + "eframe", + "egui", + "egui_commonmark", + "egui_extras", + "egui_tiles", + "getrandom 0.2.16", + "itertools 0.14.0", + "once_cell", + "parking_lot", + "re_arrow_util", + "re_entity_db", + "re_format", + "re_log", + "re_log_types", + "re_tracing", + "serde", + "serde_json", + "smallvec", + "strum 0.26.3", + "strum_macros 0.26.4", + "sublime_fuzzy", + "time", + "url", +] + +[[package]] +name = "re_uri" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b40bf22181d341947493d999e9361b8910af85a084bc42c78f34e3c947fc3d" +dependencies = [ + "re_log", + "re_log_types", + "re_tuid", + "serde", + "thiserror 1.0.69", + "url", +] + +[[package]] +name = "re_video" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "249b6f7b93a4889848d057407640adce66b5f83969695c8e91268d7fc62dd43f" +dependencies = [ + "bit-vec 0.8.0", + "cfg_aliases", + "crossbeam", + "econtext", + "ffmpeg-sidecar", + "itertools 0.14.0", + "js-sys", + "once_cell", + "parking_lot", + "poll-promise", + "re_build_info", + "re_build_tools", + "re_log", + "re_mp4", + "re_rav1d", + "re_tracing", + "serde", + "thiserror 1.0.69", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "re_view" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2060b82f5a1209056dc55221e00de66a33ef0c6069982c858a32a2175358e91" +dependencies = [ + "ahash", + "arrow", + "egui", + "glam 0.28.0", + "itertools 0.14.0", + "nohash-hasher", + "re_chunk_store", + "re_entity_db", + "re_log", + "re_log_types", + "re_query", + "re_renderer", + "re_tracing", + "re_types", + "re_types_core", + "re_ui", + "re_viewer_context", + "re_viewport_blueprint", +] + +[[package]] +name = "re_view_bar_chart" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b240275fa058a93e66eb9924b60b97aa06a067eb94d6657b254ce9d0f4d033da" +dependencies = [ + "egui", + "egui_plot", + "re_chunk_store", + "re_entity_db", + "re_log_types", + "re_renderer", + "re_tracing", + "re_types", + "re_ui", + "re_view", + "re_viewer_context", + "re_viewport_blueprint", +] + +[[package]] +name = "re_view_dataframe" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a747d9b6df962a7b2a362edfd820607e037e2606068a8b98651a24d04f84b810" +dependencies = [ + "anyhow", + "arrow", + "egui", + "egui_table", + "itertools 0.14.0", + "re_chunk_store", + "re_dataframe", + "re_dataframe_ui", + "re_error", + "re_format", + "re_log", + "re_log_types", + "re_renderer", + "re_sorbet", + "re_tracing", + "re_types", + "re_types_core", + "re_ui", + "re_viewer_context", + "re_viewport_blueprint", +] + +[[package]] +name = "re_view_graph" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13fabc7837e582833cffd7702f1c7eb0fb585dd013e8e4024f55340170e9f69b" +dependencies = [ + "ahash", + "egui", + "fjadra", + "itertools 0.14.0", + "nohash-hasher", + "re_chunk", + "re_data_ui", + "re_entity_db", + "re_format", + "re_log", + "re_log_types", + "re_query", + "re_renderer", + "re_tracing", + "re_types", + "re_ui", + "re_view", + "re_viewer_context", + "re_viewport_blueprint", +] + +[[package]] +name = "re_view_spatial" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80cca88663b6b87f3b32f94ba3ccf4bb9e3fe8b73a4f4ea63f298ecadba52d16" +dependencies = [ + "ahash", + "anyhow", + "arrow", + "bitflags 2.9.1", + "bytemuck", + "egui", + "glam 0.28.0", + "hexasphere 14.1.0", + "image 0.25.6", + "itertools 0.14.0", + "nohash-hasher", + "once_cell", + "ordered-float 4.6.0", + "re_chunk_store", + "re_data_ui", + "re_entity_db", + "re_error", + "re_format", + "re_log", + "re_log_types", + "re_math", + "re_query", + "re_renderer", + "re_tracing", + "re_types", + "re_ui", + "re_video", + "re_view", + "re_viewer_context", + "re_viewport_blueprint", + "serde", + "smallvec", + "thiserror 1.0.69", + "vec1", + "web-time", +] + +[[package]] +name = "re_view_tensor" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bb954a4979bee65ea808f22007f52cc4b1463bed89c87bbd0fe4c4702208a17" +dependencies = [ + "anyhow", + "bytemuck", + "egui", + "half", + "ndarray", + "re_chunk_store", + "re_data_ui", + "re_log_types", + "re_query", + "re_renderer", + "re_tracing", + "re_types", + "re_ui", + "re_view", + "re_viewer_context", + "re_viewport_blueprint", + "thiserror 1.0.69", + "wgpu", +] + +[[package]] +name = "re_view_text_document" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f833f7f74c957f366c28e1be079ecee1e4bdc32dfc12a845dbc1a9a962a0c8ff" +dependencies = [ + "egui", + "egui_commonmark", + "re_chunk_store", + "re_renderer", + "re_tracing", + "re_types", + "re_ui", + "re_view", + "re_viewer_context", +] + +[[package]] +name = "re_view_text_log" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0cf59ab503cdf5cff7e928c0d3a4e51734c78cc850073cb39d6ac5e056cb3da" +dependencies = [ + "egui", + "egui_extras", + "itertools 0.14.0", + "re_chunk_store", + "re_data_ui", + "re_entity_db", + "re_log_types", + "re_query", + "re_renderer", + "re_tracing", + "re_types", + "re_ui", + "re_view", + "re_viewer_context", +] + +[[package]] +name = "re_view_time_series" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68654fde4907d68f9db3e3693ed9b36591eccf12eee7dc6b90529515bee58b75" +dependencies = [ + "egui", + "egui_plot", + "itertools 0.14.0", + "nohash-hasher", + "rayon", + "re_chunk_store", + "re_format", + "re_log", + "re_log_types", + "re_query", + "re_renderer", + "re_tracing", + "re_types", + "re_ui", + "re_view", + "re_viewer_context", + "re_viewport_blueprint", + "smallvec", +] + +[[package]] +name = "re_viewer" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d7d178c3438a39b9049ae76d46ceb69c381ad4c18cce5f480c966aaf7465c06" +dependencies = [ + "ahash", + "anyhow", + "arrow", + "bytemuck", + "cfg-if", + "crossbeam", + "eframe", + "egui", + "egui-wgpu", + "egui_plot", + "egui_table", + "ehttp", + "glam 0.28.0", + "image 0.25.6", + "itertools 0.14.0", + "js-sys", + "parking_lot", + "percent-encoding", + "poll-promise", + "re_analytics", + "re_blueprint_tree", + "re_build_info", + "re_build_tools", + "re_capabilities", + "re_chunk", + "re_chunk_store", + "re_chunk_store_ui", + "re_component_ui", + "re_data_loader", + "re_data_source", + "re_data_ui", + "re_dataframe_ui", + "re_entity_db", + "re_error", + "re_format", + "re_grpc_client", + "re_log", + "re_log_encoding", + "re_log_types", + "re_memory", + "re_query", + "re_redap_browser", + "re_renderer", + "re_selection_panel", + "re_smart_channel", + "re_sorbet", + "re_time_panel", + "re_tracing", + "re_types", + "re_types_core", + "re_ui", + "re_uri", + "re_video", + "re_view_bar_chart", + "re_view_dataframe", + "re_view_graph", + "re_view_spatial", + "re_view_tensor", + "re_view_text_document", + "re_view_text_log", + "re_view_time_series", + "re_viewer_context", + "re_viewport", + "re_viewport_blueprint", + "rfd", + "ron", + "serde", + "serde-wasm-bindgen", + "serde_json", + "strum 0.26.3", + "strum_macros 0.26.4", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "web-time", + "wgpu", +] + +[[package]] +name = "re_viewer_context" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35a22e44d92af16aab75bb3d2d5e2752ccdc9c204ca7d88d4030e92044595424" +dependencies = [ + "ahash", + "anyhow", + "arrow", + "bit-vec 0.8.0", + "bitflags 2.9.1", + "bytemuck", + "crossbeam", + "directories", + "egui", + "egui-wgpu", + "egui_tiles", + "emath", + "glam 0.28.0", + "half", + "home", + "image 0.25.6", + "indexmap 2.9.0", + "itertools 0.14.0", + "linked-hash-map", + "ndarray", + "nohash-hasher", + "once_cell", + "parking_lot", + "re_build_info", + "re_capabilities", + "re_chunk", + "re_chunk_store", + "re_data_source", + "re_entity_db", + "re_format", + "re_log", + "re_log_encoding", + "re_log_types", + "re_math", + "re_query", + "re_renderer", + "re_smart_channel", + "re_sorbet", + "re_string_interner", + "re_tracing", + "re_types", + "re_types_core", + "re_ui", + "re_uri", + "re_video", + "rfd", + "serde", + "slotmap", + "smallvec", + "strum_macros 0.26.4", + "thiserror 1.0.69", + "tokio", + "uuid", + "wasm-bindgen-futures", + "web-sys", + "wgpu", +] + +[[package]] +name = "re_viewport" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0546e12575656141971e21ab71f3cf81cf8076a89c2420757f43b5ea5993705f" +dependencies = [ + "ahash", + "egui", + "egui_tiles", + "nohash-hasher", + "rayon", + "re_context_menu", + "re_entity_db", + "re_log", + "re_log_types", + "re_renderer", + "re_tracing", + "re_types", + "re_ui", + "re_view", + "re_viewer_context", + "re_viewport_blueprint", +] + +[[package]] +name = "re_viewport_blueprint" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e050182136271637ab77c16ed40a2f2f659133e2ac2ebf8bb8100a95652495cf" +dependencies = [ + "ahash", + "arrow", + "egui", + "egui_tiles", + "itertools 0.14.0", + "nohash-hasher", + "once_cell", + "parking_lot", + "re_chunk", + "re_chunk_store", + "re_entity_db", + "re_log", + "re_log_types", + "re_tracing", + "re_types", + "re_types_core", + "re_ui", + "re_viewer_context", + "slotmap", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "re_web_viewer_server" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de87dbde77cfc8fe3a82a7b2ff06e67d49b3476660819403d46a88bcad87cee" +dependencies = [ + "document-features", + "re_analytics", + "re_log", + "thiserror 1.0.69", + "tiny_http", +] + +[[package]] +name = "rectangle-pack" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d463f2884048e7153449a55166f91028d5b0ea53c79377099ce4e8cf0cf9bb" + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" +dependencies = [ + "bitflags 2.9.1", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "renderdoc-sys" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" + +[[package]] +name = "rerun" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21c20c11f1dd7932d0b1ccec09644d76a94bc47dc0fcdeeea08798c55cac02bc" +dependencies = [ + "anyhow", + "arrow", + "camino", + "clap", + "crossbeam", + "document-features", + "env_filter", + "indexmap 2.9.0", + "indicatif", + "itertools 0.14.0", + "log", + "puffin", + "rayon", + "re_analytics", + "re_build_info", + "re_build_tools", + "re_byte_size", + "re_capabilities", + "re_chunk", + "re_chunk_store", + "re_crash_handler", + "re_data_source", + "re_entity_db", + "re_error", + "re_format", + "re_format_arrow", + "re_grpc_server", + "re_log", + "re_log_encoding", + "re_log_types", + "re_memory", + "re_sdk", + "re_smart_channel", + "re_sorbet", + "re_tracing", + "re_types", + "re_uri", + "re_video", + "re_viewer", + "re_viewer_context", + "re_web_viewer_server", + "similar-asserts", + "tokio", + "unindent", +] + +[[package]] +name = "rexif" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be932047c168919c8d5af065b16fa7d4bd24835ffa256bf0cf1ff463f91c15df" + +[[package]] +name = "rfd" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80c844748fdc82aae252ee4594a89b6e7ebef1063de7951545564cbc4e57075d" +dependencies = [ + "ashpd", + "block2 0.6.1", + "dispatch2 0.2.0", + "js-sys", + "log", + "objc2 0.6.1", + "objc2-app-kit 0.3.1", + "objc2-core-foundation", + "objc2-foundation 0.3.1", + "pollster", + "raw-window-handle", + "urlencoding", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rgb" +version = "0.8.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" + +[[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.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "ringbuf" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79abed428d1fd2a128201cec72c5f6938e2da607c6f3745f769fabea399d950a" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "rmp" +version = "0.8.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "228ed7c16fa39782c3b3468e974aec2795e9089153cd08ee2e9aefb3613334c4" +dependencies = [ + "byteorder", + "num-traits", + "paste", +] + +[[package]] +name = "rmp-serde" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e599a477cf9840e92f2cde9a7189e67b42c57532749bf90aea6ec10facd4db" +dependencies = [ + "byteorder", + "rmp", + "serde", +] + +[[package]] +name = "robust" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e27ee8bb91ca0adcf0ecb116293afa12d393f9c2b9b9cd54d33e8078fe19839" + +[[package]] +name = "ron" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" +dependencies = [ + "base64 0.21.7", + "bitflags 2.9.1", + "serde", + "serde_derive", +] + +[[package]] +name = "roxmltree" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" + +[[package]] +name = "rstar" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "421400d13ccfd26dfa5858199c30a5d76f9c54e0dba7575273025b43c5175dbb" +dependencies = [ + "heapless", + "num-traits", + "smallvec", +] + +[[package]] +name = "rust-format" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60e7c00b6c3bf5e38a880eec01d7e829d12ca682079f8238a464def3c4b31627" + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustfft" +version = "6.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f266ff9b0cfc79de11fd5af76a2bc672fe3ace10c96fa06456740fa70cb1ed49" +dependencies = [ + "num-complex", + "num-integer", + "num-traits", + "primal-check", + "strength_reduce", + "transpose", + "version_check", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.9.1", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266" +dependencies = [ + "bitflags 2.9.1", + "errno", + "libc", + "linux-raw-sys 0.9.4", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls" +version = "0.23.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +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.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "safe_arch" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sctk-adwaita" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" +dependencies = [ + "ab_glyph", + "log", + "memmap2", + "smithay-client-toolkit", + "tiny-skia", +] + +[[package]] +name = "security-framework" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +dependencies = [ + "bitflags 2.9.1", + "core-foundation 0.10.0", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +dependencies = [ + "serde", +] + +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + +[[package]] +name = "seq-macro" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-wasm-bindgen" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8302e169f0eddcc139c70f139d19d6467353af16f9fce27e8c30158036a1e16b" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "serde_bytes" +version = "0.11.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8437fd221bde2d4ca316d61b90e337e9e702b3820b87d63caa9ba6c02bd06d96" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_with" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.9.0", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shell-words" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +dependencies = [ + "libc", +] + +[[package]] +name = "simba" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a386a501cd104797982c15ae17aafe8b9261315b5d07e3ec803f2ea26be0fa" +dependencies = [ + "approx", + "num-complex", + "num-traits", + "paste", + "wide", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "similar" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" +dependencies = [ + "bstr", + "unicode-segmentation", +] + +[[package]] +name = "similar-asserts" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b441962c817e33508847a22bd82f03a30cff43642dc2fae8b050566121eb9a" +dependencies = [ + "console", + "similar", +] + +[[package]] +name = "simple-easing" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "832ddd7df0d98d6fd93b973c330b7c8e0742d5cb8f1afc7dea89dba4d2531aa1" + +[[package]] +name = "sindri" +version = "0.26.0" +dependencies = [ + "build_utils", + "clap", + "colored 3.0.0", + "dialoguer", + "futures", + "home", + "indicatif", + "local-ip-address", + "miette", + "serde", + "serde_with", + "thiserror 2.0.12", + "tokio", + "toml", + "yggdrasil", +] + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] +name = "skeptic" +version = "0.13.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d23b015676c90a0f01c197bfdc786c20342c73a0afdda9025adb0bc42940a8" +dependencies = [ + "bytecount", + "cargo_metadata 0.14.2", + "error-chain", + "glob", + "pulldown-cmark 0.9.6", + "tempfile", + "walkdir", +] + +[[package]] +name = "skrifa" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1c44ad1f6c5bdd4eefed8326711b7dbda9ea45dfd36068c427d332aa382cbe" +dependencies = [ + "bytemuck", + "read-fonts", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slotmap" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +dependencies = [ + "serde", + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +dependencies = [ + "serde", +] + +[[package]] +name = "smithay-client-toolkit" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" +dependencies = [ + "bitflags 2.9.1", + "calloop", + "calloop-wayland-source", + "cursor-icon", + "libc", + "log", + "memmap2", + "rustix 0.38.44", + "thiserror 1.0.69", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", +] + +[[package]] +name = "smithay-clipboard" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc8216eec463674a0e90f29e0ae41a4db573ec5b56b1c6c1c71615d249b6d846" +dependencies = [ + "libc", + "smithay-client-toolkit", + "wayland-backend", +] + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] + +[[package]] +name = "snap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" + +[[package]] +name = "socket2" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "spade" +version = "2.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ece03ff43cd2a9b57ebf776ea5e78bd30b3b4185a619f041079f4109f385034" +dependencies = [ + "hashbrown 0.15.3", + "num-traits", + "robust", + "smallvec", +] + +[[package]] +name = "spatial" +version = "0.1.0" +dependencies = [ + "nalgebra", + "spatial_derive", +] + +[[package]] +name = "spatial_derive" +version = "0.1.0" +dependencies = [ + "petgraph", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "portable-atomic", +] + +[[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.9.1", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "stackfuture" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eae92052b72ef70dafa16eddbabffc77e5ca3574be2f7bc1127b36f0a7ad7f2" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strength_reduce" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe895eb47f22e2ddd4dabc02bce419d2e643c8e3b585c78158b349195bc24d82" + +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros 0.26.4", +] + +[[package]] +name = "strum" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" +dependencies = [ + "strum_macros 0.27.1", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.101", +] + +[[package]] +name = "strum_macros" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.101", +] + +[[package]] +name = "sublime_fuzzy" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7986063f7c0ab374407e586d7048a3d5aac94f103f751088bf398e07cd5400" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "supports-color" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64fc7232dd8d2e4ac5ce4ef302b1d81e0b80d055b9d77c7c4f51f6aa4c867d6" +dependencies = [ + "is_ci", +] + +[[package]] +name = "supports-hyperlinks" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "804f44ed3c63152de6a9f90acbea1a110441de43006ea51bcce8f436196a288b" + +[[package]] +name = "supports-unicode" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7401a30af6cb5818bb64852270bb722533397edcfc7344954a38f420819ece2" + +[[package]] +name = "svg_fmt" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0193cc4331cfd2f3d2011ef287590868599a2f33c3e69bc22c1a3d3acf9e02fb" + +[[package]] +name = "symphonia" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "815c942ae7ee74737bb00f965fa5b5a2ac2ce7b6c01c0cc169bbeaf7abd5f5a9" +dependencies = [ + "lazy_static", + "symphonia-codec-pcm", + "symphonia-core", + "symphonia-format-riff", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-codec-pcm" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f395a67057c2ebc5e84d7bb1be71cce1a7ba99f64e0f0f0e303a03f79116f89b" +dependencies = [ + "log", + "symphonia-core", +] + +[[package]] +name = "symphonia-core" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "798306779e3dc7d5231bd5691f5a813496dc79d3f56bf82e25789f2094e022c3" +dependencies = [ + "arrayvec", + "bitflags 1.3.2", + "bytemuck", + "lazy_static", + "log", +] + +[[package]] +name = "symphonia-format-riff" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f7be232f962f937f4b7115cbe62c330929345434c834359425e043bfd15f50" +dependencies = [ + "extended", + "log", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-metadata" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc622b9841a10089c5b18e99eb904f4341615d5aa55bbf4eedde1be721a4023c" +dependencies = [ + "encoding_rs", + "lazy_static", + "log", + "symphonia-core", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +dependencies = [ + "proc-macro2", + "quote", + "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 2.0.101", +] + +[[package]] +name = "sysinfo" +version = "0.30.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a5b4ddaee55fb2bea2bf0e5000747e5f5c0de765e5a5ff87f4cd106439f4bb3" +dependencies = [ + "cfg-if", + "core-foundation-sys", + "libc", + "ntapi", + "once_cell", + "windows 0.52.0", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tasks" +version = "0.1.0" +dependencies = [ + "async-std", + "bevy", + "rand 0.9.1", +] + +[[package]] +name = "tempfile" +version = "3.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" +dependencies = [ + "fastrand", + "getrandom 0.3.3", + "once_cell", + "rustix 1.0.7", + "windows-sys 0.59.0", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "terminal_size" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45c6481c4829e4cc63825e62c49186a34538b7b2750b73b266581ffb612fb5ed" +dependencies = [ + "rustix 1.0.7", + "windows-sys 0.59.0", +] + +[[package]] +name = "textwrap" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +dependencies = [ + "unicode-linebreak", + "unicode-width 0.2.0", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "thrift" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e54bc85fc7faa8bc175c4bab5b92ba8d9a3ce893d0e9f42cc455c8ab16a9e09" +dependencies = [ + "byteorder", + "integer-encoding", + "ordered-float 2.10.1", +] + +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + +[[package]] +name = "time" +version = "0.3.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +dependencies = [ + "deranged", + "itoa", + "js-sys", + "libc", + "num-conv", + "num_threads", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" + +[[package]] +name = "time-macros" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tiny-skia" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "log", + "tiny-skia-path", +] + +[[package]] +name = "tiny-skia-path" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + +[[package]] +name = "tiny_http" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389915df6413a2e74fb181895f933386023c71110878cd0825588928e64cdc82" +dependencies = [ + "ascii", + "chunked_transfer", + "httpdate", + "log", +] + +[[package]] +name = "tinystl" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdbcdda2f86a57b89b5d9ac17cd4c9f3917ec8edcde403badf3d992d2947af2a" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +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 = "to_method" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c4ceeeca15c8384bbc3e011dbd8fccb7f068a440b752b7d9b32ceb0ca0e2e8" + +[[package]] +name = "tobj" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04aca6092e5978e708ee784e8ab9b5cf3cdb598b28f99a2f257446e7081a7025" +dependencies = [ + "ahash", +] + +[[package]] +name = "tokio" +version = "1.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75ef51a33ef1da925cea3e4eb122833cb377c61439ca401b770f54902b806779" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio 1.0.4", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-util" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" +dependencies = [ + "indexmap 2.9.0", + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" +dependencies = [ + "indexmap 2.9.0", + "serde", + "serde_spanned", + "toml_datetime", + "toml_write", + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" + +[[package]] +name = "tonic" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64 0.22.1", + "bytes", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-timeout", + "hyper-util", + "percent-encoding", + "pin-project", + "prost", + "rustls-native-certs", + "rustls-pemfile", + "socket2", + "tokio", + "tokio-rustls", + "tokio-stream", + "tower 0.4.13", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tonic-web" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5299dd20801ad736dccb4a5ea0da7376e59cd98f213bf1c3d478cf53f4834b58" +dependencies = [ + "base64 0.22.1", + "bytes", + "http", + "http-body", + "http-body-util", + "pin-project", + "tokio-stream", + "tonic", + "tower-http", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tonic-web-wasm-client" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8957be1a1c7aa12d4c9d67882060dd57aed816bbc553fa60949312e839f4a8ea" +dependencies = [ + "base64 0.22.1", + "byteorder", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "httparse", + "js-sys", + "pin-project", + "thiserror 1.0.69", + "tonic", + "tower-service", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand 0.8.5", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" +dependencies = [ + "bitflags 2.9.1", + "bytes", + "http", + "http-body", + "http-body-util", + "pin-project-lite", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-appender" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" +dependencies = [ + "crossbeam-channel", + "thiserror 1.0.69", + "time", + "tracing-subscriber", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-error" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b1581020d7a273442f5b45074a6a57d5757ad0a47dac0e9f0bd57b81936f3db" +dependencies = [ + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-oslog" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "528bdd1f0e27b5dd9a4ededf154e824b0532731e4af73bb531de46276e0aab1e" +dependencies = [ + "bindgen", + "cc", + "cfg-if", + "once_cell", + "parking_lot", + "tracing-core", + "tracing-subscriber", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "tracing-tracy" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eaa1852afa96e0fe9e44caa53dc0bd2d9d05e0f2611ce09f97f8677af56e4ba" +dependencies = [ + "tracing-core", + "tracing-subscriber", + "tracy-client", +] + +[[package]] +name = "tracing-wasm" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4575c663a174420fa2d78f4108ff68f65bf2fbb7dd89f33749b6e826b3626e07" +dependencies = [ + "tracing", + "tracing-subscriber", + "wasm-bindgen", +] + +[[package]] +name = "tracy-client" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d90a2c01305b02b76fdd89ac8608bae27e173c829a35f7d76a345ab5d33836db" +dependencies = [ + "loom", + "once_cell", + "tracy-client-sys", +] + +[[package]] +name = "tracy-client-sys" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69fff37da548239c3bf9e64a12193d261e8b22b660991c6fd2df057c168f435f" +dependencies = [ + "cc", + "windows-targets 0.52.6", +] + +[[package]] +name = "transpose" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad61aed86bc3faea4300c7aee358b4c6d0c8d6ccc36524c96e4c92ccf26e77e" +dependencies = [ + "num-integer", + "strength_reduce", +] + +[[package]] +name = "triple_buffer" +version = "8.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "420466259f9fa5decc654c490b9ab538400e5420df8237f84ecbe20368bcf72b" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "ttf-parser" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" + +[[package]] +name = "turbojpeg" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "017914ca203ad45ccb4f6b7a61823673c43dc28c31082e1ab692c3729849d90b" +dependencies = [ + "gcd", + "libc", + "thiserror 1.0.69", + "turbojpeg-sys", +] + +[[package]] +name = "turbojpeg-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2d87290369f91af10f425f9ec0b8ce775cf79ea189291faa974c0b4e02e1e2f" +dependencies = [ + "anyhow", + "cmake", + "libc", + "pkg-config", +] + +[[package]] +name = "twox-hash" +version = "1.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" +dependencies = [ + "cfg-if", + "static_assertions", +] + +[[package]] +name = "type-map" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90" +dependencies = [ + "rustc-hash 2.1.1", +] + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "uds_windows" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +dependencies = [ + "memoffset 0.9.1", + "tempfile", + "winapi", +] + +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-bidi-mirroring" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cb788ffebc92c5948d0e997106233eeb1d8b9512f93f41651f52b6c5f5af86" + +[[package]] +name = "unicode-ccc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df77b101bcc4ea3d78dafc5ad7e4f58ceffe0b2b16bf446aeb50b6cb4157656" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + +[[package]] +name = "unicode-properties" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" + +[[package]] +name = "unicode-script" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb421b350c9aff471779e262955939f565ec18b86c15364e6bdf0d662ca7c1f" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-width" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "unindent" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "ureq" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" +dependencies = [ + "base64 0.22.1", + "flate2", + "log", + "once_cell", + "rustls", + "rustls-pki-types", + "url", + "webpki-roots 0.26.11", +] + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d" +dependencies = [ + "getrandom 0.3.3", + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "v_frame" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "value-bag" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "943ce29a8a743eb10d6082545d861b24f9d1b160b7d741e0f2cdf726bec909c5" + +[[package]] +name = "variadics_please" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b6d82be61465f97d42bd1d15bf20f3b0a3a0905018f38f9d6f6962055b0b5c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "vec1" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab68b56840f69efb0fefbe3ab6661499217ffdc58e2eef7c3f6f69835386322" +dependencies = [ + "smallvec", +] + +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vqf" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0326dba4a7b59d1f23a16c8a47b85439c6fe24e606bbfc947c25363fdc647a" +dependencies = [ + "nalgebra", + "serde", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.101", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wayland-backend" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe770181423e5fc79d3e2a7f4410b7799d5aab1de4372853de3c6aa13ca24121" +dependencies = [ + "cc", + "downcast-rs 1.2.1", + "rustix 0.38.44", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978fa7c67b0847dbd6a9f350ca2569174974cd4082737054dbb7fbb79d7d9a61" +dependencies = [ + "bitflags 2.9.1", + "rustix 0.38.44", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-csd-frame" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" +dependencies = [ + "bitflags 2.9.1", + "cursor-icon", + "wayland-backend", +] + +[[package]] +name = "wayland-cursor" +version = "0.31.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65317158dec28d00416cb16705934070aef4f8393353d41126c54264ae0f182" +dependencies = [ + "rustix 0.38.44", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "779075454e1e9a521794fed15886323ea0feda3f8b0fc1390f5398141310422a" +dependencies = [ + "bitflags 2.9.1", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fd38cdad69b56ace413c6bcc1fbf5acc5e2ef4af9d5f8f1f9570c0c83eae175" +dependencies = [ + "bitflags 2.9.1", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cb6cdc73399c0e06504c437fe3cf886f25568dd5454473d565085b36d6a8bbf" +dependencies = [ + "bitflags 2.9.1", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" +dependencies = [ + "proc-macro2", + "quick-xml 0.37.5", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615" +dependencies = [ + "dlib", + "log", + "once_cell", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webbrowser" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5df295f8451142f1856b1bd86a606dfe9587d439bc036e319c827700dbd555e" +dependencies = [ + "core-foundation 0.10.0", + "home", + "jni", + "log", + "ndk-context", + "objc2 0.6.1", + "objc2-foundation 0.3.1", + "url", + "web-sys", +] + +[[package]] +name = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.0", +] + +[[package]] +name = "webpki-roots" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "weezl" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" + +[[package]] +name = "wgpu" +version = "24.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b0b3436f0729f6cdf2e6e9201f3d39dc95813fad61d826c1ed07918b4539353" +dependencies = [ + "arrayvec", + "bitflags 2.9.1", + "cfg_aliases", + "document-features", + "js-sys", + "log", + "naga", + "parking_lot", + "profiling", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core" +version = "24.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f0aa306497a238d169b9dc70659105b4a096859a34894544ca81719242e1499" +dependencies = [ + "arrayvec", + "bit-vec 0.8.0", + "bitflags 2.9.1", + "cfg_aliases", + "document-features", + "indexmap 2.9.0", + "log", + "naga", + "once_cell", + "parking_lot", + "profiling", + "raw-window-handle", + "rustc-hash 1.1.0", + "smallvec", + "thiserror 2.0.12", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-hal" +version = "24.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f112f464674ca69f3533248508ee30cb84c67cf06c25ff6800685f5e0294e259" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bit-set 0.8.0", + "bitflags 2.9.1", + "block", + "bytemuck", + "cfg_aliases", + "core-graphics-types", + "glow", + "glutin_wgl_sys", + "gpu-alloc", + "gpu-allocator", + "gpu-descriptor", + "js-sys", + "khronos-egl", + "libc", + "libloading", + "log", + "metal", + "naga", + "ndk-sys 0.5.0+25.2.9519653", + "objc", + "once_cell", + "ordered-float 4.6.0", + "parking_lot", + "profiling", + "range-alloc", + "raw-window-handle", + "renderdoc-sys", + "rustc-hash 1.1.0", + "smallvec", + "thiserror 2.0.12", + "wasm-bindgen", + "web-sys", + "wgpu-types", + "windows 0.58.0", + "windows-core 0.58.0", +] + +[[package]] +name = "wgpu-types" +version = "24.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50ac044c0e76c03a0378e7786ac505d010a873665e2d51383dcff8dd227dc69c" +dependencies = [ + "bitflags 2.9.1", + "js-sys", + "log", + "serde", + "web-sys", +] + +[[package]] +name = "wide" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b5576b9a81633f3e8df296ce0063042a73507636cbe956c61133dd7034ab22" +dependencies = [ + "bytemuck", + "safe_arch", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +dependencies = [ + "windows-core 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" +dependencies = [ + "windows-core 0.54.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core 0.58.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.61.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5ee8f3d025738cb02bad7868bbb5f8a6327501e870bf51f1b455b0a2454a419" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" +dependencies = [ + "windows-result 0.1.2", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", + "windows-strings 0.1.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement 0.60.0", + "windows-interface 0.59.1", + "windows-link", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link", +] + +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result 0.2.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "winit" +version = "0.30.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4409c10174df8779dc29a4788cac85ed84024ccbc1743b776b21a520ee1aaf4" +dependencies = [ + "ahash", + "android-activity", + "atomic-waker", + "bitflags 2.9.1", + "block2 0.5.1", + "bytemuck", + "calloop", + "cfg_aliases", + "concurrent-queue", + "core-foundation 0.9.4", + "core-graphics", + "cursor-icon", + "dpi", + "js-sys", + "libc", + "memmap2", + "ndk 0.9.0", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", + "objc2-ui-kit", + "orbclient", + "percent-encoding", + "pin-project", + "raw-window-handle", + "redox_syscall 0.4.1", + "rustix 0.38.44", + "sctk-adwaita", + "smithay-client-toolkit", + "smol_str", + "tracing", + "unicode-segmentation", + "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-plasma", + "web-sys", + "web-time", + "windows-sys 0.52.0", + "x11-dl", + "x11rb", + "xkbcommon-dl", +] + +[[package]] +name = "winnow" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.9.1", +] + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" +dependencies = [ + "as-raw-xcb-connection", + "gethostname", + "libc", + "libloading", + "once_cell", + "rustix 0.38.44", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" + +[[package]] +name = "xcursor" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61" + +[[package]] +name = "xdg-home" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "xkbcommon-dl" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" +dependencies = [ + "bitflags 2.9.1", + "dlib", + "log", + "once_cell", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" + +[[package]] +name = "xml-rs" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" + +[[package]] +name = "xshell" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e7290c623014758632efe00737145b6867b66292c42167f2ec381eb566a373d" +dependencies = [ + "xshell-macros", +] + +[[package]] +name = "xshell-macros" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32ac00cd3f8ec9c1d33fb3e7958a82df6989c42d747bd326c822b1d625283547" + +[[package]] +name = "yazi" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c94451ac9513335b5e23d7a8a2b61a7102398b8cca5160829d313e84c9d98be1" + +[[package]] +name = "yggdrasil" +version = "0.1.0" +dependencies = [ + "apodize", + "async-std", + "bevy", + "bifrost", + "chrono", + "cpal", + "fast_image_resize", + "filter", + "futures", + "geo", + "heimdall", + "itertools 0.14.0", + "kira", + "libc", + "lstsq", + "miette", + "ml", + "nalgebra", + "ndarray", + "nidhogg", + "num", + "odal", + "ordered-float 5.0.0", + "pathfinding", + "rand 0.9.1", + "re_control_comms", + "rerun", + "rustfft", + "serde", + "serde_json", + "serde_with", + "spatial", + "tasks", + "toml", + "tracing", + "tracing-appender", + "tracing-subscriber", + "tracing-tracy", + "vqf", +] + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "synstructure", +] + +[[package]] +name = "zbus" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" +dependencies = [ + "async-broadcast", + "async-executor", + "async-fs", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener 5.4.0", + "futures-core", + "futures-sink", + "futures-util", + "hex", + "nix 0.29.0", + "ordered-stream", + "rand 0.8.5", + "serde", + "serde_repr", + "sha1", + "static_assertions", + "tracing", + "uds_windows", + "windows-sys 0.52.0", + "xdg-home", + "zbus_macros 4.4.0", + "zbus_names 3.0.0", + "zvariant 4.2.0", +] + +[[package]] +name = "zbus" +version = "5.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3a7c7cee313d044fca3f48fa782cb750c79e4ca76ba7bc7718cd4024cdf6f68" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener 5.4.0", + "futures-core", + "futures-lite", + "hex", + "nix 0.30.1", + "ordered-stream", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "windows-sys 0.59.0", + "winnow", + "zbus_macros 5.7.1", + "zbus_names 4.2.0", + "zvariant 5.5.3", +] + +[[package]] +name = "zbus-lockstep" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca2c5dceb099bddaade154055c926bb8ae507a18756ba1d8963fd7b51d8ed1d" +dependencies = [ + "zbus_xml", + "zvariant 4.2.0", +] + +[[package]] +name = "zbus-lockstep-macros" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709ab20fc57cb22af85be7b360239563209258430bccf38d8b979c5a2ae3ecce" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "zbus-lockstep", + "zbus_xml", + "zvariant 4.2.0", +] + +[[package]] +name = "zbus_macros" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.101", + "zvariant_utils 2.1.0", +] + +[[package]] +name = "zbus_macros" +version = "5.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a17e7e5eec1550f747e71a058df81a9a83813ba0f6a95f39c4e218bdc7ba366a" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.101", + "zbus_names 4.2.0", + "zvariant 5.5.3", + "zvariant_utils 3.2.0", +] + +[[package]] +name = "zbus_names" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" +dependencies = [ + "serde", + "static_assertions", + "zvariant 4.2.0", +] + +[[package]] +name = "zbus_names" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" +dependencies = [ + "serde", + "static_assertions", + "winnow", + "zvariant 5.5.3", +] + +[[package]] +name = "zbus_xml" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab3f374552b954f6abb4bd6ce979e6c9b38fb9d0cd7cc68a7d796e70c9f3a233" +dependencies = [ + "quick-xml 0.30.0", + "serde", + "static_assertions", + "zbus_names 3.0.0", + "zvariant 4.2.0", +] + +[[package]] +name = "zeno" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd15f8e0dbb966fd9245e7498c7e9e5055d9e5c8b676b95bd67091cd11a1e697" + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +dependencies = [ + "zerocopy-derive 0.8.25", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "zune-jpeg" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99a5bab8d7dedf81405c4bb1f2b83ea057643d9cb28778cea9eecddeedd2e028" +dependencies = [ + "zune-core", +] + +[[package]] +name = "zvariant" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" +dependencies = [ + "endi", + "enumflags2", + "serde", + "static_assertions", + "zvariant_derive 4.2.0", +] + +[[package]] +name = "zvariant" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d30786f75e393ee63a21de4f9074d4c038d52c5b1bb4471f955db249f9dffb1" +dependencies = [ + "endi", + "enumflags2", + "serde", + "url", + "winnow", + "zvariant_derive 5.5.3", + "zvariant_utils 3.2.0", +] + +[[package]] +name = "zvariant_derive" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.101", + "zvariant_utils 2.1.0", +] + +[[package]] +name = "zvariant_derive" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75fda702cd42d735ccd48117b1630432219c0e9616bf6cb0f8350844ee4d9580" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.101", + "zvariant_utils 3.2.0", +] + +[[package]] +name = "zvariant_utils" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "zvariant_utils" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16edfee43e5d7b553b77872d99bc36afdda75c223ca7ad5e3fbecd82ca5fc34" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "static_assertions", + "syn 2.0.101", + "winnow", +] diff --git a/Cargo.lock b/Cargo.lock index 0cedec757..8cf491258 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -399,7 +399,7 @@ checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" dependencies = [ "proc-macro2", "quote", - "syn 2.0.100", + "syn 2.0.101", ] [[package]] @@ -997,9 +997,9 @@ dependencies = [ [[package]] name = "av1-grain" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +checksum = "4f3efb2ca85bc610acfa917b5aaa36f3fcbebed5b3182d7f877b02531c4b80c8" dependencies = [ "anyhow", "arrayvec", @@ -1327,6 +1327,43 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "bevy_egui" +version = "0.34.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a3d58a8afdb6100bca50251043a85320391742cae125d559f6cca3a16b84cdd" +dependencies = [ + "arboard", + "bevy_app", + "bevy_asset", + "bevy_derive", + "bevy_ecs", + "bevy_image", + "bevy_input", + "bevy_log", + "bevy_math", + "bevy_picking", + "bevy_platform", + "bevy_reflect", + "bevy_render", + "bevy_time", + "bevy_window", + "bevy_winit", + "bytemuck", + "crossbeam-channel", + "egui", + "encase", + "image 0.25.6", + "js-sys", + "thread_local", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webbrowser", + "wgpu-types", + "winit", +] + [[package]] name = "bevy_encase_derive" version = "0.16.0" @@ -1337,6 +1374,43 @@ dependencies = [ "encase_derive_impl", ] +[[package]] +name = "bevy_gizmos" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54af8145b35ab2a830a6dd1058e23c1e1ddc4b893db79d295259ef82f51c7520" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_core_pipeline", + "bevy_ecs", + "bevy_gizmos_macros", + "bevy_image", + "bevy_math", + "bevy_pbr", + "bevy_reflect", + "bevy_render", + "bevy_sprite", + "bevy_time", + "bevy_transform", + "bevy_utils", + "bytemuck", + "tracing", +] + +[[package]] +name = "bevy_gizmos_macros" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40137ace61f092b7a09eba41d7d1e6aef941f53a7818b06ef86dcce7b6a1fd3f" +dependencies = [ + "bevy_macro_utils", + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "bevy_image" version = "0.16.0" @@ -1356,7 +1430,9 @@ dependencies = [ "guillotiere", "half", "image 0.25.6", + "ktx2", "rectangle-pack", + "ruzstd", "serde", "thiserror 2.0.12", "tracing", @@ -1411,11 +1487,14 @@ dependencies = [ "bevy_derive", "bevy_diagnostic", "bevy_ecs", + "bevy_gizmos", + "bevy_image", "bevy_input", "bevy_input_focus", "bevy_log", "bevy_math", "bevy_pbr", + "bevy_picking", "bevy_platform", "bevy_ptr", "bevy_reflect", @@ -1551,6 +1630,31 @@ dependencies = [ "tracing", ] +[[package]] +name = "bevy_picking" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f73674f62b1033006bd75c89033f5d3516386cfd7d43bb9f7665012c0ab14d22" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_derive", + "bevy_ecs", + "bevy_input", + "bevy_math", + "bevy_mesh", + "bevy_platform", + "bevy_reflect", + "bevy_render", + "bevy_time", + "bevy_transform", + "bevy_utils", + "bevy_window", + "crossbeam-channel", + "tracing", + "uuid", +] + [[package]] name = "bevy_platform" version = "0.16.0" @@ -1650,6 +1754,7 @@ dependencies = [ "image 0.25.6", "indexmap 2.9.0", "js-sys", + "ktx2", "naga", "naga_oil", "nonmax", @@ -1679,15 +1784,62 @@ dependencies = [ ] [[package]] -name = "bevy_state" +name = "bevy_scene" version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "682c343c354b191fe6669823bce3b0695ee1ae4ac36f582e29c436a72b67cdd5" +checksum = "e7b628f560f2d2fe9f35ecd4526627ba3992f082de03fd745536e4053a0266fe" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_derive", + "bevy_ecs", + "bevy_platform", + "bevy_reflect", + "bevy_render", + "bevy_transform", + "bevy_utils", + "derive_more", + "serde", + "thiserror 2.0.12", + "uuid", +] + +[[package]] +name = "bevy_sprite" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01f97bf54fb1c37a1077139b59bb32bc77f7ca53149cfcaa512adbb69a2d492c" dependencies = [ "bevy_app", "bevy_asset", + "bevy_color", + "bevy_core_pipeline", "bevy_derive", "bevy_ecs", + "bevy_image", + "bevy_math", + "bevy_platform", + "bevy_reflect", + "bevy_render", + "bevy_transform", + "bevy_utils", + "bitflags 2.9.1", + "bytemuck", + "derive_more", + "fixedbitset", + "nonmax", + "radsort", + "tracing", +] + +[[package]] +name = "bevy_state" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "682c343c354b191fe6669823bce3b0695ee1ae4ac36f582e29c436a72b67cdd5" +dependencies = [ + "bevy_app", + "bevy_ecs", "bevy_platform", "bevy_reflect", "bevy_state_macros", @@ -1731,16 +1883,43 @@ dependencies = [ ] [[package]] -name = "bevy_time" +name = "bevy_text" version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456369ca10f8e039aaf273332744674844827854833ee29e28f9e161702f2f55" +checksum = "8ef071262c5a9afbc39caba4c0b282c7d045fbb5cf33bdab1924bd2343403833" dependencies = [ "bevy_app", "bevy_asset", "bevy_color", "bevy_derive", "bevy_ecs", + "bevy_image", + "bevy_log", + "bevy_math", + "bevy_platform", + "bevy_reflect", + "bevy_render", + "bevy_sprite", + "bevy_transform", + "bevy_utils", + "bevy_window", + "cosmic-text", + "serde", + "smallvec", + "sys-locale", + "thiserror 2.0.12", + "tracing", + "unicode-bidi", +] + +[[package]] +name = "bevy_time" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456369ca10f8e039aaf273332744674844827854833ee29e28f9e161702f2f55" +dependencies = [ + "bevy_app", + "bevy_ecs", "bevy_platform", "bevy_reflect", "crossbeam-channel", @@ -1807,7 +1986,6 @@ dependencies = [ "approx", "bevy_a11y", "bevy_app", - "bevy_asset", "bevy_derive", "bevy_ecs", "bevy_input", @@ -1819,14 +1997,12 @@ dependencies = [ "bevy_tasks", "bevy_utils", "bevy_window", - "bytemuck", "cfg-if", "crossbeam-channel", "raw-window-handle", "tracing", "wasm-bindgen", "web-sys", - "wgpu-types 23.0.0", "winit", ] @@ -2603,18 +2779,18 @@ dependencies = [ [[package]] name = "cosmic-text" -version = "0.12.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fd57d82eb4bfe7ffa9b1cec0c05e2fd378155b47f255a67983cb4afe0e80c2" +checksum = "e418dd4f5128c3e93eab12246391c54a20c496811131f85754dc8152ee207892" dependencies = [ - "bitflags 2.9.0", + "bitflags 2.9.1", "fontdb", "log", "rangemap", - "rayon", "rustc-hash 1.1.0", "rustybuzz", "self_cell", + "smol_str", "swash", "sys-locale", "ttf-parser 0.21.1", @@ -3532,6 +3708,21 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "exr" +version = "1.73.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" +dependencies = [ + "bit_field", + "half", + "lebe", + "miniz_oxide", + "rayon-core", + "smallvec", + "zune-inflate", +] + [[package]] name = "extended" version = "0.1.0" @@ -3668,6 +3859,38 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "font-types" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02a596f5713680923a2080d86de50fe472fb290693cf0f701187a1c8b36996b7" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "fontconfig-parser" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbc773e24e02d4ddd8395fd30dc147524273a83e54e0f312d986ea30de5f5646" +dependencies = [ + "roxmltree", +] + +[[package]] +name = "fontdb" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0299020c3ef3f60f526a4f64ab4a3d4ce116b1acbf24cdd22da0068e5d81dc3" +dependencies = [ + "fontconfig-parser", + "log", + "memmap2", + "slotmap", + "tinyvec", + "ttf-parser 0.20.0", +] + [[package]] name = "foreign-types" version = "0.5.0" @@ -3920,6 +4143,16 @@ dependencies = [ "wasi 0.14.2+wasi-0.2.4", ] +[[package]] +name = "gif" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +dependencies = [ + "color_quant", + "weezl", +] + [[package]] name = "gimli" version = "0.31.1" @@ -5065,6 +5298,16 @@ version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +[[package]] +name = "libfuzzer-sys" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" +dependencies = [ + "arbitrary", + "cc", +] + [[package]] name = "libloading" version = "0.8.8" @@ -5220,7 +5463,7 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75761162ae2b0e580d7e7c390558127e5f01b4194debd6221fd8c207fc80e3f5" dependencies = [ - "twox-hash", + "twox-hash 1.6.3", ] [[package]] @@ -6410,7 +6653,7 @@ dependencies = [ "seq-macro", "snap", "thrift", - "twox-hash", + "twox-hash 1.6.3", ] [[package]] @@ -7022,8 +7265,8 @@ dependencies = [ "once_cell", "paste", "profiling", - "rand", - "rand_chacha", + "rand 0.8.5", + "rand_chacha 0.3.1", "simd_helpers", "system-deps", "thiserror 1.0.69", @@ -7033,9 +7276,9 @@ dependencies = [ [[package]] name = "ravif" -version = "0.11.11" +version = "0.11.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" +checksum = "d6a5f31fcf7500f9401fea858ea4ab5525c99f2322cfcee732c0e6c74208c0c6" dependencies = [ "avif-serialize", "imgref", @@ -8688,6 +8931,16 @@ dependencies = [ "tiny_http", ] +[[package]] +name = "read-fonts" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e85935612710191461ec9df47b4b5880dd6359d4fad3b2f2ed696215f6f3146" +dependencies = [ + "bytemuck", + "font-types", +] + [[package]] name = "rectangle-pack" version = "0.4.2" @@ -9096,6 +9349,32 @@ version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +[[package]] +name = "rustybuzz" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfb9cf8877777222e4a3bc7eb247e398b56baba500c38c1c46842431adc8b55c" +dependencies = [ + "bitflags 2.9.1", + "bytemuck", + "libm", + "smallvec", + "ttf-parser 0.21.1", + "unicode-bidi-mirroring", + "unicode-ccc", + "unicode-properties", + "unicode-script", +] + +[[package]] +name = "ruzstd" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3640bec8aad418d7d03c72ea2de10d5c646a598f9883c7babc160d91e3c1b26c" +dependencies = [ + "twox-hash 2.1.0", +] + [[package]] name = "ryu" version = "1.0.20" @@ -9201,6 +9480,12 @@ dependencies = [ "libc", ] +[[package]] +name = "self_cell" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f7d95a54511e0c7be3f51e8867aa8cf35148d7b9445d44de2f943e2b206e749" + [[package]] name = "semver" version = "1.0.26" @@ -9397,6 +9682,15 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + [[package]] name = "similar" version = "2.7.0" @@ -9423,6 +9717,22 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "832ddd7df0d98d6fd93b973c330b7c8e0742d5cb8f1afc7dea89dba4d2531aa1" +[[package]] +name = "simulation" +version = "0.1.0" +dependencies = [ + "bevy", + "bevy_egui", + "bifrost", + "filter", + "ml", + "nalgebra", + "nidhogg", + "serde", + "tasks", + "yggdrasil", +] + [[package]] name = "sindri" version = "0.28.0" @@ -9467,9 +9777,9 @@ dependencies = [ [[package]] name = "skrifa" -version = "0.22.3" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1c44ad1f6c5bdd4eefed8326711b7dbda9ea45dfd36068c427d332aa382cbe" +checksum = "b9c3bb8cab5196b98d70c866ce1ea81ab516104d5b396f84ae80f8766b5d5b4e" dependencies = [ "bytemuck", "read-fonts", @@ -9731,6 +10041,17 @@ version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0193cc4331cfd2f3d2011ef287590868599a2f33c3e69bc22c1a3d3acf9e02fb" +[[package]] +name = "swash" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f745de914febc7c9ab4388dfaf94bbc87e69f57bb41133a9b0c84d4be49856f3" +dependencies = [ + "skrifa", + "yazi", + "zeno", +] + [[package]] name = "symphonia" version = "0.5.4" @@ -9830,6 +10151,15 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "sys-locale" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" +dependencies = [ + "libc", +] + [[package]] name = "sysinfo" version = "0.30.13" @@ -10539,6 +10869,18 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" name = "ttf-parser" version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" + +[[package]] +name = "ttf-parser" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c591d83f69777866b9126b24c6dd9a18351f177e49d625920d19f989fd31cf8" + +[[package]] +name = "ttf-parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" [[package]] @@ -10575,6 +10917,12 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "twox-hash" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7b17f197b3050ba473acf9181f7b1d3b66d1cf7356c6cc57886662276e65908" + [[package]] name = "type-map" version = "0.5.1" @@ -11920,9 +12268,9 @@ checksum = "32ac00cd3f8ec9c1d33fb3e7958a82df6989c42d747bd326c822b1d625283547" [[package]] name = "yazi" -version = "0.1.6" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c94451ac9513335b5e23d7a8a2b61a7102398b8cca5160829d313e84c9d98be1" +checksum = "e01738255b5a16e78bbb83e7fbba0a1e7dd506905cfc53f4622d89015a03fbb5" [[package]] name = "yggdrasil" @@ -12191,9 +12539,9 @@ dependencies = [ [[package]] name = "zeno" -version = "0.2.3" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd15f8e0dbb966fd9245e7498c7e9e5055d9e5c8b676b95bd67091cd11a1e697" +checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" [[package]] name = "zerocopy" diff --git a/Cargo.toml b/Cargo.toml index 0149fdd3b..88fcfbc56 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -65,7 +65,7 @@ apodize = "1.0.0" async-std = "1.13.1" bevy = { version = "0.16.0", default-features = false, features = [ "bevy_state", - "bevy_asset", + "bevy_asset", "bevy_core_pipeline", "bevy_pbr", "bevy_mesh_picking_backend", @@ -81,7 +81,7 @@ bevy = { version = "0.16.0", default-features = false, features = [ "x11", "wayland", ] } -bevy_egui = { version = "0.33.0"} +bevy_egui = { version = "0.34.0"} byteorder = "1.5.0" cargo_toml = "0.22.1" chrono = "0.4.40" diff --git a/deploy/assets/motions/standup_back.json b/deploy/assets/motions/standup_back.json index 038462a6f..3a89e6d84 100644 --- a/deploy/assets/motions/standup_back.json +++ b/deploy/assets/motions/standup_back.json @@ -1 +1 @@ -{"settings":{"interpolation_type":"Linear","exit_routine":"Standing","motion_order":["standup/on_back/ready_to_kick","standup/on_back/kick_up","standup/on_back/half_sit_to_crouch","standup/half_crouch_to_sit","standup/extend_legs"]},"submotions":{"standup/on_back/ready_to_kick":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.2,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.0,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.0,"left_elbow_yaw":0.0,"left_elbow_roll":0.0,"left_wrist_yaw":0.0,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":0.0,"left_knee_pitch":0.0,"left_ankle_pitch":0.0,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":0.0,"right_elbow_yaw":0.0,"right_elbow_roll":0.0,"right_wrist_yaw":0.0,"right_hip_roll":0.0,"right_hip_pitch":0.0,"right_knee_pitch":0.0,"right_ankle_pitch":0.0,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.6},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.0,"left_elbow_yaw":0.0,"left_elbow_roll":0.0,"left_wrist_yaw":0.113558054,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":-0.21940398,"left_knee_pitch":0.829936,"left_ankle_pitch":1.0937839,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":0.0,"right_elbow_yaw":0.0,"right_elbow_roll":0.0,"right_wrist_yaw":-0.113558054,"right_hip_roll":0.0,"right_hip_pitch":-0.21940398,"right_knee_pitch":0.829936,"right_ankle_pitch":1.0937839,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.3},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":2.146755,"left_shoulder_roll":0.0,"left_elbow_yaw":0.0,"left_elbow_roll":0.0,"left_wrist_yaw":0.113558054,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":0.55219793,"left_knee_pitch":1.1198621,"left_ankle_pitch":0.40655208,"left_ankle_roll":0.0,"right_shoulder_pitch":2.146755,"right_shoulder_roll":0.0,"right_elbow_yaw":0.0,"right_elbow_roll":0.0,"right_wrist_yaw":-0.113558054,"right_hip_roll":0.0,"right_hip_pitch":0.55219793,"right_knee_pitch":1.1198621,"right_ankle_pitch":0.40655208,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.3},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":0.55219793,"left_knee_pitch":1.1198621,"left_ankle_pitch":0.40655208,"left_ankle_roll":0.0,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":0.0,"right_hip_pitch":0.55219793,"right_knee_pitch":1.1198621,"right_ankle_pitch":0.40655208,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.3},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":0.0,"left_knee_pitch":1.9198622,"left_ankle_pitch":0.0,"left_ankle_roll":0.0,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":0.0,"right_hip_pitch":0.0,"right_knee_pitch":1.9198622,"right_ankle_pitch":0.0,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.3}]},"standup/half_crouch_to_sit":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.7453293,"left_shoulder_roll":0.36651915,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2617994,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.134464,"left_hip_roll":0.06981317,"left_hip_pitch":-0.55850536,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.012291,"left_ankle_roll":0.17453292,"right_shoulder_pitch":1.8675023,"right_shoulder_roll":-0.34906584,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.15707964,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.2617994,"right_hip_pitch":-0.31415927,"right_knee_pitch":-0.08726646,"right_ankle_pitch":0.9250245,"right_ankle_roll":0.06981317,"left_hand":0.0,"right_hand":0.0},"duration":0.7},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5707964,"left_shoulder_roll":0.36651915,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2617994,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.7592182,"left_hip_roll":0.20943952,"left_hip_pitch":-0.9599311,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.9773844,"left_ankle_roll":0.15707964,"right_shoulder_pitch":1.727876,"right_shoulder_roll":0.0,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.15707964,"right_wrist_yaw":1.5707964,"right_hip_roll":0.23561946,"right_hip_pitch":-0.7679449,"right_knee_pitch":1.6580628,"right_ankle_pitch":-0.27925268,"right_ankle_roll":0.2617994,"left_hand":0.0,"right_hand":0.0},"duration":0.5},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5184364,"left_shoulder_roll":0.33161256,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2443461,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.57595867,"left_hip_roll":-0.12217305,"left_hip_pitch":-1.0471976,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.8552113,"left_ankle_roll":0.1308997,"right_shoulder_pitch":1.4137167,"right_shoulder_roll":-0.19198622,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.13962634,"right_wrist_yaw":1.5707964,"right_hip_roll":0.15707964,"right_hip_pitch":-0.9948377,"right_knee_pitch":2.1118484,"right_ankle_pitch":-0.89011794,"right_ankle_roll":-0.15707964,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5184364,"left_shoulder_roll":0.33161256,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2443461,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.57595867,"left_hip_roll":-0.12217305,"left_hip_pitch":-1.0471976,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.8552113,"left_ankle_roll":0.1308997,"right_shoulder_pitch":1.4137167,"right_shoulder_roll":-0.19198622,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.13962634,"right_wrist_yaw":1.5707964,"right_hip_roll":0.15707964,"right_hip_pitch":-0.9948377,"right_knee_pitch":2.1118484,"right_ankle_pitch":-0.89011794,"right_ankle_roll":-0.15707964,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.43117,"left_shoulder_roll":0.2268928,"left_elbow_yaw":-1.4660766,"left_elbow_roll":-0.20943952,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":0.0,"left_hip_roll":-0.06981317,"left_hip_pitch":-0.9250245,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.1693707,"left_ankle_roll":0.034906585,"right_shoulder_pitch":1.3089969,"right_shoulder_roll":-0.12217305,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.12217305,"right_wrist_yaw":1.5707964,"right_hip_roll":0.10471976,"right_hip_pitch":-0.9075712,"right_knee_pitch":2.1118484,"right_ankle_pitch":-1.1693707,"right_ankle_roll":-0.08726646,"left_hand":0.0,"right_hand":0.0},"duration":0.2},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.43117,"left_shoulder_roll":0.2268928,"left_elbow_yaw":-1.4660766,"left_elbow_roll":-0.20943952,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":0.0,"left_hip_roll":-0.06981317,"left_hip_pitch":-0.9250245,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.1693707,"left_ankle_roll":0.034906585,"right_shoulder_pitch":1.3089969,"right_shoulder_roll":-0.12217305,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.12217305,"right_wrist_yaw":1.5707964,"right_hip_roll":0.10471976,"right_hip_pitch":-0.9075712,"right_knee_pitch":2.1118484,"right_ankle_pitch":-1.1693707,"right_ankle_roll":-0.08726646,"left_hand":0.0,"right_hand":0.0},"duration":0.2}]},"standup/on_back/kick_up":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.3,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":-1.5358897,"left_knee_pitch":-0.08726646,"left_ankle_pitch":0.0,"left_ankle_roll":0.0,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":0.0,"right_hip_pitch":-1.5358897,"right_knee_pitch":-0.08726646,"right_ankle_pitch":0.0,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.8},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":-1.5358897,"left_knee_pitch":-0.08726646,"left_ankle_pitch":0.0,"left_ankle_roll":0.0,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":0.0,"right_hip_pitch":-1.5358897,"right_knee_pitch":-0.08726646,"right_ankle_pitch":0.0,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.2},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.2268928,"left_hip_pitch":-0.27925268,"left_knee_pitch":-0.08726646,"left_ankle_pitch":1.0471976,"left_ankle_roll":0.08726646,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":-0.2268928,"right_hip_pitch":-0.27925268,"right_knee_pitch":-0.08726646,"right_ankle_pitch":1.0471976,"right_ankle_roll":-0.08726646,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":-1.3962634,"left_knee_pitch":-0.08726646,"left_ankle_pitch":0.0,"left_ankle_roll":0.0,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":0.0,"right_hip_pitch":-1.3962634,"right_knee_pitch":-0.08726646,"right_ankle_pitch":0.0,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.7}]},"standup/on_back/half_sit_to_crouch":{"joint_stifness":0.9,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[{"variable":"AngleY","min":-0.6,"max":0.6}],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":2.0943952,"left_shoulder_roll":-0.08726646,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.33161256,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.134464,"left_hip_roll":0.7330383,"left_hip_pitch":-1.3962634,"left_knee_pitch":1.3351768,"left_ankle_pitch":0.8552113,"left_ankle_roll":-0.12217305,"right_shoulder_pitch":2.1118484,"right_shoulder_roll":-0.017453292,"right_elbow_yaw":1.5184364,"right_elbow_roll":-0.38397244,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.567232,"right_hip_pitch":-1.4660766,"right_knee_pitch":1.43117,"right_ankle_pitch":0.82030475,"right_ankle_roll":0.017453292,"left_hand":0.0,"right_hand":0.0},"duration":0.5},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":2.024582,"left_shoulder_roll":-0.13962634,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.27925268,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.134464,"left_hip_roll":0.20943952,"left_hip_pitch":-0.5235988,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.715585,"left_ankle_roll":-0.33161256,"right_shoulder_pitch":2.1118484,"right_shoulder_roll":-0.6981317,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.13962634,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.34906584,"right_hip_pitch":-1.5358897,"right_knee_pitch":0.83775806,"right_ankle_pitch":0.9250245,"right_ankle_roll":-0.017453292,"left_hand":0.0,"right_hand":0.0},"duration":1.1}]},"standup/extend_legs":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.34906584,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.2,"left_elbow_yaw":-1.57,"left_elbow_roll":-0.008,"left_wrist_yaw":0.0,"left_hip_yaw_pitch":0.0138,"left_hip_roll":0.0,"left_hip_pitch":-0.3,"left_knee_pitch":0.93,"left_ankle_pitch":-0.6,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":-0.2,"right_elbow_yaw":1.57,"right_elbow_roll":0.008,"right_wrist_yaw":0.0,"right_hip_roll":0.0,"right_hip_pitch":-0.3,"right_knee_pitch":0.93,"right_ankle_pitch":-0.6,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.34906584,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.2,"left_elbow_yaw":-1.57,"left_elbow_roll":-0.008,"left_wrist_yaw":0.0,"left_hip_yaw_pitch":0.0138,"left_hip_roll":0.0,"left_hip_pitch":-0.3,"left_knee_pitch":0.93,"left_ankle_pitch":-0.6,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":-0.2,"right_elbow_yaw":1.57,"right_elbow_roll":0.008,"right_wrist_yaw":0.0,"right_hip_roll":0.0,"right_hip_pitch":-0.3,"right_knee_pitch":0.93,"right_ankle_pitch":-0.6,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.4}]}}} \ No newline at end of file +{"settings":{"interpolation_type":"Linear","exit_routine":"Standing","motion_order":["standup/on_back/ready_to_kick","standup/on_back/kick_up","standup/on_back/half_sit_to_crouch","standup/half_crouch_to_sit","standup/extend_legs"]},"submotions":{"standup/on_back/ready_to_kick":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.2,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.0,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.0,"left_elbow_yaw":0.0,"left_elbow_roll":0.0,"left_wrist_yaw":0.0,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":0.0,"left_knee_pitch":0.0,"left_ankle_pitch":0.0,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":0.0,"right_elbow_yaw":0.0,"right_elbow_roll":0.0,"right_wrist_yaw":0.0,"right_hip_roll":0.0,"right_hip_pitch":0.0,"right_knee_pitch":0.0,"right_ankle_pitch":0.0,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.6},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.0,"left_elbow_yaw":0.0,"left_elbow_roll":0.0,"left_wrist_yaw":0.113558054,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":-0.21940398,"left_knee_pitch":0.829936,"left_ankle_pitch":1.0937839,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":0.0,"right_elbow_yaw":0.0,"right_elbow_roll":0.0,"right_wrist_yaw":-0.113558054,"right_hip_roll":0.0,"right_hip_pitch":-0.21940398,"right_knee_pitch":0.829936,"right_ankle_pitch":1.0937839,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.3},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":2.146755,"left_shoulder_roll":0.0,"left_elbow_yaw":0.0,"left_elbow_roll":0.0,"left_wrist_yaw":0.113558054,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":0.55219793,"left_knee_pitch":1.1198621,"left_ankle_pitch":0.40655208,"left_ankle_roll":0.0,"right_shoulder_pitch":2.146755,"right_shoulder_roll":0.0,"right_elbow_yaw":0.0,"right_elbow_roll":0.0,"right_wrist_yaw":-0.113558054,"right_hip_roll":0.0,"right_hip_pitch":0.55219793,"right_knee_pitch":1.1198621,"right_ankle_pitch":0.40655208,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.3},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":0.55219793,"left_knee_pitch":1.1198621,"left_ankle_pitch":0.40655208,"left_ankle_roll":0.0,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":0.0,"right_hip_pitch":0.55219793,"right_knee_pitch":1.1198621,"right_ankle_pitch":0.40655208,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.3},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":0.0,"left_knee_pitch":1.9198622,"left_ankle_pitch":0.0,"left_ankle_roll":0.0,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":0.0,"right_hip_pitch":0.0,"right_knee_pitch":1.9198622,"right_ankle_pitch":0.0,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.3}]},"standup/extend_legs":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.34906584,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.2,"left_elbow_yaw":-1.57,"left_elbow_roll":-0.008,"left_wrist_yaw":0.0,"left_hip_yaw_pitch":0.0138,"left_hip_roll":0.0,"left_hip_pitch":-0.3,"left_knee_pitch":0.93,"left_ankle_pitch":-0.6,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":-0.2,"right_elbow_yaw":1.57,"right_elbow_roll":0.008,"right_wrist_yaw":0.0,"right_hip_roll":0.0,"right_hip_pitch":-0.3,"right_knee_pitch":0.93,"right_ankle_pitch":-0.6,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.34906584,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.2,"left_elbow_yaw":-1.57,"left_elbow_roll":-0.008,"left_wrist_yaw":0.0,"left_hip_yaw_pitch":0.0138,"left_hip_roll":0.0,"left_hip_pitch":-0.3,"left_knee_pitch":0.93,"left_ankle_pitch":-0.6,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":-0.2,"right_elbow_yaw":1.57,"right_elbow_roll":0.008,"right_wrist_yaw":0.0,"right_hip_roll":0.0,"right_hip_pitch":-0.3,"right_knee_pitch":0.93,"right_ankle_pitch":-0.6,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.4}]},"standup/on_back/half_sit_to_crouch":{"joint_stifness":0.9,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[{"variable":"AngleY","min":-0.6,"max":0.6}],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":2.0943952,"left_shoulder_roll":-0.08726646,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.33161256,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.134464,"left_hip_roll":0.7330383,"left_hip_pitch":-1.3962634,"left_knee_pitch":1.3351768,"left_ankle_pitch":0.8552113,"left_ankle_roll":-0.12217305,"right_shoulder_pitch":2.1118484,"right_shoulder_roll":-0.017453292,"right_elbow_yaw":1.5184364,"right_elbow_roll":-0.38397244,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.567232,"right_hip_pitch":-1.4660766,"right_knee_pitch":1.43117,"right_ankle_pitch":0.82030475,"right_ankle_roll":0.017453292,"left_hand":0.0,"right_hand":0.0},"duration":0.5},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":2.024582,"left_shoulder_roll":-0.13962634,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.27925268,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.134464,"left_hip_roll":0.20943952,"left_hip_pitch":-0.5235988,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.715585,"left_ankle_roll":-0.33161256,"right_shoulder_pitch":2.1118484,"right_shoulder_roll":-0.6981317,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.13962634,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.34906584,"right_hip_pitch":-1.5358897,"right_knee_pitch":0.83775806,"right_ankle_pitch":0.9250245,"right_ankle_roll":-0.017453292,"left_hand":0.0,"right_hand":0.0},"duration":1.1}]},"standup/on_back/kick_up":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.3,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":-1.5358897,"left_knee_pitch":-0.08726646,"left_ankle_pitch":0.0,"left_ankle_roll":0.0,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":0.0,"right_hip_pitch":-1.5358897,"right_knee_pitch":-0.08726646,"right_ankle_pitch":0.0,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.8},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":-1.5358897,"left_knee_pitch":-0.08726646,"left_ankle_pitch":0.0,"left_ankle_roll":0.0,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":0.0,"right_hip_pitch":-1.5358897,"right_knee_pitch":-0.08726646,"right_ankle_pitch":0.0,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.2},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.2268928,"left_hip_pitch":-0.27925268,"left_knee_pitch":-0.08726646,"left_ankle_pitch":1.0471976,"left_ankle_roll":0.08726646,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":-0.2268928,"right_hip_pitch":-0.27925268,"right_knee_pitch":-0.08726646,"right_ankle_pitch":1.0471976,"right_ankle_roll":-0.08726646,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":-1.3962634,"left_knee_pitch":-0.08726646,"left_ankle_pitch":0.0,"left_ankle_roll":0.0,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":0.0,"right_hip_pitch":-1.3962634,"right_knee_pitch":-0.08726646,"right_ankle_pitch":0.0,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.7}]},"standup/half_crouch_to_sit":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.7453293,"left_shoulder_roll":0.36651915,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2617994,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.134464,"left_hip_roll":0.06981317,"left_hip_pitch":-0.55850536,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.012291,"left_ankle_roll":0.17453292,"right_shoulder_pitch":1.8675023,"right_shoulder_roll":-0.34906584,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.15707964,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.2617994,"right_hip_pitch":-0.31415927,"right_knee_pitch":-0.08726646,"right_ankle_pitch":0.9250245,"right_ankle_roll":0.06981317,"left_hand":0.0,"right_hand":0.0},"duration":0.7},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5707964,"left_shoulder_roll":0.36651915,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2617994,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.7592182,"left_hip_roll":0.20943952,"left_hip_pitch":-0.9599311,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.9773844,"left_ankle_roll":0.15707964,"right_shoulder_pitch":1.727876,"right_shoulder_roll":0.0,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.15707964,"right_wrist_yaw":1.5707964,"right_hip_roll":0.23561946,"right_hip_pitch":-0.7679449,"right_knee_pitch":1.6580628,"right_ankle_pitch":-0.27925268,"right_ankle_roll":0.2617994,"left_hand":0.0,"right_hand":0.0},"duration":0.5},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5184364,"left_shoulder_roll":0.33161256,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2443461,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.57595867,"left_hip_roll":-0.12217305,"left_hip_pitch":-1.0471976,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.8552113,"left_ankle_roll":0.1308997,"right_shoulder_pitch":1.4137167,"right_shoulder_roll":-0.19198622,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.13962634,"right_wrist_yaw":1.5707964,"right_hip_roll":0.15707964,"right_hip_pitch":-0.9948377,"right_knee_pitch":2.1118484,"right_ankle_pitch":-0.89011794,"right_ankle_roll":-0.15707964,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5184364,"left_shoulder_roll":0.33161256,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2443461,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.57595867,"left_hip_roll":-0.12217305,"left_hip_pitch":-1.0471976,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.8552113,"left_ankle_roll":0.1308997,"right_shoulder_pitch":1.4137167,"right_shoulder_roll":-0.19198622,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.13962634,"right_wrist_yaw":1.5707964,"right_hip_roll":0.15707964,"right_hip_pitch":-0.9948377,"right_knee_pitch":2.1118484,"right_ankle_pitch":-0.89011794,"right_ankle_roll":-0.15707964,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.43117,"left_shoulder_roll":0.2268928,"left_elbow_yaw":-1.4660766,"left_elbow_roll":-0.20943952,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":0.0,"left_hip_roll":-0.06981317,"left_hip_pitch":-0.9250245,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.1693707,"left_ankle_roll":0.034906585,"right_shoulder_pitch":1.3089969,"right_shoulder_roll":-0.12217305,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.12217305,"right_wrist_yaw":1.5707964,"right_hip_roll":0.10471976,"right_hip_pitch":-0.9075712,"right_knee_pitch":2.1118484,"right_ankle_pitch":-1.1693707,"right_ankle_roll":-0.08726646,"left_hand":0.0,"right_hand":0.0},"duration":0.2},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.43117,"left_shoulder_roll":0.2268928,"left_elbow_yaw":-1.4660766,"left_elbow_roll":-0.20943952,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":0.0,"left_hip_roll":-0.06981317,"left_hip_pitch":-0.9250245,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.1693707,"left_ankle_roll":0.034906585,"right_shoulder_pitch":1.3089969,"right_shoulder_roll":-0.12217305,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.12217305,"right_wrist_yaw":1.5707964,"right_hip_roll":0.10471976,"right_hip_pitch":-0.9075712,"right_knee_pitch":2.1118484,"right_ankle_pitch":-1.1693707,"right_ankle_roll":-0.08726646,"left_hand":0.0,"right_hand":0.0},"duration":0.2}]}}} \ No newline at end of file diff --git a/deploy/assets/motions/standup_stomach.json b/deploy/assets/motions/standup_stomach.json index 3c405f6fc..a85b696f0 100644 --- a/deploy/assets/motions/standup_stomach.json +++ b/deploy/assets/motions/standup_stomach.json @@ -1 +1 @@ -{"settings":{"interpolation_type":"Linear","exit_routine":"Standing","motion_order":["standup/on_stomach/lying_to_yoga","standup/on_stomach/yoga_to_sitting","standup/on_stomach/sitting_to_half_crouch","standup/half_crouch_to_sit","standup/extend_legs"]},"submotions":{"standup/extend_legs":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.34906584,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.2,"left_elbow_yaw":-1.57,"left_elbow_roll":-0.008,"left_wrist_yaw":0.0,"left_hip_yaw_pitch":0.0138,"left_hip_roll":0.0,"left_hip_pitch":-0.3,"left_knee_pitch":0.93,"left_ankle_pitch":-0.6,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":-0.2,"right_elbow_yaw":1.57,"right_elbow_roll":0.008,"right_wrist_yaw":0.0,"right_hip_roll":0.0,"right_hip_pitch":-0.3,"right_knee_pitch":0.93,"right_ankle_pitch":-0.6,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.34906584,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.2,"left_elbow_yaw":-1.57,"left_elbow_roll":-0.008,"left_wrist_yaw":0.0,"left_hip_yaw_pitch":0.0138,"left_hip_roll":0.0,"left_hip_pitch":-0.3,"left_knee_pitch":0.93,"left_ankle_pitch":-0.6,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":-0.2,"right_elbow_yaw":1.57,"right_elbow_roll":0.008,"right_wrist_yaw":0.0,"right_hip_roll":0.0,"right_hip_pitch":-0.3,"right_knee_pitch":0.93,"right_ankle_pitch":-0.6,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.4}]},"standup/on_stomach/yoga_to_sitting":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.5,"left_shoulder_pitch":1.9495327,"left_shoulder_roll":-0.073303826,"left_elbow_yaw":1.5812683,"left_elbow_roll":0.006981317,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.51138145,"left_hip_roll":-0.02443461,"left_hip_pitch":-1.1885692,"left_knee_pitch":-0.012217305,"left_ankle_pitch":-0.3944444,"left_ankle_roll":0.286234,"right_shoulder_pitch":1.9198622,"right_shoulder_roll":0.045378562,"right_elbow_yaw":-1.3421582,"right_elbow_roll":0.15009831,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.040142573,"right_hip_pitch":-1.298525,"right_knee_pitch":0.022689281,"right_ankle_pitch":0.0017453292,"right_ankle_roll":-0.31066862,"left_hand":0.0,"right_hand":0.0},"duration":0.5},{"target_position":{"head_yaw":0.0,"head_pitch":0.5,"left_shoulder_pitch":2.0909045,"left_shoulder_roll":0.13613568,"left_elbow_yaw":-1.2409291,"left_elbow_roll":-0.54803336,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.98262036,"left_hip_roll":0.27576202,"left_hip_pitch":-0.87266463,"left_knee_pitch":-0.12042772,"left_ankle_pitch":0.15358898,"left_ankle_roll":-0.21642083,"right_shoulder_pitch":2.1223204,"right_shoulder_roll":-0.006981317,"right_elbow_yaw":1.5271631,"right_elbow_roll":0.3874631,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.33161256,"right_hip_pitch":-0.85695666,"right_knee_pitch":-0.12042772,"right_ankle_pitch":0.27925268,"right_ankle_roll":-0.082030475,"left_hand":0.0,"right_hand":0.0},"duration":0.693181818}]},"standup/half_crouch_to_sit":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.7453293,"left_shoulder_roll":0.36651915,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2617994,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.134464,"left_hip_roll":0.06981317,"left_hip_pitch":-0.55850536,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.012291,"left_ankle_roll":0.17453292,"right_shoulder_pitch":1.8675023,"right_shoulder_roll":-0.34906584,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.15707964,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.2617994,"right_hip_pitch":-0.31415927,"right_knee_pitch":-0.08726646,"right_ankle_pitch":0.9250245,"right_ankle_roll":0.06981317,"left_hand":0.0,"right_hand":0.0},"duration":0.7},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5707964,"left_shoulder_roll":0.36651915,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2617994,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.7592182,"left_hip_roll":0.20943952,"left_hip_pitch":-0.9599311,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.9773844,"left_ankle_roll":0.15707964,"right_shoulder_pitch":1.727876,"right_shoulder_roll":0.0,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.15707964,"right_wrist_yaw":1.5707964,"right_hip_roll":0.23561946,"right_hip_pitch":-0.7679449,"right_knee_pitch":1.6580628,"right_ankle_pitch":-0.27925268,"right_ankle_roll":0.2617994,"left_hand":0.0,"right_hand":0.0},"duration":0.5},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5184364,"left_shoulder_roll":0.33161256,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2443461,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.57595867,"left_hip_roll":-0.12217305,"left_hip_pitch":-1.0471976,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.8552113,"left_ankle_roll":0.1308997,"right_shoulder_pitch":1.4137167,"right_shoulder_roll":-0.19198622,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.13962634,"right_wrist_yaw":1.5707964,"right_hip_roll":0.15707964,"right_hip_pitch":-0.9948377,"right_knee_pitch":2.1118484,"right_ankle_pitch":-0.89011794,"right_ankle_roll":-0.15707964,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5184364,"left_shoulder_roll":0.33161256,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2443461,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.57595867,"left_hip_roll":-0.12217305,"left_hip_pitch":-1.0471976,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.8552113,"left_ankle_roll":0.1308997,"right_shoulder_pitch":1.4137167,"right_shoulder_roll":-0.19198622,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.13962634,"right_wrist_yaw":1.5707964,"right_hip_roll":0.15707964,"right_hip_pitch":-0.9948377,"right_knee_pitch":2.1118484,"right_ankle_pitch":-0.89011794,"right_ankle_roll":-0.15707964,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.43117,"left_shoulder_roll":0.2268928,"left_elbow_yaw":-1.4660766,"left_elbow_roll":-0.20943952,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":0.0,"left_hip_roll":-0.06981317,"left_hip_pitch":-0.9250245,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.1693707,"left_ankle_roll":0.034906585,"right_shoulder_pitch":1.3089969,"right_shoulder_roll":-0.12217305,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.12217305,"right_wrist_yaw":1.5707964,"right_hip_roll":0.10471976,"right_hip_pitch":-0.9075712,"right_knee_pitch":2.1118484,"right_ankle_pitch":-1.1693707,"right_ankle_roll":-0.08726646,"left_hand":0.0,"right_hand":0.0},"duration":0.2},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.43117,"left_shoulder_roll":0.2268928,"left_elbow_yaw":-1.4660766,"left_elbow_roll":-0.20943952,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":0.0,"left_hip_roll":-0.06981317,"left_hip_pitch":-0.9250245,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.1693707,"left_ankle_roll":0.034906585,"right_shoulder_pitch":1.3089969,"right_shoulder_roll":-0.12217305,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.12217305,"right_wrist_yaw":1.5707964,"right_hip_roll":0.10471976,"right_hip_pitch":-0.9075712,"right_knee_pitch":2.1118484,"right_ankle_pitch":-1.1693707,"right_ankle_roll":-0.08726646,"left_hand":0.0,"right_hand":0.0},"duration":0.2}]},"standup/on_stomach/sitting_to_half_crouch":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.7,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.6,"head_pitch":0.5,"left_shoulder_pitch":2.0926497,"left_shoulder_roll":-0.0837758,"left_elbow_yaw":-1.4887658,"left_elbow_roll":-0.32463124,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.134464,"left_hip_roll":0.7278023,"left_hip_pitch":-1.399754,"left_knee_pitch":1.3351768,"left_ankle_pitch":0.86044735,"left_ankle_roll":-0.12566371,"right_shoulder_pitch":2.1223204,"right_shoulder_roll":-0.015707964,"right_elbow_yaw":1.5254178,"right_elbow_roll":0.39095375,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.567232,"right_hip_pitch":-1.4660766,"right_knee_pitch":1.4276793,"right_ankle_pitch":0.8220501,"right_ankle_roll":0.019198623,"left_hand":0.0,"right_hand":0.0},"duration":0.693181818},{"target_position":{"head_yaw":0.0,"head_pitch":0.5,"left_shoulder_pitch":2.0210912,"left_shoulder_roll":-0.13264503,"left_elbow_yaw":-1.4765486,"left_elbow_roll":-0.27750736,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.2025318,"left_hip_roll":0.20420352,"left_hip_pitch":-0.51836276,"left_knee_pitch":2.1746802,"left_ankle_pitch":-0.71383965,"left_ankle_roll":-0.3298672,"right_shoulder_pitch":2.1066124,"right_shoulder_roll":-0.6928957,"right_elbow_yaw":1.7348573,"right_elbow_roll":0.143117,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.35430184,"right_hip_pitch":-1.5603243,"right_knee_pitch":0.8412487,"right_ankle_pitch":0.9180432,"right_ankle_roll":-0.017453292,"left_hand":0.0,"right_hand":0.0},"duration":0.9}]},"standup/on_stomach/lying_to_yoga":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":-0.672,"left_shoulder_pitch":-0.017453292,"left_shoulder_roll":1.1519173,"left_elbow_yaw":-1.5184364,"left_elbow_roll":-0.029670598,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":0.0,"left_knee_pitch":0.0,"left_ankle_pitch":1.0471976,"left_ankle_roll":0.0,"right_shoulder_pitch":0.017453292,"right_shoulder_roll":-1.1519173,"right_elbow_yaw":1.5184364,"right_elbow_roll":0.029670598,"right_wrist_yaw":1.5707964,"right_hip_roll":0.0,"right_hip_pitch":0.0,"right_knee_pitch":0.0,"right_ankle_pitch":1.0471976,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.6},{"target_position":{"head_yaw":0.0,"head_pitch":-0.672,"left_shoulder_pitch":1.881465,"left_shoulder_roll":1.298525,"left_elbow_yaw":-0.6230825,"left_elbow_roll":-1.399754,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.1833333,"left_hip_roll":0.68416905,"left_hip_pitch":0.4886922,"left_knee_pitch":-0.11868239,"left_ankle_pitch":-0.19896753,"left_ankle_roll":0.6143559,"right_shoulder_pitch":1.7208947,"right_shoulder_roll":-1.2863077,"right_elbow_yaw":0.08901179,"right_elbow_roll":1.2810717,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.75398225,"right_hip_pitch":0.4956735,"right_knee_pitch":-0.101229094,"right_ankle_pitch":-0.15707964,"right_ankle_roll":-0.62482786,"left_hand":0.0,"right_hand":0.0},"duration":0.45},{"target_position":{"head_yaw":0.0,"head_pitch":0.0,"left_shoulder_pitch":2.0385447,"left_shoulder_roll":-0.006981317,"left_elbow_yaw":1.9373155,"left_elbow_roll":-1.5568337,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.1920599,"left_hip_roll":0.72431165,"left_hip_pitch":-1.5376351,"left_knee_pitch":-0.06632251,"left_ankle_pitch":0.19373155,"left_ankle_roll":0.56548667,"right_shoulder_pitch":2.1101031,"right_shoulder_roll":0.34906584,"right_elbow_yaw":-1.3194689,"right_elbow_roll":1.558579,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.8045968,"right_hip_pitch":0.45204028,"right_knee_pitch":-0.082030475,"right_ankle_pitch":0.2984513,"right_ankle_roll":-0.5427974,"left_hand":0.0,"right_hand":0.0},"duration":0.272727272},{"target_position":{"head_yaw":0.0,"head_pitch":-0.672,"left_shoulder_pitch":2.0699606,"left_shoulder_roll":-0.006981317,"left_elbow_yaw":1.9477874,"left_elbow_roll":-1.558579,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.2025318,"left_hip_roll":0.699877,"left_hip_pitch":-1.5917403,"left_knee_pitch":-0.11519173,"left_ankle_pitch":0.19024089,"left_ankle_roll":0.56897736,"right_shoulder_pitch":2.1170843,"right_shoulder_roll":0.34906584,"right_elbow_yaw":-1.3159783,"right_elbow_roll":1.558579,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.68416905,"right_hip_pitch":-1.6126842,"right_knee_pitch":2.1275563,"right_ankle_pitch":0.23736478,"right_ankle_roll":-0.5375614,"left_hand":0.0,"right_hand":0.0},"duration":0.272727},{"target_position":{"head_yaw":0.0,"head_pitch":0.0,"left_shoulder_pitch":2.0804324,"left_shoulder_roll":-0.006981317,"left_elbow_yaw":1.9512781,"left_elbow_roll":-1.558579,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.2095132,"left_hip_roll":0.7347836,"left_hip_pitch":-1.5934856,"left_knee_pitch":-0.12217305,"left_ankle_pitch":0.20769419,"left_ankle_roll":0.567232,"right_shoulder_pitch":2.0909045,"right_shoulder_roll":0.34906584,"right_elbow_yaw":-1.3159783,"right_elbow_roll":1.5550884,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.7923795,"right_hip_pitch":-1.6109389,"right_knee_pitch":-0.12217305,"right_ankle_pitch":0.2565634,"right_ankle_roll":-0.40317106,"left_hand":0.0,"right_hand":0.0},"duration":0.554545455}]}}} \ No newline at end of file +{"settings":{"interpolation_type":"Linear","exit_routine":"Standing","motion_order":["standup/on_stomach/lying_to_yoga","standup/on_stomach/yoga_to_sitting","standup/on_stomach/sitting_to_half_crouch","standup/half_crouch_to_sit","standup/extend_legs"]},"submotions":{"standup/half_crouch_to_sit":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.7453293,"left_shoulder_roll":0.36651915,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2617994,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.134464,"left_hip_roll":0.06981317,"left_hip_pitch":-0.55850536,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.012291,"left_ankle_roll":0.17453292,"right_shoulder_pitch":1.8675023,"right_shoulder_roll":-0.34906584,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.15707964,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.2617994,"right_hip_pitch":-0.31415927,"right_knee_pitch":-0.08726646,"right_ankle_pitch":0.9250245,"right_ankle_roll":0.06981317,"left_hand":0.0,"right_hand":0.0},"duration":0.7},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5707964,"left_shoulder_roll":0.36651915,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2617994,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.7592182,"left_hip_roll":0.20943952,"left_hip_pitch":-0.9599311,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.9773844,"left_ankle_roll":0.15707964,"right_shoulder_pitch":1.727876,"right_shoulder_roll":0.0,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.15707964,"right_wrist_yaw":1.5707964,"right_hip_roll":0.23561946,"right_hip_pitch":-0.7679449,"right_knee_pitch":1.6580628,"right_ankle_pitch":-0.27925268,"right_ankle_roll":0.2617994,"left_hand":0.0,"right_hand":0.0},"duration":0.5},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5184364,"left_shoulder_roll":0.33161256,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2443461,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.57595867,"left_hip_roll":-0.12217305,"left_hip_pitch":-1.0471976,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.8552113,"left_ankle_roll":0.1308997,"right_shoulder_pitch":1.4137167,"right_shoulder_roll":-0.19198622,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.13962634,"right_wrist_yaw":1.5707964,"right_hip_roll":0.15707964,"right_hip_pitch":-0.9948377,"right_knee_pitch":2.1118484,"right_ankle_pitch":-0.89011794,"right_ankle_roll":-0.15707964,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5184364,"left_shoulder_roll":0.33161256,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2443461,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.57595867,"left_hip_roll":-0.12217305,"left_hip_pitch":-1.0471976,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.8552113,"left_ankle_roll":0.1308997,"right_shoulder_pitch":1.4137167,"right_shoulder_roll":-0.19198622,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.13962634,"right_wrist_yaw":1.5707964,"right_hip_roll":0.15707964,"right_hip_pitch":-0.9948377,"right_knee_pitch":2.1118484,"right_ankle_pitch":-0.89011794,"right_ankle_roll":-0.15707964,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.43117,"left_shoulder_roll":0.2268928,"left_elbow_yaw":-1.4660766,"left_elbow_roll":-0.20943952,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":0.0,"left_hip_roll":-0.06981317,"left_hip_pitch":-0.9250245,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.1693707,"left_ankle_roll":0.034906585,"right_shoulder_pitch":1.3089969,"right_shoulder_roll":-0.12217305,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.12217305,"right_wrist_yaw":1.5707964,"right_hip_roll":0.10471976,"right_hip_pitch":-0.9075712,"right_knee_pitch":2.1118484,"right_ankle_pitch":-1.1693707,"right_ankle_roll":-0.08726646,"left_hand":0.0,"right_hand":0.0},"duration":0.2},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.43117,"left_shoulder_roll":0.2268928,"left_elbow_yaw":-1.4660766,"left_elbow_roll":-0.20943952,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":0.0,"left_hip_roll":-0.06981317,"left_hip_pitch":-0.9250245,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.1693707,"left_ankle_roll":0.034906585,"right_shoulder_pitch":1.3089969,"right_shoulder_roll":-0.12217305,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.12217305,"right_wrist_yaw":1.5707964,"right_hip_roll":0.10471976,"right_hip_pitch":-0.9075712,"right_knee_pitch":2.1118484,"right_ankle_pitch":-1.1693707,"right_ankle_roll":-0.08726646,"left_hand":0.0,"right_hand":0.0},"duration":0.2}]},"standup/on_stomach/lying_to_yoga":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":-0.672,"left_shoulder_pitch":-0.017453292,"left_shoulder_roll":1.1519173,"left_elbow_yaw":-1.5184364,"left_elbow_roll":-0.029670598,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":0.0,"left_knee_pitch":0.0,"left_ankle_pitch":1.0471976,"left_ankle_roll":0.0,"right_shoulder_pitch":0.017453292,"right_shoulder_roll":-1.1519173,"right_elbow_yaw":1.5184364,"right_elbow_roll":0.029670598,"right_wrist_yaw":1.5707964,"right_hip_roll":0.0,"right_hip_pitch":0.0,"right_knee_pitch":0.0,"right_ankle_pitch":1.0471976,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.6},{"target_position":{"head_yaw":0.0,"head_pitch":-0.672,"left_shoulder_pitch":1.881465,"left_shoulder_roll":1.298525,"left_elbow_yaw":-0.6230825,"left_elbow_roll":-1.399754,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.1833333,"left_hip_roll":0.68416905,"left_hip_pitch":0.4886922,"left_knee_pitch":-0.11868239,"left_ankle_pitch":-0.19896753,"left_ankle_roll":0.6143559,"right_shoulder_pitch":1.7208947,"right_shoulder_roll":-1.2863077,"right_elbow_yaw":0.08901179,"right_elbow_roll":1.2810717,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.75398225,"right_hip_pitch":0.4956735,"right_knee_pitch":-0.101229094,"right_ankle_pitch":-0.15707964,"right_ankle_roll":-0.62482786,"left_hand":0.0,"right_hand":0.0},"duration":0.45},{"target_position":{"head_yaw":0.0,"head_pitch":0.0,"left_shoulder_pitch":2.0385447,"left_shoulder_roll":-0.006981317,"left_elbow_yaw":1.9373155,"left_elbow_roll":-1.5568337,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.1920599,"left_hip_roll":0.72431165,"left_hip_pitch":-1.5376351,"left_knee_pitch":-0.06632251,"left_ankle_pitch":0.19373155,"left_ankle_roll":0.56548667,"right_shoulder_pitch":2.1101031,"right_shoulder_roll":0.34906584,"right_elbow_yaw":-1.3194689,"right_elbow_roll":1.558579,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.8045968,"right_hip_pitch":0.45204028,"right_knee_pitch":-0.082030475,"right_ankle_pitch":0.2984513,"right_ankle_roll":-0.5427974,"left_hand":0.0,"right_hand":0.0},"duration":0.272727272},{"target_position":{"head_yaw":0.0,"head_pitch":-0.672,"left_shoulder_pitch":2.0699606,"left_shoulder_roll":-0.006981317,"left_elbow_yaw":1.9477874,"left_elbow_roll":-1.558579,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.2025318,"left_hip_roll":0.699877,"left_hip_pitch":-1.5917403,"left_knee_pitch":-0.11519173,"left_ankle_pitch":0.19024089,"left_ankle_roll":0.56897736,"right_shoulder_pitch":2.1170843,"right_shoulder_roll":0.34906584,"right_elbow_yaw":-1.3159783,"right_elbow_roll":1.558579,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.68416905,"right_hip_pitch":-1.6126842,"right_knee_pitch":2.1275563,"right_ankle_pitch":0.23736478,"right_ankle_roll":-0.5375614,"left_hand":0.0,"right_hand":0.0},"duration":0.272727},{"target_position":{"head_yaw":0.0,"head_pitch":0.0,"left_shoulder_pitch":2.0804324,"left_shoulder_roll":-0.006981317,"left_elbow_yaw":1.9512781,"left_elbow_roll":-1.558579,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.2095132,"left_hip_roll":0.7347836,"left_hip_pitch":-1.5934856,"left_knee_pitch":-0.12217305,"left_ankle_pitch":0.20769419,"left_ankle_roll":0.567232,"right_shoulder_pitch":2.0909045,"right_shoulder_roll":0.34906584,"right_elbow_yaw":-1.3159783,"right_elbow_roll":1.5550884,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.7923795,"right_hip_pitch":-1.6109389,"right_knee_pitch":-0.12217305,"right_ankle_pitch":0.2565634,"right_ankle_roll":-0.40317106,"left_hand":0.0,"right_hand":0.0},"duration":0.554545455}]},"standup/on_stomach/yoga_to_sitting":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.5,"left_shoulder_pitch":1.9495327,"left_shoulder_roll":-0.073303826,"left_elbow_yaw":1.5812683,"left_elbow_roll":0.006981317,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.51138145,"left_hip_roll":-0.02443461,"left_hip_pitch":-1.1885692,"left_knee_pitch":-0.012217305,"left_ankle_pitch":-0.3944444,"left_ankle_roll":0.286234,"right_shoulder_pitch":1.9198622,"right_shoulder_roll":0.045378562,"right_elbow_yaw":-1.3421582,"right_elbow_roll":0.15009831,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.040142573,"right_hip_pitch":-1.298525,"right_knee_pitch":0.022689281,"right_ankle_pitch":0.0017453292,"right_ankle_roll":-0.31066862,"left_hand":0.0,"right_hand":0.0},"duration":0.5},{"target_position":{"head_yaw":0.0,"head_pitch":0.5,"left_shoulder_pitch":2.0909045,"left_shoulder_roll":0.13613568,"left_elbow_yaw":-1.2409291,"left_elbow_roll":-0.54803336,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.98262036,"left_hip_roll":0.27576202,"left_hip_pitch":-0.87266463,"left_knee_pitch":-0.12042772,"left_ankle_pitch":0.15358898,"left_ankle_roll":-0.21642083,"right_shoulder_pitch":2.1223204,"right_shoulder_roll":-0.006981317,"right_elbow_yaw":1.5271631,"right_elbow_roll":0.3874631,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.33161256,"right_hip_pitch":-0.85695666,"right_knee_pitch":-0.12042772,"right_ankle_pitch":0.27925268,"right_ankle_roll":-0.082030475,"left_hand":0.0,"right_hand":0.0},"duration":0.693181818}]},"standup/on_stomach/sitting_to_half_crouch":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.7,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.6,"head_pitch":0.5,"left_shoulder_pitch":2.0926497,"left_shoulder_roll":-0.0837758,"left_elbow_yaw":-1.4887658,"left_elbow_roll":-0.32463124,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.134464,"left_hip_roll":0.7278023,"left_hip_pitch":-1.399754,"left_knee_pitch":1.3351768,"left_ankle_pitch":0.86044735,"left_ankle_roll":-0.12566371,"right_shoulder_pitch":2.1223204,"right_shoulder_roll":-0.015707964,"right_elbow_yaw":1.5254178,"right_elbow_roll":0.39095375,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.567232,"right_hip_pitch":-1.4660766,"right_knee_pitch":1.4276793,"right_ankle_pitch":0.8220501,"right_ankle_roll":0.019198623,"left_hand":0.0,"right_hand":0.0},"duration":0.693181818},{"target_position":{"head_yaw":0.0,"head_pitch":0.5,"left_shoulder_pitch":2.0210912,"left_shoulder_roll":-0.13264503,"left_elbow_yaw":-1.4765486,"left_elbow_roll":-0.27750736,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.2025318,"left_hip_roll":0.20420352,"left_hip_pitch":-0.51836276,"left_knee_pitch":2.1746802,"left_ankle_pitch":-0.71383965,"left_ankle_roll":-0.3298672,"right_shoulder_pitch":2.1066124,"right_shoulder_roll":-0.6928957,"right_elbow_yaw":1.7348573,"right_elbow_roll":0.143117,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.35430184,"right_hip_pitch":-1.5603243,"right_knee_pitch":0.8412487,"right_ankle_pitch":0.9180432,"right_ankle_roll":-0.017453292,"left_hand":0.0,"right_hand":0.0},"duration":0.9}]},"standup/extend_legs":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.34906584,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.2,"left_elbow_yaw":-1.57,"left_elbow_roll":-0.008,"left_wrist_yaw":0.0,"left_hip_yaw_pitch":0.0138,"left_hip_roll":0.0,"left_hip_pitch":-0.3,"left_knee_pitch":0.93,"left_ankle_pitch":-0.6,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":-0.2,"right_elbow_yaw":1.57,"right_elbow_roll":0.008,"right_wrist_yaw":0.0,"right_hip_roll":0.0,"right_hip_pitch":-0.3,"right_knee_pitch":0.93,"right_ankle_pitch":-0.6,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.34906584,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.2,"left_elbow_yaw":-1.57,"left_elbow_roll":-0.008,"left_wrist_yaw":0.0,"left_hip_yaw_pitch":0.0138,"left_hip_roll":0.0,"left_hip_pitch":-0.3,"left_knee_pitch":0.93,"left_ankle_pitch":-0.6,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":-0.2,"right_elbow_yaw":1.57,"right_elbow_roll":0.008,"right_wrist_yaw":0.0,"right_hip_roll":0.0,"right_hip_pitch":-0.3,"right_knee_pitch":0.93,"right_ankle_pitch":-0.6,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.4}]}}} \ No newline at end of file diff --git a/tools/simulation/Cargo.toml b/tools/simulation/Cargo.toml index 1807970c2..e60cb0924 100644 --- a/tools/simulation/Cargo.toml +++ b/tools/simulation/Cargo.toml @@ -18,7 +18,7 @@ yggdrasil = { workspace = true } bevy = { workspace = true } bevy_egui = { workspace = true } nalgebra = { workspace = true } - +filter = { version = "0.1.0", path = "../../crates/filter" } ml = { workspace = true } tasks = { workspace = true } diff --git a/tools/simulation/src/main.rs b/tools/simulation/src/main.rs index b3a7f48ee..3f769e854 100644 --- a/tools/simulation/src/main.rs +++ b/tools/simulation/src/main.rs @@ -1,14 +1,17 @@ +use std::time::Instant; + use bevy::app::{AppLabel, MainSchedulePlugin}; use bevy::ecs::event::EventRegistry; use bevy::state::app::StatesPlugin; use bevy::{prelude::*, render::camera::Viewport, window::PrimaryWindow}; use bevy_egui::egui::{Direction, Layout, RichText, Ui}; -use bevy_egui::{egui, EguiContexts, EguiPlugin}; +use bevy_egui::{EguiContexts, EguiPlugin, egui}; use bifrost::communication::{ CompetitionPhase, CompetitionType, GameControllerMessage, GamePhase, GameState, Half, Penalty, RobotInfo, SetPlay, TeamColor, TeamInfo, }; -use nalgebra::{Isometry2, Translation2, UnitComplex, Vector2}; +use filter::{CovarianceMatrix, UnscentedKalmanFilter}; +use nalgebra::{Isometry2, Point2, Translation2, UnitComplex, Vector2}; use tasks::TaskPlugin; use yggdrasil::behavior::behaviors::Stand; use yggdrasil::behavior::engine::CommandsBehaviorExt; @@ -19,12 +22,13 @@ use yggdrasil::core::config::layout::RobotPosition; use yggdrasil::core::config::showtime::{self, PlayerConfig}; use yggdrasil::core::{config, control, debug}; use yggdrasil::localization::RobotPose; -use yggdrasil::motion::odometry::{self, Odometry}; +use yggdrasil::localization::odometry::{self, Odometry}; use yggdrasil::motion::walking_engine::step_context::StepContext; +use yggdrasil::nao::Cycle; use yggdrasil::prelude::Config; use yggdrasil::sensor::orientation::update_orientation; -use yggdrasil::vision::ball_detection::ball_tracker::BallTracker; +use yggdrasil::vision::ball_detection::ball_tracker::{BallPosition, BallTracker}; use yggdrasil::vision::referee::communication::ReceivedRefereePose; use yggdrasil::vision::referee::recognize::RefereePoseRecognized; use yggdrasil::{ @@ -38,7 +42,7 @@ const FIELD_WIDTH_METERS: f32 = 10.4; const FIELD_HEIGHT_METERS: f32 = 7.4; // Remove fixed visual dimensions since we'll calculate them dynamically const PIXELS_PER_METER: f32 = 100.0; // Base scale factor, will be adjusted dynamically - // Robot size in meters +// Robot size in meters const ROBOT_SIZE_METERS: f32 = 0.5; // 50cm x 50cm robot // Scale factors to convert between meters and pixels - will be updated dynamically @@ -71,7 +75,12 @@ fn main() { pixels_per_meter: PIXELS_PER_METER, }) .init_resource::() - .add_plugins((DefaultPlugins, EguiPlugin, MeshPickingPlugin)) + .add_plugins(( + DefaultPlugins, + EguiPlugin { + enable_multipass_for_primary_context: false, + }, + )) .add_systems(Startup, setup_system) .add_systems( Update, @@ -113,6 +122,19 @@ fn create_full_robot(player_number: u8) -> SubApp { sub_app.init_resource::(); sub_app.insert_resource(PlayNum(player_number)); + let ball_tracker = BallTracker { + position_kf: UnscentedKalmanFilter::<2, 5, BallPosition>::new( + BallPosition(Point2::new(0.0, 0.0)), + CovarianceMatrix::from_diagonal_element(0.001), // variance = std^2, and we don't know where the ball is + ), + // prediction is done each cycle, this is roughly 1.7cm of std per cycle or 1.3 meters per second + prediction_noise: CovarianceMatrix::from_diagonal_element(0.001), + sensor_noise: CovarianceMatrix::from_diagonal_element(0.001), + cycle: Cycle::default(), + timestamp: Instant::now(), + stationary_variance_threshold: 0.001, // variance = std^2 + }; + sub_app .add_plugins((MinimalPlugins, MainSchedulePlugin, StatesPlugin)) .add_plugins(( @@ -132,7 +154,7 @@ fn create_full_robot(player_number: u8) -> SubApp { motion::MotionPlugins, // Removed vision::VisionPlugins, )) - .insert_resource(BallTracker::default()) + .insert_resource(ball_tracker) .insert_resource(Whistle::default()) .insert_resource(initial_gamecontroller()) .add_event::() @@ -140,9 +162,7 @@ fn create_full_robot(player_number: u8) -> SubApp { .add_systems(PostStartup, (setup_robot, update_orientation)) .add_systems( PreUpdate, - (update_simulated_odometry - .after(odometry::update_odometry) - .before(localization::update_robot_pose),), + (update_simulated_odometry.after(odometry::update_odometry)), ) .add_systems( PreStartup, @@ -383,8 +403,8 @@ fn update_field_scale( mut field_query: Query<&mut Sprite, With>, camera: Query<&Camera>, ) { - let window = window.single(); - let camera = camera.single(); + let window = window.single().expect("Simulation did not find a window!"); + let camera = camera.single().expect("Simulation did not find a camera!"); if let Some(viewport) = &camera.viewport { let available_width = viewport.physical_size.x as f32 / window.scale_factor(); @@ -399,7 +419,7 @@ fn update_field_scale( field_scale.pixels_per_meter = new_scale; // Update field sprite size - if let Ok(mut sprite) = field_query.get_single_mut() { + if let Ok(mut sprite) = field_query.single_mut() { sprite.custom_size = Some(Vec2::new( FIELD_WIDTH_METERS * new_scale, FIELD_HEIGHT_METERS * new_scale, @@ -412,7 +432,10 @@ fn update_field_scale( fn update_position_markers( field_scale: Res, mut circle_query: Query<&mut Transform, (With, Without)>, - mut text_query: Query<(&mut Transform, &Parent), (With, Without)>, + mut text_query: Query< + (&mut Transform, &ChildOf), + (With, Without), + >, robot_transforms: Query< &Transform, (With, Without, Without), @@ -425,9 +448,9 @@ fn update_position_markers( } // Update text transforms - counter-rotate against parent - for (mut transform, parent) in text_query.iter_mut() { + for (mut transform, child) in text_query.iter_mut() { // Get the parent's rotation and apply the inverse to keep text upright - if let Ok(parent_transform) = robot_transforms.get(parent.get()) { + if let Ok(parent_transform) = robot_transforms.get(child.parent()) { transform.rotation = parent_transform.rotation.inverse(); } } @@ -440,7 +463,7 @@ fn on_robot_drag( field_scale: Res, ) { // First try direct access (in case the Robot component is on the dragged entity) - if let Ok((mut robot, mut transform)) = robots.get_mut(drag.entity()) { + if let Ok((mut robot, mut transform)) = robots.get_mut(drag.target.entity()) { let world_delta = Vec2::new( drag.delta.x / field_scale.pixels_per_meter, -drag.delta.y / field_scale.pixels_per_meter, diff --git a/yggdrasil/src/nao/sim_lola.rs b/yggdrasil/src/nao/sim_lola.rs index dd33b69a2..5562f7cc4 100644 --- a/yggdrasil/src/nao/sim_lola.rs +++ b/yggdrasil/src/nao/sim_lola.rs @@ -1,7 +1,7 @@ use bevy::{ecs::system::RunSystemOnce, prelude::*}; use nidhogg::{ - types::{FillExt, JointArray}, DisconnectExt, HardwareInfo, NaoBackend, NaoControlMessage, NaoState, Result, + types::{FillExt, JointArray}, }; use nidhogg::backend::{ConnectWithRetry, ReadHardwareInfo}; @@ -47,7 +47,6 @@ fn initialize_nao(mut commands: Commands, mut lola: ResMut) { head_version: Default::default(), body_id: Default::default(), body_version: Default::default(), - initial_joint_positions: Default::default(), }; // Read state and reply with a message. @@ -55,7 +54,7 @@ fn initialize_nao(mut commands: Commands, mut lola: ResMut) { .read_nao_state() .expect("failed to read initial state from LoLA"); let msg = NaoControlMessage { - position: info.initial_joint_positions.clone(), + position: Default::default(), stiffness: JointArray::fill(DEFAULT_STIFFNESS), ..Default::default() }; From 1b7b719ed9e1dbaaa5c2c3f1c3560dc90c7743a8 Mon Sep 17 00:00:00 2001 From: Fyor Klein Gunnewiek Date: Sun, 25 May 2025 18:05:10 +0200 Subject: [PATCH 03/10] Ball fixes --- deploy/assets/motions/standup_back.json | 2 +- deploy/assets/motions/standup_stomach.json | 2 +- tools/simulation/src/main.rs | 81 +++++++++++++++------- 3 files changed, 59 insertions(+), 26 deletions(-) diff --git a/deploy/assets/motions/standup_back.json b/deploy/assets/motions/standup_back.json index 3a89e6d84..e05c3def2 100644 --- a/deploy/assets/motions/standup_back.json +++ b/deploy/assets/motions/standup_back.json @@ -1 +1 @@ -{"settings":{"interpolation_type":"Linear","exit_routine":"Standing","motion_order":["standup/on_back/ready_to_kick","standup/on_back/kick_up","standup/on_back/half_sit_to_crouch","standup/half_crouch_to_sit","standup/extend_legs"]},"submotions":{"standup/on_back/ready_to_kick":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.2,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.0,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.0,"left_elbow_yaw":0.0,"left_elbow_roll":0.0,"left_wrist_yaw":0.0,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":0.0,"left_knee_pitch":0.0,"left_ankle_pitch":0.0,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":0.0,"right_elbow_yaw":0.0,"right_elbow_roll":0.0,"right_wrist_yaw":0.0,"right_hip_roll":0.0,"right_hip_pitch":0.0,"right_knee_pitch":0.0,"right_ankle_pitch":0.0,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.6},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.0,"left_elbow_yaw":0.0,"left_elbow_roll":0.0,"left_wrist_yaw":0.113558054,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":-0.21940398,"left_knee_pitch":0.829936,"left_ankle_pitch":1.0937839,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":0.0,"right_elbow_yaw":0.0,"right_elbow_roll":0.0,"right_wrist_yaw":-0.113558054,"right_hip_roll":0.0,"right_hip_pitch":-0.21940398,"right_knee_pitch":0.829936,"right_ankle_pitch":1.0937839,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.3},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":2.146755,"left_shoulder_roll":0.0,"left_elbow_yaw":0.0,"left_elbow_roll":0.0,"left_wrist_yaw":0.113558054,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":0.55219793,"left_knee_pitch":1.1198621,"left_ankle_pitch":0.40655208,"left_ankle_roll":0.0,"right_shoulder_pitch":2.146755,"right_shoulder_roll":0.0,"right_elbow_yaw":0.0,"right_elbow_roll":0.0,"right_wrist_yaw":-0.113558054,"right_hip_roll":0.0,"right_hip_pitch":0.55219793,"right_knee_pitch":1.1198621,"right_ankle_pitch":0.40655208,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.3},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":0.55219793,"left_knee_pitch":1.1198621,"left_ankle_pitch":0.40655208,"left_ankle_roll":0.0,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":0.0,"right_hip_pitch":0.55219793,"right_knee_pitch":1.1198621,"right_ankle_pitch":0.40655208,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.3},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":0.0,"left_knee_pitch":1.9198622,"left_ankle_pitch":0.0,"left_ankle_roll":0.0,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":0.0,"right_hip_pitch":0.0,"right_knee_pitch":1.9198622,"right_ankle_pitch":0.0,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.3}]},"standup/extend_legs":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.34906584,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.2,"left_elbow_yaw":-1.57,"left_elbow_roll":-0.008,"left_wrist_yaw":0.0,"left_hip_yaw_pitch":0.0138,"left_hip_roll":0.0,"left_hip_pitch":-0.3,"left_knee_pitch":0.93,"left_ankle_pitch":-0.6,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":-0.2,"right_elbow_yaw":1.57,"right_elbow_roll":0.008,"right_wrist_yaw":0.0,"right_hip_roll":0.0,"right_hip_pitch":-0.3,"right_knee_pitch":0.93,"right_ankle_pitch":-0.6,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.34906584,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.2,"left_elbow_yaw":-1.57,"left_elbow_roll":-0.008,"left_wrist_yaw":0.0,"left_hip_yaw_pitch":0.0138,"left_hip_roll":0.0,"left_hip_pitch":-0.3,"left_knee_pitch":0.93,"left_ankle_pitch":-0.6,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":-0.2,"right_elbow_yaw":1.57,"right_elbow_roll":0.008,"right_wrist_yaw":0.0,"right_hip_roll":0.0,"right_hip_pitch":-0.3,"right_knee_pitch":0.93,"right_ankle_pitch":-0.6,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.4}]},"standup/on_back/half_sit_to_crouch":{"joint_stifness":0.9,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[{"variable":"AngleY","min":-0.6,"max":0.6}],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":2.0943952,"left_shoulder_roll":-0.08726646,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.33161256,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.134464,"left_hip_roll":0.7330383,"left_hip_pitch":-1.3962634,"left_knee_pitch":1.3351768,"left_ankle_pitch":0.8552113,"left_ankle_roll":-0.12217305,"right_shoulder_pitch":2.1118484,"right_shoulder_roll":-0.017453292,"right_elbow_yaw":1.5184364,"right_elbow_roll":-0.38397244,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.567232,"right_hip_pitch":-1.4660766,"right_knee_pitch":1.43117,"right_ankle_pitch":0.82030475,"right_ankle_roll":0.017453292,"left_hand":0.0,"right_hand":0.0},"duration":0.5},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":2.024582,"left_shoulder_roll":-0.13962634,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.27925268,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.134464,"left_hip_roll":0.20943952,"left_hip_pitch":-0.5235988,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.715585,"left_ankle_roll":-0.33161256,"right_shoulder_pitch":2.1118484,"right_shoulder_roll":-0.6981317,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.13962634,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.34906584,"right_hip_pitch":-1.5358897,"right_knee_pitch":0.83775806,"right_ankle_pitch":0.9250245,"right_ankle_roll":-0.017453292,"left_hand":0.0,"right_hand":0.0},"duration":1.1}]},"standup/on_back/kick_up":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.3,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":-1.5358897,"left_knee_pitch":-0.08726646,"left_ankle_pitch":0.0,"left_ankle_roll":0.0,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":0.0,"right_hip_pitch":-1.5358897,"right_knee_pitch":-0.08726646,"right_ankle_pitch":0.0,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.8},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":-1.5358897,"left_knee_pitch":-0.08726646,"left_ankle_pitch":0.0,"left_ankle_roll":0.0,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":0.0,"right_hip_pitch":-1.5358897,"right_knee_pitch":-0.08726646,"right_ankle_pitch":0.0,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.2},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.2268928,"left_hip_pitch":-0.27925268,"left_knee_pitch":-0.08726646,"left_ankle_pitch":1.0471976,"left_ankle_roll":0.08726646,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":-0.2268928,"right_hip_pitch":-0.27925268,"right_knee_pitch":-0.08726646,"right_ankle_pitch":1.0471976,"right_ankle_roll":-0.08726646,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":-1.3962634,"left_knee_pitch":-0.08726646,"left_ankle_pitch":0.0,"left_ankle_roll":0.0,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":0.0,"right_hip_pitch":-1.3962634,"right_knee_pitch":-0.08726646,"right_ankle_pitch":0.0,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.7}]},"standup/half_crouch_to_sit":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.7453293,"left_shoulder_roll":0.36651915,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2617994,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.134464,"left_hip_roll":0.06981317,"left_hip_pitch":-0.55850536,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.012291,"left_ankle_roll":0.17453292,"right_shoulder_pitch":1.8675023,"right_shoulder_roll":-0.34906584,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.15707964,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.2617994,"right_hip_pitch":-0.31415927,"right_knee_pitch":-0.08726646,"right_ankle_pitch":0.9250245,"right_ankle_roll":0.06981317,"left_hand":0.0,"right_hand":0.0},"duration":0.7},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5707964,"left_shoulder_roll":0.36651915,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2617994,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.7592182,"left_hip_roll":0.20943952,"left_hip_pitch":-0.9599311,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.9773844,"left_ankle_roll":0.15707964,"right_shoulder_pitch":1.727876,"right_shoulder_roll":0.0,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.15707964,"right_wrist_yaw":1.5707964,"right_hip_roll":0.23561946,"right_hip_pitch":-0.7679449,"right_knee_pitch":1.6580628,"right_ankle_pitch":-0.27925268,"right_ankle_roll":0.2617994,"left_hand":0.0,"right_hand":0.0},"duration":0.5},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5184364,"left_shoulder_roll":0.33161256,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2443461,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.57595867,"left_hip_roll":-0.12217305,"left_hip_pitch":-1.0471976,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.8552113,"left_ankle_roll":0.1308997,"right_shoulder_pitch":1.4137167,"right_shoulder_roll":-0.19198622,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.13962634,"right_wrist_yaw":1.5707964,"right_hip_roll":0.15707964,"right_hip_pitch":-0.9948377,"right_knee_pitch":2.1118484,"right_ankle_pitch":-0.89011794,"right_ankle_roll":-0.15707964,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5184364,"left_shoulder_roll":0.33161256,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2443461,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.57595867,"left_hip_roll":-0.12217305,"left_hip_pitch":-1.0471976,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.8552113,"left_ankle_roll":0.1308997,"right_shoulder_pitch":1.4137167,"right_shoulder_roll":-0.19198622,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.13962634,"right_wrist_yaw":1.5707964,"right_hip_roll":0.15707964,"right_hip_pitch":-0.9948377,"right_knee_pitch":2.1118484,"right_ankle_pitch":-0.89011794,"right_ankle_roll":-0.15707964,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.43117,"left_shoulder_roll":0.2268928,"left_elbow_yaw":-1.4660766,"left_elbow_roll":-0.20943952,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":0.0,"left_hip_roll":-0.06981317,"left_hip_pitch":-0.9250245,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.1693707,"left_ankle_roll":0.034906585,"right_shoulder_pitch":1.3089969,"right_shoulder_roll":-0.12217305,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.12217305,"right_wrist_yaw":1.5707964,"right_hip_roll":0.10471976,"right_hip_pitch":-0.9075712,"right_knee_pitch":2.1118484,"right_ankle_pitch":-1.1693707,"right_ankle_roll":-0.08726646,"left_hand":0.0,"right_hand":0.0},"duration":0.2},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.43117,"left_shoulder_roll":0.2268928,"left_elbow_yaw":-1.4660766,"left_elbow_roll":-0.20943952,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":0.0,"left_hip_roll":-0.06981317,"left_hip_pitch":-0.9250245,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.1693707,"left_ankle_roll":0.034906585,"right_shoulder_pitch":1.3089969,"right_shoulder_roll":-0.12217305,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.12217305,"right_wrist_yaw":1.5707964,"right_hip_roll":0.10471976,"right_hip_pitch":-0.9075712,"right_knee_pitch":2.1118484,"right_ankle_pitch":-1.1693707,"right_ankle_roll":-0.08726646,"left_hand":0.0,"right_hand":0.0},"duration":0.2}]}}} \ No newline at end of file +{"settings":{"interpolation_type":"Linear","exit_routine":"Standing","motion_order":["standup/on_back/ready_to_kick","standup/on_back/kick_up","standup/on_back/half_sit_to_crouch","standup/half_crouch_to_sit","standup/extend_legs"]},"submotions":{"standup/half_crouch_to_sit":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.7453293,"left_shoulder_roll":0.36651915,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2617994,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.134464,"left_hip_roll":0.06981317,"left_hip_pitch":-0.55850536,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.012291,"left_ankle_roll":0.17453292,"right_shoulder_pitch":1.8675023,"right_shoulder_roll":-0.34906584,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.15707964,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.2617994,"right_hip_pitch":-0.31415927,"right_knee_pitch":-0.08726646,"right_ankle_pitch":0.9250245,"right_ankle_roll":0.06981317,"left_hand":0.0,"right_hand":0.0},"duration":0.7},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5707964,"left_shoulder_roll":0.36651915,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2617994,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.7592182,"left_hip_roll":0.20943952,"left_hip_pitch":-0.9599311,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.9773844,"left_ankle_roll":0.15707964,"right_shoulder_pitch":1.727876,"right_shoulder_roll":0.0,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.15707964,"right_wrist_yaw":1.5707964,"right_hip_roll":0.23561946,"right_hip_pitch":-0.7679449,"right_knee_pitch":1.6580628,"right_ankle_pitch":-0.27925268,"right_ankle_roll":0.2617994,"left_hand":0.0,"right_hand":0.0},"duration":0.5},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5184364,"left_shoulder_roll":0.33161256,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2443461,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.57595867,"left_hip_roll":-0.12217305,"left_hip_pitch":-1.0471976,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.8552113,"left_ankle_roll":0.1308997,"right_shoulder_pitch":1.4137167,"right_shoulder_roll":-0.19198622,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.13962634,"right_wrist_yaw":1.5707964,"right_hip_roll":0.15707964,"right_hip_pitch":-0.9948377,"right_knee_pitch":2.1118484,"right_ankle_pitch":-0.89011794,"right_ankle_roll":-0.15707964,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5184364,"left_shoulder_roll":0.33161256,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2443461,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.57595867,"left_hip_roll":-0.12217305,"left_hip_pitch":-1.0471976,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.8552113,"left_ankle_roll":0.1308997,"right_shoulder_pitch":1.4137167,"right_shoulder_roll":-0.19198622,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.13962634,"right_wrist_yaw":1.5707964,"right_hip_roll":0.15707964,"right_hip_pitch":-0.9948377,"right_knee_pitch":2.1118484,"right_ankle_pitch":-0.89011794,"right_ankle_roll":-0.15707964,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.43117,"left_shoulder_roll":0.2268928,"left_elbow_yaw":-1.4660766,"left_elbow_roll":-0.20943952,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":0.0,"left_hip_roll":-0.06981317,"left_hip_pitch":-0.9250245,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.1693707,"left_ankle_roll":0.034906585,"right_shoulder_pitch":1.3089969,"right_shoulder_roll":-0.12217305,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.12217305,"right_wrist_yaw":1.5707964,"right_hip_roll":0.10471976,"right_hip_pitch":-0.9075712,"right_knee_pitch":2.1118484,"right_ankle_pitch":-1.1693707,"right_ankle_roll":-0.08726646,"left_hand":0.0,"right_hand":0.0},"duration":0.2},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.43117,"left_shoulder_roll":0.2268928,"left_elbow_yaw":-1.4660766,"left_elbow_roll":-0.20943952,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":0.0,"left_hip_roll":-0.06981317,"left_hip_pitch":-0.9250245,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.1693707,"left_ankle_roll":0.034906585,"right_shoulder_pitch":1.3089969,"right_shoulder_roll":-0.12217305,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.12217305,"right_wrist_yaw":1.5707964,"right_hip_roll":0.10471976,"right_hip_pitch":-0.9075712,"right_knee_pitch":2.1118484,"right_ankle_pitch":-1.1693707,"right_ankle_roll":-0.08726646,"left_hand":0.0,"right_hand":0.0},"duration":0.2}]},"standup/on_back/kick_up":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.3,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":-1.5358897,"left_knee_pitch":-0.08726646,"left_ankle_pitch":0.0,"left_ankle_roll":0.0,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":0.0,"right_hip_pitch":-1.5358897,"right_knee_pitch":-0.08726646,"right_ankle_pitch":0.0,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.8},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":-1.5358897,"left_knee_pitch":-0.08726646,"left_ankle_pitch":0.0,"left_ankle_roll":0.0,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":0.0,"right_hip_pitch":-1.5358897,"right_knee_pitch":-0.08726646,"right_ankle_pitch":0.0,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.2},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.2268928,"left_hip_pitch":-0.27925268,"left_knee_pitch":-0.08726646,"left_ankle_pitch":1.0471976,"left_ankle_roll":0.08726646,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":-0.2268928,"right_hip_pitch":-0.27925268,"right_knee_pitch":-0.08726646,"right_ankle_pitch":1.0471976,"right_ankle_roll":-0.08726646,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":-1.3962634,"left_knee_pitch":-0.08726646,"left_ankle_pitch":0.0,"left_ankle_roll":0.0,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":0.0,"right_hip_pitch":-1.3962634,"right_knee_pitch":-0.08726646,"right_ankle_pitch":0.0,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.7}]},"standup/on_back/ready_to_kick":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.2,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.0,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.0,"left_elbow_yaw":0.0,"left_elbow_roll":0.0,"left_wrist_yaw":0.0,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":0.0,"left_knee_pitch":0.0,"left_ankle_pitch":0.0,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":0.0,"right_elbow_yaw":0.0,"right_elbow_roll":0.0,"right_wrist_yaw":0.0,"right_hip_roll":0.0,"right_hip_pitch":0.0,"right_knee_pitch":0.0,"right_ankle_pitch":0.0,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.6},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.0,"left_elbow_yaw":0.0,"left_elbow_roll":0.0,"left_wrist_yaw":0.113558054,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":-0.21940398,"left_knee_pitch":0.829936,"left_ankle_pitch":1.0937839,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":0.0,"right_elbow_yaw":0.0,"right_elbow_roll":0.0,"right_wrist_yaw":-0.113558054,"right_hip_roll":0.0,"right_hip_pitch":-0.21940398,"right_knee_pitch":0.829936,"right_ankle_pitch":1.0937839,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.3},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":2.146755,"left_shoulder_roll":0.0,"left_elbow_yaw":0.0,"left_elbow_roll":0.0,"left_wrist_yaw":0.113558054,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":0.55219793,"left_knee_pitch":1.1198621,"left_ankle_pitch":0.40655208,"left_ankle_roll":0.0,"right_shoulder_pitch":2.146755,"right_shoulder_roll":0.0,"right_elbow_yaw":0.0,"right_elbow_roll":0.0,"right_wrist_yaw":-0.113558054,"right_hip_roll":0.0,"right_hip_pitch":0.55219793,"right_knee_pitch":1.1198621,"right_ankle_pitch":0.40655208,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.3},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":0.55219793,"left_knee_pitch":1.1198621,"left_ankle_pitch":0.40655208,"left_ankle_roll":0.0,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":0.0,"right_hip_pitch":0.55219793,"right_knee_pitch":1.1198621,"right_ankle_pitch":0.40655208,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.3},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.918992,"left_shoulder_roll":0.12421203,"left_elbow_yaw":0.20244598,"left_elbow_roll":-1.257838,"left_wrist_yaw":-0.052197933,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":0.0,"left_knee_pitch":1.9198622,"left_ankle_pitch":0.0,"left_ankle_roll":0.0,"right_shoulder_pitch":1.962028,"right_shoulder_roll":-0.266958,"right_elbow_yaw":-0.14883995,"right_elbow_roll":1.37604,"right_wrist_yaw":0.056715965,"right_hip_roll":0.0,"right_hip_pitch":0.0,"right_knee_pitch":1.9198622,"right_ankle_pitch":0.0,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.3}]},"standup/on_back/half_sit_to_crouch":{"joint_stifness":0.9,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[{"variable":"AngleY","min":-0.6,"max":0.6}],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":2.0943952,"left_shoulder_roll":-0.08726646,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.33161256,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.134464,"left_hip_roll":0.7330383,"left_hip_pitch":-1.3962634,"left_knee_pitch":1.3351768,"left_ankle_pitch":0.8552113,"left_ankle_roll":-0.12217305,"right_shoulder_pitch":2.1118484,"right_shoulder_roll":-0.017453292,"right_elbow_yaw":1.5184364,"right_elbow_roll":-0.38397244,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.567232,"right_hip_pitch":-1.4660766,"right_knee_pitch":1.43117,"right_ankle_pitch":0.82030475,"right_ankle_roll":0.017453292,"left_hand":0.0,"right_hand":0.0},"duration":0.5},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":2.024582,"left_shoulder_roll":-0.13962634,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.27925268,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.134464,"left_hip_roll":0.20943952,"left_hip_pitch":-0.5235988,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.715585,"left_ankle_roll":-0.33161256,"right_shoulder_pitch":2.1118484,"right_shoulder_roll":-0.6981317,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.13962634,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.34906584,"right_hip_pitch":-1.5358897,"right_knee_pitch":0.83775806,"right_ankle_pitch":0.9250245,"right_ankle_roll":-0.017453292,"left_hand":0.0,"right_hand":0.0},"duration":1.1}]},"standup/extend_legs":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.34906584,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.2,"left_elbow_yaw":-1.57,"left_elbow_roll":-0.008,"left_wrist_yaw":0.0,"left_hip_yaw_pitch":0.0138,"left_hip_roll":0.0,"left_hip_pitch":-0.3,"left_knee_pitch":0.93,"left_ankle_pitch":-0.6,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":-0.2,"right_elbow_yaw":1.57,"right_elbow_roll":0.008,"right_wrist_yaw":0.0,"right_hip_roll":0.0,"right_hip_pitch":-0.3,"right_knee_pitch":0.93,"right_ankle_pitch":-0.6,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.34906584,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.2,"left_elbow_yaw":-1.57,"left_elbow_roll":-0.008,"left_wrist_yaw":0.0,"left_hip_yaw_pitch":0.0138,"left_hip_roll":0.0,"left_hip_pitch":-0.3,"left_knee_pitch":0.93,"left_ankle_pitch":-0.6,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":-0.2,"right_elbow_yaw":1.57,"right_elbow_roll":0.008,"right_wrist_yaw":0.0,"right_hip_roll":0.0,"right_hip_pitch":-0.3,"right_knee_pitch":0.93,"right_ankle_pitch":-0.6,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.4}]}}} \ No newline at end of file diff --git a/deploy/assets/motions/standup_stomach.json b/deploy/assets/motions/standup_stomach.json index a85b696f0..4a7619483 100644 --- a/deploy/assets/motions/standup_stomach.json +++ b/deploy/assets/motions/standup_stomach.json @@ -1 +1 @@ -{"settings":{"interpolation_type":"Linear","exit_routine":"Standing","motion_order":["standup/on_stomach/lying_to_yoga","standup/on_stomach/yoga_to_sitting","standup/on_stomach/sitting_to_half_crouch","standup/half_crouch_to_sit","standup/extend_legs"]},"submotions":{"standup/half_crouch_to_sit":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.7453293,"left_shoulder_roll":0.36651915,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2617994,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.134464,"left_hip_roll":0.06981317,"left_hip_pitch":-0.55850536,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.012291,"left_ankle_roll":0.17453292,"right_shoulder_pitch":1.8675023,"right_shoulder_roll":-0.34906584,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.15707964,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.2617994,"right_hip_pitch":-0.31415927,"right_knee_pitch":-0.08726646,"right_ankle_pitch":0.9250245,"right_ankle_roll":0.06981317,"left_hand":0.0,"right_hand":0.0},"duration":0.7},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5707964,"left_shoulder_roll":0.36651915,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2617994,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.7592182,"left_hip_roll":0.20943952,"left_hip_pitch":-0.9599311,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.9773844,"left_ankle_roll":0.15707964,"right_shoulder_pitch":1.727876,"right_shoulder_roll":0.0,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.15707964,"right_wrist_yaw":1.5707964,"right_hip_roll":0.23561946,"right_hip_pitch":-0.7679449,"right_knee_pitch":1.6580628,"right_ankle_pitch":-0.27925268,"right_ankle_roll":0.2617994,"left_hand":0.0,"right_hand":0.0},"duration":0.5},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5184364,"left_shoulder_roll":0.33161256,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2443461,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.57595867,"left_hip_roll":-0.12217305,"left_hip_pitch":-1.0471976,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.8552113,"left_ankle_roll":0.1308997,"right_shoulder_pitch":1.4137167,"right_shoulder_roll":-0.19198622,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.13962634,"right_wrist_yaw":1.5707964,"right_hip_roll":0.15707964,"right_hip_pitch":-0.9948377,"right_knee_pitch":2.1118484,"right_ankle_pitch":-0.89011794,"right_ankle_roll":-0.15707964,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5184364,"left_shoulder_roll":0.33161256,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2443461,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.57595867,"left_hip_roll":-0.12217305,"left_hip_pitch":-1.0471976,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.8552113,"left_ankle_roll":0.1308997,"right_shoulder_pitch":1.4137167,"right_shoulder_roll":-0.19198622,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.13962634,"right_wrist_yaw":1.5707964,"right_hip_roll":0.15707964,"right_hip_pitch":-0.9948377,"right_knee_pitch":2.1118484,"right_ankle_pitch":-0.89011794,"right_ankle_roll":-0.15707964,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.43117,"left_shoulder_roll":0.2268928,"left_elbow_yaw":-1.4660766,"left_elbow_roll":-0.20943952,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":0.0,"left_hip_roll":-0.06981317,"left_hip_pitch":-0.9250245,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.1693707,"left_ankle_roll":0.034906585,"right_shoulder_pitch":1.3089969,"right_shoulder_roll":-0.12217305,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.12217305,"right_wrist_yaw":1.5707964,"right_hip_roll":0.10471976,"right_hip_pitch":-0.9075712,"right_knee_pitch":2.1118484,"right_ankle_pitch":-1.1693707,"right_ankle_roll":-0.08726646,"left_hand":0.0,"right_hand":0.0},"duration":0.2},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.43117,"left_shoulder_roll":0.2268928,"left_elbow_yaw":-1.4660766,"left_elbow_roll":-0.20943952,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":0.0,"left_hip_roll":-0.06981317,"left_hip_pitch":-0.9250245,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.1693707,"left_ankle_roll":0.034906585,"right_shoulder_pitch":1.3089969,"right_shoulder_roll":-0.12217305,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.12217305,"right_wrist_yaw":1.5707964,"right_hip_roll":0.10471976,"right_hip_pitch":-0.9075712,"right_knee_pitch":2.1118484,"right_ankle_pitch":-1.1693707,"right_ankle_roll":-0.08726646,"left_hand":0.0,"right_hand":0.0},"duration":0.2}]},"standup/on_stomach/lying_to_yoga":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":-0.672,"left_shoulder_pitch":-0.017453292,"left_shoulder_roll":1.1519173,"left_elbow_yaw":-1.5184364,"left_elbow_roll":-0.029670598,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":0.0,"left_knee_pitch":0.0,"left_ankle_pitch":1.0471976,"left_ankle_roll":0.0,"right_shoulder_pitch":0.017453292,"right_shoulder_roll":-1.1519173,"right_elbow_yaw":1.5184364,"right_elbow_roll":0.029670598,"right_wrist_yaw":1.5707964,"right_hip_roll":0.0,"right_hip_pitch":0.0,"right_knee_pitch":0.0,"right_ankle_pitch":1.0471976,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.6},{"target_position":{"head_yaw":0.0,"head_pitch":-0.672,"left_shoulder_pitch":1.881465,"left_shoulder_roll":1.298525,"left_elbow_yaw":-0.6230825,"left_elbow_roll":-1.399754,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.1833333,"left_hip_roll":0.68416905,"left_hip_pitch":0.4886922,"left_knee_pitch":-0.11868239,"left_ankle_pitch":-0.19896753,"left_ankle_roll":0.6143559,"right_shoulder_pitch":1.7208947,"right_shoulder_roll":-1.2863077,"right_elbow_yaw":0.08901179,"right_elbow_roll":1.2810717,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.75398225,"right_hip_pitch":0.4956735,"right_knee_pitch":-0.101229094,"right_ankle_pitch":-0.15707964,"right_ankle_roll":-0.62482786,"left_hand":0.0,"right_hand":0.0},"duration":0.45},{"target_position":{"head_yaw":0.0,"head_pitch":0.0,"left_shoulder_pitch":2.0385447,"left_shoulder_roll":-0.006981317,"left_elbow_yaw":1.9373155,"left_elbow_roll":-1.5568337,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.1920599,"left_hip_roll":0.72431165,"left_hip_pitch":-1.5376351,"left_knee_pitch":-0.06632251,"left_ankle_pitch":0.19373155,"left_ankle_roll":0.56548667,"right_shoulder_pitch":2.1101031,"right_shoulder_roll":0.34906584,"right_elbow_yaw":-1.3194689,"right_elbow_roll":1.558579,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.8045968,"right_hip_pitch":0.45204028,"right_knee_pitch":-0.082030475,"right_ankle_pitch":0.2984513,"right_ankle_roll":-0.5427974,"left_hand":0.0,"right_hand":0.0},"duration":0.272727272},{"target_position":{"head_yaw":0.0,"head_pitch":-0.672,"left_shoulder_pitch":2.0699606,"left_shoulder_roll":-0.006981317,"left_elbow_yaw":1.9477874,"left_elbow_roll":-1.558579,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.2025318,"left_hip_roll":0.699877,"left_hip_pitch":-1.5917403,"left_knee_pitch":-0.11519173,"left_ankle_pitch":0.19024089,"left_ankle_roll":0.56897736,"right_shoulder_pitch":2.1170843,"right_shoulder_roll":0.34906584,"right_elbow_yaw":-1.3159783,"right_elbow_roll":1.558579,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.68416905,"right_hip_pitch":-1.6126842,"right_knee_pitch":2.1275563,"right_ankle_pitch":0.23736478,"right_ankle_roll":-0.5375614,"left_hand":0.0,"right_hand":0.0},"duration":0.272727},{"target_position":{"head_yaw":0.0,"head_pitch":0.0,"left_shoulder_pitch":2.0804324,"left_shoulder_roll":-0.006981317,"left_elbow_yaw":1.9512781,"left_elbow_roll":-1.558579,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.2095132,"left_hip_roll":0.7347836,"left_hip_pitch":-1.5934856,"left_knee_pitch":-0.12217305,"left_ankle_pitch":0.20769419,"left_ankle_roll":0.567232,"right_shoulder_pitch":2.0909045,"right_shoulder_roll":0.34906584,"right_elbow_yaw":-1.3159783,"right_elbow_roll":1.5550884,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.7923795,"right_hip_pitch":-1.6109389,"right_knee_pitch":-0.12217305,"right_ankle_pitch":0.2565634,"right_ankle_roll":-0.40317106,"left_hand":0.0,"right_hand":0.0},"duration":0.554545455}]},"standup/on_stomach/yoga_to_sitting":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.5,"left_shoulder_pitch":1.9495327,"left_shoulder_roll":-0.073303826,"left_elbow_yaw":1.5812683,"left_elbow_roll":0.006981317,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.51138145,"left_hip_roll":-0.02443461,"left_hip_pitch":-1.1885692,"left_knee_pitch":-0.012217305,"left_ankle_pitch":-0.3944444,"left_ankle_roll":0.286234,"right_shoulder_pitch":1.9198622,"right_shoulder_roll":0.045378562,"right_elbow_yaw":-1.3421582,"right_elbow_roll":0.15009831,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.040142573,"right_hip_pitch":-1.298525,"right_knee_pitch":0.022689281,"right_ankle_pitch":0.0017453292,"right_ankle_roll":-0.31066862,"left_hand":0.0,"right_hand":0.0},"duration":0.5},{"target_position":{"head_yaw":0.0,"head_pitch":0.5,"left_shoulder_pitch":2.0909045,"left_shoulder_roll":0.13613568,"left_elbow_yaw":-1.2409291,"left_elbow_roll":-0.54803336,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.98262036,"left_hip_roll":0.27576202,"left_hip_pitch":-0.87266463,"left_knee_pitch":-0.12042772,"left_ankle_pitch":0.15358898,"left_ankle_roll":-0.21642083,"right_shoulder_pitch":2.1223204,"right_shoulder_roll":-0.006981317,"right_elbow_yaw":1.5271631,"right_elbow_roll":0.3874631,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.33161256,"right_hip_pitch":-0.85695666,"right_knee_pitch":-0.12042772,"right_ankle_pitch":0.27925268,"right_ankle_roll":-0.082030475,"left_hand":0.0,"right_hand":0.0},"duration":0.693181818}]},"standup/on_stomach/sitting_to_half_crouch":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.7,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.6,"head_pitch":0.5,"left_shoulder_pitch":2.0926497,"left_shoulder_roll":-0.0837758,"left_elbow_yaw":-1.4887658,"left_elbow_roll":-0.32463124,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.134464,"left_hip_roll":0.7278023,"left_hip_pitch":-1.399754,"left_knee_pitch":1.3351768,"left_ankle_pitch":0.86044735,"left_ankle_roll":-0.12566371,"right_shoulder_pitch":2.1223204,"right_shoulder_roll":-0.015707964,"right_elbow_yaw":1.5254178,"right_elbow_roll":0.39095375,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.567232,"right_hip_pitch":-1.4660766,"right_knee_pitch":1.4276793,"right_ankle_pitch":0.8220501,"right_ankle_roll":0.019198623,"left_hand":0.0,"right_hand":0.0},"duration":0.693181818},{"target_position":{"head_yaw":0.0,"head_pitch":0.5,"left_shoulder_pitch":2.0210912,"left_shoulder_roll":-0.13264503,"left_elbow_yaw":-1.4765486,"left_elbow_roll":-0.27750736,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.2025318,"left_hip_roll":0.20420352,"left_hip_pitch":-0.51836276,"left_knee_pitch":2.1746802,"left_ankle_pitch":-0.71383965,"left_ankle_roll":-0.3298672,"right_shoulder_pitch":2.1066124,"right_shoulder_roll":-0.6928957,"right_elbow_yaw":1.7348573,"right_elbow_roll":0.143117,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.35430184,"right_hip_pitch":-1.5603243,"right_knee_pitch":0.8412487,"right_ankle_pitch":0.9180432,"right_ankle_roll":-0.017453292,"left_hand":0.0,"right_hand":0.0},"duration":0.9}]},"standup/extend_legs":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.34906584,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.2,"left_elbow_yaw":-1.57,"left_elbow_roll":-0.008,"left_wrist_yaw":0.0,"left_hip_yaw_pitch":0.0138,"left_hip_roll":0.0,"left_hip_pitch":-0.3,"left_knee_pitch":0.93,"left_ankle_pitch":-0.6,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":-0.2,"right_elbow_yaw":1.57,"right_elbow_roll":0.008,"right_wrist_yaw":0.0,"right_hip_roll":0.0,"right_hip_pitch":-0.3,"right_knee_pitch":0.93,"right_ankle_pitch":-0.6,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.34906584,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.2,"left_elbow_yaw":-1.57,"left_elbow_roll":-0.008,"left_wrist_yaw":0.0,"left_hip_yaw_pitch":0.0138,"left_hip_roll":0.0,"left_hip_pitch":-0.3,"left_knee_pitch":0.93,"left_ankle_pitch":-0.6,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":-0.2,"right_elbow_yaw":1.57,"right_elbow_roll":0.008,"right_wrist_yaw":0.0,"right_hip_roll":0.0,"right_hip_pitch":-0.3,"right_knee_pitch":0.93,"right_ankle_pitch":-0.6,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.4}]}}} \ No newline at end of file +{"settings":{"interpolation_type":"Linear","exit_routine":"Standing","motion_order":["standup/on_stomach/lying_to_yoga","standup/on_stomach/yoga_to_sitting","standup/on_stomach/sitting_to_half_crouch","standup/half_crouch_to_sit","standup/extend_legs"]},"submotions":{"standup/on_stomach/yoga_to_sitting":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.5,"left_shoulder_pitch":1.9495327,"left_shoulder_roll":-0.073303826,"left_elbow_yaw":1.5812683,"left_elbow_roll":0.006981317,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.51138145,"left_hip_roll":-0.02443461,"left_hip_pitch":-1.1885692,"left_knee_pitch":-0.012217305,"left_ankle_pitch":-0.3944444,"left_ankle_roll":0.286234,"right_shoulder_pitch":1.9198622,"right_shoulder_roll":0.045378562,"right_elbow_yaw":-1.3421582,"right_elbow_roll":0.15009831,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.040142573,"right_hip_pitch":-1.298525,"right_knee_pitch":0.022689281,"right_ankle_pitch":0.0017453292,"right_ankle_roll":-0.31066862,"left_hand":0.0,"right_hand":0.0},"duration":0.5},{"target_position":{"head_yaw":0.0,"head_pitch":0.5,"left_shoulder_pitch":2.0909045,"left_shoulder_roll":0.13613568,"left_elbow_yaw":-1.2409291,"left_elbow_roll":-0.54803336,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.98262036,"left_hip_roll":0.27576202,"left_hip_pitch":-0.87266463,"left_knee_pitch":-0.12042772,"left_ankle_pitch":0.15358898,"left_ankle_roll":-0.21642083,"right_shoulder_pitch":2.1223204,"right_shoulder_roll":-0.006981317,"right_elbow_yaw":1.5271631,"right_elbow_roll":0.3874631,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.33161256,"right_hip_pitch":-0.85695666,"right_knee_pitch":-0.12042772,"right_ankle_pitch":0.27925268,"right_ankle_roll":-0.082030475,"left_hand":0.0,"right_hand":0.0},"duration":0.693181818}]},"standup/extend_legs":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.34906584,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.2,"left_elbow_yaw":-1.57,"left_elbow_roll":-0.008,"left_wrist_yaw":0.0,"left_hip_yaw_pitch":0.0138,"left_hip_roll":0.0,"left_hip_pitch":-0.3,"left_knee_pitch":0.93,"left_ankle_pitch":-0.6,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":-0.2,"right_elbow_yaw":1.57,"right_elbow_roll":0.008,"right_wrist_yaw":0.0,"right_hip_roll":0.0,"right_hip_pitch":-0.3,"right_knee_pitch":0.93,"right_ankle_pitch":-0.6,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.34906584,"left_shoulder_pitch":1.57,"left_shoulder_roll":0.2,"left_elbow_yaw":-1.57,"left_elbow_roll":-0.008,"left_wrist_yaw":0.0,"left_hip_yaw_pitch":0.0138,"left_hip_roll":0.0,"left_hip_pitch":-0.3,"left_knee_pitch":0.93,"left_ankle_pitch":-0.6,"left_ankle_roll":0.0,"right_shoulder_pitch":1.57,"right_shoulder_roll":-0.2,"right_elbow_yaw":1.57,"right_elbow_roll":0.008,"right_wrist_yaw":0.0,"right_hip_roll":0.0,"right_hip_pitch":-0.3,"right_knee_pitch":0.93,"right_ankle_pitch":-0.6,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.4}]},"standup/on_stomach/lying_to_yoga":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":-0.672,"left_shoulder_pitch":-0.017453292,"left_shoulder_roll":1.1519173,"left_elbow_yaw":-1.5184364,"left_elbow_roll":-0.029670598,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":0.0,"left_hip_roll":0.0,"left_hip_pitch":0.0,"left_knee_pitch":0.0,"left_ankle_pitch":1.0471976,"left_ankle_roll":0.0,"right_shoulder_pitch":0.017453292,"right_shoulder_roll":-1.1519173,"right_elbow_yaw":1.5184364,"right_elbow_roll":0.029670598,"right_wrist_yaw":1.5707964,"right_hip_roll":0.0,"right_hip_pitch":0.0,"right_knee_pitch":0.0,"right_ankle_pitch":1.0471976,"right_ankle_roll":0.0,"left_hand":0.0,"right_hand":0.0},"duration":0.6},{"target_position":{"head_yaw":0.0,"head_pitch":-0.672,"left_shoulder_pitch":1.881465,"left_shoulder_roll":1.298525,"left_elbow_yaw":-0.6230825,"left_elbow_roll":-1.399754,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.1833333,"left_hip_roll":0.68416905,"left_hip_pitch":0.4886922,"left_knee_pitch":-0.11868239,"left_ankle_pitch":-0.19896753,"left_ankle_roll":0.6143559,"right_shoulder_pitch":1.7208947,"right_shoulder_roll":-1.2863077,"right_elbow_yaw":0.08901179,"right_elbow_roll":1.2810717,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.75398225,"right_hip_pitch":0.4956735,"right_knee_pitch":-0.101229094,"right_ankle_pitch":-0.15707964,"right_ankle_roll":-0.62482786,"left_hand":0.0,"right_hand":0.0},"duration":0.45},{"target_position":{"head_yaw":0.0,"head_pitch":0.0,"left_shoulder_pitch":2.0385447,"left_shoulder_roll":-0.006981317,"left_elbow_yaw":1.9373155,"left_elbow_roll":-1.5568337,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.1920599,"left_hip_roll":0.72431165,"left_hip_pitch":-1.5376351,"left_knee_pitch":-0.06632251,"left_ankle_pitch":0.19373155,"left_ankle_roll":0.56548667,"right_shoulder_pitch":2.1101031,"right_shoulder_roll":0.34906584,"right_elbow_yaw":-1.3194689,"right_elbow_roll":1.558579,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.8045968,"right_hip_pitch":0.45204028,"right_knee_pitch":-0.082030475,"right_ankle_pitch":0.2984513,"right_ankle_roll":-0.5427974,"left_hand":0.0,"right_hand":0.0},"duration":0.272727272},{"target_position":{"head_yaw":0.0,"head_pitch":-0.672,"left_shoulder_pitch":2.0699606,"left_shoulder_roll":-0.006981317,"left_elbow_yaw":1.9477874,"left_elbow_roll":-1.558579,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.2025318,"left_hip_roll":0.699877,"left_hip_pitch":-1.5917403,"left_knee_pitch":-0.11519173,"left_ankle_pitch":0.19024089,"left_ankle_roll":0.56897736,"right_shoulder_pitch":2.1170843,"right_shoulder_roll":0.34906584,"right_elbow_yaw":-1.3159783,"right_elbow_roll":1.558579,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.68416905,"right_hip_pitch":-1.6126842,"right_knee_pitch":2.1275563,"right_ankle_pitch":0.23736478,"right_ankle_roll":-0.5375614,"left_hand":0.0,"right_hand":0.0},"duration":0.272727},{"target_position":{"head_yaw":0.0,"head_pitch":0.0,"left_shoulder_pitch":2.0804324,"left_shoulder_roll":-0.006981317,"left_elbow_yaw":1.9512781,"left_elbow_roll":-1.558579,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.2095132,"left_hip_roll":0.7347836,"left_hip_pitch":-1.5934856,"left_knee_pitch":-0.12217305,"left_ankle_pitch":0.20769419,"left_ankle_roll":0.567232,"right_shoulder_pitch":2.0909045,"right_shoulder_roll":0.34906584,"right_elbow_yaw":-1.3159783,"right_elbow_roll":1.5550884,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.7923795,"right_hip_pitch":-1.6109389,"right_knee_pitch":-0.12217305,"right_ankle_pitch":0.2565634,"right_ankle_roll":-0.40317106,"left_hand":0.0,"right_hand":0.0},"duration":0.554545455}]},"standup/half_crouch_to_sit":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.0,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.7453293,"left_shoulder_roll":0.36651915,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2617994,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.134464,"left_hip_roll":0.06981317,"left_hip_pitch":-0.55850536,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.012291,"left_ankle_roll":0.17453292,"right_shoulder_pitch":1.8675023,"right_shoulder_roll":-0.34906584,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.15707964,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.2617994,"right_hip_pitch":-0.31415927,"right_knee_pitch":-0.08726646,"right_ankle_pitch":0.9250245,"right_ankle_roll":0.06981317,"left_hand":0.0,"right_hand":0.0},"duration":0.7},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5707964,"left_shoulder_roll":0.36651915,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2617994,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.7592182,"left_hip_roll":0.20943952,"left_hip_pitch":-0.9599311,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.9773844,"left_ankle_roll":0.15707964,"right_shoulder_pitch":1.727876,"right_shoulder_roll":0.0,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.15707964,"right_wrist_yaw":1.5707964,"right_hip_roll":0.23561946,"right_hip_pitch":-0.7679449,"right_knee_pitch":1.6580628,"right_ankle_pitch":-0.27925268,"right_ankle_roll":0.2617994,"left_hand":0.0,"right_hand":0.0},"duration":0.5},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5184364,"left_shoulder_roll":0.33161256,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2443461,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.57595867,"left_hip_roll":-0.12217305,"left_hip_pitch":-1.0471976,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.8552113,"left_ankle_roll":0.1308997,"right_shoulder_pitch":1.4137167,"right_shoulder_roll":-0.19198622,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.13962634,"right_wrist_yaw":1.5707964,"right_hip_roll":0.15707964,"right_hip_pitch":-0.9948377,"right_knee_pitch":2.1118484,"right_ankle_pitch":-0.89011794,"right_ankle_roll":-0.15707964,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.5184364,"left_shoulder_roll":0.33161256,"left_elbow_yaw":-1.4835298,"left_elbow_roll":-0.2443461,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-0.57595867,"left_hip_roll":-0.12217305,"left_hip_pitch":-1.0471976,"left_knee_pitch":2.1118484,"left_ankle_pitch":-0.8552113,"left_ankle_roll":0.1308997,"right_shoulder_pitch":1.4137167,"right_shoulder_roll":-0.19198622,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.13962634,"right_wrist_yaw":1.5707964,"right_hip_roll":0.15707964,"right_hip_pitch":-0.9948377,"right_knee_pitch":2.1118484,"right_ankle_pitch":-0.89011794,"right_ankle_roll":-0.15707964,"left_hand":0.0,"right_hand":0.0},"duration":0.4},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.43117,"left_shoulder_roll":0.2268928,"left_elbow_yaw":-1.4660766,"left_elbow_roll":-0.20943952,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":0.0,"left_hip_roll":-0.06981317,"left_hip_pitch":-0.9250245,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.1693707,"left_ankle_roll":0.034906585,"right_shoulder_pitch":1.3089969,"right_shoulder_roll":-0.12217305,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.12217305,"right_wrist_yaw":1.5707964,"right_hip_roll":0.10471976,"right_hip_pitch":-0.9075712,"right_knee_pitch":2.1118484,"right_ankle_pitch":-1.1693707,"right_ankle_roll":-0.08726646,"left_hand":0.0,"right_hand":0.0},"duration":0.2},{"target_position":{"head_yaw":0.0,"head_pitch":0.38397244,"left_shoulder_pitch":1.43117,"left_shoulder_roll":0.2268928,"left_elbow_yaw":-1.4660766,"left_elbow_roll":-0.20943952,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":0.0,"left_hip_roll":-0.06981317,"left_hip_pitch":-0.9250245,"left_knee_pitch":2.1118484,"left_ankle_pitch":-1.1693707,"left_ankle_roll":0.034906585,"right_shoulder_pitch":1.3089969,"right_shoulder_roll":-0.12217305,"right_elbow_yaw":1.727876,"right_elbow_roll":-0.12217305,"right_wrist_yaw":1.5707964,"right_hip_roll":0.10471976,"right_hip_pitch":-0.9075712,"right_knee_pitch":2.1118484,"right_ankle_pitch":-1.1693707,"right_ankle_roll":-0.08726646,"left_hand":0.0,"right_hand":0.0},"duration":0.2}]},"standup/on_stomach/sitting_to_half_crouch":{"joint_stifness":0.8,"chest_angle_bound_upper":-0.4,"chest_angle_bound_lower":0.4,"exit_waittime":0.7,"fail_routine":"Retry","conditions":[],"keyframes":[{"target_position":{"head_yaw":0.6,"head_pitch":0.5,"left_shoulder_pitch":2.0926497,"left_shoulder_roll":-0.0837758,"left_elbow_yaw":-1.4887658,"left_elbow_roll":-0.32463124,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.134464,"left_hip_roll":0.7278023,"left_hip_pitch":-1.399754,"left_knee_pitch":1.3351768,"left_ankle_pitch":0.86044735,"left_ankle_roll":-0.12566371,"right_shoulder_pitch":2.1223204,"right_shoulder_roll":-0.015707964,"right_elbow_yaw":1.5254178,"right_elbow_roll":0.39095375,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.567232,"right_hip_pitch":-1.4660766,"right_knee_pitch":1.4276793,"right_ankle_pitch":0.8220501,"right_ankle_roll":0.019198623,"left_hand":0.0,"right_hand":0.0},"duration":0.693181818},{"target_position":{"head_yaw":0.0,"head_pitch":0.5,"left_shoulder_pitch":2.0210912,"left_shoulder_roll":-0.13264503,"left_elbow_yaw":-1.4765486,"left_elbow_roll":-0.27750736,"left_wrist_yaw":-1.5707964,"left_hip_yaw_pitch":-1.2025318,"left_hip_roll":0.20420352,"left_hip_pitch":-0.51836276,"left_knee_pitch":2.1746802,"left_ankle_pitch":-0.71383965,"left_ankle_roll":-0.3298672,"right_shoulder_pitch":2.1066124,"right_shoulder_roll":-0.6928957,"right_elbow_yaw":1.7348573,"right_elbow_roll":0.143117,"right_wrist_yaw":1.5707964,"right_hip_roll":-0.35430184,"right_hip_pitch":-1.5603243,"right_knee_pitch":0.8412487,"right_ankle_pitch":0.9180432,"right_ankle_roll":-0.017453292,"left_hand":0.0,"right_hand":0.0},"duration":0.9}]}}} \ No newline at end of file diff --git a/tools/simulation/src/main.rs b/tools/simulation/src/main.rs index 3f769e854..b975502f2 100644 --- a/tools/simulation/src/main.rs +++ b/tools/simulation/src/main.rs @@ -14,7 +14,7 @@ use filter::{CovarianceMatrix, UnscentedKalmanFilter}; use nalgebra::{Isometry2, Point2, Translation2, UnitComplex, Vector2}; use tasks::TaskPlugin; use yggdrasil::behavior::behaviors::Stand; -use yggdrasil::behavior::engine::CommandsBehaviorExt; +use yggdrasil::behavior::engine::{BehaviorState, CommandsBehaviorExt, RoleState}; use yggdrasil::behavior::primary_state::PrimaryState; use yggdrasil::core::audio::whistle_detection::Whistle; use yggdrasil::core::config::layout::LayoutConfig; @@ -22,6 +22,7 @@ use yggdrasil::core::config::layout::RobotPosition; use yggdrasil::core::config::showtime::{self, PlayerConfig}; use yggdrasil::core::{config, control, debug}; use yggdrasil::localization::RobotPose; +use yggdrasil::localization::hypothesis::odometry_update; use yggdrasil::localization::odometry::{self, Odometry}; use yggdrasil::motion::walking_engine::step_context::StepContext; use yggdrasil::nao::Cycle; @@ -132,7 +133,7 @@ fn create_full_robot(player_number: u8) -> SubApp { sensor_noise: CovarianceMatrix::from_diagonal_element(0.001), cycle: Cycle::default(), timestamp: Instant::now(), - stationary_variance_threshold: 0.001, // variance = std^2 + stationary_variance_threshold: 0.1, // variance = std^2 }; sub_app @@ -162,13 +163,47 @@ fn create_full_robot(player_number: u8) -> SubApp { .add_systems(PostStartup, (setup_robot, update_orientation)) .add_systems( PreUpdate, - (update_simulated_odometry.after(odometry::update_odometry)), + // (update_simulated_odometry.after(odometry::update_odometry)), + ( + test, + update_simulated_odometry + .after(odometry::update_odometry) + .before(odometry_update), + update_ball_position.after(update_simulated_odometry), + ), ) .add_systems( PreStartup, set_player_number.after(showtime::configure_showtime), ); + fn test(state: Option>>) { + println!("Current behavior state: {:?}", state); + } + fn update_ball_position( + mut commands: Commands, + mut ball_tracker: ResMut, + pose: Res, + odometry: Res, + ) { + // Update the ball position based on the tracker + ball_tracker.measurement_update(BallPosition(pose.world_to_robot(&Point2::new(0.0, 0.0)))); + ball_tracker.predict(&odometry); + + let ball_position = ball_tracker.stationary_ball(); + + if let Some(ball) = ball_position { + println!( + "Global Ball position: {:?}, Relative {:?}", + pose.robot_to_world(&ball), + ball + ); + return; + } + + println!("No stationary ball detected!"); + } + fn setup_robot(mut commands: Commands) { commands.insert_resource(PrimaryState::Initial); commands.set_behavior(Stand); @@ -514,28 +549,26 @@ fn draw_robot( .id(); // Spawn the draggable circle - commands - .spawn(( - Mesh2d(meshes.add(Circle::new(1.0))), - MeshMaterial2d(materials.add(ColorMaterial::from_color(color))), - Transform::from_xyz(0.0, 0.0, 0.0), - PositionCircle, - )) - // .observe(|over: Trigger>| { - // println!("Over event triggered for circle: {}", over.entity()); - // }) - .set_parent(robot_entity); + commands.spawn(( + Mesh2d(meshes.add(Circle::new(1.0))), + MeshMaterial2d(materials.add(ColorMaterial::from_color(color))), + Transform::from_xyz(0.0, 0.0, 0.0), + PositionCircle, + ChildOf(robot_entity), + )); + // .observe(|over: Trigger>| { + // println!("Over event triggered for circle: {}", over.entity()); + // }) - commands - .spawn(( - Text2d::new(config.player_number.to_string()), - text_font.clone(), - TextLayout::new_with_justify(text_justification), - Transform::from_xyz(0.0, 0.0, 0.2), - TextColor(Color::srgb(0.2, 0.2, 0.2)), - PlayerNumber, - )) - .set_parent(robot_entity); + commands.spawn(( + Text2d::new(config.player_number.to_string()), + text_font.clone(), + TextLayout::new_with_justify(text_justification), + Transform::from_xyz(0.0, 0.0, 0.2), + TextColor(Color::srgb(0.2, 0.2, 0.2)), + PlayerNumber, + ChildOf(robot_entity), + )); // Add drag observer directly to the robot entity // commands.entity(robot_entity).observe(on_robot_drag); From c41f803916dfdb1a18d3fa9c1a8f4704ae69ac01 Mon Sep 17 00:00:00 2001 From: Fyor Klein Gunnewiek Date: Thu, 19 Jun 2025 18:05:47 +0200 Subject: [PATCH 04/10] Add ball physics and scoring --- tools/simulation/assets/ball.png | Bin 0 -> 885 bytes tools/simulation/src/main.rs | 194 +++++++++++++++++++++++++------ 2 files changed, 161 insertions(+), 33 deletions(-) create mode 100644 tools/simulation/assets/ball.png diff --git a/tools/simulation/assets/ball.png b/tools/simulation/assets/ball.png new file mode 100644 index 0000000000000000000000000000000000000000..0c19d7353ff5c7ff3b7b802e06b7820c9405074c GIT binary patch literal 885 zcmV-*1B(2KP)G7{39ENGGs zJ`^eLVGoK*%hro%YAo5q1PhI66BjI4aM_eI4(o%z@Oj>Cchy7m`}wc6XV1Z1uo)L{9R=(}yT!Gmh%Yd&*0)%R7cu58X|?*X6;IRkh|UcBpj*Tky8TW@N-tf+D6-*4V7(%6J)7jg8=YK|6|K zDM10V7Pkura11|d>~+jq+CGUMu}IL3qZ%8;cNmsfhAwoW6I~e9+$cT~bc>|~?Z~Ou zhb)HGD&r)E(T^GAH8+p*f(OJ>f_dcC>Ocu^Xl?`>wPs3?7fT7MScxO(Lk^#!9~I4w zp;v1<@G2I>B0(0*P()F%2N$)bib-^1(&AQQ3j0wKO9>X#>-6`GVxz@H*p5L#Su7777v-?82kihUf60Aj117Y3?w_@ga`moI4`5hS7udn8P|uNaWCi zUgWV}YsN8v3`X1~t=@4wh7Npyn-UB70Vi-2KcUakE@K0(qU0WF_5Q#iJd8K-6&5sh z0l%T3UKzV_8CS6tx7{PHvD+BK@7RMIxS+8K{EFvM!6^*k6kfn#4C1y1+BBEJ09N5k zjA2@$3m;(wGgyl!a0vTQv4l3Q%bJR-Os-MEBVOkxaY{9pV9%aYF;8XnzU00000 LNkvXXu0mjf1f7Qi literal 0 HcmV?d00001 diff --git a/tools/simulation/src/main.rs b/tools/simulation/src/main.rs index b975502f2..c3c6bd031 100644 --- a/tools/simulation/src/main.rs +++ b/tools/simulation/src/main.rs @@ -21,9 +21,9 @@ use yggdrasil::core::config::layout::LayoutConfig; use yggdrasil::core::config::layout::RobotPosition; use yggdrasil::core::config::showtime::{self, PlayerConfig}; use yggdrasil::core::{config, control, debug}; -use yggdrasil::localization::RobotPose; use yggdrasil::localization::hypothesis::odometry_update; use yggdrasil::localization::odometry::{self, Odometry}; +use yggdrasil::localization::{RobotPose, pose}; use yggdrasil::motion::walking_engine::step_context::StepContext; use yggdrasil::nao::Cycle; use yggdrasil::prelude::Config; @@ -45,6 +45,8 @@ const FIELD_HEIGHT_METERS: f32 = 7.4; const PIXELS_PER_METER: f32 = 100.0; // Base scale factor, will be adjusted dynamically // Robot size in meters const ROBOT_SIZE_METERS: f32 = 0.5; // 50cm x 50cm robot +// Ball size in meters (SPL standard) +const BALL_RADIUS_METERS: f32 = 0.055; // Scale factors to convert between meters and pixels - will be updated dynamically #[derive(Resource)] @@ -58,16 +60,28 @@ struct PlayerNumber; #[derive(Resource)] pub struct Simulation { state: GameState, + ball_position: Point2, + ball_velocity: Vec2, // Add velocity + gamecontroller: GameControllerMessage, // Add gamecontroller } impl Default for Simulation { fn default() -> Self { Self { state: GameState::Initial, + ball_position: Point2::new(1.0, 1.0), + ball_velocity: Vec2::ZERO, // Start stationary + gamecontroller: initial_gamecontroller(), // Initialize } } } +#[derive(Resource)] +struct SimBallPosition(Point2); + +#[derive(Component)] +struct SimBall; + fn main() { let mut app = App::new(); @@ -90,6 +104,9 @@ fn main() { update_robot_positions, update_field_scale, update_position_markers, + update_ball_motion, // Add ball motion system + handle_ball_robot_collisions, // Add collision system + update_ball_visual, // <-- add this ), ); @@ -156,8 +173,8 @@ fn create_full_robot(player_number: u8) -> SubApp { // Removed vision::VisionPlugins, )) .insert_resource(ball_tracker) + .insert_resource(SimBallPosition(Point2::new(-1.0, -1.0))) .insert_resource(Whistle::default()) - .insert_resource(initial_gamecontroller()) .add_event::() .add_event::() .add_systems(PostStartup, (setup_robot, update_orientation)) @@ -165,7 +182,6 @@ fn create_full_robot(player_number: u8) -> SubApp { PreUpdate, // (update_simulated_odometry.after(odometry::update_odometry)), ( - test, update_simulated_odometry .after(odometry::update_odometry) .before(odometry_update), @@ -177,31 +193,15 @@ fn create_full_robot(player_number: u8) -> SubApp { set_player_number.after(showtime::configure_showtime), ); - fn test(state: Option>>) { - println!("Current behavior state: {:?}", state); - } fn update_ball_position( - mut commands: Commands, + ball: Res, mut ball_tracker: ResMut, pose: Res, odometry: Res, ) { // Update the ball position based on the tracker - ball_tracker.measurement_update(BallPosition(pose.world_to_robot(&Point2::new(0.0, 0.0)))); + ball_tracker.measurement_update(BallPosition(pose.world_to_robot(&ball.0))); ball_tracker.predict(&odometry); - - let ball_position = ball_tracker.stationary_ball(); - - if let Some(ball) = ball_position { - println!( - "Global Ball position: {:?}, Relative {:?}", - pose.robot_to_world(&ball), - ball - ); - return; - } - - println!("No stationary ball detected!"); } fn setup_robot(mut commands: Commands) { @@ -230,8 +230,12 @@ fn create_full_robot(player_number: u8) -> SubApp { sub_app.set_extract(|main_world, sub_world| { let simulation = main_world.resource_mut::(); + // Insert the gamecontroller from Simulation + sub_world.insert_resource(simulation.gamecontroller.clone()); sub_world.resource_mut::().state = simulation.state; + sub_world.insert_resource(SimBallPosition(simulation.ball_position)); + let robot_pose = sub_world.resource::(); let player_config = sub_world.resource::(); @@ -356,16 +360,71 @@ fn ui_main( // Set initial size to 25% of window width, max 50% let right = egui::SidePanel::right("right_panel") - .default_width(window.width() * 0.25) - .max_width(window.width() * 0.5) - .resizable(true) - .show(ctx, |ui| { - ui.label("Right resizeable panel"); - ui.allocate_rect(ui.available_rect_before_wrap(), egui::Sense::hover()); - }) - .response - .rect - .width(); + .default_width(window.width() * 0.25) + .max_width(window.width() * 0.5) + .resizable(true) + .show(ctx, |ui| { + // Top-aligned, horizontally centered scoreboard + ui.add_space(20.0); + ui.vertical_centered(|ui| { + ui.label( + egui::RichText::new("SCOREBOARD") + .size(32.0) + .color(egui::Color32::from_rgb(255, 215, 0)) + .strong() + .underline(), + ); + ui.add_space(20.0); + + // Score display with team colors using columns with constrained height + let score_a = simulation.gamecontroller.teams[0].score; + let score_b = simulation.gamecontroller.teams[1].score; + + ui.allocate_ui_with_layout( + egui::Vec2::new(ui.available_width(), 70.0), // Fixed height + egui::Layout::top_down(egui::Align::Center), + |ui| { + ui.columns(3, |columns| { + columns[0].with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + ui.label( + egui::RichText::new(format!("{}", score_a)) + .size(60.0) + .color(egui::Color32::from_rgb(220, 20, 60)) + .strong() + ); + }); + + columns[1].centered_and_justified(|ui| { + ui.label( + egui::RichText::new("-") + .size(48.0) + .color(egui::Color32::WHITE) + .strong() + ); + }); + + columns[2].with_layout(egui::Layout::left_to_right(egui::Align::Center), |ui| { + ui.label( + egui::RichText::new(format!("{}", score_b)) + .size(60.0) + .color(egui::Color32::from_rgb(30, 144, 255)) + .strong() + ); + }); + }); + } + ); + + ui.add_space(20.0); + ui.separator(); + }); + + // Fill the rest of the available rect + ui.allocate_rect(ui.available_rect_before_wrap(), egui::Sense::hover()); + }) + .response + .rect + .width(); // Set initial size to 25% of window height, max 33% let bottom = egui::TopBottomPanel::bottom("bottom_panel") @@ -609,7 +668,6 @@ fn setup_system( // Spawn all robots in a single loop for i in 1..=layout_config.initial_positions.len() { - // Draw initial position robot draw_robot( &mut commands, &mut meshes, @@ -618,9 +676,79 @@ fn setup_system( &robot_texture, &text_font, text_justification, - &field_scale, // Pass field_scale here + &field_scale, ); } + // Spawn the ball as a simple colored circle using Mesh2d and MeshMaterial2d + let ball_color = Color::srgba(0.0, 0.0, 0.0, 0.5); + + commands.spawn(( + Mesh2d(meshes.add(Circle::new(1.0))), + MeshMaterial2d(materials.add(ColorMaterial::from_color(ball_color))), + Transform::from_xyz( + 1.0 * field_scale.pixels_per_meter, + 1.0 * field_scale.pixels_per_meter, + 2.0, + ).with_scale(Vec3::splat(BALL_RADIUS_METERS * 2.0 * field_scale.pixels_per_meter)), + SimBall, + )); + commands.spawn(Camera2d); } + +// System to update the ball's visual position and scale +fn update_ball_visual( + simulation: Res, + field_scale: Res, + mut query: Query<&mut Transform, With>, +) { + if let Ok(mut transform) = query.get_single_mut() { + transform.translation.x = simulation.ball_position.x * field_scale.pixels_per_meter; + transform.translation.y = simulation.ball_position.y * field_scale.pixels_per_meter; + transform.scale = Vec3::splat(BALL_RADIUS_METERS * 2.0 * field_scale.pixels_per_meter); + } +} + +// Ball movement system +fn update_ball_motion(mut simulation: ResMut, time: Res