diff --git a/Cargo.lock b/Cargo.lock index b7b0f11..a741171 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -279,6 +279,7 @@ dependencies = [ "parking_lot", "percent-encoding", "windows-sys 0.60.2", + "wl-clipboard-rs", "x11rb", ] @@ -509,9 +510,9 @@ dependencies = [ [[package]] name = "bevy" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "950238d3049d81006a6fd6b898a34cfc01bb5462a7668795a54d640aed19fd0a" +checksum = "4bfadbebfc6599aa59289b754ac30023959854304f3d393da2cf62bb3cd5df8f" dependencies = [ "bevy_dylib", "bevy_internal", @@ -530,7 +531,7 @@ dependencies = [ "bevy_color", "bevy_core_pipeline", "bevy_ecs", - "bevy_egui", + "bevy_egui 0.40.1", "bevy_gizmos", "bevy_image", "bevy_light", @@ -548,7 +549,7 @@ dependencies = [ "bevy_window", "bytemuck", "disqualified", - "egui", + "egui 0.34.3", "fuzzy-matcher", "image", "opener", @@ -570,9 +571,9 @@ dependencies = [ [[package]] name = "bevy-settings" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04372da0c37bab175e0bfbc4ad8f214ffcbea01850225573b6e49132db11e18b" +checksum = "3776102c41a5a212fced1a9ef76cb8aed8db96fcee397c1a869ea871d30b86df" dependencies = [ "bevy_app", "bevy_ecs", @@ -590,9 +591,9 @@ dependencies = [ [[package]] name = "bevy_a11y" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86f2cb45b000a9d121a5a7606f9af4a49e72b8b6a3885dc2acac2f0897a04f1" +checksum = "3c02cd43f914ef7a0f5b16f8a3d88c378c07c92f1a8c32ac5ac4d4f73e55f9e2" dependencies = [ "accesskit", "bevy_app", @@ -603,18 +604,18 @@ dependencies = [ [[package]] name = "bevy_android" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e5e2a949be318bf7184eb084622892afcc1e8b2af44973ac53ab53201756e0" +checksum = "ae5ea5245a845cefa8efb5ff7c2a8a36cdebfb99596068780f340f0b5aba6689" dependencies = [ "android-activity", ] [[package]] name = "bevy_animation" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da2fcd94cc32ba1c875c62e88506c0ba4775555a413e34cd172ea95fa26098e" +checksum = "dc513aac5cda673fb138236e969b4514e0a9b9f93fd33288111f147baa8af623" dependencies = [ "bevy_animation_macros", "bevy_app", @@ -645,9 +646,9 @@ dependencies = [ [[package]] name = "bevy_animation_macros" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fa3d816d7788e27da936b9c7ec27f9828906d53cb1d06e26c58cac5c5ee799f" +checksum = "eed2910d9ca5c3b48968a54c4571789e4e81935cf3c823383fcac34ca28e2b0e" dependencies = [ "bevy_macro_utils", "quote", @@ -656,9 +657,9 @@ dependencies = [ [[package]] name = "bevy_anti_alias" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "815414ea2e11afe1f2396d89279cfa0986907ef3ec673ec936d9fa695b2bfbf9" +checksum = "dde973fc942cb596b03cae0dbece0a4d9dc2d2790bbc9852aa415affc1210d3a" dependencies = [ "bevy_app", "bevy_asset", @@ -678,9 +679,9 @@ dependencies = [ [[package]] name = "bevy_app" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671ae6f3a8d84f9ed696c531a138558596e041231a8414b6efeafa8469e841f9" +checksum = "5fd2aa472d43b4d081ef41d26300d17bd22cba6d68df2a223eb358782fa40bc6" dependencies = [ "bevy_derive", "bevy_ecs", @@ -700,9 +701,9 @@ dependencies = [ [[package]] name = "bevy_asset" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a05907de6a362d2c609a7a1d1b4dca3b58b768f746b719ca1a3c7dfa87d391" +checksum = "1624eddbf2293441b2158506aba75e523432b898d9da26eb6ed3e20af4c7fd38" dependencies = [ "async-broadcast", "async-channel", @@ -774,9 +775,9 @@ dependencies = [ [[package]] name = "bevy_asset_macros" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9444998cc37b51dfd1572c23a501865733ea65619a7d88b47aa654ae2290a4f" +checksum = "735611c80e926e960d279cba2a6f6ab27a61291752ec3b26e76bf9a0957e11e1" dependencies = [ "bevy_macro_utils", "proc-macro2", @@ -786,9 +787,9 @@ dependencies = [ [[package]] name = "bevy_audio" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06af3bd91de885f2a5c024569779a7fb43349df611d92f7b795c66c8797378db" +checksum = "750809b7b007dd6de6e5c730e67973027a3d22392fa7fd6f5331f8cefb489a18" dependencies = [ "bevy_app", "bevy_asset", @@ -802,9 +803,9 @@ dependencies = [ [[package]] name = "bevy_camera" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20105c3e77c2fb391bf3ded3a473d60e4058b837c9bf4e3412225833e524c75a" +checksum = "96de20d0babfb51e3907eb4eb56f1e36096a6f8c77acd997f5de611df4ee067d" dependencies = [ "bevy_app", "bevy_asset", @@ -828,9 +829,9 @@ dependencies = [ [[package]] name = "bevy_camera_controller" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be74e5b6c7238f204b41642cf60d3846b2abda0a2252252035a58bc362072944" +checksum = "bfb356016add201b084008c4320d8ef1696a843f0dcf92db35992731cfef65b1" dependencies = [ "bevy_app", "bevy_camera", @@ -846,10 +847,11 @@ dependencies = [ [[package]] name = "bevy_clipboard" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dc5fb913f25c5a16a2a1aa2942ba3f1365a6d0f2db3c0ea5bc0be01f85dca5d" +checksum = "d0a9792c7f2e8b5b71b9572a6d98fca4ee88ed186c8a02e164540c461ae3a92e" dependencies = [ + "arboard", "bevy_app", "bevy_ecs", "bevy_log", @@ -861,9 +863,9 @@ dependencies = [ [[package]] name = "bevy_color" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e2dfc0091be6eb62fec9158b2d3e6f21b002be7bdb42dd3b8322e949c8426b0" +checksum = "5e5370beae13bea2db64744f370bb33566aa770dff91c2beae245ce82217fbbc" dependencies = [ "bevy_math", "bevy_reflect", @@ -877,9 +879,9 @@ dependencies = [ [[package]] name = "bevy_core_pipeline" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "885d640bbff6c4fa3beadbb043d0d1ae53b2fda864da18a2bf2670fb90428865" +checksum = "2564f1ba766532e8eeb20059133ff6703e8dd5c3864b92378d0d1c541096ef12" dependencies = [ "bevy_app", "bevy_asset", @@ -906,9 +908,9 @@ dependencies = [ [[package]] name = "bevy_derive" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "293df2b2f7ed65ef2ce02b2e7359faac1a9a92a8cc96c182c9de77eb06049ae0" +checksum = "9d2a03321f3bd8016a041b3ae6afe83e636b3540fbc61d571bf069a21fda3231" dependencies = [ "bevy_macro_utils", "quote", @@ -917,9 +919,9 @@ dependencies = [ [[package]] name = "bevy_dev_tools" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db815000affd21545a6d6986f180a66393aee8c84330843e854d376c8537b10f" +checksum = "ee5887919325facb6142d98de3e3d156c1b86c2375ac569e2e3547601ab05eaf" dependencies = [ "bevy_app", "bevy_asset", @@ -949,9 +951,9 @@ dependencies = [ [[package]] name = "bevy_diagnostic" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a73e11555051f37c3e0e9ef7775e77108f2482310242996fb5bb6ef8b685b78e" +checksum = "07a3a736f15486650c4c6866798a78d625c7063c991a3cc7b13f1577d89c82ae" dependencies = [ "atomic-waker", "bevy_app", @@ -967,18 +969,18 @@ dependencies = [ [[package]] name = "bevy_dylib" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70547c664f17a903cdef1e8e673496e9bdfa3d69dece9c01523d79067a876e34" +checksum = "e3c03a128bac8b59a8699b81038b574e3cfa33dfae18e375d46be028d3d13c0e" dependencies = [ "bevy_internal", ] [[package]] name = "bevy_ecs" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4654b9b3535fa7813d2878a50e1b5ad80a361dc1c913b96ded57667f65d70a01" +checksum = "a350b2e4c2e47f7903d688affb8a723b31bca63af9789f1da88703f1ba04e354" dependencies = [ "arrayvec", "bevy_ecs_macros", @@ -1004,9 +1006,9 @@ dependencies = [ [[package]] name = "bevy_ecs_macro_logic" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee0b98a74141ce8dce4654c60020ebbaefab32646f42af6bbae55f282ae65ff7" +checksum = "76a10fef45a3e7dad717ba03e8b5f7ecdf3b3fd1cd1c5e425793525938e90d5f" dependencies = [ "bevy_macro_utils", "proc-macro2", @@ -1016,9 +1018,9 @@ dependencies = [ [[package]] name = "bevy_ecs_macros" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dc958a194d226d618404e0fea99a3c8b4146207a00a3ba07fa712bf71607240" +checksum = "3916d712264b6f3ec9c964ba10719450ea371e537e202a2ffcfa9f6a5e68169d" dependencies = [ "bevy_ecs_macro_logic", "bevy_macro_utils", @@ -1059,7 +1061,55 @@ dependencies = [ "bevy_winit", "bytemuck", "crossbeam-channel", - "egui", + "egui 0.34.3", + "encase", + "getrandom 0.4.3", + "image", + "itertools 0.14.0", + "js-sys", + "smithay-clipboard", + "thread_local", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webbrowser", + "wgpu-types", + "winit", +] + +[[package]] +name = "bevy_egui" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e99e2d018c7e567a268638d3058e57895e914e5650dcf7bd80a5fead9e6413a9" +dependencies = [ + "arboard", + "bevy_app", + "bevy_asset", + "bevy_camera", + "bevy_color", + "bevy_core_pipeline", + "bevy_derive", + "bevy_ecs", + "bevy_image", + "bevy_input", + "bevy_log", + "bevy_math", + "bevy_mesh", + "bevy_picking", + "bevy_platform", + "bevy_reflect", + "bevy_render", + "bevy_shader", + "bevy_time", + "bevy_transform", + "bevy_ui_render", + "bevy_utils", + "bevy_window", + "bevy_winit", + "bytemuck", + "crossbeam-channel", + "egui 0.36.2", "encase", "getrandom 0.4.3", "image", @@ -1077,9 +1127,9 @@ dependencies = [ [[package]] name = "bevy_encase_derive" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14dc5bf9e6cb46c4401a66625b5f7eb9654a7f3c8586423c428b79586a1c55cd" +checksum = "be03820f64f2279ae9d826c882e4ef764516ff75ab7bdc39bb40801891533b89" dependencies = [ "bevy_macro_utils", "encase_derive_impl", @@ -1087,9 +1137,9 @@ dependencies = [ [[package]] name = "bevy_feathers" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e744e047f9328a9c072982569fabbbc837db0474fd902473b5f438f8688c30b6" +checksum = "e2bb6cfa726defd90add3eb71dc8b1ab32ca441f2531130679bfa880af2fb1f1" dependencies = [ "accesskit", "bevy_a11y", @@ -1132,9 +1182,9 @@ dependencies = [ [[package]] name = "bevy_gilrs" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7998fe83c89d527efa83c85c574a17f7bb6e34881d638ecb7f706d9d79e82f3c" +checksum = "b8215d166d5c4a9f821713a1a549a57c5f8bdf404745c84f7a8b920b7b7d92b2" dependencies = [ "bevy_app", "bevy_ecs", @@ -1148,9 +1198,9 @@ dependencies = [ [[package]] name = "bevy_gizmos" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c0cbd55cc33b6412777d60d8c24a96bee148c82a5731f35ac85b2df4a7cf957" +checksum = "2ac5bcad0b8d141ef64f4a89643f74f11827ea6ef48073192b39d69156ed1b92" dependencies = [ "bevy_app", "bevy_asset", @@ -1171,9 +1221,9 @@ dependencies = [ [[package]] name = "bevy_gizmos_macros" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9903f2614f53bacacb92bef1e407afe3a27a4abddb500bfd479909c5d7b254df" +checksum = "b37bbaa6241480b119da406fc261c9cf85d435addad880ae564c9b0f54a89a28" dependencies = [ "bevy_macro_utils", "quote", @@ -1182,9 +1232,9 @@ dependencies = [ [[package]] name = "bevy_gizmos_render" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd569456c4b19bafa6d37c1bd9cc743fdadda3a2f23d79d2ceb0a088ea8d475f" +checksum = "2ea2b6266d210bca0aa3bcba7e17204e437b4e86cecd4021ab7dcd32da576a02" dependencies = [ "bevy_app", "bevy_asset", @@ -1211,9 +1261,9 @@ dependencies = [ [[package]] name = "bevy_gltf" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84e21ad83b7dc8d456491ea3d50057685d8c4cca8bc52a1b4a7161c86c369842" +checksum = "0d17df73b26adfb8be89f0716b8667c60660bdd2d589863b8901caca58c99841" dependencies = [ "async-lock", "base64 0.22.1", @@ -1258,9 +1308,9 @@ dependencies = [ [[package]] name = "bevy_image" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37bc41f69a0c6ade2e7961602517545b39ab8e42bc8c4a729bd24ffee3bcd904" +checksum = "ca63218585b83f98831214431449e9344b363349dd5cab98dae0b8129f0a0e2f" dependencies = [ "basis-universal", "bevy_app", @@ -1274,7 +1324,7 @@ dependencies = [ "bitflags 2.13.1", "bytemuck", "futures-lite", - "guillotiere", + "guillotiere 0.6.2", "half", "image", "ktx2", @@ -1288,9 +1338,9 @@ dependencies = [ [[package]] name = "bevy_input" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd221cf0732f5bf06caf594bdb233361ac735d4d416cf5849757b64bf4e8472a" +checksum = "b22e8b1119ff5c0b551cc11b672d25732c4e3eda72aceabc380595bd0e7bbe88" dependencies = [ "bevy_app", "bevy_ecs", @@ -1305,9 +1355,9 @@ dependencies = [ [[package]] name = "bevy_input_focus" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e1a14f56c6e722048ec9dc20dbbc6f46b8037f61e319ea776829199278da166" +checksum = "c4d5573eb503387f73d12acde3010d49c808c790d34691e2fb410fc54b8c72b9" dependencies = [ "bevy_app", "bevy_ecs", @@ -1322,9 +1372,9 @@ dependencies = [ [[package]] name = "bevy_internal" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a85632a749f956f92b7b391c31ce1f229e57b06de879d1b60a3bb91e4e240" +checksum = "4ba99ca2e501f14f4af3322d66ae41b5c5b6ebd3aac4d00cda47dea4c00290ae" dependencies = [ "bevy-settings", "bevy_a11y", @@ -1383,9 +1433,9 @@ dependencies = [ [[package]] name = "bevy_light" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd7b5009e9cc765c30b21daf2277ea4423cbd347b05280ea0943b50c5a80cd42" +checksum = "a4f91fb900c2412c5cb7ff5083d428d8361a1d39b605df86eb259aff82f7ac45" dependencies = [ "bevy_app", "bevy_asset", @@ -1409,9 +1459,9 @@ dependencies = [ [[package]] name = "bevy_log" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2017a5fe12ea230d00cfdca00c65c262924be26e0324f7e0033c64f8cc265888" +checksum = "e24488594832237c1e3abc823642823fa057b810c3a21e14e65bdbd15d1579d5" dependencies = [ "android_log-sys", "bevy_app", @@ -1427,9 +1477,9 @@ dependencies = [ [[package]] name = "bevy_macro_utils" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "746a19912c6dc1bbe79188778573e8a253d5832c696b2fcb95578c17b29ff7ba" +checksum = "7164fe229422295bba15f1885048f34f4660db069aacb895208f996b0c7784fb" dependencies = [ "proc-macro2", "quote", @@ -1439,9 +1489,9 @@ dependencies = [ [[package]] name = "bevy_material" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "423710403b4a4d8e9ee872c6ac8108787f2396422b582d15a660a40731ddfbf0" +checksum = "3efcdb3ba04a57f6e05548884745684a2051e9692398915f57c5c276306b7f10" dependencies = [ "bevy_asset", "bevy_derive", @@ -1462,9 +1512,9 @@ dependencies = [ [[package]] name = "bevy_material_macros" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6928e167592472f6ee900f80de199cc2dafd31d4f082a86e8d594b81b973e3d" +checksum = "854f95c8f3374ef6242790de50b5cb8f5a601c698772d1447bf856067b53ee64" dependencies = [ "bevy_macro_utils", "quote", @@ -1473,9 +1523,9 @@ dependencies = [ [[package]] name = "bevy_math" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c280440d2a5bc07ea393b5346b5712eec73ea30f0133097b8b13dade385beb" +checksum = "98ead494dcfaa9b4594eed7f09a27d868b7cc7fc9ebd655c5643322778f4a8a2" dependencies = [ "approx", "arrayvec", @@ -1493,9 +1543,9 @@ dependencies = [ [[package]] name = "bevy_mesh" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59863e6f37ef0ba1f37021bce9dd940f9dc31d15e03f548cda5fd3e674f409e" +checksum = "e2adbf8e5a5817c345986756eb0377e18a510e1d7685ef62d6c7bafcd3bab85e" dependencies = [ "bevy_app", "bevy_asset", @@ -1527,9 +1577,9 @@ checksum = "bff34eb29ff4b8a8688bc7299f14fb6b597461ca80fec03ed7d22939ab33e48f" [[package]] name = "bevy_pbr" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38ebc777de2d7f45888c68e8e04949bfb8a40aee62f700283fc340f525e67f52" +checksum = "244ae7d618b51a59c913c36b0564a295cd85ea91a5e777b542bb7bdb846a23d6" dependencies = [ "arrayvec", "bevy_app", @@ -1570,9 +1620,9 @@ dependencies = [ [[package]] name = "bevy_picking" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93468ac5937f76be3af763d496f01e899edf6d9c1a1d39a87ae4ce8eba36f78b" +checksum = "235d1ea0cd7d0ff2f37592f37b4d8504c597884296058ecadcb0d206d0258ab7" dependencies = [ "bevy_app", "bevy_asset", @@ -1594,9 +1644,9 @@ dependencies = [ [[package]] name = "bevy_platform" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3120670bb2308980f723477c9d82476fcda31f08be9b256c3f0acdee82a65094" +checksum = "fd610a417e7b4a3b9602cf11264d16cbbff8eabe689c5fed8be4e84c6a2680a3" dependencies = [ "critical-section", "foldhash 0.2.0", @@ -1616,9 +1666,9 @@ dependencies = [ [[package]] name = "bevy_post_process" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57379b51aa0f1b2066c956263e1f12686d22cf8939cf9644eebf2ee42d3dd460" +checksum = "8eb9340107f7a4292b3b1d138cffb2700f31cef580f5777f2e83f4f00eae4dc1" dependencies = [ "bevy_app", "bevy_asset", @@ -1641,15 +1691,15 @@ dependencies = [ [[package]] name = "bevy_ptr" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b511e89f7078fd21fdea77061a0ca3e737297c7011bb10c073e0aecb17c9fea6" +checksum = "1974de4b140f102fded747229ff4a61921acec07f02f0d1dcdadfe9ce177d0ff" [[package]] name = "bevy_reflect" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92abd59cbba1524c1847e9a50f74d94e6b7836c80a8edfa9c47e59f7fd81021d" +checksum = "9b76c3d056da3e299b84652ccf914c487b786857225d8ffbc8fc9509441a9e6b" dependencies = [ "assert_type_match", "bevy_platform", @@ -1676,9 +1726,9 @@ dependencies = [ [[package]] name = "bevy_reflect_derive" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fa4e6b97fd2d582dd5ed96762a70d04505a477c833cf4f69d016dcd03d2d04" +checksum = "5fc5f820ee52afeca6d3bb83f15c1bf61ea6196c840a761a21a8bc266a3b166e" dependencies = [ "bevy_macro_utils", "indexmap", @@ -1690,9 +1740,9 @@ dependencies = [ [[package]] name = "bevy_render" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89b2cc850a4c3fd12a6a088a4fc3e80118b2e1b569da8936f6d4d99ca1b6ee7" +checksum = "fc86a32b2eef9859e1e7d323c6d1a9150fe77aa17c30fd05abebc12f645929dc" dependencies = [ "async-channel", "bevy_app", @@ -1744,9 +1794,9 @@ dependencies = [ [[package]] name = "bevy_render_macros" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0eb5cffe5253a6ab4e4b84b2e40a6a2f4673deb16fd63ab9dfc4a015449873a" +checksum = "6be6eba0ce9770ae4576693804d6c605f8afd9c4769787414254efcf92196a90" dependencies = [ "bevy_macro_utils", "proc-macro2", @@ -1756,9 +1806,9 @@ dependencies = [ [[package]] name = "bevy_scene" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a3c891148c40e1352fc41001c0e1894ba63fc4e2d3aca33447343c4122b782" +checksum = "33f6f4f24cd771c6fd67286a8f264a45a644dc798a36614252db220d4fbbd63b" dependencies = [ "bevy_app", "bevy_asset", @@ -1777,9 +1827,9 @@ dependencies = [ [[package]] name = "bevy_scene_macros" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4bc33a36a4e9e344985a96cd8b4abc816cf2c5d2fa002d72fd7bcd11396589c" +checksum = "4fc7844c3410e228581200f73be123467c424f62fc40499c3e869b641b582748" dependencies = [ "bevy_ecs_macro_logic", "bevy_macro_utils", @@ -1790,9 +1840,9 @@ dependencies = [ [[package]] name = "bevy_shader" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0ac51378bb6a021165ee334f846b515cd06082e24ce962adce58ad7df1c39a" +checksum = "50ba4fa5c5102a9ad1b0508c5bf8a6d02a22d5dc13c23ba908ee6d3d16a357cd" dependencies = [ "bevy_asset", "bevy_platform", @@ -1809,9 +1859,9 @@ dependencies = [ [[package]] name = "bevy_sprite" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c679b88cc655881d403929bcdf02d30f688fd8916eb1635e6e7f8585d8ae6894" +checksum = "e93e631436ff9c08613843d46521ee60f2fcb2eb5f4754eec59591ca817a2ba0" dependencies = [ "bevy_app", "bevy_asset", @@ -1835,9 +1885,9 @@ dependencies = [ [[package]] name = "bevy_sprite_render" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a65ca9a286dd5815ca4d2d41d4f83bdbb22c8a639d10b4c33eac114b369c36" +checksum = "0c0a13c775880fe8fb3e7928921b2a1b549fd92c17571e7ca5e1250e53f0e56c" dependencies = [ "bevy_app", "bevy_asset", @@ -1868,9 +1918,9 @@ dependencies = [ [[package]] name = "bevy_state" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c22e694ea52e42994aea6ed2d0b378fa1e9d5a9b615db88626e33508bc03f35" +checksum = "f69ce6a0066eb4626165e2f8c85d3cf4808cfe4cb2027df8840d5cbfe8a3428d" dependencies = [ "bevy_app", "bevy_ecs", @@ -1884,9 +1934,9 @@ dependencies = [ [[package]] name = "bevy_state_macros" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835f45091fa0df1ff3cb10f4ca5a397d4e9249b550f1be6893b08a2a06d6eed7" +checksum = "a36dd49049023a0abbd0bd1e2b99580ed83a18c5351c64caba4c06e3b584cf9c" dependencies = [ "bevy_macro_utils", "quote", @@ -1895,9 +1945,9 @@ dependencies = [ [[package]] name = "bevy_tasks" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa34e6b9b804851ec08a41c0346c859d82e2fa98c906d74b965ee61bbbb688e4" +checksum = "1f787d4ba7237b64b30bd2d690a8cbae1ba775e0eec326711c446654cb720e7c" dependencies = [ "async-channel", "async-executor", @@ -1914,9 +1964,9 @@ dependencies = [ [[package]] name = "bevy_text" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38e1d7eb8b10229f424b4fc56c864a26c32ac02b8cd184e2cc25eceea7b5e892" +checksum = "c0b275f50fb01b1e2d411326a7750ecc2fe629c48b89997cf2a3c93fe786e076" dependencies = [ "bevy_app", "bevy_asset", @@ -1943,9 +1993,9 @@ dependencies = [ [[package]] name = "bevy_time" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c21e3be2aa4426ea1e0a7036d3d1dbbded84c319459d9f3e2a616b33563372f2" +checksum = "f6896d83d7ed32a2f89da127b7aeddf01eb702e603897cf5ddac231480a1870e" dependencies = [ "bevy_app", "bevy_ecs", @@ -1958,9 +2008,9 @@ dependencies = [ [[package]] name = "bevy_transform" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c95fefe69c9223d10e6b52a0fdf12811bab9d0c7dcb27570cb86824b451f180d" +checksum = "d94cc6065320ebeb58ae88a0863a4c4c2a642c6db698e283eb50be01a834ca5a" dependencies = [ "bevy_app", "bevy_ecs", @@ -1984,9 +2034,9 @@ dependencies = [ [[package]] name = "bevy_ui" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5519c799ecf14e2eeece8b9b823250a00c9df14523e2638b647fccfe4ff0d20" +checksum = "8a2f97c39dadfef97dbe295fc1ce212825bb9fda2becc8f558d1d7e7d7dbbedf" dependencies = [ "accesskit", "bevy_a11y", @@ -2022,9 +2072,9 @@ dependencies = [ [[package]] name = "bevy_ui_render" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f1d3921936d88bd2638dd4d87bff8fc3b9908a046a50658548045102249f93e" +checksum = "30a36be1c251417421ee070ecd1a393f0036631f7495564a8c9d4abb6042dc40" dependencies = [ "bevy_app", "bevy_asset", @@ -2055,9 +2105,9 @@ dependencies = [ [[package]] name = "bevy_ui_widgets" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fc616ccc51b36dea5cb1de91ed82569b41649923388e5ba82cb7d2f1ef18d8" +checksum = "a71063099a056a010bdbbcc1f1daf2d50bff517d69d62e5334d4c32d7bf9e9e0" dependencies = [ "accesskit", "bevy_a11y", @@ -2079,9 +2129,9 @@ dependencies = [ [[package]] name = "bevy_utils" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3aceea6c7ffdd568f866d5ca4dfe50c33440c54f7bc230c13a9ba7ab0c91aed1" +checksum = "de51fa7ea2e95d4c2d1278c5629285d59eec951cc60c992964c03f30910ef5a1" dependencies = [ "async-channel", "bevy_platform", @@ -2092,9 +2142,9 @@ dependencies = [ [[package]] name = "bevy_window" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efcc255b43db156fba393b2ff8fa552aac5e7e02ae4c6298eacdbab655ddf988" +checksum = "38373ee93a9248c14afe41d2025f4aa5e68b004b06ae7702816b180e72b39ea3" dependencies = [ "bevy_app", "bevy_asset", @@ -2111,9 +2161,9 @@ dependencies = [ [[package]] name = "bevy_winit" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308c9eb04f74f340593b3def6a7c1778fd42581d779c6db836d690c7d471f94c" +checksum = "c1e9c615f4194b1e00ba536892a3d3d3300c2a1f8e66112fdebd7077bf2744c9" dependencies = [ "accesskit", "accesskit_winit", @@ -2144,9 +2194,9 @@ dependencies = [ [[package]] name = "bevy_world_serialization" -version = "0.19.0" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de58ae74410d4f940e3f00484f58603b4f1a53a7d84ebe3fca258d2a3aa96620" +checksum = "36855264b9b5d229bde74f01730eb6251c72dc052404ae144a9295cc0abdefc1" dependencies = [ "bevy_app", "bevy_asset", @@ -2164,6 +2214,17 @@ dependencies = [ "uuid", ] +[[package]] +name = "bevygraph" +version = "0.1.0" +source = "git+https://github.com/tbillington/bevy_debug_view#0d520f5f4e8693166408f082e8d25dd377dabc3e" +dependencies = [ + "bevy", + "bevy_egui 0.42.0", + "indexmap", + "log", +] + [[package]] name = "bincode" version = "1.3.3" @@ -2980,7 +3041,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a05fbfa222ffb51989d5ccf33e5f7aebfcf96c5023413856b0c3618a7f79896e" dependencies = [ "bytemuck", - "emath", + "emath 0.34.3", +] + +[[package]] +name = "ecolor" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0656a7530b9e2841ee7a5f983965bdd9840c32f4012f759cfd44b912cced6b34" +dependencies = [ + "bytemuck", + "emath 0.36.2", ] [[package]] @@ -2992,8 +3063,8 @@ dependencies = [ "accesskit", "ahash", "bitflags 2.13.1", - "emath", - "epaint", + "emath 0.34.3", + "epaint 0.34.3", "log", "nohash-hasher", "profiling", @@ -3001,6 +3072,26 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "egui" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc938cc27cd911415e1e4d151bc56ff9df063d8db081374e87aeb805ea74b2ba" +dependencies = [ + "accesskit", + "ahash", + "bitflags 2.13.1", + "emath 0.36.2", + "epaint 0.36.2", + "itertools 0.15.0", + "log", + "nohash-hasher", + "profiling", + "smallvec", + "unicode-segmentation", + "web-sys", +] + [[package]] name = "either" version = "1.17.0" @@ -3016,6 +3107,15 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "emath" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52c8d4141cf0f60fb2f7aefaf352d3ffa5171ef0ab09731c64391801e95e48f1" +dependencies = [ + "bytemuck", +] + [[package]] name = "ena" version = "0.14.4" @@ -3081,9 +3181,9 @@ checksum = "6675898a291ec212fc3df04f537d177fce8496120244590e6359dcaa4c25da79" dependencies = [ "ahash", "bytemuck", - "ecolor", - "emath", - "epaint_default_fonts", + "ecolor 0.34.3", + "emath 0.34.3", + "epaint_default_fonts 0.34.3", "font-types 0.11.3", "log", "nohash-hasher", @@ -3092,7 +3192,32 @@ dependencies = [ "self_cell", "skrifa 0.40.0", "smallvec", - "vello_cpu", + "vello_cpu 0.0.6", +] + +[[package]] +name = "epaint" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0ec0308dc23130fc1a7d4623a8534c2ed069c6dc84e258ee4f3de99615aa1a3" +dependencies = [ + "ahash", + "bytemuck", + "ecolor 0.36.2", + "emath 0.36.2", + "epaint_default_fonts 0.36.2", + "font-types 0.12.2", + "harfrust 0.12.0", + "log", + "nohash-hasher", + "parking_lot", + "profiling", + "self_cell", + "skrifa 0.44.0", + "smallvec", + "unicode-general-category", + "unicode-segmentation", + "vello_cpu 0.1.0", ] [[package]] @@ -3101,6 +3226,12 @@ version = "0.34.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8970033a4282a7bcf899b38b5ed3a58b732fe093d03785d58648515d8d309da" +[[package]] +name = "epaint_default_fonts" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773fa9c96dd0dbef887e39d0ed6177f141cce4d68e6041df77570aa3702dfa13" + [[package]] name = "equivalent" version = "1.0.2" @@ -3193,6 +3324,12 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "fearless_simd" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97b65636e5b9ef369943878ac74335ba1c55c1cb6adbf1e2c293c624248d693" + [[package]] name = "file-id" version = "0.2.3" @@ -3578,6 +3715,22 @@ dependencies = [ "simba", ] +[[package]] +name = "glifo" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed4a1bb24121291d27230c1b1b44e07d6a9b28cefdb32fe1581dfb84e14f940a" +dependencies = [ + "bytemuck", + "foldhash 0.2.0", + "hashbrown 0.17.1", + "log", + "peniko", + "skrifa 0.44.0", + "smallvec", + "vello_common 0.1.0", +] + [[package]] name = "glow" version = "0.17.0" @@ -3688,6 +3841,15 @@ dependencies = [ "svg_fmt", ] +[[package]] +name = "guillotiere" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b17e70c989c36bad147b27a58d148c0741c51448aa5653436547323e524d0ab" +dependencies = [ + "euclid", +] + [[package]] name = "half" version = "2.7.1" @@ -3714,6 +3876,18 @@ dependencies = [ "smallvec", ] +[[package]] +name = "harfrust" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c03d949a14aa089bbb282f7dd76a498a7f684428e4257202efc119ec010376f9" +dependencies = [ + "bitflags 2.13.1", + "bytemuck", + "read-fonts 0.41.0", + "smallvec", +] + [[package]] name = "hash32" version = "0.3.1" @@ -4529,6 +4703,15 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + [[package]] name = "nonmax" version = "0.5.5" @@ -5126,6 +5309,16 @@ dependencies = [ "num-traits", ] +[[package]] +name = "os_pipe" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + [[package]] name = "owned_ttf_parser" version = "0.25.1" @@ -5177,7 +5370,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fad031076f48f0d4d85ce1aea9b94b4e715a4d636a030a123038f8f5b5e4343" dependencies = [ "fontique", - "harfrust", + "harfrust 0.6.2", "hashbrown 0.17.1", "icu_normalizer", "icu_properties", @@ -6079,8 +6272,9 @@ dependencies = [ "bevy", "bevy-inspector-egui", "bevy_asset_loader", - "bevy_egui", + "bevy_egui 0.40.1", "bevy_ggrs", + "bevygraph", "bincode", "blake3", "clap", @@ -6756,6 +6950,17 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "tree_magic_mini" +version = "3.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8765b90061cba6c22b5831f675da109ae5561588290f9fa2317adab2714d5a6" +dependencies = [ + "memchr", + "nom", + "petgraph", +] + [[package]] name = "ttf-parser" version = "0.25.1" @@ -6786,6 +6991,12 @@ version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "214ca0b2191785cbc06209b9ca1861e048e39b5ba33574b3cedd58363d5bb5f6" +[[package]] +name = "unicode-general-category" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b993bddc193ae5bd0d623b49ec06ac3e9312875fdae725a975c51db1cc1677f" + [[package]] name = "unicode-ident" version = "1.0.24" @@ -6894,7 +7105,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bd1a4c633ce09e7d713df1a6e036644a125e15e0c169cfb5180ddf5836ca04b" dependencies = [ "bytemuck", - "fearless_simd", + "fearless_simd 0.3.0", "hashbrown 0.16.1", "log", "peniko", @@ -6902,6 +7113,21 @@ dependencies = [ "smallvec", ] +[[package]] +name = "vello_common" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e9aed918117e8152c9eddfd8362d73c465c23f26c44786aa331707b8a64fa2" +dependencies = [ + "bytemuck", + "fearless_simd 0.4.1", + "guillotiere 0.7.0", + "log", + "peniko", + "smallvec", + "thiserror 2.0.19", +] + [[package]] name = "vello_cpu" version = "0.0.6" @@ -6910,7 +7136,19 @@ checksum = "0162bfe48aabf6a9fdcd401b628c7d9f260c2cbabb343c70a65feba6f7849edc" dependencies = [ "bytemuck", "hashbrown 0.16.1", - "vello_common", + "vello_common 0.0.6", +] + +[[package]] +name = "vello_cpu" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac7349e1f55f6b801c7c277958df4ea53e7f20f21e8014910ad888b2ecda93ea" +dependencies = [ + "bytemuck", + "glifo", + "hashbrown 0.17.1", + "vello_common 0.1.0", ] [[package]] @@ -7819,6 +8057,24 @@ version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" +[[package]] +name = "wl-clipboard-rs" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d7888ccd4896447b2d14d3a9350a85df2aeb6f181e2e7a31349d104ac46cac1" +dependencies = [ + "libc", + "log", + "os_pipe", + "rustix 1.1.4", + "thiserror 2.0.19", + "tree_magic_mini", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-wlr", +] + [[package]] name = "writeable" version = "0.6.3" diff --git a/Cargo.toml b/Cargo.toml index 78e1f28..cd225ee 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,7 +13,7 @@ debug_features = ["bevy/free_camera"] gamecube-adapter = ["dep:gc-adapter-neo"] [dependencies] -bevy = { version = "0.19", features = ["asset_processor", "basis-universal", "compressed_image_saver", "bevy_settings"] } +bevy = { version = "0.19.1", features = ["asset_processor", "basis-universal", "compressed_image_saver", "bevy_settings"] } # Loads the scenes you author in the editor (assets/*.bsn) and builds # physics colliders from them. An ordinary dependency; remove it if you # stop using authored scenes. @@ -24,6 +24,7 @@ arrayvec = "0.7.8" bevy-inspector-egui = "0.37.0" bevy_egui = "0.40.0" bevy_ggrs = { git = "https://github.com/gschup/bevy_ggrs" } +bevygraph = { git = "https://github.com/tbillington/bevy_debug_view" } serde = "1.0.229" serde_json = "1.0.145" bincode = "1.3.3" diff --git a/README.md b/README.md index 99c36e8..a0d69ee 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,19 @@ cargo run -- --debug-match --players 2 --local-port 7001 \ --net-player 0=127.0.0.1:7000 --net-player 1=local ``` +## Hitbox viewer + +Run the live attack-script previewer with a fighter manifest and attack: + +```sh +cargo run --bin hitbox-editor -- \ + --manifest fighters/test/test.fighter.ron --attack jab +``` + +The timeline is read-only and refreshes through Bevy's asset hot reloading. +Press Space to pause or resume, use the arrow keys to step, or click and drag +the timeline to scrub. + ## Production Build ```sh diff --git a/src/bin/hitbox-editor.rs b/src/bin/hitbox-editor.rs new file mode 100644 index 0000000..23aa194 --- /dev/null +++ b/src/bin/hitbox-editor.rs @@ -0,0 +1,37 @@ +use bevy::{ + asset::{AssetMode, AssetPlugin}, + gltf::GltfPlugin, + image::{ImageAddressMode, ImagePlugin, ImageSamplerDescriptor}, + prelude::*, +}; +use bevy_egui::EguiPlugin; +use clap::Parser; +use shinespark::hitbox_viewer::{HitboxViewerArgs, HitboxViewerPlugin}; + +fn main() -> AppExit { + let args = HitboxViewerArgs::parse(); + let default_sampler = ImageSamplerDescriptor::linear() + .set_address_mode(ImageAddressMode::Repeat) + .set_anisotropic_filter(16) + .clone(); + let default_plugins = DefaultPlugins + .set(ImagePlugin { + default_sampler: default_sampler.clone(), + }) + .set(GltfPlugin { + default_sampler, + ..default() + }) + .set(AssetPlugin { + mode: AssetMode::Processed, + use_asset_processor_override: Some(cfg!(feature = "development")), + ..default() + }); + + App::new() + .add_plugins(default_plugins) + .add_plugins(EguiPlugin::default()) + .insert_resource(args) + .add_plugins(HitboxViewerPlugin) + .run() +} diff --git a/src/fighter/animation.rs b/src/fighter/animation.rs index 667391f..98dbb7c 100644 --- a/src/fighter/animation.rs +++ b/src/fighter/animation.rs @@ -99,4 +99,5 @@ pub enum AnimKind { AttackForwardTilt, AttackDownTilt, AttackNeutralAir, + AttackForwardAir, } diff --git a/src/fighter/attack/mod.rs b/src/fighter/attack/mod.rs index 77dc69a..0bcc754 100644 --- a/src/fighter/attack/mod.rs +++ b/src/fighter/attack/mod.rs @@ -200,7 +200,7 @@ impl AttackKind { AttackKind::NeutralAir => AnimKind::AttackNeutralAir, AttackKind::Jab => AnimKind::AttackJab1, AttackKind::UpTilt => AnimKind::AttackUpTilt, - AttackKind::ForwardAir => AnimKind::AttackUpTilt, + AttackKind::ForwardAir => AnimKind::AttackForwardAir, AttackKind::BackAir => AnimKind::AttackUpTilt, AttackKind::DownAir => AnimKind::AttackUpTilt, AttackKind::UpAir => AnimKind::AttackUpTilt, diff --git a/src/fighter/baked_animation/asset_baking.rs b/src/fighter/baked_animation/asset_baking.rs index 37fe861..6a639c6 100644 --- a/src/fighter/baked_animation/asset_baking.rs +++ b/src/fighter/baked_animation/asset_baking.rs @@ -154,6 +154,7 @@ type FighterBakeProcessor = LoadTransformAndSave< >; pub struct BakedAnimationPlugin; +pub struct BakedAnimationVisualPlugin; pub struct BakedAnimationAssetProcessingPlugin; @@ -172,17 +173,27 @@ impl Plugin for BakedAnimationAssetProcessingPlugin { impl Plugin for BakedAnimationPlugin { fn build(&self, app: &mut App) { - app.add_plugins(BakedAnimationAssetProcessingPlugin) - .add_systems( - bevy_ggrs::prelude::GgrsSchedule, - super::runtime::update_fighter_bone_matrices - .in_set(crate::schedule::GameplaySet::Animation), - ) - .add_systems( - Update, - super::visual_binding::apply_baked_fighter_visual_pose, - ) - .add_observer(super::visual_binding::bind_fighter_visual_bones); + app.add_plugins(( + BakedAnimationAssetProcessingPlugin, + BakedAnimationVisualPlugin, + )) + .add_systems( + bevy_ggrs::prelude::GgrsSchedule, + super::runtime::update_fighter_bone_matrices + .in_set(super::BakedAnimationSamplingSet) + .in_set(crate::schedule::GameplaySet::Animation), + ); + } +} + +impl Plugin for BakedAnimationVisualPlugin { + fn build(&self, app: &mut App) { + app.add_systems( + Update, + super::visual_binding::apply_baked_fighter_visual_pose + .after(super::BakedAnimationSamplingSet), + ) + .add_observer(super::visual_binding::bind_fighter_visual_bones); } } diff --git a/src/fighter/baked_animation/mod.rs b/src/fighter/baked_animation/mod.rs index 2f87f62..6d5c8b2 100644 --- a/src/fighter/baked_animation/mod.rs +++ b/src/fighter/baked_animation/mod.rs @@ -5,12 +5,17 @@ mod runtime; mod visual_binding; pub use crate::math::fixed_transform::FixedMat4; -pub use asset_baking::{BakedAnimationAssetProcessingPlugin, BakedAnimationPlugin}; +pub use asset_baking::{ + BakedAnimationAssetProcessingPlugin, BakedAnimationPlugin, BakedAnimationVisualPlugin, +}; pub use runtime::{ BakedAnimationClip, BakedFighterAnimations, FighterBoneIndexMap, FighterBoneMatrices, resample_fighter_bone_matrices, update_fighter_bone_matrices, }; +#[derive(bevy::prelude::SystemSet, Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct BakedAnimationSamplingSet; + pub const BAKED_ANIMATION_FPS: u32 = 60; #[cfg(test)] diff --git a/src/fighter/baked_animation/runtime.rs b/src/fighter/baked_animation/runtime.rs index fe05f0b..9429515 100644 --- a/src/fighter/baked_animation/runtime.rs +++ b/src/fighter/baked_animation/runtime.rs @@ -55,6 +55,29 @@ impl BakedFighterAnimations { pub fn frame_count(&self, kind: AnimKind) -> Option { self.clip(kind).map(|clip| clip.frames.len() as u32) } + /// Samples one bone in model space without depending on the runtime's + /// previous-frame buffers. Tooling uses this when the user scrubs between + /// unrelated frames. + pub fn sample_bone_model_transform( + &self, + frame: &FighterAnimationFrame, + bone: &str, + model_scale: FGi32, + ) -> Option { + let local = self.sample_pose(frame)?; + let index = self.bone_names.iter().position(|name| name == bone)?; + let mut model = vec![None; local.len()]; + resolve_model_transform(index, &self.parents, local, &mut model).ok()?; + let scale = FixedMat4 { + cols: [ + [model_scale, FGi32::ZERO, FGi32::ZERO, FGi32::ZERO], + [FGi32::ZERO, model_scale, FGi32::ZERO, FGi32::ZERO], + [FGi32::ZERO, FGi32::ZERO, model_scale, FGi32::ZERO], + [FGi32::ZERO, FGi32::ZERO, FGi32::ZERO, FGi32::ONE], + ], + }; + Some(scale.mul(model[index]?)) + } pub(super) fn clip(&self, kind: AnimKind) -> Option<&BakedAnimationClip> { self.clip_indices .get(&kind) @@ -78,6 +101,26 @@ pub struct FighterBoneMatrices { pub struct FighterBoneIndexMap(pub HashMap); impl FighterBoneMatrices { + /// Samples a baked pose for a preview or other non-gameplay caller. + pub fn sample_baked_pose( + &mut self, + baked: &BakedFighterAnimations, + frame: &FighterAnimationFrame, + model_scale: FGi32, + ) -> bool { + let Some(pose) = baked.sample_pose(frame) else { + return false; + }; + self.set_pose( + frame.kind, + &baked.bone_names, + &baked.parents, + pose, + model_scale, + ); + true + } + #[cfg(test)] pub(super) fn buffer_capacities(&self) -> [usize; 5] { [ diff --git a/src/fighter/baked_animation/visual_binding.rs b/src/fighter/baked_animation/visual_binding.rs index 3aa053a..088177a 100644 --- a/src/fighter/baked_animation/visual_binding.rs +++ b/src/fighter/baked_animation/visual_binding.rs @@ -92,9 +92,12 @@ pub(super) fn bind_fighter_visual_bones( pub(super) fn apply_baked_fighter_visual_pose( mut nodes: Query<(&mut Transform, &BakedFighterBone)>, fighters: Query<&FighterBoneMatrices>, - timing: Res, + timing: Option>, ) { - let overstep_fraction = timing.overstep_fraction(); + let overstep_fraction = timing + .as_deref() + .map(GgrsFrameTiming::overstep_fraction) + .unwrap_or(0.0); for (mut transform, bone) in &mut nodes { let Ok(matrices) = fighters.get(bone.fighter) else { continue; diff --git a/src/hitbox_viewer/mod.rs b/src/hitbox_viewer/mod.rs new file mode 100644 index 0000000..f407d69 --- /dev/null +++ b/src/hitbox_viewer/mod.rs @@ -0,0 +1,694 @@ +//! Standalone, read-only attack-script previewer used by `hitbox-editor`. + +use bevy::{gltf::Gltf, prelude::*, world_serialization::WorldAssetRoot}; +use bevy_egui::{EguiContexts, EguiPrimaryContextPass, egui}; +use clap::{Parser, ValueEnum}; + +use crate::{ + GameAssetPlugin, + fighter::{ + animation::FighterAnimationFrame, + attack::{AttackHitbox, AttackKind}, + baked_animation::{ + BakedAnimationAssetProcessingPlugin, BakedAnimationSamplingSet, + BakedAnimationVisualPlugin, BakedFighterAnimations, FighterBoneIndexMap, + FighterBoneMatrices, FixedMat4, + }, + manifest::{FighterHurtbox, FighterManifest}, + visual::FighterAnimations, + }, + filled_gizmos::{FilledGizmos, FilledGizmosPlugin}, + math::{ + int::{FGi32, FGi32Ext}, + vec3::FGVec3, + }, + scripting::{FighterAttackScript, importer::FighterScriptImportPlugin}, +}; + +#[derive(Clone, Copy, Debug, ValueEnum)] +pub enum ViewerAttack { + NeutralAir, + ForwardAir, + BackAir, + DownAir, + UpAir, + Jab, + UpTilt, + DownTilt, + ForwardTilt, + UpSmash, + DownSmash, + ForwardSmash, +} + +impl From for AttackKind { + fn from(value: ViewerAttack) -> Self { + match value { + ViewerAttack::NeutralAir => Self::NeutralAir, + ViewerAttack::ForwardAir => Self::ForwardAir, + ViewerAttack::BackAir => Self::BackAir, + ViewerAttack::DownAir => Self::DownAir, + ViewerAttack::UpAir => Self::UpAir, + ViewerAttack::Jab => Self::Jab, + ViewerAttack::UpTilt => Self::UpTilt, + ViewerAttack::DownTilt => Self::DownTilt, + ViewerAttack::ForwardTilt => Self::ForwardTilt, + ViewerAttack::UpSmash => Self::UpSmash, + ViewerAttack::DownSmash => Self::DownSmash, + ViewerAttack::ForwardSmash => Self::ForwardSmash, + } + } +} + +#[derive(Parser, Resource, Debug)] +#[command(version, about = "Live preview for Shinespark attack hitboxes")] +pub struct HitboxViewerArgs { + /// Fighter manifest path, relative to the assets directory. + #[arg(long, default_value = "fighters/test/test.fighter.ron")] + pub manifest: String, + /// Attack script and matching animation to preview. + #[arg(long, value_enum, default_value_t = ViewerAttack::Jab)] + pub attack: ViewerAttack, + /// Start with fighter hurtboxes hidden. + #[arg(long)] + pub hide_hurtboxes: bool, +} + +#[derive(Resource)] +struct ViewerAssets { + manifest: Handle, + model: Option>, + baked: Option>, + script: Option>, + fighter: Option, + error: Option, +} + +#[derive(Resource)] +struct ViewerState { + attack: AttackKind, + frame: u32, + playing: bool, + show_hurtboxes: bool, + elapsed: f32, +} + +pub struct HitboxViewerPlugin; + +impl Plugin for HitboxViewerPlugin { + fn build(&self, app: &mut App) { + let args = app.world().resource::(); + let attack = args.attack.into(); + let show_hurtboxes = !args.hide_hurtboxes; + app.add_plugins(( + GameAssetPlugin, + FighterScriptImportPlugin, + BakedAnimationAssetProcessingPlugin, + BakedAnimationVisualPlugin, + FilledGizmosPlugin, + )) + .insert_resource(ViewerState { + attack, + frame: 0, + playing: true, + show_hurtboxes, + elapsed: 0.0, + }) + .add_systems(Startup, setup) + .add_systems( + FixedUpdate, + ( + request_fighter_dependencies, + spawn_preview_fighter, + handle_keyboard, + advance_preview, + sync_preview_frame, + sample_preview_pose.in_set(BakedAnimationSamplingSet), + draw_preview, + ) + .chain(), + ) + .add_systems(EguiPrimaryContextPass, draw_ui); + } +} + +fn setup(mut commands: Commands, asset_server: Res, args: Res) { + commands.insert_resource(ViewerAssets { + manifest: asset_server.load(args.manifest.clone()), + model: None, + baked: None, + script: None, + fighter: None, + error: None, + }); + commands.spawn(( + Name::new("Hitbox viewer camera"), + Camera3d::default(), + Transform::from_xyz(0.0, 9.0, 38.0).looking_at(Vec3::new(0.0, 8.0, 0.0), Vec3::Y), + )); + commands.spawn(( + Name::new("Hitbox viewer light"), + DirectionalLight { + illuminance: 8_000.0, + shadow_maps_enabled: true, + ..default() + }, + Transform::from_rotation(Quat::from_euler(EulerRot::XYZ, -0.7, -0.5, 0.0)), + )); + commands.insert_resource(GlobalAmbientLight { + color: Color::WHITE, + brightness: 250.0, + affects_lightmapped_meshes: true, + }); +} + +fn request_fighter_dependencies( + asset_server: Res, + manifests: Res>, + mut viewer: ResMut, + state: Res, +) { + if viewer.model.is_some() { + return; + } + let Some(manifest) = manifests.get(&viewer.manifest) else { + return; + }; + let Some(script_path) = manifest.attack_scripts.get(&state.attack) else { + viewer.error = Some(format!( + "{:?} has no {:?} attack script", + manifest.id, state.attack + )); + return; + }; + viewer.model = Some(asset_server.load(manifest.model_path.clone())); + viewer.baked = Some(asset_server.load(manifest.baked_animation_path.clone())); + viewer.script = Some(asset_server.load(script_path.clone())); + viewer.error = None; +} + +fn spawn_preview_fighter( + mut commands: Commands, + gltfs: Res>, + baked_assets: Res>, + scripts: Res>, + manifests: Res>, + mut viewer: ResMut, + state: Res, +) { + if viewer.fighter.is_some() { + return; + } + let (Some(model_handle), Some(baked_handle), Some(script_handle)) = + (&viewer.model, &viewer.baked, &viewer.script) + else { + return; + }; + let (Some(gltf), Some(_), Some(_), Some(manifest)) = ( + gltfs.get(model_handle), + baked_assets.get(baked_handle), + scripts.get(script_handle), + manifests.get(&viewer.manifest), + ) else { + return; + }; + let Some(scene) = gltf.scenes.first().cloned() else { + viewer.error = Some("fighter model contains no scene".into()); + return; + }; + let entity = commands + .spawn(( + Name::new("Hitbox preview fighter"), + FighterAnimations { + baked: baked_handle.clone(), + }, + FighterAnimationFrame { + kind: state.attack.get_animation(), + frame: state.frame, + repeat: false, + }, + FighterBoneMatrices::default(), + FighterBoneIndexMap::default(), + WorldAssetRoot(scene), + Transform::from_scale(Vec3::splat(manifest.model_scale.to_num())) + .with_rotation(Quat::from_rotation_y(std::f32::consts::FRAC_PI_2)), + )) + .id(); + viewer.fighter = Some(entity); +} + +fn timeline_end( + state: &ViewerState, + viewer: &ViewerAssets, + scripts: &Assets, + baked_assets: &Assets, +) -> u32 { + let animation_end = viewer + .baked + .as_ref() + .and_then(|handle| baked_assets.get(handle)) + .and_then(|baked| baked.frame_count(state.attack.get_animation())) + .unwrap_or(1); + let hitbox_end = viewer + .script + .as_ref() + .and_then(|handle| scripts.get(handle)) + .and_then(|script| script.hitboxes.iter().map(|hitbox| hitbox.end_frame).max()) + .unwrap_or(1); + animation_end.max(hitbox_end).max(1) +} + +fn handle_keyboard( + keys: Res>, + mut state: ResMut, + viewer: Res, + scripts: Res>, + baked_assets: Res>, +) { + let end = timeline_end(&state, &viewer, &scripts, &baked_assets); + if keys.just_pressed(KeyCode::Space) { + state.playing = !state.playing; + } + if keys.just_pressed(KeyCode::ArrowLeft) { + state.playing = false; + state.frame = state.frame.saturating_sub(1); + } + if keys.just_pressed(KeyCode::ArrowRight) { + state.playing = false; + state.frame = (state.frame + 1).min(end.saturating_sub(1)); + } + if keys.just_pressed(KeyCode::Home) { + state.playing = false; + state.frame = 0; + } +} + +fn advance_preview( + time: Res