diff --git a/Cargo.lock b/Cargo.lock index bb57bbb..b4c036e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -74,6 +74,12 @@ dependencies = [ "winit", ] +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "ahash" version = "0.8.11" @@ -153,6 +159,24 @@ dependencies = [ "num-traits", ] +[[package]] +name = "arboard" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb4009533e8ff8f1450a5bcbc30f4242a1d34442221f72314bea1f5dc9c7f89" +dependencies = [ + "clipboard-win", + "core-graphics", + "image 0.25.2", + "log", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "parking_lot", + "windows-sys 0.48.0", + "x11rb", +] + [[package]] name = "arrayref" version = "0.3.8" @@ -165,6 +189,12 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + [[package]] name = "ash" version = "0.37.3+1.3.251" @@ -264,6 +294,50 @@ dependencies = [ "bevy_internal", ] +[[package]] +name = "bevy-inspector-egui" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8d77dbe53c8840aa74b66ea19dac6675d0a1752c989610cbded909d03967bec" +dependencies = [ + "bevy-inspector-egui-derive", + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_core", + "bevy_core_pipeline", + "bevy_ecs", + "bevy_egui", + "bevy_hierarchy", + "bevy_log", + "bevy_math", + "bevy_pbr", + "bevy_reflect", + "bevy_render", + "bevy_state", + "bevy_time", + "bevy_utils", + "bevy_window", + "bytemuck", + "egui", + "fuzzy-matcher", + "image 0.24.9", + "once_cell", + "pretty-type-name", + "smallvec", +] + +[[package]] +name = "bevy-inspector-egui-derive" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "161d93f4b3a9246a87485e30ccf4cc927f204a14f26df42da977e383f0a0ec5d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + [[package]] name = "bevy-trait-query" version = "0.5.1" @@ -446,6 +520,7 @@ name = "bevy_dogoap" version = "0.1.0" dependencies = [ "bevy", + "bevy-inspector-egui", "bevy-trait-query", "bevy_framepace", "dogoap", @@ -486,6 +561,28 @@ dependencies = [ "syn 2.0.72", ] +[[package]] +name = "bevy_egui" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e4a90f30f2849a07d91e393b10c0cc05df09b5773c010ddde57dd8b583be230" +dependencies = [ + "arboard", + "bevy", + "bytemuck", + "console_log", + "crossbeam-channel", + "egui", + "js-sys", + "log", + "thread_local", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webbrowser", + "winit", +] + [[package]] name = "bevy_encase_derive" version = "0.14.0" @@ -631,9 +728,9 @@ dependencies = [ [[package]] name = "bevy_macro_utils" -version = "0.14.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ad860d35d74b35d4d6ae7f656d163b6f475aa2e64fc293ee86ac901977ddb7" +checksum = "7ec4a585ec2a6dedd4f4143c07219d120ae142121929f0d83e68d82a452cdc9b" dependencies = [ "proc-macro2", "quote", @@ -760,7 +857,7 @@ dependencies = [ "encase", "futures-lite", "hexasphere", - "image", + "image 0.25.2", "js-sys", "naga", "naga_oil", @@ -832,6 +929,32 @@ dependencies = [ "thiserror", ] +[[package]] +name = "bevy_state" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0959984092d56885fd3b320ea84fb816821bad6bfa3040b9d4ee850d3273233d" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_hierarchy", + "bevy_reflect", + "bevy_state_macros", + "bevy_utils", +] + +[[package]] +name = "bevy_state_macros" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8a449823c420d1cc1fa6cf3d484570b08358e5eeedc1b86de1efcf9c10399b5" +dependencies = [ + "bevy_macro_utils", + "proc-macro2", + "quote", + "syn 2.0.72", +] + [[package]] name = "bevy_tasks" version = "0.14.0" @@ -1093,6 +1216,12 @@ dependencies = [ "syn 2.0.72", ] +[[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" @@ -1165,6 +1294,15 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[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 = "codespan-reporting" version = "0.11.1" @@ -1175,6 +1313,12 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + [[package]] name = "com" version = "0.6.0" @@ -1235,6 +1379,16 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "console_log" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be8aed40e4edbf4d3b4431ab260b63fdc40f5780a4766824329ea0f1eefe3c0f" +dependencies = [ + "log", + "web-sys", +] + [[package]] name = "const-fnv1a-hash" version = "1.1.0" @@ -1308,6 +1462,15 @@ 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 = "crossbeam-channel" version = "0.5.13" @@ -1404,6 +1567,37 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" +[[package]] +name = "ecolor" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e6b451ff1143f6de0f33fc7f1b68fecfd2c7de06e104de96c4514de3f5396f8" +dependencies = [ + "bytemuck", + "emath", +] + +[[package]] +name = "egui" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20c97e70a2768de630f161bb5392cbd3874fcf72868f14df0e002e82e06cb798" +dependencies = [ + "ahash", + "emath", + "epaint", + "nohash-hasher", +] + +[[package]] +name = "emath" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6a21708405ea88f63d8309650b4d77431f4bc28fb9d8e6f77d3963b51249e6" +dependencies = [ + "bytemuck", +] + [[package]] name = "encase" version = "0.8.0" @@ -1436,6 +1630,21 @@ dependencies = [ "syn 2.0.72", ] +[[package]] +name = "epaint" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f0dcc0a0771e7500e94cd1cb797bd13c9f23b9409bdc3c824e2cbc562b7fa01" +dependencies = [ + "ab_glyph", + "ahash", + "bytemuck", + "ecolor", + "emath", + "nohash-hasher", + "parking_lot", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -1462,6 +1671,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "error-code" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0474425d51df81997e2f90a21591180b38eccf27292d755f3e30750225c175b" + [[package]] name = "euclid" version = "0.22.10" @@ -1504,6 +1719,15 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" +[[package]] +name = "fdeflate" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" +dependencies = [ + "simd-adler32", +] + [[package]] name = "fixedbitset" version = "0.4.2" @@ -1516,6 +1740,16 @@ version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" +[[package]] +name = "flate2" +version = "1.0.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f211bbe8e69bbd0cfdea405084f128ae8b4aaa6b0b522fc8f2b009084797920" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "foreign-types" version = "0.5.0" @@ -1543,6 +1777,15 @@ 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 = "futures-core" version = "0.3.30" @@ -1568,6 +1811,25 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "fuzzy-matcher" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54614a3312934d066701a80f20f15fa3b56d67ac7722b39eea5b4c9dd1d66c94" +dependencies = [ + "thread_local", +] + +[[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.15" @@ -1751,6 +2013,37 @@ 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 = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "image" +version = "0.24.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "num-traits", +] + [[package]] name = "image" version = "0.25.2" @@ -1760,6 +2053,8 @@ dependencies = [ "bytemuck", "byteorder-lite", "num-traits", + "png", + "tiff", ] [[package]] @@ -1827,6 +2122,12 @@ dependencies = [ "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.69" @@ -1981,6 +2282,16 @@ dependencies = [ "paste", ] +[[package]] +name = "miniz_oxide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +dependencies = [ + "adler", + "simd-adler32", +] + [[package]] name = "naga" version = "0.20.0" @@ -2062,6 +2373,12 @@ dependencies = [ "jni-sys", ] +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + [[package]] name = "nonmax" version = "0.5.5" @@ -2399,6 +2716,12 @@ dependencies = [ "thiserror", ] +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + [[package]] name = "petgraph" version = "0.6.5" @@ -2452,6 +2775,19 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +[[package]] +name = "png" +version = "0.17.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + [[package]] name = "polling" version = "3.7.2" @@ -2488,6 +2824,12 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" +[[package]] +name = "pretty-type-name" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f73cdaf19b52e6143685c3606206e114a4dfa969d6b14ec3894c88eb38bd4b" + [[package]] name = "proc-macro-crate" version = "1.3.1" @@ -2791,6 +3133,12 @@ dependencies = [ "lazy_static", ] +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + [[package]] name = "slab" version = "0.4.9" @@ -2959,6 +3307,17 @@ dependencies = [ "once_cell", ] +[[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 = "tiny-skia" version = "0.11.4" @@ -2984,6 +3343,21 @@ dependencies = [ "strict-num", ] +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "toml_datetime" version = "0.6.6" @@ -3107,12 +3481,27 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "059d83cc991e7a42fc37bd50941885db0888e34209f8cfd9aab07ddec03bc9cf" +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-segmentation" version = "1.11.0" @@ -3131,6 +3520,17 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +[[package]] +name = "url" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + [[package]] name = "uuid" version = "1.10.0" @@ -3340,6 +3740,7 @@ checksum = "43676fe2daf68754ecf1d72026e4e6c15483198b5d24e888b74d3f22f887a148" dependencies = [ "dlib", "log", + "once_cell", "pkg-config", ] @@ -3363,6 +3764,30 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webbrowser" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "425ba64c1e13b1c6e8c5d2541c8fac10022ca584f33da781db01b5756aef1f4e" +dependencies = [ + "block2", + "core-foundation", + "home", + "jni", + "log", + "ndk-context", + "objc2", + "objc2-foundation", + "url", + "web-sys", +] + +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + [[package]] name = "wgpu" version = "0.20.1" @@ -3590,6 +4015,15 @@ 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" @@ -3614,6 +4048,21 @@ dependencies = [ "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" @@ -3636,6 +4085,12 @@ 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" @@ -3648,6 +4103,12 @@ 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" @@ -3660,6 +4121,12 @@ 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" @@ -3678,6 +4145,12 @@ 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" @@ -3690,6 +4163,12 @@ 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" @@ -3702,6 +4181,12 @@ 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" @@ -3714,6 +4199,12 @@ 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" @@ -3731,6 +4222,7 @@ dependencies = [ "atomic-waker", "bitflags 2.6.0", "block2", + "bytemuck", "calloop", "cfg_aliases 0.2.1", "concurrent-queue", @@ -3747,6 +4239,7 @@ dependencies = [ "objc2-foundation", "objc2-ui-kit", "orbclient", + "percent-encoding", "pin-project", "raw-window-handle", "redox_syscall 0.4.1", @@ -3765,6 +4258,8 @@ dependencies = [ "web-sys", "web-time", "windows-sys 0.52.0", + "x11-dl", + "x11rb", "xkbcommon-dl", ] @@ -3786,6 +4281,38 @@ dependencies = [ "memchr", ] +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "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 0.8.5", + "once_cell", + "rustix", + "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.6" diff --git a/crates/bevy_dogoap/Cargo.toml b/crates/bevy_dogoap/Cargo.toml index e5de411..c8b9806 100644 --- a/crates/bevy_dogoap/Cargo.toml +++ b/crates/bevy_dogoap/Cargo.toml @@ -12,7 +12,7 @@ compute-pool = [] [dependencies] bevy = { version = "0.14.0", default-features = false, optional = false, features = ["wayland", "bevy_gizmos", "bevy_text", "multi_threaded", "default_font", "webgl2"]} -# bevy-inspector-egui = "0.25.1" +bevy-inspector-egui = "0.25.1" bevy-trait-query = { git = "https://github.com/RobWalt/bevy-trait-query.git", rev = "215b9068e8457d96ddcd4c8efa9605ba0f8feda5", version = "0.5.1" } bevy_framepace = "0.17.1" dogoap = { path = "../dogoap", version = "*"} diff --git a/crates/bevy_dogoap/examples/resman.rs b/crates/bevy_dogoap/examples/resman.rs index 237a58d..7204f49 100644 --- a/crates/bevy_dogoap/examples/resman.rs +++ b/crates/bevy_dogoap/examples/resman.rs @@ -15,23 +15,62 @@ // Worker has Actions: // - GoToServingDesk, TakeOrder, MakeProduct, MoveProduct, HandOverOrder -use std::collections::HashMap; +/* Sequence Diagram for the full flow of actions (paste into https://sequencediagram.org/) -use bevy::{color::palettes::css::*, prelude::*}; +Customer->Customer: Check thirst +Customer->Serve Desk: GoToServeDesk + +Worker->Serve Desk: GoToServeDesk +Customer->Serve Desk: Create Order + +Worker->Lemonade Maker: Produce Lemonade +Lemonade Maker->Worker: Produced Lemonade + +Worker->Serve Desk: Complete Order +Customer<-Serve Desk: Pickup Order +Customer->Customer: Drink Lemonade + +*/ + +use std::collections::{HashMap, VecDeque}; + +use bevy::{color::palettes::css::*, input::common_conditions::input_toggle_active, prelude::*}; use bevy_dogoap::prelude::*; -use dogoap::prelude::*; +use bevy_inspector_egui::quick::WorldInspectorPlugin; fn main() { let mut app = App::new(); // Customer components + actions - register_components!(app, vec![Thirst, CarryingItem, PlacedOrder, OrderReady]); + register_components!( + app, + vec![ + Thirst, + CarryingItem, + PlacedOrder, + OrderReady, + AtOrderDesk, + ShouldGoToOrderDesk + ] + ); register_actions!( app, - vec![DrinkLemonade, PickupLemonade, WaitForOrder, PlaceOrder] + vec![ + DrinkLemonade, + PickupLemonade, + WaitForOrder, + PlaceOrder, + GoToOrderDesk + ] ); // Worker components + actions - register_components!(app, vec![Energy]); - register_actions!(app, vec![Rest]); + register_components!( + app, + vec![Energy, AtLemonadeMaker, ServedOrder, ShouldGoToOrderDesk] + ); + register_actions!( + app, + vec![Rest, ServeOrder, ProduceLemonade, GoToLemonadeMaker] + ); app.add_plugins(DefaultPlugins.set(WindowPlugin { primary_window: Some(Window { @@ -41,10 +80,24 @@ fn main() { ..default() })) .add_plugins(DogoapPlugin) + .add_plugins(WorldInspectorPlugin::default().run_if(input_toggle_active(false, KeyCode::KeyI))) .add_systems(Startup, setup) - .add_systems(Update, (update_thirst, draw_state_debug, draw_ui)) + .add_systems(Update, (draw_state_debug, draw_ui)) + // Systems that always affects needs + .add_systems(FixedUpdate, update_thirst) // Systems that handle actions - .add_systems(Update, (handle_pickup_lemonade, handle_drink_lemonade)) + .add_systems( + FixedUpdate, + ( + handle_pickup_lemonade, + handle_drink_lemonade, + handle_place_order, + handle_wait_for_order, + handle_go_to_order_desk, + handle_move_to, + handle_call_worker_to_empty_order_desk, + ), + ) .run(); } @@ -62,6 +115,12 @@ struct PlacedOrder(bool); #[derive(Component, Clone, DatumComponent)] struct OrderReady(bool); +#[derive(Component, Clone, DatumComponent)] +struct AtOrderDesk(bool); + +#[derive(Component, Clone, DatumComponent)] +struct ShouldGoToOrderDesk(bool); + // Actions for customer #[derive(Component, Clone, Default, ActionComponent)] @@ -76,21 +135,43 @@ struct WaitForOrder; #[derive(Component, Clone, Default, ActionComponent)] struct PlaceOrder; +#[derive(Component, Clone, Default, ActionComponent)] +struct GoToOrderDesk; + // DatumComponents for worker #[derive(Component, Clone, DatumComponent)] struct Energy(f64); +#[derive(Component, Clone, DatumComponent)] +struct ServedOrder(bool); + +#[derive(Component, Clone, DatumComponent)] +struct AtLemonadeMaker(bool); + +// Actions for worker + #[derive(Component, Clone, Default, ActionComponent)] struct Rest; +#[derive(Component, Clone, Default, ActionComponent)] +struct ServeOrder; + +#[derive(Component, Clone, Default, ActionComponent)] +struct ProduceLemonade; + +#[derive(Component, Clone, Default, ActionComponent)] +struct GoToLemonadeMaker; + // Markers #[derive(Component)] struct Agent; -#[derive(Component)] -struct Customer; +#[derive(Component, Default)] +struct Customer { + order: Option, +} #[derive(Component)] struct Worker; @@ -107,7 +188,22 @@ enum Item { struct LemonadeMaker; #[derive(Component)] -struct OrderDesk; +struct Order { + items_to_produce: VecDeque, + items: Vec, + owner: Entity, +} + +#[derive(Component, Default)] +struct OrderDesk { + assigned_customer: Option, + assigned_worker: Option, + can_take_order: bool, // set to true when both customer and worker present + current_order: Option, +} + +#[derive(Component)] +struct MoveTo(Vec3); #[derive(Component)] struct StateDebugText; @@ -126,29 +222,42 @@ fn setup(mut commands: Commands) { // Requires us to not be carrying nothing, and leads to us having a lemonade let pickup_lemonade_action = PickupLemonade::new() .add_precondition(CarryingItem::is(Item::Nothing)) + .add_precondition(OrderReady::is(true)) + .add_precondition(AtOrderDesk::is(true)) .add_mutator(CarryingItem::set(Item::Lemonade)); + // Requires us to having placed an order, order not yet ready and we're at the order desk let wait_for_order_action = WaitForOrder::new() .add_precondition(PlacedOrder::is(true)) .add_precondition(OrderReady::is(false)) + .add_precondition(AtOrderDesk::is(true)) .add_mutator(OrderReady::set(true)); + // Requires us to not having placed an order previously, and we're at the ordering desk let place_order_action = PlaceOrder::new() .add_precondition(PlacedOrder::is(false)) + .add_precondition(AtOrderDesk::is(true)) .add_mutator(PlacedOrder::set(true)); - // Drink Lemonade - // Pickup Lemonade - // Wait for Order - // Place Order - // Go To Order Desk + let go_to_order_desk_action = GoToOrderDesk::new() + .add_precondition(AtOrderDesk::is(false)) + .add_mutator(AtOrderDesk::set(true)); let (mut planner, components) = create_planner!({ actions: [ (DrinkLemonade, drink_lemonade_action), - (PickupLemonade, pickup_lemonade_action) + (PickupLemonade, pickup_lemonade_action), + (WaitForOrder, wait_for_order_action), + (PlaceOrder, place_order_action), + (GoToOrderDesk, go_to_order_desk_action), + ], + state: [ + Thirst(0.0), + CarryingItem(Item::Nothing), + PlacedOrder(false), + OrderReady(false), + AtOrderDesk(false), ], - state: [Thirst(0.0), CarryingItem(Item::Nothing)], goals: [goal], }); @@ -156,13 +265,11 @@ fn setup(mut commands: Commands) { planner.always_plan = true; // Re-calculate our plan whenever we can planner.current_goal = Some(goal.clone()); - let t = Transform::from_scale(Vec3::splat(2.0)); - commands .spawn(( Agent, Name::new("Customer"), - Customer, + Customer::default(), planner, components, TransformBundle::from(Transform::from_xyz(-200.0, -100.0, 1.0)), @@ -170,7 +277,7 @@ fn setup(mut commands: Commands) { .with_children(|subcommands| { subcommands.spawn(( Text2dBundle { - transform: Transform::from_translation(Vec3::new(10.0, -10.0, 10.0)), + transform: Transform::from_translation(Vec3::new(-70.0, 0.0, 10.0)), text: Text::from_section( "", TextStyle { @@ -189,15 +296,57 @@ fn setup(mut commands: Commands) { // Spawn worker for _i in 0..1 { - let goal = Goal::from_reqs(&[Energy::is_more(1.0)]); + // Now for the worker + + // Final outcome for the worker is increasing the amount of money, always + // We trick the agent into performing our actions forever by having a: + // ServedOrder DatumComponent that the agent wants to set to true, + // but at runtime it can never actually get there. + + // In order to set ServedOrder to true, the agent needs to run ServeOrder + + // let goal = Goal::from_reqs(&[Energy::is_more(1.0), ServedOrder::is(true)]); + let goal = Goal::from_reqs(&[AtOrderDesk::is(true)]); + + let serve_order_action = ServeOrder::new() + .add_precondition(CarryingItem::is(Item::Lemonade)) + .add_precondition(AtOrderDesk::is(true)) + .add_mutator(ServedOrder::set(true)); + + let produce_lemonade_action = ProduceLemonade::new() + .add_precondition(CarryingItem::is(Item::Nothing)) + .add_precondition(AtLemonadeMaker::is(true)) + .add_mutator(CarryingItem::set(Item::Lemonade)); + + let go_to_lemonade_maker_action = GoToLemonadeMaker::new() + .add_precondition(AtLemonadeMaker::is(false)) + .add_mutator(AtLemonadeMaker::set(true)); let rest_action = Rest::new() .add_precondition(Energy::is_less(10.0)) .add_mutator(Energy::increase(50.0)); + let go_to_order_desk_action = GoToOrderDesk::new() + .add_precondition(AtOrderDesk::is(false)) + .add_precondition(ShouldGoToOrderDesk::is(true)) + .add_mutator(AtOrderDesk::set(true)); + let (planner, components) = create_planner!({ - actions: [(Rest, rest_action)], - state: [Energy(50.0)], + actions: [ + (Rest, rest_action), + (ServeOrder, serve_order_action), + (ProduceLemonade, produce_lemonade_action), + (GoToLemonadeMaker, go_to_lemonade_maker_action), + (GoToOrderDesk, go_to_order_desk_action), + ], + state: [ + Energy(50.0), + ServedOrder(false), + AtLemonadeMaker(false), + AtOrderDesk(false), + CarryingItem(Item::Nothing), + ShouldGoToOrderDesk(false), + ], goals: [goal], }); @@ -230,31 +379,258 @@ fn setup(mut commands: Commands) { }); } - commands.spawn(( - LemonadeMaker, - TransformBundle::from(Transform::from_xyz(100.0, 0.0, 1.0)), - )); + commands + .spawn(( + Name::new("Lemonade Maker"), + LemonadeMaker, + TransformBundle::from(Transform::from_xyz(100.0, 0.0, 1.0)), + )) + .with_children(|subcommands| { + subcommands.spawn(( + Text2dBundle { + transform: Transform::from_translation(Vec3::new(0.0, 25.0, 10.0)), + text: Text::from_section( + "Lemonade Maker", + TextStyle { + font_size: 12.0, + ..default() + }, + ) + .with_justify(JustifyText::Left), + text_anchor: bevy::sprite::Anchor::TopLeft, + ..default() + }, + StateDebugText, + )); + }); - commands.spawn(( - OrderDesk, - TransformBundle::from(Transform::from_xyz(-100.0, 0.0, 1.0)), - )); + commands + .spawn(( + Name::new("Order Desk"), + OrderDesk::default(), + TransformBundle::from(Transform::from_xyz(-100.0, 0.0, 1.0)), + )) + .with_children(|subcommands| { + subcommands.spawn(( + Text2dBundle { + transform: Transform::from_translation(Vec3::new(0.0, 50.0, 10.0)), + text: Text::from_section( + "Order Desk", + TextStyle { + font_size: 12.0, + ..default() + }, + ) + .with_justify(JustifyText::Left), + text_anchor: bevy::sprite::Anchor::TopLeft, + ..default() + }, + StateDebugText, + )); + }); commands.spawn(Camera2dBundle::default()); } +fn handle_call_worker_to_empty_order_desk( + mut commands: Commands, + mut q_order_desks: Query<(&mut OrderDesk, &Transform)>, + mut q_workers: Query< + (Entity, &mut ShouldGoToOrderDesk, &Transform), + (With, Without), + >, +) { + for (mut order_desk, t_order_desk) in q_order_desks.iter_mut() { + if order_desk.assigned_customer.is_some() && order_desk.assigned_worker.is_none() { + // This order desk needs a worker! + // TODO continue here! + let (mut worker, mut should_go, t_worker) = + q_workers.iter_mut().next().expect("no workers"); + should_go.0 = true; + // Do we want to assign this directly? Or move there first + // if t_worker.translation.distance(t_order_desk.translation) < 5.0 { + order_desk.assigned_worker = Some(worker); + // } + } + } +} + +fn handle_move_to( + mut commands: Commands, + time: Res