diff --git a/Cargo.lock b/Cargo.lock index af413db..2ef83a1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,19 +4,13 @@ version = 4 [[package]] name = "addr2line" -version = "0.21.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - [[package]] name = "adler2" version = "2.0.0" @@ -35,19 +29,19 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ - "getrandom", + "getrandom 0.2.16", "once_cell", "version_check", ] [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", - "getrandom", + "getrandom 0.3.3", "once_cell", "version_check", "zerocopy", @@ -62,6 +56,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "aliasable" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" + [[package]] name = "android-tzdata" version = "0.1.1" @@ -90,9 +90,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.15" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -105,36 +105,37 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.8" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.4" +version = "3.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +checksum = "6680de5231bd6ee4c6191b8a1325daa282b415391ec9d3a37bd34f2060dc73fa" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "once_cell_polyfill", + "windows-sys 0.59.0", ] [[package]] @@ -155,9 +156,9 @@ dependencies = [ [[package]] name = "arrayref" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" @@ -166,10 +167,56 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] -name = "async-broadcast" -version = "0.7.1" +name = "ashpd" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e" +checksum = "6cbdf310d77fd3aaee6ea2093db7011dc2d35d2eb3481e5607f1f8d942ed99df" +dependencies = [ + "enumflags2", + "futures-channel", + "futures-util", + "rand 0.9.1", + "serde", + "serde_repr", + "tokio", + "url", + "zbus", +] + +[[package]] +name = "asteroids" +version = "2.0.0" +source = "git+https://github.com/StardustXR/asteroids.git?branch=dev#767d322b04b08fb5317b7c81cbb7730f1c87e85a" +dependencies = [ + "ashpd", + "bumpalo", + "derive-where", + "derive_setters", + "dioxus-devtools", + "directories 6.0.0", + "futures-util", + "glam 0.30.3", + "inotify", + "lazy_static", + "map-range", + "mint", + "ouroboros", + "ron", + "rustc-hash 2.1.1", + "serde", + "stardust-xr-fusion", + "stardust-xr-molecules", + "tokio", + "tracing", + "tracy-client", + "zbus", +] + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" dependencies = [ "event-listener", "event-listener-strategy", @@ -191,33 +238,23 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.13.1" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +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-io" -version = "2.3.4" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8" +checksum = "1237c0ae75a0f3765f58910ff9cdd0a12eeb39ab2f4c7de23262f337f0aacbb3" dependencies = [ "async-lock", "cfg-if", @@ -226,7 +263,7 @@ dependencies = [ "futures-lite", "parking", "polling", - "rustix", + "rustix 1.0.7", "slab", "tracing", "windows-sys 0.59.0", @@ -245,9 +282,9 @@ dependencies = [ [[package]] name = "async-process" -version = "2.2.4" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a07789659a4d385b79b18b9127fc27e1a59e1e89117c78c5ea3b806f016374" +checksum = "cde3f4e40e6021d7acffc90095cbd6dc54cb593903d1de5832f435eb274b85dc" dependencies = [ "async-channel", "async-io", @@ -258,9 +295,8 @@ dependencies = [ "cfg-if", "event-listener", "futures-lite", - "rustix", + "rustix 1.0.7", "tracing", - "windows-sys 0.59.0", ] [[package]] @@ -271,14 +307,14 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.101", ] [[package]] name = "async-signal" -version = "0.2.10" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +checksum = "d7605a4e50d4b06df3898d5a70bf5fde51ed9059b0434b73105193bc27acce0d" dependencies = [ "async-io", "async-lock", @@ -286,7 +322,7 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix", + "rustix 1.0.7", "signal-hook-registry", "slab", "windows-sys 0.59.0", @@ -300,13 +336,13 @@ checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" [[package]] name = "async-trait" -version = "0.1.82" +version = "0.1.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.101", ] [[package]] @@ -317,23 +353,23 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", - "miniz_oxide 0.7.4", + "miniz_oxide", "object", "rustc-demangle", + "windows-targets 0.52.6", ] [[package]] @@ -362,9 +398,21 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.6.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +dependencies = [ + "serde", +] + +[[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 = "blocking" @@ -381,15 +429,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] name = "bytemuck" -version = "1.18.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" +checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" [[package]] name = "byteorder" @@ -399,15 +447,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.1" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8318a53db07bb3f8dca91a600466bdb3f2eaadeedfdbcf02e1accbad9271ba50" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cc" -version = "1.1.18" +version = "1.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62ac837cdb5cb22e10a256099b4fc502b1dfe560cb282963a974d7abd80e476" +checksum = "16595d3be041c03b09d08d0858631facccee9221e579704070e6e9e4915d3bc7" dependencies = [ "shlex", ] @@ -426,22 +474,22 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" dependencies = [ "android-tzdata", "iana-time-zone", "num-traits", "serde", - "windows-targets 0.52.6", + "windows-link", ] [[package]] name = "clap" -version = "4.5.17" +version = "4.5.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e5a21b8495e732f1b3c364c9949b201ca7bae518c502c80256c96ad79eaf6ac" +checksum = "2c5e4fcf9c21d2e544ca1ee9d8552de13019a42aa7dbf32747fa7aaf1df76e57" dependencies = [ "clap_builder", "clap_derive", @@ -449,9 +497,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.17" +version = "4.5.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cf2dd12af7a047ad9d6da2b6b249759a22a7abc0f474c1dae1777afa4b21a73" +checksum = "fecb53a0e6fcfb055f686001bc2e2592fa527efaf38dbe81a6a9563562e57d41" dependencies = [ "anstream", "anstyle", @@ -461,21 +509,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.13" +version = "4.5.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" +checksum = "14cb31bb0a7d536caef2639baa7fad459e15c3144efefa6dbd1c84562c4739f6" dependencies = [ - "heck", + "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.101", ] [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "cluFlock" @@ -489,9 +537,9 @@ dependencies = [ [[package]] name = "color-eyre" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55146f5e46f237f7423d74111267d4597b59b0dad0ffaf7303bce9945d843ad5" +checksum = "e5920befb47832a6d61ee3a3a846565cfa39b331331e68a3b1d1116630f2f26d" dependencies = [ "backtrace", "color-spantrace", @@ -513,9 +561,9 @@ dependencies = [ [[package]] name = "color-spantrace" -version = "0.2.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd6be1b2a7e382e2b98b43b2adcca6bb0e465af0bdd38123873ae61eb17a72c2" +checksum = "b8b88ea9df13354b55bc7234ebcce36e6ef896aca2e42a15de9e10edce01b427" dependencies = [ "once_cell", "owo-colors", @@ -531,9 +579,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "concurrent-queue" @@ -544,6 +592,26 @@ dependencies = [ "crossbeam-utils", ] +[[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 = "convert_case" version = "0.6.0" @@ -559,6 +627,15 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[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" @@ -570,9 +647,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -589,21 +666,31 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.20" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +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 = "darling" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ "darling_core", "darling_macro", @@ -611,27 +698,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.77", + "syn 2.0.101", ] [[package]] name = "darling_macro" -version = "0.20.10" +version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core", "quote", - "syn 2.0.77", + "syn 2.0.101", ] [[package]] @@ -645,9 +732,15 @@ dependencies = [ "hashbrown 0.14.5", "lock_api", "once_cell", - "parking_lot_core 0.9.10", + "parking_lot_core 0.9.11", ] +[[package]] +name = "data-encoding" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" + [[package]] name = "data-url" version = "0.2.0" @@ -656,14 +749,127 @@ checksum = "8d7439c3735f405729d52c3fbbe4de140eaf938a1fe47d227c27f8254d4302a5" [[package]] name = "deranged" -version = "0.3.11" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" dependencies = [ "powerfmt", "serde", ] +[[package]] +name = "derive-where" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e73f2692d4bd3cac41dca28934a39894200c9fabf49586d77d0e5954af1d7902" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "derive_setters" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c848e86c87e5cc305313041c5677d4d95d60baa71cf95e5f6ea2554bb629ff" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[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 = "dioxus-cli-config" +version = "0.7.0-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fd0ba83fe297b4509423853acb11bf0ef0dffa8c603b0857d8fd07d0da5107c" + +[[package]] +name = "dioxus-core" +version = "0.7.0-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0a6891a06145a8c7e27892f7532efafd3e0e5e0fe3dd156ce87067bb0040aab" +dependencies = [ + "const_format", + "dioxus-core-types", + "futures-channel", + "futures-util", + "generational-box", + "longest-increasing-subsequence", + "rustc-hash 2.1.1", + "rustversion", + "serde", + "slab", + "slotmap", + "subsecond", + "tracing", + "warnings", +] + +[[package]] +name = "dioxus-core-types" +version = "0.7.0-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aaf7456e7733e3fc014f0f860680f5b0b8f4a7a70ae31143f99b1ef74b6c9ba2" + +[[package]] +name = "dioxus-devtools" +version = "0.7.0-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "694419010472aa7a9787cb3a299aecc0a6c08eb5c277e9f51a4520a669b2ba46" +dependencies = [ + "dioxus-cli-config", + "dioxus-core", + "dioxus-devtools-types", + "dioxus-signals", + "serde", + "serde_json", + "subsecond", + "thiserror 2.0.12", + "tracing", + "tungstenite", + "warnings", +] + +[[package]] +name = "dioxus-devtools-types" +version = "0.7.0-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7da8e3e136b6714ce769d4cf3e1c27d29fc0da3818042fad85a21aef2f3268d" +dependencies = [ + "dioxus-core", + "serde", + "subsecond-types", +] + +[[package]] +name = "dioxus-signals" +version = "0.7.0-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87aac5473b2a6a78fa0d386276f42e313df10ef5c297b33bdb2d962404161750" +dependencies = [ + "dioxus-core", + "futures-channel", + "futures-util", + "generational-box", + "parking_lot 0.12.4", + "rustc-hash 2.1.1", + "tracing", + "warnings", +] + [[package]] name = "directories" version = "5.0.1" @@ -673,6 +879,15 @@ dependencies = [ "dirs-sys 0.4.1", ] +[[package]] +name = "directories" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16f5094c54661b38d03bd7e50df373292118db60b585c08a411c6d840017fe7d" +dependencies = [ + "dirs-sys 0.5.0", +] + [[package]] name = "dirs" version = "4.0.0" @@ -698,7 +913,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" dependencies = [ "libc", - "redox_users", + "redox_users 0.4.6", "winapi", ] @@ -710,10 +925,33 @@ checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" dependencies = [ "libc", "option-ext", - "redox_users", + "redox_users 0.4.6", "windows-sys 0.48.0", ] +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users 0.5.0", + "windows-sys 0.59.0", +] + +[[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 = "dlv-list" version = "0.2.3" @@ -731,9 +969,9 @@ checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "endi" @@ -743,9 +981,9 @@ checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" [[package]] name = "enumflags2" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" +checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" dependencies = [ "enumflags2_derive", "serde", @@ -753,36 +991,36 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" +checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.101", ] [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.9" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "event-listener" -version = "5.3.1" +version = "5.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6032be9bd27023a771701cc49f9f053c751055f71efb2e0ae5c15809093675ba" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" dependencies = [ "concurrent-queue", "parking", @@ -791,9 +1029,9 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.2" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ "event-listener", "pin-project-lite", @@ -801,15 +1039,14 @@ dependencies = [ [[package]] name = "exr" -version = "1.72.0" +version = "1.73.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4" +checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" dependencies = [ "bit_field", - "flume", - "half 2.4.1", + "half 2.6.0", "lebe", - "miniz_oxide 0.7.4", + "miniz_oxide", "rayon-core", "smallvec", "zune-inflate", @@ -836,24 +1073,24 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.1.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fdeflate" -version = "0.3.4" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" dependencies = [ "simd-adler32", ] [[package]] name = "flatbuffers" -version = "24.3.25" +version = "24.12.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8add37afff2d4ffa83bc748a70b4b1370984f6980768554182424ef71447c35f" +checksum = "4f1baf0dbf96932ec9a3038d57900329c015b0bfb7b63d904f3bc27e2b02a096" dependencies = [ "bitflags 1.3.2", "rustc_version", @@ -861,12 +1098,12 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.33" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" dependencies = [ "crc32fast", - "miniz_oxide 0.8.0", + "miniz_oxide", ] [[package]] @@ -888,15 +1125,6 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" -[[package]] -name = "flume" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" -dependencies = [ - "spin", -] - [[package]] name = "fnv" version = "1.0.7" @@ -905,9 +1133,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fontconfig-parser" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fcfcd44ca6e90c921fee9fa665d530b21ef1327a4c1a6c5250ea44b776ada7" +checksum = "bbc773e24e02d4ddd8395fd30dc147524273a83e54e0f312d986ea30de5f5646" dependencies = [ "roxmltree 0.20.0", ] @@ -920,10 +1148,19 @@ checksum = "ff20bef7942a72af07104346154a70a70b089c572e454b41bef6eb6cb10e9c06" dependencies = [ "fontconfig-parser", "log", - "memmap2", + "memmap2 0.5.10", "ttf-parser", ] +[[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 = "freedesktop-icons-greedy" version = "0.2.6" @@ -934,7 +1171,7 @@ dependencies = [ "itertools 0.11.0", "once_cell", "rust-ini 0.18.0", - "thiserror", + "thiserror 1.0.69", "walkdir", "xdg", ] @@ -946,7 +1183,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db9c27b72f19a99a895f8ca89e2d26e4ef31013376e56fdafef697627306c3e4" dependencies = [ "nom", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -955,6 +1192,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", +] + [[package]] name = "futures-core" version = "0.3.31" @@ -963,9 +1209,9 @@ checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-io" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" @@ -988,7 +1234,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.101", ] [[package]] @@ -1012,14 +1258,60 @@ dependencies = [ ] [[package]] -name = "getrandom" -version = "0.2.15" +name = "generational-box" +version = "0.7.0-alpha.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "5b653b09dec5836ba2dcbfafcc9cdf4afedec51e89beccb908a588cb8fbb4863" +dependencies = [ + "parking_lot 0.12.4", + "tracing", +] + +[[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", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[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]] @@ -1044,9 +1336,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glam" @@ -1068,18 +1360,9 @@ dependencies = [ [[package]] name = "glam" -version = "0.27.0" +version = "0.30.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e05e7e6723e3455f4818c7b26e855439f7546cf617ef669d1adedb8669e5cb9" -dependencies = [ - "mint", -] - -[[package]] -name = "glam" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf3aa70d918d2b234126ff4f850f628f172542bf0603ded26b8ee36e5e22d5f9" +checksum = "6b46b9ca4690308844c644e7c634d68792467260e051c8543e0c7871662b3ba7" dependencies = [ "mint", ] @@ -1102,9 +1385,9 @@ checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" [[package]] name = "half" -version = "2.4.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" dependencies = [ "cfg-if", "crunchy", @@ -1134,6 +1417,18 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +[[package]] +name = "hashbrown" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + [[package]] name = "heck" version = "0.5.0" @@ -1142,15 +1437,9 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" -version = "0.3.9" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hermit-abi" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" +checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" [[package]] name = "hex" @@ -1162,29 +1451,51 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" name = "hexagon_launcher" version = "0.1.0" dependencies = [ + "asteroids", "clap", "color-eyre", "glam 0.25.0", "manifest-dir-macros", + "mint", "protostar", + "rayon", "serde", + "single", "stardust-xr-fusion", - "stardust-xr-molecules", "tokio", + "tracing", "tracing-subscriber", - "tween", + "tracing-tracy", ] [[package]] -name = "iana-time-zone" -version = "0.1.60" +name = "http" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[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", ] @@ -1198,12 +1509,119 @@ 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 = "image" version = "0.24.9" @@ -1247,15 +1665,37 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.5.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" dependencies = [ "equivalent", - "hashbrown 0.14.5", + "hashbrown 0.15.3", "serde", ] +[[package]] +name = "inotify" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" +dependencies = [ + "bitflags 2.9.1", + "futures-core", + "inotify-sys", + "libc", + "tokio", +] + +[[package]] +name = "inotify-sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" +dependencies = [ + "libc", +] + [[package]] name = "instant" version = "0.1.13" @@ -1265,6 +1705,17 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "io-uring" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +dependencies = [ + "bitflags 2.9.1", + "cfg-if", + "libc", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -1291,9 +1742,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jpeg-decoder" @@ -1306,22 +1757,23 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] [[package]] name = "kdl" -version = "4.6.0" +version = "4.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "062c875482ccb676fd40c804a40e3824d4464c18c364547456d1c8e8e951ae47" +checksum = "e03e2e96c5926fe761088d66c8c2aee3a4352a2573f4eaca50043ad130af9117" dependencies = [ "miette", "nom", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1365,9 +1817,19 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.158" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" + +[[package]] +name = "libloading" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" +dependencies = [ + "cfg-if", + "windows-targets 0.52.6", +] [[package]] name = "libredox" @@ -1375,7 +1837,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.1", "libc", ] @@ -1391,15 +1853,27 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +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 = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ "autocfg", "scopeguard", @@ -1407,9 +1881,28 @@ dependencies = [ [[package]] name = "log" -version = "0.4.22" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "longest-increasing-subsequence" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3bd0dd2cd90571056fdb71f6275fada10131182f84899f4b2a916e565d81d86" + +[[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 = "manifest-dir-macros" @@ -1420,7 +1913,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.101", ] [[package]] @@ -1434,11 +1927,11 @@ dependencies = [ [[package]] name = "matchers" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] [[package]] @@ -1447,6 +1940,15 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "memfd" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64" +dependencies = [ + "rustix 0.38.44", +] + [[package]] name = "memmap2" version = "0.5.10" @@ -1456,6 +1958,15 @@ dependencies = [ "libc", ] +[[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.9.1" @@ -1473,7 +1984,7 @@ checksum = "59bb584eaeeab6bd0226ccf3509a69d7936d148cf3d036ad350abe35e8c6856e" dependencies = [ "miette-derive", "once_cell", - "thiserror", + "thiserror 1.0.69", "unicode-width", ] @@ -1485,7 +1996,7 @@ checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.101", ] [[package]] @@ -1496,21 +2007,12 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.4" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" -dependencies = [ - "adler", - "simd-adler32", -] - -[[package]] -name = "miniz_oxide" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" dependencies = [ "adler2", + "simd-adler32", ] [[package]] @@ -1524,14 +2026,13 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ - "hermit-abi 0.3.9", "libc", - "wasi", - "windows-sys 0.52.0", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.59.0", ] [[package]] @@ -1549,7 +2050,7 @@ version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.1", "cfg-if", "libc", "memoffset", @@ -1557,11 +2058,11 @@ dependencies = [ [[package]] name = "nix" -version = "0.29.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.1", "cfg-if", "cfg_aliases", "libc", @@ -1580,12 +2081,11 @@ dependencies = [ [[package]] name = "nu-ansi-term" -version = "0.46.0" +version = "0.50.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" dependencies = [ - "overload", - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -1626,18 +2126,24 @@ dependencies = [ [[package]] name = "object" -version = "0.32.2" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.19.0" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +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 = "option-ext" @@ -1676,16 +2182,34 @@ dependencies = [ ] [[package]] -name = "overload" -version = "0.1.1" +name = "ouroboros" +version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +checksum = "1e0f050db9c44b97a94723127e6be766ac5c340c48f2c4bb3ffa11713744be59" +dependencies = [ + "aliasable", + "ouroboros_macro", + "static_assertions", +] + +[[package]] +name = "ouroboros_macro" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c7028bdd3d43083f6d8d4d5187680d0d3560d54df4cc9d752005268b41e64d0" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn 2.0.101", +] [[package]] name = "owo-colors" -version = "3.5.0" +version = "4.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" +checksum = "26995317201fa17f3656c36716aed4a7c81743a9634ac4c99c0eeda495db0cec" [[package]] name = "parking" @@ -1706,12 +2230,12 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", - "parking_lot_core 0.9.10", + "parking_lot_core 0.9.11", ] [[package]] @@ -1730,17 +2254,23 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.3", + "redox_syscall 0.5.12", "smallvec", "windows-targets 0.52.6", ] +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + [[package]] name = "pico-args" version = "0.5.0" @@ -1748,10 +2278,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" [[package]] -name = "pin-project-lite" -version = "0.2.14" +name = "pin-project" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +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" @@ -1772,32 +2322,41 @@ dependencies = [ [[package]] name = "png" -version = "0.17.13" +version = "0.17.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" dependencies = [ "bitflags 1.3.2", "crc32fast", "fdeflate", "flate2", - "miniz_oxide 0.7.4", + "miniz_oxide", ] [[package]] name = "polling" -version = "3.7.3" +version = "3.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" +checksum = "b53a684391ad002dd6a596ceb6c74fd004fdce75f4be2e3f615068abbea5fd50" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi 0.4.0", + "hermit-abi", "pin-project-lite", - "rustix", + "rustix 1.0.7", "tracing", "windows-sys 0.59.0", ] +[[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" @@ -1806,9 +2365,9 @@ checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] name = "ppv-lite86" -version = "0.2.20" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ "zerocopy", ] @@ -1825,29 +2384,42 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" dependencies = [ - "toml_edit 0.22.20", + "toml_edit 0.22.26", ] [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] +[[package]] +name = "proc-macro2-diagnostics" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "version_check", + "yansi", +] + [[package]] name = "protostar" version = "0.4.0" dependencies = [ "clap", "color-eyre", - "directories", + "directories 5.0.1", "dirs 5.0.1", "ez-pixmap", "freedesktop-icons-greedy", @@ -1886,13 +2458,19 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.37" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +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 = "rand" version = "0.4.6" @@ -1913,10 +2491,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", + "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" @@ -1927,6 +2515,16 @@ dependencies = [ "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.3.1" @@ -1948,14 +2546,23 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "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 = "rayon" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ "either", "rayon-core", @@ -1963,9 +2570,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -1997,11 +2604,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.3" +version = "0.5.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a908a6e00f1fdd0dfd9c0eb08ce85126f6d8bbda50017e74bc4a4b7d4a926a4" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.1", ] [[package]] @@ -2010,54 +2617,50 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ - "getrandom", + "getrandom 0.2.16", "libredox", - "thiserror", + "thiserror 1.0.69", +] + +[[package]] +name = "redox_users" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror 2.0.12", ] [[package]] name = "regex" -version = "1.10.6" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", + "regex-automata", + "regex-syntax", ] [[package]] name = "regex-automata" -version = "0.1.10" +version = "0.4.9" 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.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.4", + "regex-syntax", ] [[package]] name = "regex-syntax" -version = "0.6.29" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "remove_dir_all" @@ -2096,6 +2699,19 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "ron" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "beceb6f7bf81c73e73aeef6dd1356d9a1b2b4909e1f0fc3e59b034f9572d7b7f" +dependencies = [ + "base64 0.22.1", + "bitflags 2.9.1", + "serde", + "serde_derive", + "unicode-ident", +] + [[package]] name = "rosvgtree" version = "0.1.0" @@ -2158,9 +2774,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.0.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" [[package]] name = "rustc_version" @@ -2173,17 +2789,36 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.37" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.6.0", + "bitflags 2.9.1", "errno", "libc", - "linux-raw-sys", - "windows-sys 0.52.0", + "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 = "rustversion" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" + [[package]] name = "rustybuzz" version = "0.7.0" @@ -2202,9 +2837,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "same-file" @@ -2215,6 +2850,12 @@ dependencies = [ "winapi-util", ] +[[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" @@ -2223,35 +2864,35 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "semver" -version = "1.0.23" +version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" [[package]] name = "serde" -version = "1.0.210" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.101", ] [[package]] name = "serde_json" -version = "1.0.128" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", "memchr", @@ -2261,35 +2902,35 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.101", ] [[package]] name = "serde_spanned" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] [[package]] name = "serde_with" -version = "3.9.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cecfa94848272156ea67b2b1a53f20fc7bc638c4a46d2f8abde08f05f4b857" +checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.5.0", + "indexmap 2.9.0", "serde", "serde_derive", "serde_json", @@ -2299,14 +2940,25 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.9.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8fee4991ef4f274617a51ad4af30519438dacb2f56ac773b08a1922ff743350" +checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.77", + "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]] @@ -2339,9 +2991,9 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.2" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" dependencies = [ "libc", ] @@ -2354,9 +3006,9 @@ checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] name = "simplecss" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a11be7c62927d9427e9f40f3444d5499d868648e2edbc4e2116de69e7ec0e89d" +checksum = "7a9c6883ca9c3c7c90e888de77b7a5c849c779d25d74a1269b0218b14e8b136c" dependencies = [ "log", ] @@ -2365,14 +3017,18 @@ dependencies = [ name = "single" version = "0.1.0" dependencies = [ + "asteroids", "clap", "color-eyre", "glam 0.24.2", "manifest-dir-macros", + "mint", "protostar", + "serde", "stardust-xr-fusion", "stardust-xr-molecules", "tokio", + "tracing", "tracing-subscriber", "tween", ] @@ -2387,17 +3043,20 @@ checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" name = "sirius" version = "0.1.0" dependencies = [ + "asteroids", "clap", "color-eyre", - "glam 0.24.2", + "glam 0.25.0", "manifest-dir-macros", + "mint", "protostar", "serde", + "single", "stardust-xr-fusion", - "stardust-xr-molecules", "tokio", + "tracing", "tracing-subscriber", - "tween", + "tracing-tracy", "walkdir", ] @@ -2411,40 +3070,41 @@ dependencies = [ ] [[package]] -name = "smallvec" -version = "1.13.2" +name = "slotmap" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +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" [[package]] name = "socket2" -version = "0.5.7" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] -name = "spin" -version = "0.9.8" +name = "stable_deref_trait" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] - -[[package]] -name = "split-iter" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f2b15926089e5526bb2dd738a2eb0e59034356e06eb71e1cd912358c0e62c4d" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "stardust-xr" version = "0.45.0" -source = "git+https://github.com/StardustXR/core.git?branch=dev#d2964d8db079afaadb7faa4987e34814e62d6279" +source = "git+https://github.com/StardustXR/core.git?branch=dev#32fd11dc199406e9a38194d937567b9e6b88122e" dependencies = [ "cluFlock", "color-eyre", @@ -2452,12 +3112,11 @@ dependencies = [ "global_counter", "mint", "nix 0.27.1", - "parking_lot 0.12.3", - "rustc-hash 2.0.0", + "rustc-hash 2.1.1", "serde", "shiva-color-rs", "stardust-xr-schemas", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -2465,20 +3124,19 @@ dependencies = [ [[package]] name = "stardust-xr-fusion" version = "0.45.0" -source = "git+https://github.com/StardustXR/core.git?branch=dev#d2964d8db079afaadb7faa4987e34814e62d6279" +source = "git+https://github.com/StardustXR/core.git?branch=dev#32fd11dc199406e9a38194d937567b9e6b88122e" dependencies = [ "color-eyre", "dashmap", - "glam 0.30.1", + "glam 0.30.3", "global_counter", - "parking_lot 0.12.3", + "parking_lot 0.12.4", "rustc-hash 1.1.0", "serde", "serde_repr", - "split-iter", "stardust-xr", "stardust-xr-fusion-codegen", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", "zbus", @@ -2487,23 +3145,21 @@ dependencies = [ [[package]] name = "stardust-xr-fusion-codegen" version = "0.1.0" -source = "git+https://github.com/StardustXR/core.git?branch=dev#d2964d8db079afaadb7faa4987e34814e62d6279" +source = "git+https://github.com/StardustXR/core.git?branch=dev#32fd11dc199406e9a38194d937567b9e6b88122e" dependencies = [ "convert_case", - "mint", "proc-macro2", "quote", - "split-iter", "stardust-xr-schemas", ] [[package]] name = "stardust-xr-molecules" version = "0.45.0" -source = "git+https://github.com/StardustXR/molecules.git?branch=dev#4871307e677cab37a606400b3101a51c335f851f" +source = "git+https://github.com/StardustXR/molecules.git?branch=dev#c5595dcb9e6df4c198a3b36def1ab8acfe78d00d" dependencies = [ "futures-util", - "glam 0.27.0", + "glam 0.30.3", "lazy_static", "lerp", "map-range", @@ -2519,7 +3175,7 @@ dependencies = [ [[package]] name = "stardust-xr-schemas" version = "1.5.3" -source = "git+https://github.com/StardustXR/core.git?branch=dev#d2964d8db079afaadb7faa4987e34814e62d6279" +source = "git+https://github.com/StardustXR/core.git?branch=dev#32fd11dc199406e9a38194d937567b9e6b88122e" dependencies = [ "flatbuffers", "flexbuffers", @@ -2530,7 +3186,7 @@ dependencies = [ "nanoid", "serde", "serde_repr", - "thiserror", + "thiserror 1.0.69", "tokio", "zbus", ] @@ -2556,6 +3212,34 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "subsecond" +version = "0.7.0-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43c5b40acd555d02d9a0b5bf4080dbf2cd085d5e2eb2ae7851cb14b9bf5af15c" +dependencies = [ + "js-sys", + "libc", + "libloading", + "memfd", + "memmap2 0.9.5", + "serde", + "subsecond-types", + "thiserror 2.0.12", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "subsecond-types" +version = "0.7.0-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bedadae58a56e137ac970c38c44bff38cee24400fef64c37d5a188a065b1ec1f" +dependencies = [ + "serde", +] + [[package]] name = "svgfilters" version = "0.4.0" @@ -2599,15 +3283,26 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.77" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[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 = "tempdir" version = "0.3.7" @@ -2620,35 +3315,55 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.12.0" +version = "3.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" dependencies = [ - "cfg-if", "fastrand", + "getrandom 0.3.3", "once_cell", - "rustix", + "rustix 1.0.7", "windows-sys 0.59.0", ] [[package]] name = "thiserror" -version = "1.0.63" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "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.63" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "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]] @@ -2674,9 +3389,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.36" +version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" dependencies = [ "deranged", "itoa", @@ -2689,15 +3404,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" dependencies = [ "num-conv", "time-core", @@ -2729,52 +3444,64 @@ dependencies = [ ] [[package]] -name = "tokio" -version = "1.40.0" +name = "tinystr" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.47.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", - "parking_lot 0.12.3", + "parking_lot 0.12.4", "pin-project-lite", "signal-hook-registry", + "slab", "socket2", "tokio-macros", "tracing", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "tokio-macros" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.101", ] [[package]] name = "toml" -version = "0.8.19" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.20", + "toml_edit 0.22.26", ] [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" dependencies = [ "serde", ] @@ -2785,29 +3512,36 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.9.0", "toml_datetime", "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.22.20" +version = "0.22.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583c44c02ad26b0c3f3066fe629275e50627026c51ac2e595cca4c230ce1ce1d" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.9.0", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.18", + "toml_write", + "winnow 0.7.10", ] [[package]] -name = "tracing" -version = "0.1.40" +name = "toml_write" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "pin-project-lite", "tracing-attributes", @@ -2816,20 +3550,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.101", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", "valuable", @@ -2837,9 +3571,9 @@ dependencies = [ [[package]] name = "tracing-error" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" +checksum = "8b1581020d7a273442f5b45074a6a57d5757ad0a47dac0e9f0bd57b81936f3db" dependencies = [ "tracing", "tracing-subscriber", @@ -2858,14 +3592,14 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.18" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" dependencies = [ "matchers", "nu-ansi-term", "once_cell", - "regex", + "regex-automata", "sharded-slab", "smallvec", "thread_local", @@ -2874,6 +3608,38 @@ dependencies = [ "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 = "tracy-client" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef54005d3d760186fd662dad4b7bb27ecd5531cdef54d1573ebd3f20a9205ed7" +dependencies = [ + "loom", + "once_cell", + "tracy-client-sys", +] + +[[package]] +name = "tracy-client-sys" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f9612d9503675b07b244922ea6f6f3cdd88c43add1b3498084613fc88cdf69d" +dependencies = [ + "cc", + "windows-targets 0.52.6", +] + [[package]] name = "ttf-parser" version = "0.18.1" @@ -2881,10 +3647,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0609f771ad9c6155384897e1df4d948e692667cc0588548b68eb44d052b27633" [[package]] -name = "tween" -version = "2.0.3" +name = "tungstenite" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "782d1e33eba0670d92d03e4da87f7304490493fc983d229dff383934c23f2d16" +checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" +dependencies = [ + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.9.1", + "sha1", + "thiserror 2.0.12", + "utf-8", +] + +[[package]] +name = "tween" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7311599fedb85d1a45d3feb4e27a98e502316b6e2897f0617e05a2a5848f7754" + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "uds_windows" @@ -2899,9 +3688,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.15" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-bidi-mirroring" @@ -2923,21 +3712,21 @@ checksum = "2281c8c1d221438e373249e065ca4989c4c36952c211ff21a0ee91c44a3869e7" [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-script" -version = "0.5.6" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8d71f5726e5f285a935e9fe8edfd53f0491eb6e9a5774097fdabee7cd8c9cd" +checksum = "9fb421b350c9aff471779e262955939f565ec18b86c15364e6bdf0d662ca7c1f" [[package]] name = "unicode-segmentation" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "unicode-vo" @@ -2947,9 +3736,27 @@ checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" [[package]] name = "unicode-width" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[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 = "ustr" @@ -2957,10 +3764,10 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b050b13c1933490b043b8238a75bc7676cb49292f49768c9350eabb284eaeb87" dependencies = [ - "ahash 0.8.11", + "ahash 0.8.12", "byteorder", "lazy_static", - "parking_lot 0.12.3", + "parking_lot 0.12.4", ] [[package]] @@ -2996,6 +3803,18 @@ dependencies = [ "usvg", ] +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -3004,9 +3823,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "valuable" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "version_check" @@ -3024,6 +3843,28 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "warnings" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64f68998838dab65727c9b30465595c6f7c953313559371ca8bf31759b3680ad" +dependencies = [ + "pin-project", + "tracing", + "warnings-macro", +] + +[[package]] +name = "warnings-macro" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59195a1db0e95b920366d949ba5e0d3fc0e70b67c09be15ce5abb790106b0571" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -3031,36 +3872,58 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] -name = "wasm-bindgen" -version = "0.2.93" +name = "wasi" +version = "0.14.2+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +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.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.101", "wasm-bindgen-shared", ] [[package]] -name = "wasm-bindgen-macro" -version = "0.2.93" +name = "wasm-bindgen-futures" +version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +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", @@ -3068,28 +3931,41 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.101", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[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 = "weezl" -version = "0.1.8" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" +checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" [[package]] name = "winapi" @@ -3123,12 +3999,105 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows-core" -version = "0.52.0" +name = "windows" +version = "0.61.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "c5ee8f3d025738cb02bad7868bbb5f8a6327501e870bf51f1b455b0a2454a419" dependencies = [ - "windows-targets 0.52.6", + "windows-collections", + "windows-core", + "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", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core", + "windows-link", + "windows-threading", +] + +[[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.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", + "windows-link", +] + +[[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.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", ] [[package]] @@ -3189,6 +4158,15 @@ dependencies = [ "windows_x86_64_msvc 0.52.6", ] +[[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.48.5" @@ -3290,38 +4268,34 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.18" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" dependencies = [ "memchr", ] [[package]] -name = "winnow" -version = "0.7.4" +name = "wit-bindgen-rt" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "memchr", + "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 = "xdg" version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "213b7324336b53d2414b2db8537e56544d981803139155afa84f76eeebb7a546" -[[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 = "xmlparser" version = "0.13.6" @@ -3329,14 +4303,43 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" [[package]] -name = "zbus" -version = "5.5.0" +name = "yansi" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59c333f648ea1b647bc95dc1d34807c8e25ed7a6feff3394034dc4776054b236" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + +[[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 = "5.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3a7c7cee313d044fca3f48fa782cb750c79e4ca76ba7bc7718cd4024cdf6f68" dependencies = [ "async-broadcast", "async-executor", - "async-fs", "async-io", "async-lock", "async-process", @@ -3349,17 +4352,15 @@ dependencies = [ "futures-core", "futures-lite", "hex", - "nix 0.29.0", + "nix 0.30.1", "ordered-stream", "serde", "serde_repr", - "static_assertions", "tokio", "tracing", "uds_windows", "windows-sys 0.59.0", - "winnow 0.7.4", - "xdg-home", + "winnow 0.7.10", "zbus_macros", "zbus_names", "zvariant", @@ -3367,14 +4368,14 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "5.5.0" +version = "5.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f325ad10eb0d0a3eb060203494c3b7ec3162a01a59db75d2deee100339709fc0" +checksum = "a17e7e5eec1550f747e71a058df81a9a83813ba0f6a95f39c4e218bdc7ba366a" dependencies = [ - "proc-macro-crate 3.2.0", + "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.101", "zbus_names", "zvariant", "zvariant_utils", @@ -3388,29 +4389,82 @@ checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" dependencies = [ "serde", "static_assertions", - "winnow 0.7.4", + "winnow 0.7.10", "zvariant", ] [[package]] name = "zerocopy" -version = "0.7.35" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" dependencies = [ - "byteorder", "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.35" +version = "0.8.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "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 = "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]] @@ -3424,29 +4478,29 @@ dependencies = [ [[package]] name = "zvariant" -version = "5.4.0" +version = "5.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2df9ee044893fcffbdc25de30546edef3e32341466811ca18421e3cd6c5a3ac" +checksum = "9d30786f75e393ee63a21de4f9074d4c038d52c5b1bb4471f955db249f9dffb1" dependencies = [ "endi", "enumflags2", "serde", - "static_assertions", - "winnow 0.7.4", + "url", + "winnow 0.7.10", "zvariant_derive", "zvariant_utils", ] [[package]] name = "zvariant_derive" -version = "5.4.0" +version = "5.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74170caa85b8b84cc4935f2d56a57c7a15ea6185ccdd7eadb57e6edd90f94b2f" +checksum = "75fda702cd42d735ccd48117b1630432219c0e9616bf6cb0f8350844ee4d9580" dependencies = [ - "proc-macro-crate 3.2.0", + "proc-macro-crate 3.3.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.101", "zvariant_utils", ] @@ -3460,6 +4514,6 @@ dependencies = [ "quote", "serde", "static_assertions", - "syn 2.0.77", - "winnow 0.7.4", + "syn 2.0.101", + "winnow 0.7.10", ] diff --git a/Cargo.toml b/Cargo.toml index 1046acb..7f31ce4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,8 +3,8 @@ resolver = "2" members = ["app_grid", "hexagon_launcher", "protostar", "single", "sirius"] [workspace.dependencies] -tokio = { version = "1.32.0", features = ["rt", "tokio-macros", "sync"] } -serde = "1.0.197" +tokio = { version = "1.47.1", features = ["rt", "tokio-macros", "sync"] } +serde = "1.0.219" [workspace.dependencies.stardust-xr-fusion] git = "https://github.com/StardustXR/core.git" @@ -13,3 +13,22 @@ branch = "dev" [workspace.dependencies.stardust-xr-molecules] git = "https://github.com/StardustXR/molecules.git" branch = "dev" + +[workspace.dependencies.asteroids] +git = "https://github.com/StardustXR/asteroids.git" +branch = "dev" + +[profile] + +[profile.dev] +opt-level = 3 + +[profile.wasm-dev] +inherits = "dev" +opt-level = 1 + +[profile.server-dev] +inherits = "dev" + +[profile.android-dev] +inherits = "dev" diff --git a/app_grid/Cargo.toml b/app_grid/Cargo.toml index 6104359..7dfcfec 100644 --- a/app_grid/Cargo.toml +++ b/app_grid/Cargo.toml @@ -4,13 +4,13 @@ version = "0.1.0" edition = "2024" [dependencies] -tokio = { version = "1.32.0", features = ["rt", "tokio-macros", "sync"] } +tokio = { version = "1.47.1", features = ["rt", "tokio-macros", "sync"] } protostar = { path = "../protostar" } -color-eyre = "0.6.2" -clap = "4.4.6" +color-eyre = "0.6.5" +clap = "4.5.46" manifest-dir-macros = "0.1.18" glam = "0.24.2" -tween = "2.0.1" -tracing-subscriber = "0.3.17" +tween = "2.1.0" +tracing-subscriber = "0.3.20" stardust-xr-fusion = { workspace = true } stardust-xr-molecules = { workspace = true } diff --git a/app_grid/src/main.rs b/app_grid/src/main.rs index 9bd2f37..77696f2 100644 --- a/app_grid/src/main.rs +++ b/app_grid/src/main.rs @@ -3,19 +3,19 @@ use glam::{Quat, Vec3}; use manifest_dir_macros::directory_relative_path; use protostar::{ application::Application, - xdg::{get_desktop_files, parse_desktop_file, DesktopFile, Icon, IconType}, + xdg::{DesktopFile, Icon, IconType, get_desktop_files, parse_desktop_file}, }; use stardust_xr_fusion::{ + ClientHandle, client::Client, - core::values::{color::rgba_linear, ResourceID, Vector3}, + core::values::{ResourceID, Vector3, color::rgba_linear}, drawable::{ MaterialParameter, Model, ModelPartAspect, Text, TextBounds, TextFit, TextStyle, XAlign, YAlign, }, fields::{Field, Shape}, root::{ClientState, FrameInfo, RootAspect}, - spatial::{Spatial, SpatialAspect, SpatialRefAspect, Transform}, - ClientHandle, + spatial::{Spatial, SpatialAspect, SpatialRef, SpatialRefAspect, Transform}, }; use stardust_xr_molecules::{FrameSensitive, Grabbable, GrabbableSettings, UIElement}; use std::f32::consts::PI; @@ -103,7 +103,7 @@ impl AppGrid { } } -fn model_from_icon(parent: &Spatial, icon: &Icon) -> Result { +fn model_from_icon(parent: &SpatialRef, icon: &Icon) -> Result { match &icon.icon_type { IconType::Png => { // let t = Transform::from_rotation_scale( @@ -145,7 +145,7 @@ pub struct App { } impl App { pub fn create_from_desktop_file( - parent: &impl SpatialRefAspect, + parent: &SpatialRef, position: impl Into>, desktop_file: DesktopFile, ) -> Result { @@ -163,12 +163,12 @@ impl App { }, )?; grabbable.content_parent().set_spatial_parent(parent)?; - field.set_spatial_parent(grabbable.content_parent())?; + field.set_spatial_parent(&grabbable.content_parent())?; let icon = icon - .map(|i| model_from_icon(grabbable.content_parent(), &i)) + .map(|i| model_from_icon(&grabbable.content_parent(), &i)) .unwrap_or_else(|| { Ok(Model::create( - grabbable.content_parent(), + &grabbable.content_parent(), Transform::from_rotation(Quat::from_rotation_y(PI)), &ResourceID::new_namespaced("protostar", "cartridge"), )?) diff --git a/hexagon_launcher/Cargo.toml b/hexagon_launcher/Cargo.toml index c90b4bb..1b7e781 100644 --- a/hexagon_launcher/Cargo.toml +++ b/hexagon_launcher/Cargo.toml @@ -3,15 +3,28 @@ name = "hexagon_launcher" version = "0.1.0" edition = "2024" +[features] +tracy = ["dep:tracing-tracy", "asteroids/tracy"] + [dependencies] protostar = { path = "../protostar" } color-eyre = "0.6.2" clap = "4.4.6" manifest-dir-macros = "0.1.18" glam = { version = "0.25.0", features = ["mint"] } -tween = "2.0.1" -tracing-subscriber = "0.3.17" +mint = "0.5.9" +tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } +tracing-tracy = { version = "0.11.4", default-features = false, features = [ + "enable", + "flush-on-exit", + "only-localhost", + "sampling", + "ondemand", +], optional = true } tokio = { workspace = true } serde = { workspace = true } stardust-xr-fusion = { workspace = true } -stardust-xr-molecules = { workspace = true } +asteroids = { workspace = true } +tracing = "0.1.41" +single = { path = "../single" } +rayon = "1.11.0" diff --git a/hexagon_launcher/src/app.rs b/hexagon_launcher/src/app.rs deleted file mode 100644 index 933908c..0000000 --- a/hexagon_launcher/src/app.rs +++ /dev/null @@ -1,301 +0,0 @@ -use color_eyre::eyre::Result; -use glam::{EulerRot, Quat, Vec3}; -use protostar::{ - application::Application, - xdg::{DesktopFile, Icon, IconType}, -}; -use stardust_xr_fusion::{ - core::values::{ResourceID, Vector3}, - drawable::{ - MaterialParameter, Model, ModelPartAspect, Text, TextBounds, TextFit, TextStyle, XAlign, - YAlign, - }, - fields::{CylinderShape, Field, Shape}, - node::NodeType, - root::FrameInfo, - spatial::{Spatial, SpatialAspect, SpatialRefAspect, Transform}, -}; -use stardust_xr_molecules::{FrameSensitive as _, Grabbable, GrabbableSettings, UIElement}; -use std::f32::consts::PI; -use tween::{QuartInOut, Tweener}; - -use crate::{State, ACTIVATION_DISTANCE, APP_SIZE, DEFAULT_HEX_COLOR}; - -// Model handling -fn model_from_icon(parent: &Spatial, icon: &Icon) -> Result { - match &icon.icon_type { - IconType::Png => { - let t = Transform::from_rotation_scale( - Quat::from_rotation_x(PI / 2.0) * Quat::from_rotation_y(PI), - [APP_SIZE / 2.0; 3], - ); - - let model = Model::create( - parent, - t, - &ResourceID::new_namespaced("protostar", "hexagon/hexagon"), - )?; - model - .part("Hex")? - .set_material_parameter("color", MaterialParameter::Color(DEFAULT_HEX_COLOR))?; - model.part("Icon")?.set_material_parameter( - "diffuse", - MaterialParameter::Texture(ResourceID::Direct(icon.path.clone())), - )?; - Ok(model) - } - IconType::Gltf => Ok(Model::create( - parent, - Transform::from_scale([0.05; 3]), - &ResourceID::new_direct(icon.path.clone())?, - )?), - _ => panic!("Invalid Icon Type"), - } -} - -pub struct App { - application: Application, - parent: Spatial, - position: Vector3, - grabbable: Grabbable, - _field: Field, - // field_lines: Lines, - icon: Model, - label: Option, - grabbable_shrink: Option>, - grabbable_grow: Option>, - grabbable_move: Option>, -} -impl App { - pub fn create_from_desktop_file( - parent: &Spatial, - position: impl Into>, - desktop_file: DesktopFile, - state: &State, - ) -> Result { - let position = position.into(); - let field = Field::create( - parent, - Transform::identity(), - Shape::Cylinder(CylinderShape { - length: 0.01, - radius: APP_SIZE / 2.0, - }), - )?; - // let circle = circle(32, 0.0, APP_SIZE / 2.0).thickness(0.001); - // let field_lines = Lines::create( - // &field, - // Transform::identity(), - // &[ - // circle - // .clone() - // .transform(Mat4::from_translation([0.0, 0.0, 0.005].into())), - // circle - // .clone() - // .transform(Mat4::from_translation([0.0, 0.0, -0.005].into())), - // ], - // )?; - let application = Application::create(desktop_file)?; - let icon = application.icon(128, false); - let grabbable = Grabbable::create( - parent, - Transform::from_translation(position), - &field, - GrabbableSettings { - max_distance: 0.05, - zoneable: false, - ..Default::default() - }, - )?; - if !state.unfurled { - grabbable.set_enabled(false)?; - } - grabbable.content_parent().set_spatial_parent(parent)?; - field.set_spatial_parent(grabbable.content_parent())?; - let icon = icon - .map(|i| model_from_icon(grabbable.content_parent(), &i)) - .unwrap_or_else(|| { - Ok(Model::create( - grabbable.content_parent(), - Transform::from_rotation_scale( - Quat::from_rotation_x(PI / 2.0) * Quat::from_rotation_y(PI), - [APP_SIZE * 0.5; 3], - ), - &ResourceID::new_namespaced("protostar", "hexagon/hexagon"), - )?) - })?; - if !state.unfurled { - icon.set_enabled(false)?; - } - - let label_style = TextStyle { - character_height: APP_SIZE * 2.0, - bounds: Some(TextBounds { - bounds: [1.0; 2].into(), - fit: TextFit::Wrap, - anchor_align_x: XAlign::Center, - anchor_align_y: YAlign::Center, - }), - - text_align_x: XAlign::Center, - text_align_y: YAlign::Center, - ..Default::default() - }; - let label = application.name().and_then(|name| { - Text::create( - &icon, - Transform::from_translation_rotation( - [0.0, 0.1, -(APP_SIZE * 4.0)], - Quat::from_rotation_x(PI * 0.5), - ), - name, - label_style, - ) - .ok() - }); - if !state.unfurled { - if let Some(label) = label.as_ref() { - label.set_enabled(false)?; - } - } - - Ok(App { - parent: parent.clone(), - position, - grabbable, - _field: field, - // field_lines, - label, - application, - icon, - grabbable_shrink: None, - grabbable_grow: None, - grabbable_move: None, - }) - } - pub fn content_parent(&self) -> &Spatial { - self.grabbable.content_parent() - } - pub fn apply_state(&mut self, state: &State) { - self.grabbable.set_enabled(state.unfurled).unwrap(); - if state.unfurled { - self.icon.set_enabled(true).unwrap(); - if let Some(label) = self.label.as_ref() { - label.set_enabled(true).unwrap() - } - self.grabbable_move = Some(Tweener::quart_in_out(0.0001, 1.0, 0.25)); - } else { - self.grabbable_move = Some(Tweener::quart_in_out(1.0, 0.0001, 0.25)); //TODO make the scale a parameter - } - } - - pub fn frame(&mut self, info: &FrameInfo, state: &State) { - if self.grabbable.handle_events() { - self.grabbable.frame(info); - } - - if let Some(grabbable_move) = &mut self.grabbable_move { - if !grabbable_move.is_finished() { - let scale = grabbable_move.move_by(info.delta.into()); - self.grabbable - .content_parent() - .set_relative_transform( - &self.parent, - Transform::from_translation(Vec3::from(self.position) * scale), - ) - .unwrap(); - } else { - if grabbable_move.final_value() == 0.0001 { - self.icon.set_enabled(false).unwrap(); - if let Some(label) = self.label.as_ref() { - label.set_enabled(false).unwrap() - } - } - self.grabbable_move = None; - } - } - if let Some(grabbable_shrink) = &mut self.grabbable_shrink { - if !grabbable_shrink.is_finished() { - let scale = grabbable_shrink.move_by(info.delta.into()); - self.grabbable - .content_parent() - .set_relative_transform(&self.parent, Transform::from_scale([scale; 3])) - .unwrap(); - } else { - self.grabbable - .content_parent() - .set_spatial_parent(&self.parent) - .unwrap(); - if state.unfurled { - self.grabbable_grow = Some(Tweener::quart_in_out(0.0001, 1.0, 0.25)); - self.grabbable.cancel_angular_velocity(); - self.grabbable.cancel_linear_velocity(); - } - self.grabbable_shrink = None; - self.grabbable - .content_parent() - .set_relative_transform( - &self.parent, - Transform::from_translation(self.position), - ) - .unwrap(); - self.grabbable - .content_parent() - .set_relative_transform(&self.parent, Transform::from_rotation(Quat::default())) - .unwrap(); - self.icon - .set_local_transform(Transform::from_rotation( - Quat::from_rotation_x(PI / 2.0) * Quat::from_rotation_y(PI), - )) - .unwrap(); - } - } else if let Some(grabbable_grow) = &mut self.grabbable_grow { - if !grabbable_grow.is_finished() { - let scale = grabbable_grow.move_by(info.delta.into()); - self.grabbable - .content_parent() - .set_relative_transform(&self.parent, Transform::from_scale([scale; 3])) - .unwrap(); - } else { - self.grabbable - .content_parent() - .set_spatial_parent(&self.parent) - .unwrap(); - self.grabbable_grow = None; - } - } else if self.grabbable.grab_action().actor_stopped() { - self.grabbable_shrink = Some(Tweener::quart_in_out(APP_SIZE * 0.5, 0.0001, 0.25)); - - let application = self.application.clone(); - let space = self.content_parent().clone(); - let parent = self.parent.clone(); - - //TODO: split the executable string for the args - tokio::task::spawn(async move { - let distance_vector = space - .get_transform(&parent) - .await - .unwrap() - .translation - .unwrap(); - let distance = Vec3::from(distance_vector).length_squared(); - - if distance > ACTIVATION_DISTANCE { - let client = space.node().client().unwrap(); - let space_rot = space - .get_transform(client.get_root()) - .await - .unwrap() - .rotation - .unwrap(); - let (_, y_rot, _) = Quat::from(space_rot).to_euler(EulerRot::XYZ); - let _ = space.set_relative_transform( - client.get_root(), - Transform::from_rotation_scale(Quat::from_rotation_y(y_rot), [1.0; 3]), - ); - let _ = application.launch(&space); - } - }); - } - } -} diff --git a/hexagon_launcher/src/hex.rs b/hexagon_launcher/src/hex.rs index b41ace3..71a70c1 100644 --- a/hexagon_launcher/src/hex.rs +++ b/hexagon_launcher/src/hex.rs @@ -1,7 +1,8 @@ +#![allow(dead_code)] + use std::ops::Add; -use crate::{APP_SIZE, PADDING}; -use tween::TweenTime; +use single::{APP_SIZE, PADDING}; #[derive(Clone, Copy, Debug, Default)] pub struct Hex { @@ -26,9 +27,9 @@ impl Hex { } pub fn get_coords(&self) -> [f32; 3] { - let x = 3.0 / 2.0 * (APP_SIZE + PADDING) / 2.0 * (-self.q - self.s).to_f32(); + let x = 3.0 / 2.0 * (APP_SIZE + PADDING) / 2.0 * (-self.q - self.s) as f32; let y = 3.0_f32.sqrt() * (APP_SIZE + PADDING) / 2.0 - * ((-self.q - self.s).to_f32() / 2.0 + self.s.to_f32()); + * ((-self.q - self.s) as f32 / 2.0 + self.s as f32); [x, y, 0.0] } @@ -39,6 +40,42 @@ impl Hex { pub fn scale(self, factor: isize) -> Self { Hex::new(self.q * factor, self.r * factor, self.s * factor) } + + /// outputs a hexagon at an outward spiral at position i, where i=0 is the center. + pub fn spiral(i: usize) -> Self { + if i == 0 { + return HEX_CENTER; + } + + // Find which ring we're in and position within ring + let mut cells_before = 1; // Count center + let mut radius = 1; + + while cells_before + (radius * 6) <= i { + cells_before += radius * 6; + radius += 1; + } + + // Calculate steps needed within current ring + let pos_in_ring = i - cells_before; + + // Start at top of ring (same as original code) + let mut hex = HEX_CENTER + HEX_DIRECTION_VECTORS[4].scale(radius as isize); + + // Walk around sides just like original code + let mut steps_taken = 0; + for side in 0..6 { + for _ in 0..radius { + if steps_taken == pos_in_ring { + return hex; + } + hex = hex.neighbor(side); + steps_taken += 1; + } + } + + hex + } } impl Add for Hex { type Output = Hex; diff --git a/hexagon_launcher/src/main.rs b/hexagon_launcher/src/main.rs index 160fe44..92c5e64 100644 --- a/hexagon_launcher/src/main.rs +++ b/hexagon_launcher/src/main.rs @@ -1,248 +1,150 @@ -pub mod app; -pub mod hex; +mod hex; -use app::App; -use color_eyre::eyre::Result; +use asteroids::{ + ClientState, CustomElement, Element, Migrate, Reify, Transformable, client, + elements::{Button, Grabbable, Model, ModelPart, PointerMode, Spatial}, +}; use glam::Quat; -use hex::{HEX_CENTER, HEX_DIRECTION_VECTORS}; -use manifest_dir_macros::directory_relative_path; -use protostar::xdg::{get_desktop_files, parse_desktop_file, DesktopFile}; +use hex::Hex; +use mint::{Quaternion, Vector3}; +use protostar::xdg::{DesktopFile, get_desktop_files}; +use rayon::iter::{IntoParallelRefIterator, ParallelIterator}; use serde::{Deserialize, Serialize}; +use single::{APP_SIZE, App, BTN_COLOR, BTN_SELECTED_COLOR, MODEL_SCALE}; use stardust_xr_fusion::{ - client::Client, - core::values::{ - color::{color_space::LinearRgb, rgba_linear, Rgba}, - ResourceID, - }, - drawable::{MaterialParameter, Model, ModelPartAspect}, - node::NodeError, - root::{ClientState, FrameInfo, RootAspect, RootEvent}, - spatial::{Spatial, SpatialAspect, Transform}, - ClientHandle, + drawable::MaterialParameter, + fields::{CylinderShape, Shape}, + project_local_resources, + spatial::Transform, }; -use stardust_xr_molecules::{ - button::{Button, ButtonSettings}, - FrameSensitive, Grabbable, GrabbableSettings, PointerMode, UIElement, -}; -use std::{f32::consts::PI, sync::Arc, time::Duration}; - -const APP_SIZE: f32 = 0.06; -const PADDING: f32 = 0.005; -const MODEL_SCALE: f32 = 0.03; -const ACTIVATION_DISTANCE: f32 = 0.05; - -const DEFAULT_HEX_COLOR: Rgba = rgba_linear!(0.211, 0.937, 0.588, 1.0); -const BTN_SELECTED_COLOR: Rgba = rgba_linear!(0.0, 1.0, 0.0, 1.0); -const BTN_COLOR: Rgba = rgba_linear!(1.0, 1.0, 0.0, 1.0); +use std::f32::consts::{FRAC_PI_2, PI}; +use tracing_subscriber::{EnvFilter, Layer, layer::SubscriberExt, util::SubscriberInitExt}; #[tokio::main(flavor = "current_thread")] -async fn main() -> Result<()> { +async fn main() { color_eyre::install().unwrap(); - tracing_subscriber::fmt() - .with_env_filter(tracing_subscriber::EnvFilter::from_default_env()) - .pretty() - .init(); - let owned_client = Client::connect().await?; - let client = owned_client.handle(); - let async_loop = owned_client.async_event_loop(); - client - .get_root() - .set_base_prefixes(&[directory_relative_path!("../res").to_string()]) - .unwrap(); - let mut grid = AppHexGrid::new(&client).await; - let mut owned_client = async_loop.stop().await.unwrap(); - let event_loop = owned_client.sync_event_loop(|handle, _| { - let Some(event) = handle.get_root().recv_root_event() else { - return; - }; - match event { - RootEvent::Ping { response } => response.send(Ok(())), - RootEvent::Frame { info } => { - grid.frame(info); - } - RootEvent::SaveState { response } => { - response.send(grid.save_state()); - } - } + + let registry = tracing_subscriber::registry(); + #[cfg(feature = "tracy")] + let registry = registry.with({ + use tracing_subscriber::Layer; + tracing_tracy::TracyLayer::new(tracing_tracy::DefaultConfig::default()) + .with_filter(tracing::level_filters::LevelFilter::DEBUG) }); + let log_layer = tracing_subscriber::fmt::Layer::new() + .with_thread_names(true) + .with_ansi(true) + .with_line_number(true) + .with_filter(EnvFilter::from_default_env()); + registry.with(log_layer).init(); - tokio::select! { - _ = tokio::signal::ctrl_c() => (), - e = event_loop => e?, - } - Ok(()) + client::run::(&[&project_local_resources!("../res")]).await } -#[derive(Debug, Default, Clone, Serialize, Deserialize)] -pub struct State { - unfurled: bool, -} - -struct AppHexGrid { - movable_root: Spatial, +#[derive(Debug, Serialize, Deserialize)] +pub struct HexagonLauncher { + /// if the hexagon launcher is expanded + open: bool, + pos: Vector3, + rot: Quaternion, + #[serde(skip)] + /// position in the vector is mapped to hex coordinates apps: Vec, - button: CenterButton, - state: State, } -impl AppHexGrid { - async fn new(client: &Arc) -> Self { - let client_state = client.get_root().get_state().await.unwrap(); - let state = client_state.data().unwrap_or_default(); - let movable_root = - Spatial::create(client.get_root(), Transform::identity(), false).unwrap(); +impl Default for HexagonLauncher { + fn default() -> Self { + Self { + open: false, + pos: [0.0; 3].into(), + rot: Quat::IDENTITY.into(), + apps: Vec::new(), + } + } +} +impl Migrate for HexagonLauncher { + type Old = Self; +} - let button = CenterButton::new(client, &client_state).unwrap(); - tokio::time::sleep(Duration::from_millis(10)).await; // give it a bit of time to send the messages properly +impl ClientState for HexagonLauncher { + const APP_ID: &'static str = "org.protostar.hexagon_launcher"; - let mut desktop_files: Vec = get_desktop_files() - .filter_map(|d| parse_desktop_file(d).ok()) + fn initial_state_update(&mut self) { + // Load desktop files + self.apps = get_desktop_files() + .filter_map(|d| DesktopFile::parse(d).ok()) .filter(|d| !d.no_display) + .filter_map(|d| App::new(d).ok()) .collect(); - desktop_files.sort_by_key(|d| d.clone().name.unwrap_or_default()); + self.apps.par_iter().for_each(|app| { + app.load_icon(); + }); - let mut apps = Vec::new(); - let mut radius = 1; - while !desktop_files.is_empty() { - let mut hex = HEX_CENTER + HEX_DIRECTION_VECTORS[4].scale(radius); - for i in 0..6 { - if desktop_files.is_empty() { - break; - }; - for _ in 0..radius { - if desktop_files.is_empty() { - break; - }; - apps.push( - App::create_from_desktop_file( - button.grabbable.content_parent(), - hex.get_coords(), - desktop_files.pop().unwrap(), - &state, - ) - .unwrap(), - ); - hex = hex.neighbor(i); - } - } - radius += 1; - } - AppHexGrid { - movable_root, - apps, - button, - state, - } + // Sort by name + self.apps + .sort_by_key(|app| app.app.name().unwrap_or_default().to_string()); } } -impl AppHexGrid { - fn frame(&mut self, info: FrameInfo) { - self.button.frame(&info); - if self.button.button.pressed() { - self.button - .model - .part("Hex") - .unwrap() - .set_material_parameter("color", MaterialParameter::Color(BTN_SELECTED_COLOR)) - .unwrap(); - self.state.unfurled = !self.state.unfurled; - for app in &mut self.apps { - app.apply_state(&self.state); - } - } else if self.button.button.released() { - self.button - .model - .part("Hex") - .unwrap() - .set_material_parameter("color", MaterialParameter::Color(BTN_COLOR)) - .unwrap(); - } - for app in &mut self.apps { - app.frame(&info, &self.state); - } - } - - fn save_state(&mut self) -> Result { - self.movable_root - .set_relative_transform( - self.button.grabbable.content_parent(), - Transform::from_translation([0.0; 3]), - ) - .unwrap(); - ClientState::new( - Some(self.state.clone()), - &self.movable_root, - [( - "content_parent".to_string(), - self.button.grabbable.content_parent(), - )] - .into_iter() - .collect(), +impl Reify for HexagonLauncher { + #[tracing::instrument(skip_all)] + fn reify(&self) -> impl Element { + // Build UI based on current state + Grabbable::new( + Shape::Cylinder(CylinderShape { + radius: APP_SIZE / 2.0, + length: 0.01, + }), + self.pos, + self.rot, + |state: &mut Self, pos, rot| { + state.pos = pos; + state.rot = rot; + }, + ) + .field_transform(Transform::from_rotation(Quat::from_rotation_x(FRAC_PI_2))) + .pointer_mode(PointerMode::Align) + .zoneable(false) + .build() + .child( + Button::new(|state: &mut HexagonLauncher| { + state.open = !state.open; + }) + .pos([0.0, 0.0, 0.005]) + .size([APP_SIZE / 2.0; 2]) + .build(), + ) + .child( + Model::namespaced("protostar", "hexagon/hexagon") + .transform(Transform::from_rotation_scale( + Quat::from_rotation_x(PI / 2.0) * Quat::from_rotation_y(PI), + [MODEL_SCALE; 3], + )) + .part(ModelPart::new("Hex").mat_param( + "color", + MaterialParameter::Color(if self.open { + BTN_SELECTED_COLOR + } else { + BTN_COLOR + }), + )) + .build(), + ) + .children( + self.open + .then(|| { + self.apps.iter().enumerate().map(|(i, app)| { + Spatial::default() + .pos(Hex::spiral(i + 1).get_coords()) + .build() + .identify(&app.app.name()) + .child(app.reify_substate(move |state: &mut HexagonLauncher| { + state.apps.get_mut(i) + })) + }) + }) + .into_iter() + .flatten(), ) } } - -struct CenterButton { - button: Button, - grabbable: Grabbable, - model: Model, -} -impl CenterButton { - fn new(client: &Arc, state: &ClientState) -> Result { - // (APP_SIZE + PADDING) / 2.0, - let button = Button::create( - client.get_root(), - Transform::identity(), - [(APP_SIZE + PADDING) / 2.0; 2], - ButtonSettings { - visuals: None, - ..Default::default() - }, - )?; - let grabbable = Grabbable::create( - client.get_root(), - Transform::none(), - button.touch_plane().field(), - GrabbableSettings { - max_distance: 0.025, - pointer_mode: PointerMode::Align, - magnet: false, - ..Default::default() - }, - )?; - button - .touch_plane() - .root() - .set_spatial_parent(grabbable.content_parent())?; - - let model = Model::create( - grabbable.content_parent(), - Transform::from_rotation_scale( - Quat::from_rotation_x(PI / 2.0) * Quat::from_rotation_y(PI), - [MODEL_SCALE; 3], - ), - &ResourceID::new_namespaced("protostar", "hexagon/hexagon"), - )?; - model - .part("Hex")? - .set_material_parameter("color", MaterialParameter::Color(BTN_COLOR))?; - if let Some(content_parent) = state.spatial_anchors(client).get("content_parent") { - grabbable - .content_parent() - .set_relative_transform(content_parent, Transform::identity())?; - } - Ok(CenterButton { - button, - grabbable, - model, - }) - } - - fn frame(&mut self, info: &FrameInfo) { - if self.grabbable.handle_events() { - self.grabbable.frame(info); - } - self.button.handle_events(); - } -} diff --git a/protostar/Cargo.toml b/protostar/Cargo.toml index 559abeb..ffe5c4d 100644 --- a/protostar/Cargo.toml +++ b/protostar/Cargo.toml @@ -17,7 +17,7 @@ lazy_static = "1.4.0" linicon-theme = "1.2.0" manifest-dir-macros = "0.1.16" mint = "0.5.9" -nix = "0.27.1" +nix = { version = "0.27.1", features = ["process"] } regex = "1.7.1" resvg = "0.29.0" rustc-hash = "1.1.0" diff --git a/protostar/src/application.rs b/protostar/src/application.rs index 6c865fe..e89471b 100644 --- a/protostar/src/application.rs +++ b/protostar/src/application.rs @@ -1,6 +1,7 @@ use crate::xdg::{DesktopFile, Icon, IconType}; -use nix::libc::setsid; +use nix::{libc::setsid, unistd::ForkResult}; use regex::Regex; +use serde::{Deserialize, Serialize}; use stardust_xr_fusion::{ node::{NodeError, NodeResult}, root::{ClientState, RootAspect}, @@ -8,10 +9,10 @@ use stardust_xr_fusion::{ }; use std::{ os::unix::process::CommandExt, - process::{Command, Stdio}, + process::{Command, Stdio, exit}, }; -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Serialize, Deserialize)] pub struct Application { desktop_file: DesktopFile, } @@ -82,18 +83,21 @@ impl Application { let exec: std::borrow::Cow<'_, str> = re.replace_all(&executable, ""); unsafe { - Command::new("sh") - .arg("-c") - .arg(exec.to_string()) - .stdin(Stdio::null()) - .stdout(Stdio::null()) - .stderr(Stdio::null()) - .pre_exec(|| { - _ = setsid(); - Ok(()) - }) - .spawn() - .expect("Failed to start child process"); + if let ForkResult::Child = nix::unistd::fork().expect("fork died???? how?????") { + let _ = Command::new("sh") + .arg("-c") + .arg(exec.to_string()) + .stdin(Stdio::null()) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .pre_exec(|| { + _ = setsid(); + Ok(()) + }) + .spawn() + .expect("Failed to start child process"); + exit(0); + } } }); diff --git a/protostar/src/xdg.rs b/protostar/src/xdg.rs index c2d77c1..4068f41 100644 --- a/protostar/src/xdg.rs +++ b/protostar/src/xdg.rs @@ -95,87 +95,11 @@ pub fn get_desktop_files() -> impl Iterator { #[test] fn test_get_desktop_files() { let desktop_files = get_desktop_files().collect::>(); - assert!(desktop_files - .iter() - .any(|file| file.ends_with("com.belmoussaoui.ashpd.demo.desktop"))); -} - -pub fn parse_desktop_file(path: PathBuf) -> Result { - // Open the file in read-only mode - let file = match fs::File::open( - env::current_dir() - .map_err(|e| e.to_string())? - .join(path.clone()), - ) { - Ok(file) => file, - Err(err) => return Err(format!("Failed to open file: {}", err)), - }; - - let reader = BufReader::new(file); - - // Create temporary variables to hold the parsed values - let mut name = None; - let mut command = None; - let mut categories = Vec::new(); - let mut icon = None; - let mut no_display = false; - let mut desktop_entry_found = false; - - let re = Regex::new(r"^\[([^\]]*)\]$").unwrap(); - - // Loop through each line of the file - for line in reader.lines() { - let line = match line { - Ok(line) => line, - Err(err) => return Err(format!("Failed to read line: {}", err)), - }; - - // Skip empty lines and lines that start with "#" (comments) - if line.is_empty() || line.starts_with('#') { - continue; - } - - if let Some(captures) = re.captures(&line) { - let entry = captures.get(1).unwrap(); - desktop_entry_found = entry.as_str().contains("Desktop Entry"); - } - - if !desktop_entry_found { - continue; - } - // Split the line into a key-value pair by looking for the first "=" character - let parts = line.split_once('='); - let (key, value) = match parts { - Some((key, value)) => (key, value), - None => continue, - }; - - // Parse the key-value pair based on the key - match key { - "Name" => name = Some(value.to_string()), - "Exec" => command = Some(value.to_string()), - "Categories" => { - categories = value - .split(';') - .map(|s| s.to_string()) - .filter(|s| !s.is_empty()) - .collect() - } - "Icon" => icon = Some(value.to_string()), - "NoDisplay" => no_display = value == "true", - _ => (), // Ignore unknown keys - } - } - - // Create and return a new DesktopFile instance with the parsed values - Ok(DesktopFile { - path, - name, - command, - categories, - icon, - no_display, - }) + assert!( + desktop_files + .iter() + .any(|file| file.ends_with("com.belmoussaoui.ashpd.demo.desktop")) + ); } #[test] @@ -187,7 +111,7 @@ fn test_parse_desktop_file() { fs::write(&file, data).unwrap(); // Parse the test desktop file - let desktop_file = parse_desktop_file(file).unwrap(); + let desktop_file = DesktopFile::parse(file).unwrap(); // Check the parsed values assert_eq!(desktop_file.name, Some("Test".to_string())); @@ -198,8 +122,8 @@ fn test_parse_desktop_file() { ); assert_eq!(desktop_file.icon, Some("test.png".to_string())); } - -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(into = "PathBuf", from = "PathBuf")] pub struct DesktopFile { path: PathBuf, pub name: Option, @@ -209,6 +133,97 @@ pub struct DesktopFile { pub no_display: bool, } +impl From for PathBuf { + fn from(df: DesktopFile) -> Self { + df.path + } +} +impl From for DesktopFile { + fn from(path: PathBuf) -> Self { + Self::parse(path).unwrap() + } +} + +impl DesktopFile { + pub fn parse(path: PathBuf) -> Result { + // Open the file in read-only mode + let file = match fs::File::open( + env::current_dir() + .map_err(|e| e.to_string())? + .join(path.clone()), + ) { + Ok(file) => file, + Err(err) => return Err(format!("Failed to open file: {err}")), + }; + + let reader = BufReader::new(file); + + // Create temporary variables to hold the parsed values + let mut name = None; + let mut command = None; + let mut categories = Vec::new(); + let mut icon = None; + let mut no_display = false; + let mut desktop_entry_found = false; + + let re = Regex::new(r"^\[([^\]]*)\]$").unwrap(); + + // Loop through each line of the file + for line in reader.lines() { + let line = match line { + Ok(line) => line, + Err(err) => return Err(format!("Failed to read line: {err}")), + }; + + // Skip empty lines and lines that start with "#" (comments) + if line.is_empty() || line.starts_with('#') { + continue; + } + + if let Some(captures) = re.captures(&line) { + let entry = captures.get(1).unwrap(); + desktop_entry_found = entry.as_str().contains("Desktop Entry"); + } + + if !desktop_entry_found { + continue; + } + // Split the line into a key-value pair by looking for the first "=" character + let parts = line.split_once('='); + let (key, value) = match parts { + Some((key, value)) => (key, value), + None => continue, + }; + + // Parse the key-value pair based on the key + match key { + "Name" => name = Some(value.to_string()), + "Exec" => command = Some(value.to_string()), + "Categories" => { + categories = value + .split(';') + .map(|s| s.to_string()) + .filter(|s| !s.is_empty()) + .collect() + } + "Icon" => icon = Some(value.to_string()), + "NoDisplay" => no_display = value == "true", + _ => (), // Ignore unknown keys + } + } + + // Create and return a new DesktopFile instance with the parsed values + Ok(DesktopFile { + path, + name, + command, + categories, + icon, + no_display, + }) + } +} + const ICON_SIZES: [u16; 7] = [512, 256, 128, 64, 48, 32, 24]; impl DesktopFile { diff --git a/single/Cargo.toml b/single/Cargo.toml index ecc123b..f5c5a4f 100644 --- a/single/Cargo.toml +++ b/single/Cargo.toml @@ -2,6 +2,7 @@ name = "single" version = "0.1.0" edition = "2024" +rust-version = "1.88" [dependencies] protostar = { path = "../protostar" } @@ -10,7 +11,11 @@ clap = "4.4.6" manifest-dir-macros = "0.1.18" glam = "0.24.2" tween = "2.0.1" +mint = "0.5.9" +tracing = "0.1.41" tracing-subscriber = "0.3.17" tokio = { workspace = true } +serde = { workspace = true } stardust-xr-fusion = { workspace = true } stardust-xr-molecules = { workspace = true } +asteroids = { workspace = true } diff --git a/single/src/app.rs b/single/src/app.rs new file mode 100644 index 0000000..c76e9c4 --- /dev/null +++ b/single/src/app.rs @@ -0,0 +1,163 @@ +use asteroids::elements::{ + Grabbable, Lines, Model, ModelPart, PointerMode, Text, line_from_points, +}; +use asteroids::{CustomElement, Element, Reify, Transformable}; +use glam::{Quat, Vec3}; +use mint::{Quaternion, Vector3}; +use protostar::application::Application; +use protostar::xdg::{DesktopFile, Icon, IconType}; +use serde::{Deserialize, Serialize}; +use stardust_xr_fusion::drawable::{TextBounds, TextFit}; +use stardust_xr_fusion::node::NodeError; +use stardust_xr_fusion::values::ResourceID; +use stardust_xr_fusion::{ + drawable::{MaterialParameter, XAlign, YAlign}, + fields::{CylinderShape, Shape}, + spatial::Transform, +}; +use std::f32::consts::{FRAC_PI_2, PI}; +use std::sync::OnceLock; +use std::sync::atomic::{AtomicBool, Ordering}; + +use crate::app_launcher::AppLauncher; +use crate::{ACTIVATION_DISTANCE, APP_SIZE, DEFAULT_HEX_COLOR, MODEL_SCALE}; + +#[derive(Debug, Serialize, Deserialize)] +pub struct App { + pub app: Application, + #[serde(skip)] + icon: OnceLock, + pos: Vector3, + rot: Quaternion, + #[serde(skip)] + launched: AtomicBool, +} +impl App { + pub fn new(desktop_entry: DesktopFile) -> Result { + let app = Application::create(desktop_entry)?; + Ok(App { + app, + icon: OnceLock::default(), + pos: [0.0; 3].into(), + rot: Quat::IDENTITY.into(), + launched: AtomicBool::new(false), + }) + } + + pub fn load_icon(&self) { + if self.icon.get().is_none() + && let Some(icon) = self + .app + .icon(64, true) + .and_then(|i| i.cached_process(64).ok()) + { + let _ = self.icon.set(icon); + } + } + + // Helper functions for creating app components + fn create_model(&self) -> impl Element { + match self.icon.get().as_ref().map(|i| (i.icon_type.clone(), i)) { + Some((IconType::Gltf, icon)) => Model::direct(icon.path.clone()) + .unwrap() + .transform(Transform::from_rotation_scale( + Quat::from_rotation_x(PI / 2.0) * Quat::from_rotation_y(PI), + [MODEL_SCALE; 3], + )) + .build(), + other => { + let model = Model::namespaced("protostar", "hexagon/hexagon") + .transform(Transform::from_rotation_scale( + Quat::from_rotation_x(PI / 2.0) * Quat::from_rotation_y(PI), + [APP_SIZE / 2.0; 3], + )) + .part( + ModelPart::new("Hex") + .mat_param("color", MaterialParameter::Color(DEFAULT_HEX_COLOR)), + ); + + match other { + Some((IconType::Png, icon)) => model.part(ModelPart::new("Icon").mat_param( + "diffuse", + MaterialParameter::Texture(ResourceID::Direct(icon.path.clone())), + )), + _ => model, + } + .build() + } + } + } +} +impl Reify for App { + #[tracing::instrument(skip_all)] + fn reify(&self) -> impl Element { + // The field shape for the grabbable + let field_shape = Shape::Cylinder(CylinderShape { + radius: APP_SIZE / 2.0, + length: 0.01, + }); + + let converted = Vec3::from(self.pos); + let length = converted.length(); + let direction = converted.normalize_or_zero(); + + Lines::new([line_from_points(vec![ + Vec3::from([0.0; 3]), + (length < ACTIVATION_DISTANCE) as u32 as f32 + * direction * length.clamp(0.0, ACTIVATION_DISTANCE), + ])]) + .build() + .child( + Grabbable::new( + field_shape, + self.pos, + self.rot, + move |state: &mut Self, pos, rot| { + state.pos = pos; + state.rot = rot; + }, + ) + .grab_stop({ + move |state: &mut Self| { + let pos_vec = Vec3::from(state.pos); + if pos_vec.length() > ACTIVATION_DISTANCE { + // state.app.launch(launch_space) + state.launched.store(true, Ordering::Relaxed); + } else { + state.pos = [0.0; 3].into(); + state.rot = Quat::IDENTITY.into(); + } + } + }) + .field_transform(Transform::from_rotation(Quat::from_rotation_x(FRAC_PI_2))) + .pointer_mode(PointerMode::Align) + .max_distance(0.05) + .build() + .child(self.create_model()) + .children(self.launched.load(Ordering::Relaxed).then(|| { + AppLauncher::new(&self.app) + .done(|state: &mut Self| { + state.launched.store(false, Ordering::Relaxed); + state.pos = [0.0; 3].into(); + state.rot = Quat::IDENTITY.into(); + }) + .build() + })) + .child( + Text::new(self.app.name().unwrap_or_default()) + .character_height(0.005) + .bounds(TextBounds { + bounds: [0.5, 0.5].into(), + fit: TextFit::Wrap, + anchor_align_x: XAlign::Center, + anchor_align_y: YAlign::Top, + }) + .text_align_x(XAlign::Center) + .text_align_y(YAlign::Center) + .pos([0.0, -APP_SIZE * 0.35, 0.001]) + .rot(Quat::from_rotation_y(PI)) + .build(), + ), + ) + } +} diff --git a/single/src/app_launcher.rs b/single/src/app_launcher.rs new file mode 100644 index 0000000..3ee8479 --- /dev/null +++ b/single/src/app_launcher.rs @@ -0,0 +1,62 @@ +use asteroids::{CustomElement, ValidState}; +use protostar::application::Application; +use stardust_xr_fusion::{ + node::{NodeError, NodeType}, + spatial::{Spatial, SpatialAspect, SpatialRef, Transform}, +}; +use std::fmt::Debug; + +pub struct AppLauncher(Application, Box); +impl AppLauncher { + pub fn new(app: &Application) -> Self { + AppLauncher(app.clone(), Box::new(|_| {})) + } + pub fn done(mut self, f: F) -> Self { + self.1 = Box::new(f); + self + } +} +impl CustomElement for AppLauncher { + type Inner = (Spatial, bool); + type Resource = (); + type Error = NodeError; + + fn create_inner( + &self, + _asteroids_context: &asteroids::Context, + info: asteroids::CreateInnerInfo, + _resource: &mut Self::Resource, + ) -> Result { + let spatial = Spatial::create( + info.parent_space.client()?.get_root(), + Transform::identity(), + false, + )?; + spatial.set_relative_transform(info.parent_space, Transform::from_translation([0.0; 3]))?; + Ok((spatial, false)) + } + + fn diff(&self, _old_self: &Self, _inner: &mut Self::Inner, _resource: &mut Self::Resource) {} + + fn frame( + &self, + _info: &stardust_xr_fusion::root::FrameInfo, + state: &mut State, + inner: &mut Self::Inner, + ) { + if !inner.1 { + let _ = self.0.launch(&inner.0); + (self.1)(state); + inner.1 = true; + } + } + + fn spatial_aspect(&self, inner: &Self::Inner) -> SpatialRef { + inner.0.clone().as_spatial_ref() + } +} +impl Debug for AppLauncher { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_tuple("ImperativeSpatial").finish() + } +} diff --git a/single/src/lib.rs b/single/src/lib.rs new file mode 100644 index 0000000..0ee30dc --- /dev/null +++ b/single/src/lib.rs @@ -0,0 +1,15 @@ +mod app; +mod app_launcher; + +pub use app::App; +use stardust_xr_fusion::values::color::{Rgba, color_space::LinearRgb, rgba_linear}; + +// Constants from original implementation +pub const APP_SIZE: f32 = 0.06; +pub const PADDING: f32 = 0.005; +pub const MODEL_SCALE: f32 = 0.03; +pub const ACTIVATION_DISTANCE: f32 = 0.05; + +pub const DEFAULT_HEX_COLOR: Rgba = rgba_linear!(0.211, 0.937, 0.588, 1.0); +pub const BTN_SELECTED_COLOR: Rgba = rgba_linear!(0.0, 1.0, 0.0, 1.0); +pub const BTN_COLOR: Rgba = rgba_linear!(1.0, 1.0, 0.0, 1.0); diff --git a/single/src/main.rs b/single/src/main.rs index 253201e..327a6cc 100644 --- a/single/src/main.rs +++ b/single/src/main.rs @@ -1,15 +1,12 @@ -mod single; - +use asteroids::{ClientState, CustomElement, Element, Migrate, Reify, client, elements::Spatial}; use clap::Parser; -use color_eyre::{eyre::Result, Report}; -use manifest_dir_macros::directory_relative_path; -use protostar::xdg::parse_desktop_file; -use stardust_xr_fusion::{client::Client, root::RootAspect}; +use protostar::xdg::DesktopFile; +use serde::{Deserialize, Serialize}; +use single::App; +use stardust_xr_fusion::project_local_resources; use std::path::PathBuf; use tracing_subscriber::EnvFilter; -use crate::single::Single; - #[derive(Debug, Parser)] #[clap(author, version, about, long_about = None)] struct Args { @@ -18,45 +15,39 @@ struct Args { } #[tokio::main(flavor = "current_thread")] -async fn main() -> Result<()> { +async fn main() { tracing_subscriber::fmt() .compact() .with_env_filter(EnvFilter::from_env("LOG_LEVEL")) .init(); - color_eyre::install()?; - let args = Args::parse(); - let owned_client = Client::connect().await?; - let client = owned_client.handle(); - let async_loop = owned_client.async_event_loop(); - client - .get_root() - .set_base_prefixes(&[directory_relative_path!("../res").to_string()])?; - - let mut protostar = Single::create_from_desktop_file( - client.get_root(), - [0.0, 0.0, 0.0], - parse_desktop_file(args.desktop_file).map_err(Report::msg)?, - )?; - - let mut owned_client = async_loop.stop().await.unwrap(); - let event_loop = owned_client.sync_event_loop(|handle, _| { - let Some(event) = handle.get_root().recv_root_event() else { - return; - }; - match event { - stardust_xr_fusion::root::RootEvent::Ping { response } => response.send(Ok(())), - stardust_xr_fusion::root::RootEvent::Frame { info } => { - protostar.frame(info); - } - stardust_xr_fusion::root::RootEvent::SaveState { response } => { - response.send(protostar.save_state()); - } - } - }); - - tokio::select! { - _ = tokio::signal::ctrl_c() => (), - e = event_loop => e?, - }; - Ok(()) + client::run::(&[&project_local_resources!("../res")]).await +} + +#[derive(Default, Debug, Serialize, Deserialize)] +pub struct Single { + app: Option, +} +impl Migrate for Single { + type Old = Self; +} +impl ClientState for Single { + const APP_ID: &'static str = "org.stardustxr.protostar.single"; + + fn initial_state_update(&mut self) { + let desktop_file_path = Args::parse().desktop_file; + + let app = App::new(DesktopFile::parse(desktop_file_path).unwrap()).unwrap(); + app.load_icon(); + self.app.replace(app); + } +} +impl Reify for Single { + #[tracing::instrument(skip_all)] + fn reify(&self) -> impl Element { + Spatial::default().build().maybe_child( + self.app + .as_ref() + .map(|app| app.reify_substate(|state: &mut Self| state.app.as_mut())), + ) + } } diff --git a/single/src/single.rs b/single/src/single.rs deleted file mode 100644 index f15bdf1..0000000 --- a/single/src/single.rs +++ /dev/null @@ -1,252 +0,0 @@ -use color_eyre::eyre::Result; -use glam::{Quat, Vec3}; -use protostar::{ - application::Application, - xdg::{DesktopFile, Icon, IconType}, -}; -use stardust_xr_fusion::{ - core::values::{color::rgba_linear, ResourceID, Vector3}, - drawable::{ - MaterialParameter, Model, ModelPartAspect, Text, TextBounds, TextFit, TextStyle, XAlign, - YAlign, - }, - fields::{Field, Shape}, - node::NodeType, - root::{ClientState, FrameInfo}, - spatial::{Spatial, SpatialAspect, SpatialRefAspect, Transform}, -}; -use stardust_xr_molecules::{FrameSensitive, Grabbable, GrabbableSettings, UIElement}; -use std::f32::consts::PI; -use tween::{QuartInOut, Tweener}; - -const MODEL_SCALE: f32 = 0.05; -const ACTIVATION_DISTANCE: f32 = 0.5; - -fn model_from_icon(parent: &Spatial, icon: &Icon) -> Result { - match &icon.icon_type { - IconType::Png => { - let t = Transform::from_rotation_scale( - Quat::from_rotation_x(PI / 2.0) * Quat::from_rotation_y(PI), - [MODEL_SCALE; 3], - ); - - let model = Model::create( - parent, - t, - &ResourceID::new_namespaced("protostar", "hexagon/hexagon"), - )?; - model.part("Hex")?.set_material_parameter( - "color", - MaterialParameter::Color(rgba_linear!(0.0, 1.0, 1.0, 1.0)), - )?; - model.part("Icon")?.set_material_parameter( - "diffuse", - MaterialParameter::Texture(ResourceID::Direct(icon.path.clone())), - )?; - Ok(model) - } - IconType::Gltf => Ok(Model::create( - parent, - Transform::from_scale([0.05; 3]), - &ResourceID::new_direct(icon.path.clone())?, - )?), - _ => panic!("Invalid Icon Type"), - } -} - -pub struct Single { - application: Application, - root: Spatial, - position: Vector3, - grabbable: Grabbable, - _field: Field, - icon: Model, - label: Option, - grabbable_shrink: Option>, - grabbable_grow: Option>, - grabbable_move: Option>, - currently_shown: bool, -} - -impl Single { - pub fn create_from_desktop_file( - parent: &impl SpatialRefAspect, - position: impl Into>, - desktop_file: DesktopFile, - ) -> Result { - let root = Spatial::create(parent, Transform::identity(), false)?; - let position = position.into(); - let field = Field::create( - &root, - Transform::identity(), - Shape::Box([MODEL_SCALE * 2.0; 3].into()), - )?; - let application = Application::create(desktop_file)?; - let icon = application.icon(128, false); - let grabbable = Grabbable::create( - &root, - Transform::from_translation(position), - &field, - GrabbableSettings { - max_distance: 0.01, - ..Default::default() - }, - )?; - grabbable.content_parent().set_spatial_parent(&root)?; - field.set_spatial_parent(grabbable.content_parent())?; - let icon = icon - .map(|i| model_from_icon(grabbable.content_parent(), &i)) - .unwrap_or_else(|| { - Ok(Model::create( - grabbable.content_parent(), - Transform::from_scale([MODEL_SCALE; 3]), - &ResourceID::new_namespaced("protostar", "default_icon"), - )?) - })?; - - let label_style = TextStyle { - character_height: MODEL_SCALE * 4.0, - bounds: Some(TextBounds { - bounds: [1.0; 2].into(), - fit: TextFit::Wrap, - anchor_align_x: XAlign::Center, - anchor_align_y: YAlign::Center, - }), - text_align_x: XAlign::Center, - text_align_y: YAlign::Center, - ..Default::default() - }; - let label = application.name().and_then(|name| { - Text::create( - &icon, - Transform::from_translation_rotation( - [0.0, 0.1, -(MODEL_SCALE * 8.0)], - Quat::from_rotation_x(PI * 0.5), - ), - name, - label_style, - ) - .ok() - }); - Ok(Single { - root, - position, - grabbable, - _field: field, - label, - application, - icon, - grabbable_shrink: None, - grabbable_grow: None, - grabbable_move: None, - currently_shown: true, - }) - } - pub fn content_parent(&self) -> &Spatial { - self.grabbable.content_parent() - } -} -impl Single { - pub fn frame(&mut self, info: FrameInfo) { - if self.grabbable.handle_events() { - self.grabbable.frame(&info); - } - - if let Some(grabbable_move) = &mut self.grabbable_move { - if !grabbable_move.is_finished() { - let scale = grabbable_move.move_by(info.delta.into()); - self.grabbable - .content_parent() - .set_relative_transform( - &self.root, - Transform::from_translation([ - self.position.x * scale, - self.position.y * scale, - self.position.z * scale, - ]), - ) - .unwrap(); - } else { - if grabbable_move.final_value() == 0.0001 { - self.icon.set_enabled(false).unwrap(); - if let Some(label) = self.label.as_ref() { - label.set_enabled(false).unwrap() - } - } - self.grabbable_move = None; - } - } - if let Some(grabbable_shrink) = &mut self.grabbable_shrink { - if !grabbable_shrink.is_finished() { - let scale = grabbable_shrink.move_by(info.delta.into()); - self.grabbable - .content_parent() - .set_relative_transform(&self.root, Transform::from_scale([scale; 3])) - .unwrap(); - } else { - self.grabbable - .content_parent() - .set_spatial_parent(&self.root) - .unwrap(); - if self.currently_shown { - self.grabbable_grow = Some(Tweener::quart_in_out(0.0001, 1.0, 0.25)); - self.grabbable.cancel_angular_velocity(); - self.grabbable.cancel_linear_velocity(); - } - self.grabbable_shrink = None; - self.grabbable - .content_parent() - .set_relative_transform(&self.root, Transform::from_translation(self.position)) - .unwrap(); - self.grabbable - .content_parent() - .set_relative_transform(&self.root, Transform::from_rotation(Quat::default())) - .unwrap(); - self.icon - .set_local_transform(Transform::from_rotation( - Quat::from_rotation_x(PI / 2.0) * Quat::from_rotation_y(PI), - )) - .unwrap(); - } - } else if let Some(grabbable_grow) = &mut self.grabbable_grow { - if !grabbable_grow.is_finished() { - let scale = grabbable_grow.move_by(info.delta.into()); - self.grabbable - .content_parent() - .set_relative_transform(&self.root, Transform::from_scale([scale; 3])) - .unwrap(); - } else { - self.grabbable - .content_parent() - .set_spatial_parent(&self.root) - .unwrap(); - self.grabbable_grow = None; - } - } else if self.grabbable.grab_action().actor_stopped() { - self.grabbable_shrink = Some(Tweener::quart_in_out(MODEL_SCALE, 0.0001, 0.25)); - - let application = self.application.clone(); - let space = self.content_parent().clone(); - let root = self.root.clone(); - - //TODO: split the executable string for the args - tokio::task::spawn(async move { - let distance_vector = space - .get_transform(&root) - .await - .unwrap() - .translation - .unwrap(); - let distance = Vec3::from(distance_vector).length_squared(); - - if distance > ACTIVATION_DISTANCE { - let _ = application.launch(&space); - } - }); - } - } - - pub fn save_state(&mut self) -> color_eyre::eyre::Result { - ClientState::from_root(self.content_parent()) - } -} diff --git a/sirius/Cargo.toml b/sirius/Cargo.toml index fd57632..88c86a9 100644 --- a/sirius/Cargo.toml +++ b/sirius/Cargo.toml @@ -3,16 +3,22 @@ name = "sirius" version = "0.1.0" edition = "2024" +[features] +tracy = ["dep:tracing-tracy", "asteroids/tracy"] + [dependencies] protostar = { path = "../protostar" } color-eyre = "0.6.2" clap = "4.4.6" manifest-dir-macros = "0.1.18" -glam = "0.24.2" -tween = "2.0.1" -tracing-subscriber = "0.3.17" -walkdir = "2.4.0" +glam = { version = "0.25.0", features = ["mint"] } +mint = "0.5.9" +tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } +tracing-tracy = { version = "0.11.4", optional = true } tokio = { workspace = true } serde = { workspace = true } stardust-xr-fusion = { workspace = true } -stardust-xr-molecules = { workspace = true } +asteroids = { workspace = true } +tracing = "0.1.41" +walkdir = "2.4.0" +single = { path = "../single" } diff --git a/sirius/src/main.rs b/sirius/src/main.rs index da68fcd..2aa7d8f 100644 --- a/sirius/src/main.rs +++ b/sirius/src/main.rs @@ -1,35 +1,40 @@ -use clap::{self, Parser}; -use color_eyre::eyre::Result; -use glam::{Quat, Vec3}; -use manifest_dir_macros::directory_relative_path; -use protostar::{ - application::Application, - xdg::{parse_desktop_file, DesktopFile, Icon, IconType}, +use asteroids::{ + ClientState, CustomElement, Element, Migrate, Reify, Transformable, client, + elements::{Button, Grabbable, Model, ModelPart, PointerMode, Spatial}, }; +use clap::Parser; +use glam::Quat; +use mint::{Quaternion, Vector3}; +use protostar::xdg::DesktopFile; use serde::{Deserialize, Serialize}; +use single::{App, BTN_COLOR, BTN_SELECTED_COLOR}; use stardust_xr_fusion::{ - client::Client, - core::values::{color::rgba_linear, ResourceID, Vector3}, - drawable::{ - MaterialParameter, Model, ModelPartAspect, Text, TextBounds, TextFit, TextStyle, XAlign, - YAlign, - }, - fields::{Field, Shape}, - node::{NodeError, NodeType}, - root::{ClientState, FrameInfo, RootAspect}, - spatial::{Spatial, SpatialAspect, SpatialRefAspect, Transform}, ClientHandle, + drawable::MaterialParameter, fields::Shape, project_local_resources, spatial::Transform, }; -use stardust_xr_molecules::{ - button::{Button, ButtonSettings}, - FrameSensitive, Grabbable, GrabbableSettings, UIElement, -}; -use std::{f32::consts::PI, path::PathBuf}; - -use tween::{QuartInOut, Tweener}; +use std::path::PathBuf; +use tracing_subscriber::{EnvFilter, Layer, layer::SubscriberExt, util::SubscriberInitExt}; use walkdir::WalkDir; -const APP_SIZE: f32 = 0.06; -const ACTIVATION_DISTANCE: f32 = 0.5; +#[tokio::main(flavor = "current_thread")] +async fn main() { + color_eyre::install().unwrap(); + + let registry = tracing_subscriber::registry(); + #[cfg(feature = "tracy")] + let registry = registry.with({ + use tracing_subscriber::Layer; + tracing_tracy::TracyLayer::new(tracing_tracy::DefaultConfig::default()) + .with_filter(tracing::level_filters::LevelFilter::DEBUG) + }); + let log_layer = tracing_subscriber::fmt::Layer::new() + .with_thread_names(true) + .with_ansi(true) + .with_line_number(true) + .with_filter(EnvFilter::from_default_env()); + registry.with(log_layer).init(); + + client::run::(&[&project_local_resources!("../res")]).await +} #[derive(Debug, Parser)] #[clap(author, version, about, long_about = None)] @@ -38,83 +43,45 @@ struct Args { apps_directory: PathBuf, } -#[tokio::main(flavor = "current_thread")] -async fn main() -> Result<()> { - color_eyre::install()?; - - let args = Args::parse(); - if !args.apps_directory.is_dir() { - panic!( - "{} is not a direcotry", - args.apps_directory.to_string_lossy() - ) - } - - let owned_client = Client::connect().await?; - let client = owned_client.handle(); - let async_loop = owned_client.async_event_loop(); - client - .get_root() - .set_base_prefixes(&[directory_relative_path!("../res").to_string()])?; - let mut sirius = Sirius::new(&client, args)?; - - let mut owned_client = async_loop.stop().await.unwrap(); - let event_loop = owned_client.sync_event_loop(|handle, _| { - let Some(event) = handle.get_root().recv_root_event() else { - return; - }; - match event { - stardust_xr_fusion::root::RootEvent::Ping { response } => response.send(Ok(())), - stardust_xr_fusion::root::RootEvent::Frame { info } => { - sirius.frame(info); - } - stardust_xr_fusion::root::RootEvent::SaveState { response } => { - response.send(sirius.save_state()); - } - } - }); - - tokio::select! { - _ = tokio::signal::ctrl_c() => (), - e = event_loop => e?, - } - Ok(()) -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -struct State { +#[derive(Debug, Serialize, Deserialize)] +pub struct Sirius { visible: bool, + pos: Vector3, + rot: Quaternion, + #[serde(skip)] + apps: Vec, } -struct Sirius { - button: Button, - model: Model, - clients: Vec, - state: State, - grabbable: Grabbable, +impl Default for Sirius { + fn default() -> Self { + Self { + visible: false, + pos: [0.0; 3].into(), + rot: Quat::IDENTITY.into(), + apps: Vec::new(), + } + } } -impl Sirius { - fn new(client: &ClientHandle, args: Args) -> Result { - let root = Spatial::create(client.get_root(), Transform::identity(), false).unwrap(); - let field = - Field::create(&root, Transform::identity(), Shape::Box([0.1; 3].into())).unwrap(); - let grabbable = Grabbable::create( - &root, - Transform::identity(), - &field, - GrabbableSettings::default(), - )?; - let button = Button::create( - grabbable.content_parent(), - Transform::identity(), - [0.1; 2], - ButtonSettings::default(), - )?; +impl Migrate for Sirius { + type Old = Self; +} + +impl ClientState for Sirius { + const APP_ID: &'static str = "org.protostar.sirius"; + + fn initial_state_update(&mut self) { + let args = Args::parse(); + if !args.apps_directory.is_dir() { + panic!( + "{} is not a directory", + args.apps_directory.to_string_lossy() + ) + } let walkdir = WalkDir::new(args.apps_directory.canonicalize().unwrap()); - let clients: Vec = walkdir + self.apps = walkdir .into_iter() .filter_map(|path| path.ok()) .map(|entry| entry.into_path()) @@ -123,369 +90,68 @@ impl Sirius { && path.extension().is_some() && path.extension().unwrap() == "desktop" }) - .filter_map(|path| { - App::create_from_desktop_file( - grabbable.content_parent(), - [0.0; 3], - parse_desktop_file(path).ok()?, - ) - .ok() - }) + .filter_map(|path| App::new(DesktopFile::parse(path).ok()?).ok()) .collect(); - - let model = Model::create( - grabbable.content_parent(), - Transform::identity(), - &ResourceID::new_namespaced("protostar", "button"), - )?; - field.set_spatial_parent(grabbable.content_parent())?; - let state = State { visible: false }; - - Ok(Sirius { - button, - model, - clients, - state, - grabbable, - }) } - - // fn left_hand(input_data: &InputData, _: &()) -> bool { - // match &input_data.input { - // InputDataType::Hand(h) => !h.right, - // _ => false, - // } - // } } -impl Sirius { - fn frame(&mut self, info: FrameInfo) { - for app in &mut self.clients { - app.frame(&info); - } - - if self.grabbable.handle_events() { - self.grabbable.frame(&info); - }; - if self.button.handle_events() && self.button.pressed() { - println!("Touch started"); - self.state.visible = !self.state.visible; - match self.state.visible { - true => { - for (pos, star) in self.clients.iter().enumerate() { +impl Reify for Sirius { + fn reify(&self) -> impl Element { + Grabbable::new( + Shape::Box([0.1; 3].into()), + self.pos, + self.rot, + |state: &mut Self, pos, rot| { + state.pos = pos; + state.rot = rot; + }, + ) + .pointer_mode(PointerMode::Align) + .zoneable(false) + .build() + .child( + Button::new(|state: &mut Sirius| { + state.visible = !state.visible; + }) + .pos([0.0, 0.0, 0.005]) + .size([0.1; 2]) + .build(), + ) + .child( + Model::namespaced("protostar", "button") + .transform(Transform::identity()) + .part(ModelPart::new("?????").mat_param( + "color", + MaterialParameter::Color(if self.visible { + BTN_SELECTED_COLOR + } else { + BTN_COLOR + }), + )) + .build(), + ) + .children( + self.visible + .then(|| { + self.apps.iter().enumerate().map(|(pos, app)| { let mut starpos = (pos as f32 + 1.0) / 10.0; match starpos % 0.2 == 0.0 { true => starpos = -starpos / 2.0, false => starpos = (starpos - 0.1) / 2.0, } - println!("{}", starpos); - star.content_parent() - .set_relative_transform( - self.grabbable.content_parent(), - Transform::from_translation([starpos, 0.1, 0.0]), - ) - .unwrap(); - } - } - false => { - for star in &self.clients { - star.content_parent() - .set_relative_transform( - self.grabbable.content_parent(), - Transform::from_translation([0.0; 3]), - ) - .ok(); - } - } - } - self.model - .part("?????") - .unwrap() - .set_material_parameter( - "color", - MaterialParameter::Color(rgba_linear!(0.0, 1.0, 0.0, 1.0)), - ) - .unwrap(); - self.model - .part("?????") - .unwrap() - .set_material_parameter( - "emission_factor", - MaterialParameter::Color(rgba_linear!(0.0, 0.75, 0.0, 0.75)), - ) - .unwrap(); - } - if self.button.released() { - println!("Touch ended"); - self.model - .part("?????") - .unwrap() - .set_material_parameter( - "color", - MaterialParameter::Color(rgba_linear!(1.0, 0.0, 0.0, 1.0)), - ) - .unwrap(); - self.model - .part("?????") - .unwrap() - .set_material_parameter( - "emission_factor", - MaterialParameter::Color(rgba_linear!(0.5, 0.0, 0.0, 0.5)), - ) - .unwrap(); - } - } - - fn save_state(&mut self) -> Result { - ClientState::new( - Some(self.state.clone()), - self.grabbable.content_parent(), - [( - "content_parent".to_string(), - self.grabbable.content_parent(), - )] - .into_iter() - .collect(), + Spatial::default() + .pos([starpos, 0.1, 0.0]) + .build() + .identify(&app.app.name()) + .child( + app.reify_substate(move |state: &mut Sirius| { + state.apps.get_mut(pos) + }), + ) + }) + }) + .into_iter() + .flatten(), ) } } - -fn model_from_icon(parent: &Spatial, icon: &Icon) -> Result { - match &icon.icon_type { - IconType::Png => { - let t = Transform::from_rotation_scale( - Quat::from_rotation_x(PI / 2.0) * Quat::from_rotation_y(PI), - [APP_SIZE * 0.5; 3], - ); - - let model = Model::create( - parent, - t, - &ResourceID::new_namespaced("protostar", "hexagon/hexagon"), - )?; - model.part("Hex")?.set_material_parameter( - "color", - MaterialParameter::Color(rgba_linear!(0.0, 1.0, 1.0, 1.0)), - )?; - model.part("Icon")?.set_material_parameter( - "diffuse", - MaterialParameter::Texture(ResourceID::Direct(icon.path.clone())), - )?; - Ok(model) - } - IconType::Gltf => Ok(Model::create( - parent, - Transform::from_scale([0.05; 3]), - &ResourceID::new_direct(icon.path.clone())?, - )?), - _ => panic!("Invalid Icon Type"), - } -} - -pub struct App { - application: Application, - parent: Spatial, - position: Vector3, - grabbable: Grabbable, - _field: Field, - icon: Model, - label: Option, - grabbable_shrink: Option>, - grabbable_grow: Option>, - grabbable_move: Option>, - currently_shown: bool, -} -impl App { - pub fn create_from_desktop_file( - parent: &Spatial, - position: impl Into>, - desktop_file: DesktopFile, - ) -> Result { - let position = position.into(); - let field = Field::create( - parent, - Transform::identity(), - Shape::Box([APP_SIZE; 3].into()), - )?; - let application = Application::create(desktop_file)?; - let icon = application.icon(128, false); - let grabbable = Grabbable::create( - parent, - Transform::from_translation(position), - &field, - GrabbableSettings { - max_distance: 0.01, - zoneable: false, - ..Default::default() - }, - )?; - grabbable.content_parent().set_spatial_parent(parent)?; - field.set_spatial_parent(grabbable.content_parent())?; - let icon = icon - .map(|i| model_from_icon(grabbable.content_parent(), &i)) - .unwrap_or_else(|| { - Ok(Model::create( - grabbable.content_parent(), - Transform::from_rotation_scale( - Quat::from_rotation_x(PI / 2.0) * Quat::from_rotation_y(PI), - [APP_SIZE * 0.5; 3], - ), - &ResourceID::new_namespaced("protostar", "hexagon/hexagon"), - )?) - })?; - - let label_style = TextStyle { - character_height: APP_SIZE * 2.0, - bounds: Some(TextBounds { - bounds: [1.0; 2].into(), - fit: TextFit::Wrap, - anchor_align_x: XAlign::Center, - anchor_align_y: YAlign::Center, - }), - - text_align_x: XAlign::Center, - text_align_y: YAlign::Center, - ..Default::default() - }; - let label = application.name().and_then(|name| { - Text::create( - &icon, - Transform::from_translation_rotation( - [0.0, 0.1, -(APP_SIZE * 4.0)], - Quat::from_rotation_x(PI * 0.5), - ), - name, - label_style, - ) - .ok() - }); - Ok(App { - parent: parent.clone(), - position, - grabbable, - _field: field, - label, - application, - icon, - grabbable_shrink: None, - grabbable_grow: None, - grabbable_move: None, - currently_shown: true, - }) - } - pub fn content_parent(&self) -> &Spatial { - self.grabbable.content_parent() - } - pub fn toggle(&mut self) { - self.grabbable.set_enabled(!self.currently_shown).unwrap(); - if self.currently_shown { - self.grabbable_move = Some(Tweener::quart_in_out(1.0, 0.0001, 0.25)); //TODO make the scale a parameter - } else { - self.icon.set_enabled(true).unwrap(); - if let Some(label) = self.label.as_ref() { - label.set_enabled(true).unwrap() - } - self.grabbable_move = Some(Tweener::quart_in_out(0.0001, 1.0, 0.25)); - } - self.currently_shown = !self.currently_shown; - } - - fn frame(&mut self, info: &FrameInfo) { - if !self.grabbable.handle_events() { - return; - } - self.grabbable.frame(info); - - if let Some(grabbable_move) = &mut self.grabbable_move { - if !grabbable_move.is_finished() { - let scale = grabbable_move.move_by(info.delta.into()); - self.grabbable - .content_parent() - .set_relative_transform( - &self.parent, - Transform::from_translation(Vec3::from(self.position) * scale), - ) - .unwrap(); - } else { - if grabbable_move.final_value() == 0.0001 { - self.icon.set_enabled(false).unwrap(); - if let Some(label) = self.label.as_ref() { - label.set_enabled(false).unwrap() - } - } - self.grabbable_move = None; - } - } - if let Some(grabbable_shrink) = &mut self.grabbable_shrink { - if !grabbable_shrink.is_finished() { - let scale = grabbable_shrink.move_by(info.delta.into()); - self.grabbable - .content_parent() - .set_relative_transform(&self.parent, Transform::from_scale([scale; 3])) - .unwrap(); - } else { - self.grabbable - .content_parent() - .set_spatial_parent(&self.parent) - .unwrap(); - if self.currently_shown { - self.grabbable_grow = Some(Tweener::quart_in_out(0.0001, 1.0, 0.25)); - self.grabbable.cancel_angular_velocity(); - self.grabbable.cancel_linear_velocity(); - } - self.grabbable_shrink = None; - self.grabbable - .content_parent() - .set_relative_transform( - &self.parent, - Transform::from_translation(self.position), - ) - .unwrap(); - self.grabbable - .content_parent() - .set_relative_transform(&self.parent, Transform::from_rotation(Quat::default())) - .unwrap(); - self.icon - .set_local_transform(Transform::from_rotation( - Quat::from_rotation_x(PI / 2.0) * Quat::from_rotation_y(PI), - )) - .unwrap(); - } - } else if let Some(grabbable_grow) = &mut self.grabbable_grow { - if !grabbable_grow.is_finished() { - let scale = grabbable_grow.move_by(info.delta.into()); - self.grabbable - .content_parent() - .set_relative_transform(&self.parent, Transform::from_scale([scale; 3])) - .unwrap(); - } else { - self.grabbable - .content_parent() - .set_spatial_parent(&self.parent) - .unwrap(); - self.grabbable_grow = None; - } - } else if self.grabbable.grab_action().actor_stopped() { - self.grabbable_shrink = Some(Tweener::quart_in_out(APP_SIZE * 0.5, 0.0001, 0.25)); - - let application = self.application.clone(); - let space = self.content_parent().clone(); - let parent = self.parent.clone(); - - //TODO: split the executable string for the args - tokio::task::spawn(async move { - let distance_vector = space - .get_transform(&parent) - .await - .unwrap() - .translation - .unwrap(); - let distance = Vec3::from(distance_vector).length_squared(); - - if distance > ACTIVATION_DISTANCE { - let _ = application.launch(&space); - } - }); - } - } -}