diff --git a/Cargo.lock b/Cargo.lock index 38be9a3..934a219 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6,11 +6,142 @@ version = 4 name = "SiPEED-A075V" version = "0.1.0" dependencies = [ + "bytemuck", "byteorder", + "crossbeam-channel", + "dialog", + "eframe", + "egui 0.31.1", + "egui-snarl", + "env_logger", + "epi", + "glam", + "image", + "log", "ndarray", "once_cell", - "opencv", - "reqwest", + "pasture-core", + "pasture-io", + "ply-rs", + "rand 0.9.1", + "serde", + "serde_json", + "syn 2.0.101", + "typetag", + "ureq", + "wgpu 25.0.0", +] + +[[package]] +name = "ab_glyph" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3672c180e71eeaaac3a541fbbc5f5ad4def8b747c595ad30d674e43049f7b0" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" + +[[package]] +name = "accesskit" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3d3b8f9bae46a948369bc4a03e815d4ed6d616bd00de4051133a5019dc31c5a" +dependencies = [ + "enumn", + "serde", +] + +[[package]] +name = "accesskit_atspi_common" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c5dd55e6e94949498698daf4d48fb5659e824d7abec0d394089656ceaf99d4f" +dependencies = [ + "accesskit", + "accesskit_consumer", + "atspi-common", + "serde", + "thiserror 1.0.69", + "zvariant", +] + +[[package]] +name = "accesskit_consumer" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f47983a1084940ba9a39c077a8c63e55c619388be5476ac04c804cfbd1e63459" +dependencies = [ + "accesskit", + "hashbrown", + "immutable-chunkmap", +] + +[[package]] +name = "accesskit_macos" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7329821f3bd1101e03a7d2e03bd339e3ac0dc64c70b4c9f9ae1949e3ba8dece1" +dependencies = [ + "accesskit", + "accesskit_consumer", + "hashbrown", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "accesskit_unix" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcee751cc20d88678c33edaf9c07e8b693cd02819fe89053776f5313492273f5" +dependencies = [ + "accesskit", + "accesskit_atspi_common", + "async-channel", + "async-executor", + "async-task", + "atspi", + "futures-lite", + "futures-util", + "serde", + "zbus", +] + +[[package]] +name = "accesskit_windows" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24fcd5d23d70670992b823e735e859374d694a3d12bfd8dd32bd3bd8bedb5d81" +dependencies = [ + "accesskit", + "accesskit_consumer", + "hashbrown", + "paste", + "static_assertions", + "windows", + "windows-core", +] + +[[package]] +name = "accesskit_winit" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6a48dad5530b6deb9fc7a52cc6c3bf72cdd9eb8157ac9d32d69f2427a5e879" +dependencies = [ + "accesskit", + "accesskit_macos", + "accesskit_unix", + "accesskit_windows", + "raw-window-handle", + "winit", ] [[package]] @@ -28,6 +159,31 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.16", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if 1.0.0", + "getrandom 0.2.16", + "once_cell", + "serde", + "version_check", + "zerocopy 0.7.35", +] + [[package]] name = "aho-corasick" version = "1.1.3" @@ -37,18 +193,425 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned-vec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + +[[package]] +name = "android-activity" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" +dependencies = [ + "android-properties", + "bitflags 2.9.0", + "cc", + "cesu8", + "jni", + "jni-sys", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys 0.6.0+11769913", + "num_enum", + "thiserror 1.0.69", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "0.6.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" + +[[package]] +name = "anstyle-parse" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" +dependencies = [ + "anstyle", + "once_cell", + "windows-sys 0.59.0", +] + +[[package]] +name = "anyhow" +version = "1.0.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" + +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + +[[package]] +name = "arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" + +[[package]] +name = "arboard" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1df21f715862ede32a0c525ce2ca4d52626bb0007f8c18b87a384503ac33e70" +dependencies = [ + "clipboard-win", + "image", + "log", + "objc2 0.6.1", + "objc2-app-kit 0.3.1", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation 0.3.1", + "parking_lot", + "percent-encoding", + "windows-sys 0.59.0", + "x11rb", +] + +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "array-init" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d62b7694a562cdf5a74227903507c56ab2cc8bdd1f781ed5cb4cf9c9f810bfc" + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + +[[package]] +name = "ash" +version = "0.38.0+1.3.281" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" +dependencies = [ + "libloading", +] + +[[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", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-fs" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" +dependencies = [ + "async-lock", + "blocking", + "futures-lite", +] + +[[package]] +name = "async-io" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +dependencies = [ + "async-lock", + "cfg-if 1.0.0", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix 0.38.44", + "slab", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if 1.0.0", + "event-listener", + "futures-lite", + "rustix 0.38.44", + "tracing", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "async-signal" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if 1.0.0", + "futures-core", + "futures-io", + "rustix 0.38.44", + "signal-hook-registry", + "slab", + "windows-sys 0.59.0", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "atomic-waker" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "atomic_refcell" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41e67cd8309bbd06cd603a9e693a784ac2e5d1e955f11286e355089fcab3047c" + +[[package]] +name = "atspi" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be534b16650e35237bb1ed189ba2aab86ce65e88cc84c66f4935ba38575cecbf" +dependencies = [ + "atspi-common", + "atspi-connection", + "atspi-proxies", +] + +[[package]] +name = "atspi-common" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1909ed2dc01d0a17505d89311d192518507e8a056a48148e3598fef5e7bb6ba7" +dependencies = [ + "enumflags2", + "serde", + "static_assertions", + "zbus", + "zbus-lockstep", + "zbus-lockstep-macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "atspi-connection" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "430c5960624a4baaa511c9c0fcc2218e3b58f5dbcc47e6190cafee344b873333" +dependencies = [ + "atspi-common", + "atspi-proxies", + "futures-lite", + "zbus", +] + +[[package]] +name = "atspi-proxies" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e6c5de3e524cf967569722446bcd458d5032348554d9a17d7d72b041ab7496" +dependencies = [ + "atspi-common", + "serde", + "zbus", + "zvariant", +] + [[package]] name = "autocfg" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +[[package]] +name = "av1-grain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98922d6a4cfbcb08820c69d8eeccc05bb1f29bfa06b4f5b1dbfe9a868bd7608e" +dependencies = [ + "arrayvec", +] + [[package]] name = "backtrace" version = "0.3.74" @@ -56,7 +619,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" dependencies = [ "addr2line", - "cfg-if", + "cfg-if 1.0.0", "libc", "miniz_oxide", "object", @@ -64,17 +627,117 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + [[package]] name = "base64" version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bit_field" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" + +[[package]] +name = "bitfield" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d7e60934ceec538daadb9d8432424ed043a904d8e0243f3c6446bce549a46ac" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" +dependencies = [ + "serde", +] + +[[package]] +name = "bitstream-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2 0.5.2", +] + +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "built" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ed6191a7e78c36abdb16ab65341eefd73d64d303fffccdbb00d51e4205967b" [[package]] name = "bumpalo" @@ -82,18 +745,107 @@ version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +[[package]] +name = "bytecount" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" + +[[package]] +name = "bytemuck" +version = "1.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "byteorder" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "bytes" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +[[package]] +name = "calloop" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" +dependencies = [ + "bitflags 2.9.0", + "log", + "polling", + "rustix 0.38.44", + "slab", + "thiserror 1.0.69", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" +dependencies = [ + "calloop", + "rustix 0.38.44", + "wayland-backend", + "wayland-client", +] + +[[package]] +name = "camino" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", +] + [[package]] name = "cc" version = "1.2.20" @@ -105,6 +857,28 @@ dependencies = [ "shlex", ] +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + [[package]] name = "cfg-if" version = "1.0.0" @@ -112,23 +886,93 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "clang" -version = "2.0.0" +name = "cfg_aliases" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c044c781163c001b913cd018fc95a628c50d0d2dfea8bca77dad71edb16e37" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "cgl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" dependencies = [ - "clang-sys", "libc", ] [[package]] -name = "clang-sys" -version = "1.8.1" +name = "chrono" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" dependencies = [ - "glob", - "libc", + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "clipboard-win" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" +dependencies = [ + "error-code", +] + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + +[[package]] +name = "codespan-reporting" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" +dependencies = [ + "serde", + "termcolor", + "unicode-width", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", ] [[package]] @@ -141,12 +985,177 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cursor-icon" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" + +[[package]] +name = "dialog" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736bab36d647d14c985725a57a4110a1182c6852104536cd42f1c97e96d29bf0" +dependencies = [ + "dirs", + "rpassword", +] + +[[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 = "dirs" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3" +dependencies = [ + "cfg-if 0.1.10", + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi 0.3.9", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.9.0", + "objc2 0.6.1", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -155,22 +1164,318 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] -name = "dunce" -version = "1.0.5" +name = "dlib" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading", +] [[package]] -name = "encoding_rs" -version = "0.8.35" +name = "document-features" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" dependencies = [ - "cfg-if", + "litrs", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" + +[[package]] +name = "ecolor" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc4feb366740ded31a004a0e4452fbf84e80ef432ecf8314c485210229672fd1" +dependencies = [ + "bytemuck", + "emath 0.31.1", + "serde", +] + +[[package]] +name = "eframe" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0dfe0859f3fb1bc6424c57d41e10e9093fe938f426b691e42272c2f336d915c" +dependencies = [ + "ahash 0.8.11", + "bytemuck", + "document-features", + "egui 0.31.1", + "egui-wgpu", + "egui-winit", + "egui_glow", + "glow", + "glutin", + "glutin-winit", + "home", + "image", + "js-sys", + "log", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", + "parking_lot", + "percent-encoding", + "profiling", + "raw-window-handle", + "ron", + "serde", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "web-time", + "winapi 0.3.9", + "windows-sys 0.59.0", + "winit", +] + +[[package]] +name = "egui" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a3cd1d47e12f7a17912595241622e373aa652a4e0fa90b3f9278f90a64aedf7" +dependencies = [ + "ahash 0.7.8", + "epaint 0.17.0", + "nohash-hasher", +] + +[[package]] +name = "egui" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25dd34cec49ab55d85ebf70139cb1ccd29c977ef6b6ba4fe85489d6877ee9ef3" +dependencies = [ + "accesskit", + "ahash 0.8.11", + "backtrace", + "bitflags 2.9.0", + "emath 0.31.1", + "epaint 0.31.1", + "log", + "nohash-hasher", + "profiling", + "ron", + "serde", +] + +[[package]] +name = "egui-snarl" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33f9d0444c82253d14d968342581af59d2519325381ea21d8e258c0af18a1422" +dependencies = [ + "egui 0.31.1", + "serde", + "slab", +] + +[[package]] +name = "egui-wgpu" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d319dfef570f699b6e9114e235e862a2ddcf75f0d1a061de9e1328d92146d820" +dependencies = [ + "ahash 0.8.11", + "bytemuck", + "document-features", + "egui 0.31.1", + "epaint 0.31.1", + "log", + "profiling", + "thiserror 1.0.69", + "type-map", + "web-time", + "wgpu 24.0.3", + "winit", +] + +[[package]] +name = "egui-winit" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d9dfbb78fe4eb9c3a39ad528b90ee5915c252e77bbab9d4ebc576541ab67e13" +dependencies = [ + "accesskit_winit", + "ahash 0.8.11", + "arboard", + "bytemuck", + "egui 0.31.1", + "log", + "profiling", + "raw-window-handle", + "serde", + "smithay-clipboard", + "web-time", + "webbrowser", + "winit", +] + +[[package]] +name = "egui_glow" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "910906e3f042ea6d2378ec12a6fd07698e14ddae68aed2d819ffe944a73aab9e" +dependencies = [ + "ahash 0.8.11", + "bytemuck", + "egui 0.31.1", + "glow", + "log", + "memoffset", + "profiling", + "wasm-bindgen", + "web-sys", + "winit", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "emath" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a977a80456be58a2c2d48e69c1d0baadef46cecef5a0c98df141c468da006f12" + +[[package]] +name = "emath" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e4cadcff7a5353ba72b7fea76bf2122b5ebdbc68e8155aa56dfdea90083fe1b" +dependencies = [ + "bytemuck", + "serde", +] + +[[package]] +name = "endi" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" + +[[package]] +name = "enumflags2" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "enumn" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "env_filter" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "jiff", + "log", +] + +[[package]] +name = "epaint" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "033292846059f08e03a71e1b5db2ee6ab7c9622c3b48da21f4bd13258ebee2db" +dependencies = [ + "ab_glyph", + "ahash 0.7.8", + "atomic_refcell", + "emath 0.17.0", + "nohash-hasher", +] + +[[package]] +name = "epaint" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fcc0f5a7c613afd2dee5e4b30c3e6acafb8ad6f0edb06068811f708a67c562" +dependencies = [ + "ab_glyph", + "ahash 0.8.11", + "bytemuck", + "ecolor", + "emath 0.31.1", + "epaint_default_fonts", + "log", + "nohash-hasher", + "parking_lot", + "profiling", + "serde", +] + +[[package]] +name = "epaint_default_fonts" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7e7a64c02cf7a5b51e745a9e45f60660a286f151c238b9d397b3e923f5082f" + +[[package]] +name = "epi" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c95445deccef4d29fa30488d3f7f2e942dd343eef01228becc7cefd5b918176e" +dependencies = [ + "egui 0.17.0", + "tracing", ] [[package]] @@ -179,6 +1484,16 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +[[package]] +name = "erased-serde" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e004d887f51fcb9fef17317a2f3525c887d8aa3f4f50fed920816a688284a5b7" +dependencies = [ + "serde", + "typeid", +] + [[package]] name = "errno" version = "0.3.11" @@ -189,12 +1504,88 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "error-chain" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" +dependencies = [ + "version_check", +] + +[[package]] +name = "error-code" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" + +[[package]] +name = "event-listener" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "exr" +version = "1.73.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" +dependencies = [ + "bit_field", + "half", + "lebe", + "miniz_oxide", + "rayon-core", + "smallvec", + "zune-inflate", +] + [[package]] name = "fastrand" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "flate2" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "float-ord" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bad48618fdb549078c333a7a8528acb57af271d0433bdecd523eb620628364e" + [[package]] name = "fnv" version = "1.0.7" @@ -202,19 +1593,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] -name = "foreign-types" -version = "0.3.2" +name = "foldhash" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" dependencies = [ + "foreign-types-macros", "foreign-types-shared", ] [[package]] -name = "foreign-types-shared" -version = "0.1.1" +name = "foreign-types-macros" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" [[package]] name = "form_urlencoded" @@ -225,16 +1634,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - [[package]] name = "futures-core" version = "0.3.31" @@ -247,6 +1646,30 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +[[package]] +name = "futures-lite" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "futures-sink" version = "0.3.31" @@ -267,6 +1690,7 @@ checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ "futures-core", "futures-io", + "futures-macro", "futures-sink", "futures-task", "memchr", @@ -275,13 +1699,33 @@ dependencies = [ "slab", ] +[[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 = "gethostname" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" +dependencies = [ + "libc", + "windows-targets 0.48.5", +] + [[package]] name = "getrandom" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "wasi 0.11.0+wasi-snapshot-preview1", ] @@ -292,18 +1736,45 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "libc", "r-efi", "wasi 0.14.2+wasi-0.2.4", ] +[[package]] +name = "gif" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +dependencies = [ + "color_quant", + "weezl", +] + [[package]] name = "gimli" version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glam" +version = "0.30.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b46b9ca4690308844c644e7c634d68792467260e051c8543e0c7871662b3ba7" + [[package]] name = "glob" version = "0.3.2" @@ -311,22 +1782,143 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" [[package]] -name = "h2" -version = "0.4.9" +name = "glow" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75249d144030531f8dee69fe9cea04d3edf809a017ae445e2abdff6629e86633" +checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glutin" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12124de845cacfebedff80e877bb37b5b75c34c5a4c89e47e1cdd67fb6041325" +dependencies = [ + "bitflags 2.9.0", + "cfg_aliases", + "cgl", + "dispatch2", + "glutin_egl_sys", + "glutin_glx_sys", + "glutin_wgl_sys", + "libloading", + "objc2 0.6.1", + "objc2-app-kit 0.3.1", + "objc2-core-foundation", + "objc2-foundation 0.3.1", + "once_cell", + "raw-window-handle", + "wayland-sys", + "windows-sys 0.52.0", + "x11-dl", +] + +[[package]] +name = "glutin-winit" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85edca7075f8fc728f28cb8fbb111a96c3b89e930574369e3e9c27eb75d3788f" +dependencies = [ + "cfg_aliases", + "glutin", + "raw-window-handle", + "winit", +] + +[[package]] +name = "glutin_egl_sys" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c4680ba6195f424febdc3ba46e7a42a0e58743f2edb115297b86d7f8ecc02d2" +dependencies = [ + "gl_generator", + "windows-sys 0.52.0", +] + +[[package]] +name = "glutin_glx_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7bb2938045a88b612499fbcba375a77198e01306f52272e692f8c1f3751185" +dependencies = [ + "gl_generator", + "x11-dl", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "gpu-alloc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" +dependencies = [ + "bitflags 2.9.0", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "gpu-allocator" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" +dependencies = [ + "log", + "presser", + "thiserror 1.0.69", + "windows", +] + +[[package]] +name = "gpu-descriptor" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf29e94d6d243368b7a56caa16bc213e4f9f8ed38c4d9557069527b5d5281ca" +dependencies = [ + "bitflags 2.9.0", + "gpu-descriptor-types", + "hashbrown", +] + +[[package]] +name = "gpu-descriptor-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "half" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" +dependencies = [ + "cfg-if 1.0.0", + "crunchy", + "num-traits", ] [[package]] @@ -334,6 +1926,42 @@ name = "hashbrown" version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "foldhash", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + +[[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] [[package]] name = "http" @@ -346,29 +1974,6 @@ dependencies = [ "itoa", ] -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - [[package]] name = "httparse" version = "1.10.1" @@ -376,76 +1981,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] -name = "hyper" -version = "1.6.0" +name = "iana-time-zone" +version = "0.1.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", ] [[package]] -name = "hyper-rustls" -version = "0.27.5" +name = "iana-time-zone-haiku" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ - "futures-util", - "http", - "hyper", - "hyper-util", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "libc", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", + "cc", ] [[package]] @@ -563,7 +2119,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -587,6 +2143,54 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "image" +version = "0.25.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a" +dependencies = [ + "bytemuck", + "byteorder-lite", + "color_quant", + "exr", + "gif", + "image-webp", + "num-traits", + "png", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b77d01e822461baa8409e156015a1d91735549f0f2c17691bd2d996bef238f7f" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imgref" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0263a3d970d5c054ed9312c0057b4f3bde9c0b33836d3637361d4a9e6e7a408" + +[[package]] +name = "immutable-chunkmap" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f97096f508d54f8f8ab8957862eee2ccd628847b6217af1a335e1c44dee578" +dependencies = [ + "arrayvec", +] + [[package]] name = "indexmap" version = "2.9.0" @@ -598,10 +2202,48 @@ dependencies = [ ] [[package]] -name = "ipnet" -version = "2.11.0" +name = "interpolate_name" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "inventory" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab08d7cd2c5897f2c949e5383ea7c7db03fb19130ffcfbf7eda795137ae3cb83" +dependencies = [ + "rustversion", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] [[package]] name = "itoa" @@ -609,6 +2251,52 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +[[package]] +name = "jiff" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f02000660d30638906021176af16b17498bd0d12813dbfe7b276d8bc7f3c0806" +dependencies = [ + "jiff-static", + "log", + "portable-atomic", + "portable-atomic-util", + "serde", +] + +[[package]] +name = "jiff-static" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c30758ddd7188629c6713fc45d1188af4f44c90582311d0c8d8c9907f60c48" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if 1.0.0", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + [[package]] name = "jobserver" version = "0.1.33" @@ -619,6 +2307,12 @@ dependencies = [ "libc", ] +[[package]] +name = "jpeg-decoder" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" + [[package]] name = "js-sys" version = "0.3.77" @@ -629,12 +2323,135 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + +[[package]] +name = "khronos-egl" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" +dependencies = [ + "libc", + "libloading", + "pkg-config", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[package]] +name = "las" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc1269d29c76146444ebfef86b78644e5507a5c7a98bc8fb4e60ddf255044ad7" +dependencies = [ + "byteorder", + "chrono", + "laz 0.9.3", + "log", + "num-traits", + "thiserror 1.0.69", + "uuid", +] + +[[package]] +name = "laz" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b25725927b0a5a0d86c12a18dac2c11ecb8caca47d37bc45b77a187d8f28dd21" +dependencies = [ + "byteorder", + "num-traits", +] + +[[package]] +name = "laz" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e9be1582ff02cb56b08a4d273cc5f77eacd89d33a0c682ede9d0912e1c17773" +dependencies = [ + "byteorder", + "num-traits", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lebe" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" + [[package]] name = "libc" version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +[[package]] +name = "libfuzzer-sys" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" +dependencies = [ + "arbitrary", + "cc", +] + +[[package]] +name = "libloading" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +dependencies = [ + "cfg-if 1.0.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.9.0", + "libc", + "redox_syscall 0.5.12", +] + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + [[package]] name = "linux-raw-sys" version = "0.9.4" @@ -647,12 +2464,46 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" +[[package]] +name = "litrs" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + [[package]] name = "log" version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + [[package]] name = "matrixmultiply" version = "0.3.9" @@ -663,6 +2514,16 @@ dependencies = [ "rawpointer", ] +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if 1.0.0", + "rayon", +] + [[package]] name = "memchr" version = "2.7.4" @@ -670,10 +2531,52 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] -name = "mime" -version = "0.3.17" +name = "memmap2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +checksum = "f49388d20533534cd19360ad3d6a7dadc885944aa802ba3995040c5ec11288c6" +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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "metal" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f569fb946490b5743ad69813cb19629130ce9374034abe31614a36402d18f99e" +dependencies = [ + "bitflags 2.9.0", + "block", + "core-graphics-types", + "foreign-types", + "log", + "objc", + "paste", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" @@ -682,34 +2585,83 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" dependencies = [ "adler2", + "simd-adler32", ] [[package]] -name = "mio" -version = "1.0.3" +name = "naga" +version = "24.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "e380993072e52eef724eddfcde0ed013b0c023c3f0417336ed041aa9f076994e" dependencies = [ - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", -] - -[[package]] -name = "native-tls" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" -dependencies = [ - "libc", + "arrayvec", + "bit-set", + "bitflags 2.9.0", + "cfg_aliases", + "codespan-reporting 0.11.1", + "hexf-parse", + "indexmap", "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", + "rustc-hash", + "spirv", + "strum", + "termcolor", + "thiserror 2.0.12", + "unicode-xid", +] + +[[package]] +name = "naga" +version = "25.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b977c445f26e49757f9aca3631c3b8b836942cb278d69a92e7b80d3b24da632" +dependencies = [ + "arrayvec", + "bit-set", + "bitflags 2.9.0", + "cfg_aliases", + "codespan-reporting 0.12.0", + "half", + "hashbrown", + "hexf-parse", + "indexmap", + "log", + "num-traits", + "once_cell", + "rustc-hash", + "spirv", + "strum", + "thiserror 2.0.12", + "unicode-ident", +] + +[[package]] +name = "nalgebra" +version = "0.32.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5c17de023a86f59ed79891b2e5d5a94c705dbe904a5b5c9c952ea6221b03e4" +dependencies = [ + "approx", + "bytemuck", + "matrixmultiply", + "nalgebra-macros", + "num-complex", + "num-rational", + "num-traits", + "serde", + "simba", + "typenum", +] + +[[package]] +name = "nalgebra-macros" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", ] [[package]] @@ -727,6 +2679,96 @@ dependencies = [ "rawpointer", ] +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.9.0", + "jni-sys", + "log", + "ndk-sys 0.6.0+11769913", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.5.0+25.2.9519653" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.9.0", + "cfg-if 1.0.0", + "cfg_aliases", + "libc", + "memoffset", +] + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + [[package]] name = "num-complex" version = "0.4.6" @@ -734,6 +2776,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ "num-traits", + "serde", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", ] [[package]] @@ -745,6 +2799,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -752,6 +2817,308 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", +] + +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88c6597e14493ab2e44ce58f2fdecf095a51f12ca57bec060a11c57332520551" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.9.0", + "block2", + "libc", + "objc2 0.5.2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation 0.2.2", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" +dependencies = [ + "bitflags 2.9.0", + "objc2 0.6.1", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation 0.3.1", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +dependencies = [ + "bitflags 2.9.0", + "block2", + "objc2 0.5.2", + "objc2-core-location", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.9.0", + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" +dependencies = [ + "bitflags 2.9.0", + "dispatch2", + "objc2 0.6.1", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" +dependencies = [ + "bitflags 2.9.0", + "dispatch2", + "objc2 0.6.1", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal", +] + +[[package]] +name = "objc2-core-location" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +dependencies = [ + "block2", + "objc2 0.5.2", + "objc2-contacts", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.9.0", + "block2", + "dispatch", + "libc", + "objc2 0.5.2", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" +dependencies = [ + "bitflags 2.9.0", + "objc2 0.6.1", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" +dependencies = [ + "bitflags 2.9.0", + "objc2 0.6.1", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.9.0", + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.9.0", + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal", +] + +[[package]] +name = "objc2-symbols" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +dependencies = [ + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +dependencies = [ + "bitflags 2.9.0", + "block2", + "objc2 0.5.2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-image", + "objc2-core-location", + "objc2-foundation 0.2.2", + "objc2-link-presentation", + "objc2-quartz-core", + "objc2-symbols", + "objc2-uniform-type-identifiers", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-uniform-type-identifiers" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" +dependencies = [ + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.9.0", + "block2", + "objc2 0.5.2", + "objc2-core-location", + "objc2-foundation 0.2.2", ] [[package]] @@ -770,83 +3137,163 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] -name = "opencv" -version = "0.94.4" +name = "orbclient" +version = "0.3.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5455825692ae28d834bd364ba670bd3a33c81f50d451bc69c7eaa4b44ff519f5" +checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" +dependencies = [ + "libredox", +] + +[[package]] +name = "ordered-float" +version = "4.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" dependencies = [ - "cc", - "dunce", - "jobserver", - "libc", "num-traits", - "once_cell", - "opencv-binding-generator", - "pkg-config", - "semver", - "shlex", - "vcpkg", - "windows", ] [[package]] -name = "opencv-binding-generator" -version = "0.96.1" +name = "ordered-stream" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf506b4181ff450774022aac5fca42043379229811396045838c9d9c0540b9bd" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" dependencies = [ - "clang", - "clang-sys", - "dunce", - "once_cell", - "percent-encoding", - "regex", - "shlex", + "futures-core", + "pin-project-lite", ] [[package]] -name = "openssl" -version = "0.10.72" +name = "owned_ttf_parser" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" +checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" dependencies = [ - "bitflags", - "cfg-if", - "foreign-types", + "ttf-parser", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if 1.0.0", "libc", - "once_cell", - "openssl-macros", - "openssl-sys", + "redox_syscall 0.5.12", + "smallvec", + "windows-targets 0.52.6", ] [[package]] -name = "openssl-macros" -version = "0.1.1" +name = "paste" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pasture-core" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c02bd10ab8c2678e35e437a5375e72fb02c651bc55557b8cafe0203c3023ef70" dependencies = [ + "anyhow", + "bytemuck", + "byteorder", + "float-ord", + "itertools 0.10.5", + "lazy_static", + "nalgebra", + "num-traits", + "pasture-derive", + "rayon", + "static_assertions", + "uuid", +] + +[[package]] +name = "pasture-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a94e8b8d76fdd50f66d24bb27a16609672526b7cd32b70b96fabdfca3faffe8" +dependencies = [ + "anyhow", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "pasture-io" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1549a18a77860548819d3614ed7838eab23a8632659f4e6451bc063f17fe4e5" +dependencies = [ + "anyhow", + "array-init", + "bincode", + "bitfield", + "bytemuck", + "byteorder", + "chrono", + "float-ord", + "itertools 0.10.5", + "las", + "laz 0.8.3", + "lazy_static", + "memmap2 0.7.1", + "nalgebra", + "num-traits", + "pasture-core", + "pasture-derive", + "scopeguard", + "serde", + "serde_json", + "static_assertions", +] + +[[package]] +name = "peg" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f76678828272f177ac33b7e2ac2e3e73cc6c1cd1e3e387928aa69562fa51367" +dependencies = [ + "peg-macros", + "peg-runtime", +] + +[[package]] +name = "peg-macros" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "636d60acf97633e48d266d7415a9355d4389cea327a193f87df395d88cd2b14d" +dependencies = [ + "peg-runtime", "proc-macro2", "quote", - "syn", ] [[package]] -name = "openssl-probe" -version = "0.1.6" +name = "peg-runtime" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-sys" -version = "0.9.107" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] +checksum = "9555b1514d2d99d78150d3c799d4c357a3e2c2a8062cd108e93a06d9057629c5" [[package]] name = "percent-encoding" @@ -854,6 +3301,26 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "pin-project-lite" version = "0.2.16" @@ -866,12 +3333,63 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + [[package]] name = "pkg-config" version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +[[package]] +name = "ply-rs" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbadf9cb4a79d516de4c64806fe64ffbd8161d1ac685d000be789fb628b88963" +dependencies = [ + "byteorder", + "linked-hash-map", + "peg", + "skeptic", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +dependencies = [ + "cfg-if 1.0.0", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix 0.38.44", + "tracing", + "windows-sys 0.59.0", +] + [[package]] name = "portable-atomic" version = "1.11.0" @@ -887,6 +3405,30 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy 0.8.25", +] + +[[package]] +name = "presser" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" + +[[package]] +name = "proc-macro-crate" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +dependencies = [ + "toml_edit", +] + [[package]] name = "proc-macro2" version = "1.0.95" @@ -896,6 +3438,70 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "profiling" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afbdc74edc00b6f6a218ca6a5364d6226a259d4b8ea1af4a0ea063f27e179f4d" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65f2e60fbf1063868558d69c6beacf412dc755f9fc020f514b7955fc914fe30" +dependencies = [ + "quote", + "syn 2.0.101", +] + +[[package]] +name = "pulldown-cmark" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" +dependencies = [ + "bitflags 2.9.0", + "memchr", + "unicase", +] + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + +[[package]] +name = "quick-xml" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quick-xml" +version = "0.37.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" +dependencies = [ + "memchr", +] + [[package]] name = "quote" version = "1.0.40" @@ -911,12 +3517,182 @@ version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.2", +] + +[[package]] +name = "range-alloc" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d6831663a5098ea164f89cff59c6284e95f4e3c76ce9848d4529f5ccca9bde" + +[[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av1-grain", + "bitstream-io", + "built", + "cfg-if 1.0.0", + "interpolate_name", + "itertools 0.12.1", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand 0.8.5", + "rand_chacha 0.3.1", + "simd_helpers", + "system-deps", + "thiserror 1.0.69", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6a5f31fcf7500f9401fea858ea4ab5525c99f2322cfcee732c0e6c74208c0c6" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + [[package]] name = "rawpointer" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror 1.0.69", +] + [[package]] name = "regex" version = "1.11.1" @@ -947,49 +3723,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] -name = "reqwest" -version = "0.12.15" +name = "renderdoc-sys" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" -dependencies = [ - "base64", - "bytes", - "encoding_rs", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-tls", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "system-configuration", - "tokio", - "tokio-native-tls", - "tower", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "windows-registry", -] +checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" + +[[package]] +name = "rgb" +version = "0.8.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" [[package]] name = "ring" @@ -998,29 +3741,71 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ "cc", - "cfg-if", + "cfg-if 1.0.0", "getrandom 0.2.16", "libc", "untrusted", "windows-sys 0.52.0", ] +[[package]] +name = "ron" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" +dependencies = [ + "base64 0.21.7", + "bitflags 2.9.0", + "serde", + "serde_derive", +] + +[[package]] +name = "rpassword" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d37473170aedbe66ffa3ad3726939ba677d83c646ad4fd99e5b4bc38712f45ec" +dependencies = [ + "kernel32-sys", + "libc", + "winapi 0.2.8", +] + [[package]] name = "rustc-demangle" version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.9.0", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + [[package]] name = "rustix" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" dependencies = [ - "bitflags", + "bitflags 2.9.0", "errno", "libc", - "linux-raw-sys", + "linux-raw-sys 0.9.4", "windows-sys 0.59.0", ] @@ -1030,7 +3815,9 @@ version = "0.23.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0" dependencies = [ + "log", "once_cell", + "ring", "rustls-pki-types", "rustls-webpki", "subtle", @@ -1076,35 +3863,46 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] -name = "schannel" -version = "0.1.27" +name = "safe_arch" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323" dependencies = [ - "windows-sys 0.59.0", + "bytemuck", ] [[package]] -name = "security-framework" -version = "2.11.1" +name = "same-file" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" dependencies = [ - "bitflags", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", + "winapi-util", ] [[package]] -name = "security-framework-sys" -version = "2.14.0" +name = "scoped-tls" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sctk-adwaita" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" dependencies = [ - "core-foundation-sys", - "libc", + "ab_glyph", + "log", + "memmap2 0.9.5", + "smithay-client-toolkit", + "tiny-skia", ] [[package]] @@ -1112,6 +3910,9 @@ name = "semver" version = "1.0.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +dependencies = [ + "serde", +] [[package]] name = "serde" @@ -1130,7 +3931,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -1146,23 +3947,94 @@ dependencies = [ ] [[package]] -name = "serde_urlencoded" -version = "0.7.1" +name = "serde_repr" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ - "form_urlencoded", - "itoa", - "ryu", "serde", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if 1.0.0", + "cpufeatures", + "digest", +] + [[package]] name = "shlex" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signal-hook-registry" +version = "1.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +dependencies = [ + "libc", +] + +[[package]] +name = "simba" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae" +dependencies = [ + "approx", + "num-complex", + "num-traits", + "paste", + "wide", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + +[[package]] +name = "skeptic" +version = "0.13.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d23b015676c90a0f01c197bfdc786c20342c73a0afdda9025adb0bc42940a8" +dependencies = [ + "bytecount", + "cargo_metadata", + "error-chain", + "glob", + "pulldown-cmark", + "tempfile", + "walkdir", +] + [[package]] name = "slab" version = "0.4.9" @@ -1170,6 +4042,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", + "serde", +] + +[[package]] +name = "slotmap" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +dependencies = [ + "version_check", ] [[package]] @@ -1179,13 +4061,57 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" [[package]] -name = "socket2" -version = "0.5.9" +name = "smithay-client-toolkit" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" +dependencies = [ + "bitflags 2.9.0", + "calloop", + "calloop-wayland-source", + "cursor-icon", + "libc", + "log", + "memmap2 0.9.5", + "rustix 0.38.44", + "thiserror 1.0.69", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", +] + +[[package]] +name = "smithay-clipboard" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc8216eec463674a0e90f29e0ae41a4db573ec5b56b1c6c1c71615d249b6d846" dependencies = [ "libc", - "windows-sys 0.52.0", + "smithay-client-toolkit", + "wayland-backend", +] + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] + +[[package]] +name = "spirv" +version = "0.3.0+sdk-1.3.268.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" +dependencies = [ + "bitflags 2.9.0", ] [[package]] @@ -1194,6 +4120,40 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.101", +] + [[package]] name = "subtle" version = "2.6.1" @@ -1202,9 +4162,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.100" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", @@ -1212,12 +4172,14 @@ dependencies = [ ] [[package]] -name = "sync_wrapper" -version = "1.0.2" +name = "syn" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ - "futures-core", + "proc-macro2", + "quote", + "unicode-ident", ] [[package]] @@ -1228,29 +4190,27 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] -name = "system-configuration" -version = "0.6.1" +name = "system-deps" +version = "6.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" dependencies = [ - "bitflags", - "core-foundation", - "system-configuration-sys", + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare", ] [[package]] -name = "system-configuration-sys" -version = "0.6.0" +name = "target-lexicon" +version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", -] +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tempfile" @@ -1261,10 +4221,95 @@ dependencies = [ "fastrand", "getrandom 0.3.2", "once_cell", - "rustix", + "rustix 1.0.5", "windows-sys 0.59.0", ] +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + +[[package]] +name = "tiny-skia" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if 1.0.0", + "log", + "tiny-skia-path", +] + +[[package]] +name = "tiny-skia-path" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + [[package]] name = "tinystr" version = "0.7.6" @@ -1276,80 +4321,39 @@ dependencies = [ ] [[package]] -name = "tokio" -version = "1.44.2" +name = "toml" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" +checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "pin-project-lite", - "socket2", - "windows-sys 0.52.0", + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", ] [[package]] -name = "tokio-native-tls" -version = "0.3.1" +name = "toml_datetime" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" dependencies = [ - "native-tls", - "tokio", + "serde", ] [[package]] -name = "tokio-rustls" -version = "0.26.2" +name = "toml_edit" +version = "0.22.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ - "rustls", - "tokio", + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", ] -[[package]] -name = "tokio-util" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tower" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - [[package]] name = "tracing" version = "0.1.41" @@ -1357,9 +4361,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "tracing-core" version = "0.1.33" @@ -1370,10 +4386,72 @@ dependencies = [ ] [[package]] -name = "try-lock" -version = "0.2.5" +name = "ttf-parser" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" + +[[package]] +name = "type-map" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deb68604048ff8fa93347f02441e4487594adc20bb8a084f9e564d2b827a0a9f" +dependencies = [ + "rustc-hash", +] + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "typetag" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f22b40dd7bfe8c14230cf9702081366421890435b2d625fa92b4acc4c3de6f" +dependencies = [ + "erased-serde", + "inventory", + "once_cell", + "serde", + "typetag-impl", +] + +[[package]] +name = "typetag-impl" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35f5380909ffc31b4de4f4bdf96b877175a016aa2ca98cee39fcfd8c4d53d952" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "uds_windows" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +dependencies = [ + "memoffset", + "tempfile", + "winapi 0.3.9", +] + +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" @@ -1381,12 +4459,60 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + [[package]] name = "untrusted" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +[[package]] +name = "ureq" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7a3e9af6113ecd57b8c63d3cd76a385b2e3881365f1f489e54f49801d0c83ea" +dependencies = [ + "base64 0.22.1", + "flate2", + "log", + "percent-encoding", + "rustls", + "rustls-pemfile", + "rustls-pki-types", + "ureq-proto", + "utf-8", + "webpki-roots 0.26.11", +] + +[[package]] +name = "ureq-proto" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fadf18427d33828c311234884b7ba2afb57143e6e7e69fda7ee883b624661e36" +dependencies = [ + "base64 0.22.1", + "http", + "httparse", + "log", +] + [[package]] name = "url" version = "2.5.4" @@ -1398,6 +4524,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + [[package]] name = "utf16_iter" version = "1.0.5" @@ -1411,18 +4543,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] -name = "vcpkg" -version = "0.2.15" +name = "utf8parse" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] -name = "want" -version = "0.3.1" +name = "uuid" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" + +[[package]] +name = "v_frame" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" dependencies = [ - "try-lock", + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", ] [[package]] @@ -1446,7 +4608,7 @@ version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "once_cell", "rustversion", "wasm-bindgen-macro", @@ -1462,7 +4624,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn", + "syn 2.0.101", "wasm-bindgen-shared", ] @@ -1472,7 +4634,7 @@ version = "0.4.50" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "js-sys", "once_cell", "wasm-bindgen", @@ -1497,7 +4659,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1511,6 +4673,115 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "wayland-backend" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe770181423e5fc79d3e2a7f4410b7799d5aab1de4372853de3c6aa13ca24121" +dependencies = [ + "cc", + "downcast-rs", + "rustix 0.38.44", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978fa7c67b0847dbd6a9f350ca2569174974cd4082737054dbb7fbb79d7d9a61" +dependencies = [ + "bitflags 2.9.0", + "rustix 0.38.44", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-csd-frame" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" +dependencies = [ + "bitflags 2.9.0", + "cursor-icon", + "wayland-backend", +] + +[[package]] +name = "wayland-cursor" +version = "0.31.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a65317158dec28d00416cb16705934070aef4f8393353d41126c54264ae0f182" +dependencies = [ + "rustix 0.38.44", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "779075454e1e9a521794fed15886323ea0feda3f8b0fc1390f5398141310422a" +dependencies = [ + "bitflags 2.9.0", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fd38cdad69b56ace413c6bcc1fbf5acc5e2ef4af9d5f8f1f9570c0c83eae175" +dependencies = [ + "bitflags 2.9.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cb6cdc73399c0e06504c437fe3cf886f25568dd5454473d565085b36d6a8bbf" +dependencies = [ + "bitflags 2.9.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "896fdafd5d28145fce7958917d69f2fd44469b1d4e861cb5961bcbeebc6d1484" +dependencies = [ + "proc-macro2", + "quick-xml 0.37.5", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbcebb399c77d5aa9fa5db874806ee7b4eba4e73650948e8f93963f128896615" +dependencies = [ + "dlib", + "log", + "once_cell", + "pkg-config", +] + [[package]] name = "web-sys" version = "0.3.77" @@ -1522,48 +4793,402 @@ dependencies = [ ] [[package]] -name = "windows" -version = "0.59.0" +name = "web-time" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f919aee0a93304be7f62e8e5027811bbba96bcb1de84d6618be56e43f8a32a1" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webbrowser" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5df295f8451142f1856b1bd86a606dfe9587d439bc036e319c827700dbd555e" +dependencies = [ + "core-foundation 0.10.0", + "home", + "jni", + "log", + "ndk-context", + "objc2 0.6.1", + "objc2-foundation 0.3.1", + "url", + "web-sys", +] + +[[package]] +name = "webpki-roots" +version = "0.26.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" +dependencies = [ + "webpki-roots 1.0.0", +] + +[[package]] +name = "webpki-roots" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2853738d1cc4f2da3a225c18ec6c3721abb31961096e9dbf5ab35fa88b19cfdb" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + +[[package]] +name = "wgpu" +version = "24.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35904fb00ba2d2e0a4d002fcbbb6e1b89b574d272a50e5fc95f6e81cf281c245" +dependencies = [ + "arrayvec", + "bitflags 2.9.0", + "cfg_aliases", + "document-features", + "js-sys", + "log", + "parking_lot", + "profiling", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core 24.0.2", + "wgpu-hal 24.0.4", + "wgpu-types 24.0.0", +] + +[[package]] +name = "wgpu" +version = "25.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca6049eb2014a0e0d8689f9b787605dd71d5bbfdc74095ead499f3cff705c229" +dependencies = [ + "arrayvec", + "bitflags 2.9.0", + "cfg_aliases", + "document-features", + "hashbrown", + "js-sys", + "log", + "naga 25.0.1", + "parking_lot", + "portable-atomic", + "profiling", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core 25.0.1", + "wgpu-hal 25.0.1", + "wgpu-types 25.0.0", +] + +[[package]] +name = "wgpu-core" +version = "24.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "671c25545d479b47d3f0a8e373aceb2060b67c6eb841b24ac8c32348151c7a0c" +dependencies = [ + "arrayvec", + "bit-vec", + "bitflags 2.9.0", + "cfg_aliases", + "document-features", + "indexmap", + "log", + "naga 24.0.0", + "once_cell", + "parking_lot", + "profiling", + "raw-window-handle", + "rustc-hash", + "smallvec", + "thiserror 2.0.12", + "wgpu-hal 24.0.4", + "wgpu-types 24.0.0", +] + +[[package]] +name = "wgpu-core" +version = "25.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a19813e647da7aa3cdaa84f5846e2c64114970ea7c86b1e6aae8be08091f4bdc" +dependencies = [ + "arrayvec", + "bit-set", + "bit-vec", + "bitflags 2.9.0", + "cfg_aliases", + "document-features", + "hashbrown", + "indexmap", + "log", + "naga 25.0.1", + "once_cell", + "parking_lot", + "portable-atomic", + "profiling", + "raw-window-handle", + "rustc-hash", + "smallvec", + "thiserror 2.0.12", + "wgpu-core-deps-apple", + "wgpu-core-deps-emscripten", + "wgpu-core-deps-windows-linux-android", + "wgpu-hal 25.0.1", + "wgpu-types 25.0.0", +] + +[[package]] +name = "wgpu-core-deps-apple" +version = "25.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfd488b3239b6b7b185c3b045c39ca6bf8af34467a4c5de4e0b1a564135d093d" +dependencies = [ + "wgpu-hal 25.0.1", +] + +[[package]] +name = "wgpu-core-deps-emscripten" +version = "25.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f09ad7aceb3818e52539acc679f049d3475775586f3f4e311c30165cf2c00445" +dependencies = [ + "wgpu-hal 25.0.1", +] + +[[package]] +name = "wgpu-core-deps-windows-linux-android" +version = "25.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cba5fb5f7f9c98baa7c889d444f63ace25574833df56f5b817985f641af58e46" +dependencies = [ + "wgpu-hal 25.0.1", +] + +[[package]] +name = "wgpu-hal" +version = "24.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f112f464674ca69f3533248508ee30cb84c67cf06c25ff6800685f5e0294e259" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bitflags 2.9.0", + "bytemuck", + "cfg_aliases", + "core-graphics-types", + "glow", + "glutin_wgl_sys", + "gpu-alloc", + "gpu-descriptor", + "js-sys", + "khronos-egl", + "libc", + "libloading", + "log", + "metal", + "naga 24.0.0", + "ndk-sys 0.5.0+25.2.9519653", + "objc", + "once_cell", + "ordered-float", + "parking_lot", + "profiling", + "raw-window-handle", + "renderdoc-sys", + "rustc-hash", + "smallvec", + "thiserror 2.0.12", + "wasm-bindgen", + "web-sys", + "wgpu-types 24.0.0", + "windows", +] + +[[package]] +name = "wgpu-hal" +version = "25.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb7c4a1dc42ff14c23c9b11ebf1ee85cde661a9b1cf0392f79c1faca5bc559fb" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bit-set", + "bitflags 2.9.0", + "block", + "bytemuck", + "cfg-if 1.0.0", + "cfg_aliases", + "core-graphics-types", + "glow", + "glutin_wgl_sys", + "gpu-alloc", + "gpu-allocator", + "gpu-descriptor", + "hashbrown", + "js-sys", + "khronos-egl", + "libc", + "libloading", + "log", + "metal", + "naga 25.0.1", + "ndk-sys 0.5.0+25.2.9519653", + "objc", + "ordered-float", + "parking_lot", + "portable-atomic", + "profiling", + "range-alloc", + "raw-window-handle", + "renderdoc-sys", + "smallvec", + "thiserror 2.0.12", + "wasm-bindgen", + "web-sys", + "wgpu-types 25.0.0", + "windows", + "windows-core", +] + +[[package]] +name = "wgpu-types" +version = "24.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50ac044c0e76c03a0378e7786ac505d010a873665e2d51383dcff8dd227dc69c" +dependencies = [ + "bitflags 2.9.0", + "js-sys", + "log", + "web-sys", +] + +[[package]] +name = "wgpu-types" +version = "25.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aa49460c2a8ee8edba3fca54325540d904dd85b2e086ada762767e17d06e8bc" +dependencies = [ + "bitflags 2.9.0", + "bytemuck", + "js-sys", + "log", + "thiserror 2.0.12", + "web-sys", +] + +[[package]] +name = "wide" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41b5576b9a81633f3e8df296ce0063042a73507636cbe956c61133dd7034ab22" +dependencies = [ + "bytemuck", + "safe_arch", +] + +[[package]] +name = "winapi" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" dependencies = [ "windows-core", - "windows-targets 0.53.0", + "windows-targets 0.52.6", ] [[package]] name = "windows-core" -version = "0.59.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "810ce18ed2112484b0d4e15d022e5f598113e220c53e373fb31e67e21670c1ce" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" dependencies = [ "windows-implement", "windows-interface", "windows-result", "windows-strings", - "windows-targets 0.53.0", + "windows-targets 0.52.6", ] [[package]] name = "windows-implement" -version = "0.59.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83577b051e2f49a058c308f17f273b570a6a758386fc291b5f6a934dd84e48c1" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", ] [[package]] @@ -1572,33 +5197,32 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" -[[package]] -name = "windows-registry" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" -dependencies = [ - "windows-result", - "windows-strings", - "windows-targets 0.53.0", -] - [[package]] name = "windows-result" -version = "0.3.2" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" dependencies = [ - "windows-link", + "windows-targets 0.52.6", ] [[package]] name = "windows-strings" -version = "0.3.1" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" dependencies = [ - "windows-link", + "windows-result", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", ] [[package]] @@ -1619,6 +5243,36 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + [[package]] name = "windows-targets" version = "0.52.6" @@ -1628,7 +5282,7 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", + "windows_i686_gnullvm", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", @@ -1636,20 +5290,16 @@ dependencies = [ ] [[package]] -name = "windows-targets" -version = "0.53.0" +name = "windows_aarch64_gnullvm" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" -dependencies = [ - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", -] +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" @@ -1658,10 +5308,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.0" +name = "windows_aarch64_msvc" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" @@ -1670,10 +5326,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] -name = "windows_aarch64_msvc" -version = "0.53.0" +name = "windows_i686_gnu" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" @@ -1681,12 +5343,6 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" @@ -1694,10 +5350,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] -name = "windows_i686_gnullvm" -version = "0.53.0" +name = "windows_i686_msvc" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" @@ -1706,10 +5368,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] -name = "windows_i686_msvc" -version = "0.53.0" +name = "windows_x86_64_gnu" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" @@ -1718,10 +5386,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] -name = "windows_x86_64_gnu" -version = "0.53.0" +name = "windows_x86_64_gnullvm" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" @@ -1730,10 +5404,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.0" +name = "windows_x86_64_msvc" +version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" @@ -1742,10 +5422,65 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "windows_x86_64_msvc" -version = "0.53.0" +name = "winit" +version = "0.30.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +checksum = "b0d05bd8908e14618c9609471db04007e644fd9cce6529756046cfc577f9155e" +dependencies = [ + "ahash 0.8.11", + "android-activity", + "atomic-waker", + "bitflags 2.9.0", + "block2", + "bytemuck", + "calloop", + "cfg_aliases", + "concurrent-queue", + "core-foundation 0.9.4", + "core-graphics", + "cursor-icon", + "dpi", + "js-sys", + "libc", + "memmap2 0.9.5", + "ndk", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", + "objc2-ui-kit", + "orbclient", + "percent-encoding", + "pin-project", + "raw-window-handle", + "redox_syscall 0.4.1", + "rustix 0.38.44", + "sctk-adwaita", + "smithay-client-toolkit", + "smol_str", + "tracing", + "unicode-segmentation", + "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-plasma", + "web-sys", + "web-time", + "windows-sys 0.52.0", + "x11-dl", + "x11rb", + "xkbcommon-dl", +] + +[[package]] +name = "winnow" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9fb597c990f03753e08d3c29efbfcf2019a003b4bf4ba19225c158e1549f0f3" +dependencies = [ + "memchr", +] [[package]] name = "wit-bindgen-rt" @@ -1753,7 +5488,7 @@ version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" dependencies = [ - "bitflags", + "bitflags 2.9.0", ] [[package]] @@ -1768,6 +5503,79 @@ version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" +dependencies = [ + "as-raw-xcb-connection", + "gethostname", + "libc", + "libloading", + "once_cell", + "rustix 0.38.44", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" + +[[package]] +name = "xcursor" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61" + +[[package]] +name = "xdg-home" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "xkbcommon-dl" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" +dependencies = [ + "bitflags 2.9.0", + "dlib", + "log", + "once_cell", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" + +[[package]] +name = "xml-rs" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a62ce76d9b56901b19a74f19431b0d8b3bc7ca4ad685a746dfd78ca8f4fc6bda" + [[package]] name = "yoke" version = "0.7.5" @@ -1788,10 +5596,149 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", "synstructure", ] +[[package]] +name = "zbus" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" +dependencies = [ + "async-broadcast", + "async-executor", + "async-fs", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-sink", + "futures-util", + "hex", + "nix", + "ordered-stream", + "rand 0.8.5", + "serde", + "serde_repr", + "sha1", + "static_assertions", + "tracing", + "uds_windows", + "windows-sys 0.52.0", + "xdg-home", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus-lockstep" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca2c5dceb099bddaade154055c926bb8ae507a18756ba1d8963fd7b51d8ed1d" +dependencies = [ + "zbus_xml", + "zvariant", +] + +[[package]] +name = "zbus-lockstep-macros" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709ab20fc57cb22af85be7b360239563209258430bccf38d8b979c5a2ae3ecce" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", + "zbus-lockstep", + "zbus_xml", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.101", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" +dependencies = [ + "serde", + "static_assertions", + "zvariant", +] + +[[package]] +name = "zbus_xml" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab3f374552b954f6abb4bd6ce979e6c9b38fb9d0cd7cc68a7d796e70c9f3a233" +dependencies = [ + "quick-xml 0.30.0", + "serde", + "static_assertions", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +dependencies = [ + "zerocopy-derive 0.8.25", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "zerofrom" version = "0.1.6" @@ -1809,7 +5756,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", "synstructure", ] @@ -1838,5 +5785,66 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.101", +] + +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "zune-jpeg" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99a5bab8d7dedf81405c4bb1f2b83ea057643d9cb28778cea9eecddeedd2e028" +dependencies = [ + "zune-core", +] + +[[package]] +name = "zvariant" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" +dependencies = [ + "endi", + "enumflags2", + "serde", + "static_assertions", + "zvariant_derive", +] + +[[package]] +name = "zvariant_derive" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.101", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", ] diff --git a/Cargo.toml b/Cargo.toml index bddd82e..7a94815 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,33 @@ edition = "2024" [dependencies] byteorder = "1.5.0" +crossbeam-channel = "0.5.15" +eframe = { version = "0.31.1", features = [ + "accesskit", # Make egui compatible with screen readers. NOTE: adds a lot of dependencies. + "default_fonts", # Embed the default egui fonts. + "glow", + "persistence", +] } +epi = "0.17.0" +image = "0.25.6" ndarray = "0.16.1" once_cell = "1.21.3" -opencv = "0.94.4" -reqwest = { version = "0.12.15", features = ["blocking"] } +# opencv = "0.94.4" +ureq = "3.0.11" +egui = { version = "0.31.1", features = ["callstack", "default", "log"] } +egui-snarl = { version = "0.7.1", features = ["serde"] } +glam = "0.30.3" +rand = "0.9.1" +serde = { version = "1.0.219", features = ["derive"] } +serde_json = "1.0.140" +syn = "2.0.101" +typetag = "0.2.20" +bytemuck = "1.23.0" +# simple_logger = "5.0.0" +log = "0.4.27" +env_logger = "0.11.8" +ply-rs = "0.1.3" +wgpu = "25.0.0" +dialog = "0.3.0" +pasture-core = "0.5.0" +pasture-io = "0.5.0" diff --git a/pane_layout.json b/pane_layout.json new file mode 100644 index 0000000..47ed2c9 --- /dev/null +++ b/pane_layout.json @@ -0,0 +1,31 @@ +[ + { + "pane": { + "type": "PointRendererPane" + }, + "id": "Point Cloud", + "mode": "Hidden" + }, + { + "pane": { + "type": "PipelinePane", + "snarl": { + "nodes": {}, + "wires": [] + }, + "style": { + "select_rect_contained": null + }, + "snarl_ui_id": null + }, + "id": "Pipeline Pane", + "mode": "Hidden" + }, + { + "pane": { + "type": "CameraPane" + }, + "id": "Raw Camera", + "mode": "Hidden" + } +] \ No newline at end of file diff --git a/python/.gitignore b/python/.gitignore deleted file mode 100644 index 68bc17f..0000000 --- a/python/.gitignore +++ /dev/null @@ -1,160 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# poetry -# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. -# This is especially recommended for binary packages to ensure reproducibility, and is more -# commonly ignored for libraries. -# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control -#poetry.lock - -# pdm -# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. -#pdm.lock -# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it -# in version control. -# https://pdm.fming.dev/#use-with-ide -.pdm.toml - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Cython debug symbols -cython_debug/ - -# PyCharm -# JetBrains specific template is maintained in a separate JetBrains.gitignore that can -# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore -# and can be added to the global gitignore or merged into this file. For a more nuclear -# option (not recommended) you can uncomment the following to ignore the entire idea folder. -#.idea/ diff --git a/python/tof.py b/python/tof.py deleted file mode 100644 index fb04479..0000000 --- a/python/tof.py +++ /dev/null @@ -1,392 +0,0 @@ -import struct -import numpy as np -import cv2 - -#import matplotlib.pyplot as plt -import requests - -import open3d as o3d - -HOST = '192.168.233.1' -PORT = 80 - -# def create_point_cloud_map(width, height, fx, fy, cx, cy): -# """ -# Create mapping arrays for converting depth image to point cloud. - -# Args: -# width, height: Image dimensions -# fx, fy: Focal lengths -# cx, cy: Principal point coordinates - -# Returns: -# x_map, y_map: Arrays that when multiplied by depth give X,Y coordinates -# """ -# # Create pixel coordinate grid -# v, u = np.meshgrid(np.arange(height), np.arange(width), indexing='ij') - -# # Convert to normalized image coordinates -# x_map = (u - cx) / fx -# y_map = (v - cy) / fy - -# return x_map, y_map - -# def depth_to_points(depth_image, x_map, y_map): -# """ -# Convert depth image to point cloud using pre-computed maps. - -# Args: -# depth_image: 2D depth array -# x_map, y_map: Pre-computed coordinate maps - -# Returns: -# points: Nx3 array of XYZ coordinates -# """ -# # Calculate X and Y coordinates -# X = depth_image * x_map -# Y = depth_image * y_map - -# # Stack coordinates into point cloud -# valid_points = depth_image > 0 -# points = np.stack(( -# X[valid_points], -# Y[valid_points], -# depth_image[valid_points] -# ), axis=-1) - -# return points - - - - - -def create_point_cloud_map(width, height, fx, fy, cx, cy): - """ - Create mapping arrays for converting depth image to point cloud. - - Args: - width, height: Image dimensions - fx, fy: Focal lengths - cx, cy: Principal point coordinates - - Returns: - x_map, y_map: Arrays that when multiplied by depth give X,Y coordinates - """ - # Create pixel coordinate grid - v, u = np.meshgrid(np.arange(height), np.arange(width), indexing='ij') - - # Convert to normalized image coordinates - x_map = (u - cx) / fx - y_map = (v - cy) / fy - - return x_map, y_map - -def transform_points(points, translation, rotation=None): - """ - Apply rigid transformation to points. - - Args: - points: Nx3 array of XYZ coordinates - translation: [tx, ty, tz] translation vector - rotation: 3x3 rotation matrix (optional) - - Returns: - transformed_points: Nx3 array of transformed coordinates - """ - if rotation is not None: - points = points @ rotation.T - return points + translation - -def depth_to_colored_points(depth_image, color_image, x_map, y_map, - color_intrinsics, depth_to_color_translation, - depth_to_color_rotation=None): - """ - Convert depth image to colored point cloud using pre-computed maps. - - Args: - depth_image: 2D depth array - color_image: RGB image array (height, width, 3) - x_map, y_map: Pre-computed coordinate maps for depth camera - color_intrinsics: (fx, fy, cx, cy) for RGB camera - depth_to_color_translation: [tx, ty, tz] from depth to color camera - depth_to_color_rotation: 3x3 rotation matrix (optional) - - Returns: - points: Nx3 array of XYZ coordinates - colors: Nx3 array of RGB values - """ - # Calculate initial point cloud from depth - valid_points = depth_image > 0 - X = depth_image * x_map - Y = depth_image * y_map - - points = np.stack(( - X[valid_points], - Y[valid_points], - depth_image[valid_points] - ), axis=-1) - - # Transform points to color camera coordinate system - transformed_points = transform_points( - points, - depth_to_color_translation, - depth_to_color_rotation - ) - - # Project points into color image - fx, fy, cx, cy = color_intrinsics - u = (transformed_points[:, 0] * fx / transformed_points[:, 2] + cx).astype(int) - v = (transformed_points[:, 1] * fy / transformed_points[:, 2] + cy).astype(int) - - # Filter points that project outside image bounds - height, width = color_image.shape[:2] - valid_uvs = (u >= 0) & (u < width) & (v >= 0) & (v < height) - - # Sample colors from valid projections - colors = np.zeros((len(points), 3), dtype=np.uint8) - colors[valid_uvs] = color_image[v[valid_uvs], u[valid_uvs]] - - return points[valid_uvs], colors[valid_uvs] - -def depth_to_points(depth_image, x_map, y_map): - """ - Convert depth image to point cloud using pre-computed maps. - - Args: - depth_image: 2D depth array - x_map, y_map: Pre-computed coordinate maps - - Returns: - points: Nx3 array of XYZ coordinates - """ - # Calculate X and Y coordinates - X = depth_image * x_map - Y = depth_image * y_map - - # Stack coordinates into point cloud - valid_points = depth_image > 0 - points = np.stack(( - X[valid_points], - Y[valid_points], - depth_image[valid_points] - ), axis=-1) - - return points - - - - - - - -def get_frame_from_http(host=HOST, port=PORT): - r = requests.get('http://{}:{}/getdeep'.format(host, port)) - if(r.status_code == requests.codes.ok): - print('Get deep image') - deepimg = r.content - print('Length={}'.format(len(deepimg))) - (frameid, stamp_msec) = struct.unpack('> with_config[1] - deepth_img = struct.unpack("<%us" % deepth_size, frame_payload[:deepth_size])[ - 0] if 0 != deepth_size else None - frame_payload = frame_payload[deepth_size:] - - # 0:16bit 1:8bit, resolution: 320*240 - ir_size = (320*240*2) >> with_config[3] - ir_img = struct.unpack("<%us" % ir_size, frame_payload[:ir_size])[ - 0] if 0 != ir_size else None - frame_payload = frame_payload[ir_size:] - - status_size = (320*240//8) * (16 if 0 == with_config[4] else - 2 if 1 == with_config[4] else 8 if 2 == with_config[4] else 1) - status_img = struct.unpack("<%us" % status_size, frame_payload[:status_size])[ - 0] if 0 != status_size else None - frame_payload = frame_payload[status_size:] - - assert(deep_data_size == deepth_size+ir_size+status_size) - - rgb_size = len(frame_payload) - assert(rgb_data_size == rgb_size) - rgb_img = struct.unpack("<%us" % rgb_size, frame_payload[:rgb_size])[ - 0] if 0 != rgb_size else None - - if (not rgb_img is None): - if (1 == with_config[6]): - jpeg = cv2.imdecode(np.frombuffer( - rgb_img, 'uint8', rgb_size), cv2.IMREAD_COLOR) - if not jpeg is None: - rgb = cv2.cvtColor(jpeg, cv2.COLOR_BGR2RGB) - rgb_img = rgb.tobytes() - else: - rgb_img = None - # elif 0 == with_config[6]: - # yuv = np.frombuffer(rgb_img, 'uint8', rgb_size) - # print(len(yuv)) - # if not yuv is None: - # rgb = cv2.cvtColor(yuv, cv2.COLOR_YUV420P2RGB) - # rgb_img = rgb.tobytes() - # else: - # rgb_img = None - - return (deepth_img, ir_img, status_img, rgb_img) - -prev_status = None - -def show_frame(frame_data: bytes): - global prev_status - config = frame_config_decode(frame_data[16:16+12]) - frame_bytes = frame_payload_decode(frame_data[16+12:], config) - - depth = np.frombuffer(frame_bytes[0], 'uint16' if 0 == config[1] else 'uint8').reshape( - 240, 320) if frame_bytes[0] else None - - ir = np.frombuffer(frame_bytes[1], 'uint16' if 0 == config[3] else 'uint8').reshape( - 240, 320) if frame_bytes[1] else None - - status = np.frombuffer(frame_bytes[2], 'uint16' if 0 == config[4] else 'uint8').reshape( - 240, 320) if frame_bytes[2] else None - - rgb = np.frombuffer(frame_bytes[3], 'uint8').reshape( - (480, 640, 3) if config[6] == 1 else (600, 800, 3)) if frame_bytes[3] else None - - if not (depth is None or status is None or rgb is None): - if prev_status is None: - mask = (status==0) - else: - mask = (status==0)*(prev_status==0) - - linear_mask = mask.reshape((-1)) - # delete = np.where(1-linear_mask)) - - # depth_frame = (depth*mask)/1000 - depth_frame = (depth)/1000 - blurred = cv2.GaussianBlur(depth_frame,(3,3),1.0) - # depth_frame = cv2.addWeighted(depth_frame, 2.5, blurred, -1, 0) - - prev_status = status - points = depth_to_points(depth_frame, x_map, y_map) - points = points[linear_mask] - - colors = cv2.resize(rgb, (320, 240)) - # cv2.imshow("color", mask) - - - - # colors = (np.stack((depth_frame,) * 3, axis=-1)).reshape((-1, 3)).astype(np.float64) / 255.0 - colors = colors.reshape((-1, 3)).astype(np.float64) / 255.0 - # colors *= linear_mask - # colors = colors[:-(colors.shape[0]-points.shape[0])] - # colors = np.delete(colors, delete, axis = 0) - colors = colors[linear_mask] - - # print(np.where(points)) - - # print(colors_e.shape) - - - - return depth_frame, points, colors - return None, None, None - - -# create visualizer and window. -vis = o3d.visualization.Visualizer() -vis.create_window(height=480, width=640) - -pcd = o3d.geometry.PointCloud() -pcd.points = o3d.utility.Vector3dVector(np.random.rand(10, 3)) - -vis.add_geometry(pcd) - -x_map, y_map = create_point_cloud_map( - width=320, height=240, - fx=231.8290, fy=232.7785, # focal lengths - cx=166.9372, cy=123.5151 # principal point -) - - -depth_to_color_translation = np.array([0, 0, 0]) # 5cm offset in x -depth_to_color_rotation = np.eye(3) # Identity matrix if cameras are parallel - -color_intrinsics = (520, 520, 325, 245) - -keep_running = True - -while keep_running: - if post_encode_config(frame_config_encode(1,0,255,0,2,7,1,0,0)): - p = get_frame_from_http() - depth_image, points, colors = show_frame(p) - if depth_image is None or colors is None : continue - cv2.imshow("e", depth_image) - cv2.waitKey(1) - - # points, colors = depth_to_colored_points( - # depth_image, - # color_image, - # x_map, - # y_map, - # color_intrinsics, - # depth_to_color_translation, - # depth_to_color_rotation - # ) - - - # points = depth_image.reshape((-1, 3)) - # colors = color_image.reshape((-1, 3)).astype(np.float64) / 255.0 - - # colors[:, [0, 2]] = colors[:, [2, 0]] - - print(points.shape) - print(colors.shape) - - pcd.points = o3d.utility.Vector3dVector(points) - pcd.colors = o3d.utility.Vector3dVector(colors) - - - vis.update_geometry(pcd) - - keep_running = vis.poll_events() - vis.update_renderer() - - # pcd.points.extend(np.random.rand(n_new, 3)) - # cv2.waitKey(1) - # with open("rgbd.raw", 'wb') as f: - # f.write(p) - # f.flush() diff --git a/src/app.rs b/src/app.rs new file mode 100644 index 0000000..3eaa2b6 --- /dev/null +++ b/src/app.rs @@ -0,0 +1,65 @@ +// use egui::{FontFamily, FontId, RichText, Visuals}; +// use eframe::egui_glow; +// use std::{sync::Arc, time::Instant}; +// use egui::{accesskit::TextAlign, mutex::Mutex, Align2, Color32, FontId, Pos2, Stroke}; +// use egui_glow::glow; + +use crate::pane_manager::PaneManager; + +/// We derive Deserialize/Serialize so we can persist app state on shutdown. +// #[derive(serde::Deserialize, serde::Serialize)] +// #[serde(default)] +pub struct App { + pane_manager: PaneManager, +} + +impl App { + /// Called once before the first frame. + pub fn new(cc: &eframe::CreationContext<'_>) -> Option { + // This is also where you can customize the look and feel of egui using + // `cc.egui_ctx.set_visuals` and `cc.egui_ctx.set_fonts`. + + // Load previous app state (if any). + // Note that you must enable the `persistence` feature for this to work. + // if let Some(storage) = cc.storage { + // return eframe::get_value(storage, eframe::APP_KEY).unwrap_or_default(); + // } + + Some(Self { + pane_manager: PaneManager::new(cc), + }) + } +} + +// impl Default for App { +// fn default() -> Self { +// Self { +// pane_manager: PaneManager::new(None), +// } +// } +// } + +impl eframe::App for App { + /// Called each time the UI needs repainting, which may be many times per second. + fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { + egui::CentralPanel::default().show(ctx, |ui| { + self.pane_manager.render(ui); + // egui::scroll_area::ScrollArea::vertical().show(ui, |ui| { + // egui::Frame::canvas(ui.style()).show(ui, |ui| { + // self.custom_painting(ui.max_rect(), ui); + // }); + // }) + }); + } + + // fn on_exit(&mut self, gl: Option<&glow::Context>) { + // if let Some(gl) = gl { + // self.rotating_triangle.lock().destroy(gl); + // } + // } + + // Called by the frame work to save state before shutdown. + // fn save(&mut self, storage: &mut dyn eframe::Storage) { + // eframe::set_value(storage, eframe::APP_KEY, self); + // } +} diff --git a/src/fetch_frame.rs b/src/fetch_frame.rs new file mode 100644 index 0000000..01baab3 --- /dev/null +++ b/src/fetch_frame.rs @@ -0,0 +1,335 @@ +use byteorder::{LittleEndian, ReadBytesExt}; +use ndarray::{Array2, Array3}; +use std::{io::Cursor, ops::DerefMut}; + +pub struct ProcessedFrames { + pub depth: Option>, + pub ir: Option>, + pub status: Option>, + pub rgb: Option>, +} + +impl Default for ProcessedFrames { + fn default() -> Self { + Self { + depth: None, + ir: None, + status: None, + rgb: None, + } + } +} + +// Messages between threads +pub enum FrameMessage { + RawFrame(Vec), + DecodedFrame(ProcessedFrames), + Shutdown, +} + +// Frame data structures +#[allow(dead_code)] +pub struct FrameConfig { + trigger_mode: u8, + deep_mode: u8, + deep_shift: u8, + ir_mode: u8, + status_mode: u8, + status_mask: u8, + rgb_mode: u8, + rgb_res: u8, + expose_time: i32, +} + +pub struct FramePayload { + depth_img: Option>, + ir_img: Option>, + status_img: Option>, + rgb_img: Option>, +} + +// Helper functions +fn frame_config_decode(frame_config: &[u8]) -> Result> { + if frame_config.len() < 12 { + return Err("Frame config data too short".into()); + } + + let mut cursor = Cursor::new(frame_config); + + Ok(FrameConfig { + trigger_mode: cursor.read_u8()?, + deep_mode: cursor.read_u8()?, + deep_shift: cursor.read_u8()?, + ir_mode: cursor.read_u8()?, + status_mode: cursor.read_u8()?, + status_mask: cursor.read_u8()?, + rgb_mode: cursor.read_u8()?, + rgb_res: cursor.read_u8()?, + expose_time: cursor.read_i32::()?, + }) +} + +pub fn frame_config_encode( + trigger_mode: u8, + deep_mode: u8, + deep_shift: u8, + ir_mode: u8, + status_mode: u8, + status_mask: u8, + rgb_mode: u8, + rgb_res: u8, + expose_time: i32, +) -> Vec { + let mut result = Vec::with_capacity(12); + result.push(trigger_mode); + result.push(deep_mode); + result.push(deep_shift); + result.push(ir_mode); + result.push(status_mode); + result.push(status_mask); + result.push(rgb_mode); + result.push(rgb_res); + + // Add expose_time as little endian + result.extend_from_slice(&expose_time.to_le_bytes()); + + result +} + +fn frame_payload_decode( + frame_data: &[u8], + config: &FrameConfig, +) -> Result> { + if frame_data.len() < 8 { + return Err("Frame data too short".into()); + } + + let mut cursor = Cursor::new(&frame_data[0..8]); + let deep_data_size = cursor.read_i32::()?; + let rgb_data_size = cursor.read_i32::()?; + + let mut payload = &frame_data[8..]; + + // Depth image + let depth_size = (320 * 240 * 2) >> config.deep_mode; + let depth_img = if depth_size > 0 && payload.len() >= depth_size { + let result = payload[..depth_size].to_vec(); + payload = &payload[depth_size..]; + Some(result) + } else { + None + }; + + // IR image + let ir_size = (320 * 240 * 2) >> config.ir_mode; + let ir_img = if ir_size > 0 && payload.len() >= ir_size { + let result = payload[..ir_size].to_vec(); + payload = &payload[ir_size..]; + Some(result) + } else { + None + }; + + // Status image + let status_size = (320 * 240 / 8) + * match config.status_mode { + 0 => 16, + 1 => 2, + 2 => 8, + _ => 1, + }; + + let status_img = if status_size > 0 && payload.len() >= status_size { + let result = payload[..status_size].to_vec(); + payload = &payload[status_size..]; + Some(result) + } else { + None + }; + + // Verify deep data size + let calculated_deep_size = depth_size + ir_size + status_size; + if calculated_deep_size != deep_data_size as usize { + warn!( + "Warning: Deep data size mismatch: {} vs {}", + calculated_deep_size, deep_data_size + ); + } + + // RGB image + let rgb_size = payload.len(); + if rgb_size != rgb_data_size as usize { + warn!( + "Warning: RGB data size mismatch: {} vs {}", + rgb_size, rgb_data_size + ); + } + + let rgb_img = if rgb_size > 0 { + // Process RGB image based on config + if config.rgb_mode == 1 { + // JPEG decode using OpenCV + let rgb_data = payload.to_vec(); + let decoded = decode_jpeg(&rgb_data); + decoded + } else { + Some(payload.to_vec()) + } + } else { + None + }; + + Ok(FramePayload { + depth_img, + ir_img, + status_img, + rgb_img, + }) +} + +fn decode_jpeg(jpeg_data: &[u8]) -> Option> { + // Use the image crate to decode JPEG and convert to RGB + let img = image::load_from_memory(jpeg_data).ok()?; + let rgb_img = img.to_rgb8(); + + // Convert to raw bytes + Some(rgb_img.into_raw()) +} + +pub fn decode_frame(frame_data: &[u8]) -> Result> { + if frame_data.len() < 28 { + // 16 (header) + 12 (config) + return Err("Frame data too short".into()); + } + + // Extract config + let config = frame_config_decode(&frame_data[16..28])?; + + // Decode payload + let payload = frame_payload_decode(&frame_data[28..], &config)?; + + // Process depth image + let depth = if let Some(depth_data) = payload.depth_img { + if config.deep_mode == 0 { + let data = depth_data.as_slice(); + let depth_array = Array2::from_shape_fn((240, 320), |(y, x)| { + let idx = (y * 320 + x) * 2; + if idx + 1 < data.len() { + u16::from_le_bytes([data[idx], data[idx + 1]]) + } else { + 0 + } + }); + Some(depth_array) + } else { + let data = depth_data.as_slice(); + let depth_array = Array2::from_shape_fn((240, 320), |(y, x)| { + let idx = y * 320 + x; + if idx < data.len() { + u16::from(data[idx]) + } else { + 0 + } + }); + Some(depth_array) + } + } else { + None + }; + + // Process IR image + let ir = if let Some(ir_data) = payload.ir_img { + if config.ir_mode == 0 { + let data = ir_data.as_slice(); + let ir_array = Array2::from_shape_fn((240, 320), |(y, x)| { + let idx = (y * 320 + x) * 2; + if idx + 1 < data.len() { + u16::from_le_bytes([data[idx], data[idx + 1]]) + } else { + 0 + } + }); + Some(ir_array) + } else { + let data = ir_data.as_slice(); + let ir_array = Array2::from_shape_fn((240, 320), |(y, x)| { + let idx = y * 320 + x; + if idx < data.len() { + u16::from(data[idx]) + } else { + 0 + } + }); + Some(ir_array) + } + } else { + None + }; + + // Process status image + let status = if let Some(status_data) = payload.status_img { + // Process according to status_mode + let data = status_data.as_slice(); + let status_array = Array2::from_shape_fn((240, 320), |(y, x)| { + // This is a simplified approach - actual processing depends on status_mode + let idx = y * 320 + x; + if idx < data.len() { + u16::from(data[idx]) + } else { + 0 + } + }); + Some(status_array) + } else { + None + }; + + // Process RGB image + let rgb = if let Some(rgb_data) = payload.rgb_img { + let shape = if config.rgb_mode == 1 { + match config.rgb_res { + 0 => (480, 640, 3), // Default resolution + _ => (600, 800, 3), // Alternative resolution + } + } else { + (480, 640, 3) // Default for non-JPEG + }; + + if rgb_data.len() >= shape.0 * shape.1 * shape.2 { + let rgb_array = Array3::from_shape_vec((shape.0, shape.1, shape.2), rgb_data)?; + Some(rgb_array) + } else { + warn!( + "RGB data size ({}) doesn't match expected size ({})", + rgb_data.len(), + shape.0 * shape.1 * shape.2 + ); + None + } + } else { + None + }; + + Ok(ProcessedFrames { + depth, + ir, + status, + rgb, + }) +} + +pub fn normalize(data: &Array2) -> Vec { + let mut result = Vec::with_capacity(data.dim().0 * data.dim().1 * 3); + + let max = 255. / (*data.iter().max().unwrap_or(&255u16) as f32); + + for &value in data.iter() { + let num = (value as f32 * max) as u8; + + result.push(num); + result.push(num); + result.push(num); + } + + result +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..4bdfdaa --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,8 @@ +#[macro_use] +extern crate log; + +pub mod app; +pub mod fetch_frame; +pub mod nodes; +pub mod pane_manager; +pub mod panes; diff --git a/src/main.rs b/src/main.rs index 67bcb09..39558bd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,363 +1,20 @@ -use byteorder::{LittleEndian, ReadBytesExt}; -use opencv::boxed_ref::BoxedRef; -use opencv::{core, highgui, imgcodecs, imgproc, prelude::*}; -use reqwest; -use std::error::Error; -use std::io::Cursor; +use SiPEED_A075V::app::App; -const HOST: &str = "192.168.233.1"; // Assuming default value similar to Python code -const PORT: u16 = 80; // Assuming default value similar to Python code +// Main function +fn main() -> Result<(), eframe::Error> { + env_logger::init(); -fn get_frame_from_http() -> Result, Box> { - let client = reqwest::blocking::Client::new(); - let url = format!("http://{}:{}/getdeep", HOST, PORT); - let response = client.get(&url).send()?; - - if response.status().is_success() { - println!("Get deep image"); - let deepimg = response.bytes()?.to_vec(); - println!("Length={}", deepimg.len()); - - if deepimg.len() >= 16 { - let mut cursor = Cursor::new(&deepimg[0..16]); - let frameid = cursor.read_u64::()?; - let stamp_msec = cursor.read_u64::()?; - println!("({}, {})", frameid, stamp_msec as f64 / 1000.0); - - Ok(deepimg) - } else { - Err("Image data too short".into()) - } - } else { - Err(format!("HTTP request failed with status: {}", response.status()).into()) - } -} - -fn post_encode_config(config: &[u8]) -> Result> { - let client = reqwest::blocking::Client::new(); - let url = format!("http://{}:{}/set_cfg", HOST, PORT); - let response = client.post(&url).body(config.to_vec()).send()?; - - Ok(response.status().is_success()) -} - -#[derive(Debug, Clone, Copy)] -struct FrameConfig { - trigger_mode: u8, - deep_mode: u8, - deep_shift: u8, - ir_mode: u8, - status_mode: u8, - status_mask: u8, - rgb_mode: u8, - rgb_res: u8, - expose_time: i32, -} - -fn frame_config_decode(frame_config: &[u8]) -> Result> { - if frame_config.len() < 12 { - return Err("Frame config data too short".into()); - } - - let mut cursor = Cursor::new(frame_config); - - Ok(FrameConfig { - trigger_mode: cursor.read_u8()?, - deep_mode: cursor.read_u8()?, - deep_shift: cursor.read_u8()?, - ir_mode: cursor.read_u8()?, - status_mode: cursor.read_u8()?, - status_mask: cursor.read_u8()?, - rgb_mode: cursor.read_u8()?, - rgb_res: cursor.read_u8()?, - expose_time: cursor.read_i32::()?, - }) -} - -fn frame_config_encode( - trigger_mode: u8, - deep_mode: u8, - deep_shift: u8, - ir_mode: u8, - status_mode: u8, - status_mask: u8, - rgb_mode: u8, - rgb_res: u8, - expose_time: i32, -) -> Vec { - let mut buffer = Vec::with_capacity(12); - buffer.push(trigger_mode); - buffer.push(deep_mode); - buffer.push(deep_shift); - buffer.push(ir_mode); - buffer.push(status_mode); - buffer.push(status_mask); - buffer.push(rgb_mode); - buffer.push(rgb_res); - - buffer.extend_from_slice(&expose_time.to_le_bytes()); - - buffer -} - -struct FramePayload { - depth_img: Option>, - ir_img: Option>, - status_img: Option>, - rgb_img: Option>, -} - -fn frame_payload_decode( - frame_data: &[u8], - config: &FrameConfig, -) -> Result> { - if frame_data.len() < 8 { - return Err("Frame data too short".into()); - } - - let mut cursor = Cursor::new(&frame_data[0..8]); - let deep_data_size = cursor.read_i32::()?; - let rgb_data_size = cursor.read_i32::()?; - - let mut frame_payload = &frame_data[8..]; - - // Calculate sizes based on configuration - let depth_size = (320 * 240 * 2) >> config.deep_mode; - let depth_img = if depth_size > 0 && frame_payload.len() >= depth_size { - let depth_data = frame_payload[..depth_size].to_vec(); - frame_payload = &frame_payload[depth_size..]; - Some(depth_data) - } else { - None + let options = eframe::NativeOptions { + // viewport: egui::ViewportBuilder::default() + // .with_inner_size([400.0, 300.0]) + // .with_min_inner_size([300.0, 220.0]), + depth_buffer: 24, + ..Default::default() }; - let ir_size = (320 * 240 * 2) >> config.ir_mode; - let ir_img = if ir_size > 0 && frame_payload.len() >= ir_size { - let ir_data = frame_payload[..ir_size].to_vec(); - frame_payload = &frame_payload[ir_size..]; - Some(ir_data) - } else { - None - }; - - let status_size = (320 * 240 / 8) - * match config.status_mode { - 0 => 16, - 1 => 2, - 2 => 8, - _ => 1, - }; - - let status_img = if status_size > 0 && frame_payload.len() >= status_size { - let status_data = frame_payload[..status_size].to_vec(); - frame_payload = &frame_payload[status_size..]; - Some(status_data) - } else { - None - }; - - // Verify that we've consumed the expected amount of data - if deep_data_size as usize != depth_size + ir_size + status_size { - return Err("Data size mismatch in frame payload".into()); - } - - let rgb_size = frame_payload.len(); - if rgb_data_size as usize != rgb_size { - return Err("RGB data size mismatch".into()); - } - - let mut rgb_img = if rgb_size > 0 { - Some(frame_payload.to_vec()) - } else { - None - }; - - // Process RGB image if present - if let Some(rgb_data) = rgb_img.as_ref() { - if config.rgb_mode == 1 { - let jpeg_data = Mat::from_slice(rgb_data)?; - let jpeg = imgcodecs::imdecode(&jpeg_data, imgcodecs::IMREAD_COLOR)?; - - if !jpeg.empty() { - let mut rgb = Mat::default(); - imgproc::cvt_color(&jpeg, &mut rgb, imgproc::COLOR_BGR2RGB, 0)?; - - let mut rgb_vec = Vec::new(); - let mat_size = rgb.total() as usize * rgb.elem_size().unwrap(); - rgb_vec.resize(mat_size, 0); - - // This extracts the raw bytes - let mat_data = rgb.data_bytes()?; - rgb_vec.copy_from_slice(mat_data); - - rgb_img = Some(rgb_vec); - } else { - rgb_img = None; - } - } - } - - Ok(FramePayload { - depth_img, - ir_img, - status_img, - rgb_img, - }) -} - -struct FrameOutputs { - depth: Option>, - ir: Option>, - status: Option>, - rgb: Option>, -} - -fn show_frame(frame_data: &[u8]) -> Result<(), Box> { - if frame_data.len() < 28 { - // 16 + 12 minimum size - return Err("Frame data too short".into()); - } - - let config = frame_config_decode(&frame_data[16..28])?; - let frame_bytes = frame_payload_decode(&frame_data[28..], &config)?; - - let depth = if let Some(depth_data) = frame_bytes.depth_img { - let depth_type = if config.deep_mode == 0 { - core::CV_16U - } else { - core::CV_8U - }; - - // Create a Mat from raw depth data - let depth_mat = unsafe { - let mut mat = Mat::new_rows_cols(240, 320, depth_type)?; - let mat_data = mat.data_bytes_mut()?; - if mat_data.len() == depth_data.len() { - mat_data.copy_from_slice(&depth_data); - mat - } else { - return Err("Depth data size mismatch".into()); - } - }; - - // highgui::imshow("depth_mat", &depth_mat)?; - - Some(depth_mat) - } else { - None - }; - - let ir = if let Some(ir_data) = frame_bytes.ir_img { - let ir_type = if config.ir_mode == 0 { - core::CV_16U - } else { - core::CV_8U - }; - - // Create a Mat from raw IR data - let mut ir_mat = unsafe { - let mut mat = Mat::new_rows_cols(240, 320, ir_type)?; - let mat_data = mat.data_bytes_mut()?; - if mat_data.len() == ir_data.len() { - mat_data.copy_from_slice(&ir_data); - mat - } else { - return Err("IR data size mismatch".into()); - } - }; - - // highgui::imshow("ir_mat", &ir_mat)?; - - Some(ir_mat) - } else { - None - }; - - // Process status image - let status = if let Some(status_data) = frame_bytes.status_img { - let status_type = if config.status_mode == 0 { - core::CV_16U - } else { - core::CV_8U - }; - - // Create a Mat from raw status data - let mut status_mat = unsafe { - let mut mat = Mat::new_rows_cols(240, 320, status_type)?; - let mat_data = mat.data_bytes_mut()?; - if mat_data.len() == status_data.len() { - mat_data.copy_from_slice(&status_data); - mat - } else { - return Err("Status data size mismatch".into()); - } - }; - - // highgui::imshow("status_mat", &status_mat)?; - - Some(status_mat) - } else { - None - }; - - // Process IR image - // let ir = if let Some(ir_data) = &frame_bytes.ir_img { - // let ir_data = ir_data.as_slice(); - // let ir_mat = Mat::new_rows_cols_with_data(240, 320, ir_data).unwrap(); - - // Some(ir_mat) - // } else { - // None - // }; - - // Process RGB image - let rgb = if let Some(rgb_data) = &frame_bytes.rgb_img { - let (height, width) = if config.rgb_mode == 1 { - (480, 640) - } else { - (600, 800) - }; - - let rgb_mat = unsafe { - let mut mat = Mat::new_rows_cols(height, width, core::CV_8UC3)?; - let mat_data = mat.data_bytes_mut()?; - if mat_data.len() == rgb_data.len() { - mat_data.copy_from_slice(&rgb_data); - mat - } else { - return Err("RGB data size mismatch".into()); - } - }; - - highgui::imshow("rgb", &rgb_mat); - - Some(rgb_mat) - } else { - None - }; - - Ok(()) - - // Ok(FrameOutputs { - // depth, - // ir, - // status, - // rgb, - // }) -} - -fn scanloop() -> Result<(), Box> { - if post_encode_config(&frame_config_encode(1, 0, 255, 0, 2, 7, 1, 0, 0)).unwrap_or(false) { - let raw_frame = get_frame_from_http()?; - show_frame(&raw_frame)?; - highgui::wait_key(1)?; - } - - Ok(()) -} - -fn main() { - loop { - let _ = scanloop(); - } + eframe::run_native( + "Frame Viewer", + options, + Box::new(|cc| Ok(Box::new(App::new(cc).unwrap()))), + ) } diff --git a/src/nodes/constants.rs b/src/nodes/constants.rs new file mode 100644 index 0000000..b36bc91 --- /dev/null +++ b/src/nodes/constants.rs @@ -0,0 +1,115 @@ +// use crate::pane_manager::{Pane, PaneMode, PaneState, PsudoCreationContext}; +use crate::panes::pipeline_editor::Node; +use eframe::epaint::Color32; +use egui::{Id, Ui}; +use egui_snarl::ui::{PinInfo, WireStyle}; +use egui_snarl::{InPin, OutPin}; + +#[derive(Clone, serde::Serialize, serde::Deserialize)] +pub struct Constants { + vars: Vec<(String, String)>, + popup_open: bool, + uid: Id, +} +#[typetag::serde] +impl Node for Constants { + fn new() -> Self { + let mut s = Self { + vars: Vec::new(), + popup_open: false, + uid: Id::new(rand::random::()), + }; + s.vars.push(("VAR".to_string(), "Change Me".to_string())); + s + } + + fn get_name(&self) -> &str { + "Constants" + } + fn get_description(&self) -> &str { + "Test Node" + } + + fn duplicate(&self) -> Box { + Box::new(Self::new()) + } + + fn inputs(&self) -> usize { + 0 + } + fn outputs(&self) -> usize { + self.vars.len() + } + fn show_input(&mut self, _pin: &InPin, _ui: &mut Ui, _scale: f32) -> PinInfo { + PinInfo::square() + } + fn show_output(&mut self, pin: &OutPin, ui: &mut Ui, _scale: f32) -> PinInfo { + ui.label(self.vars.iter().nth(pin.id.output).unwrap().0.clone()); + PinInfo::square() + .with_fill(Color32::RED) + .with_wire_style(WireStyle::Bezier3) + } + fn can_rx(&self, _other: &Box) -> bool { + true + } + fn can_tx(&self, _other: &Box) -> bool { + true + } + fn context_menu(&mut self, ui: &mut Ui) { + // egui::Window::new("TEST").show(ui.ctx(), |ui| { + // ui.heading("EEEEE"); + // }); + if ui.button("Edit").clicked() { + self.popup_open = !self.popup_open; + ui.close_menu(); + } + } + fn update(&mut self, ui: &mut Ui) { + if self.popup_open { + egui::Window::new("Edit - ".to_owned() + self.get_name()) + .id(self.uid) + .show(ui.ctx(), |ui| { + egui::Grid::new("my_grid") + .striped(true) + .max_col_width(9999.) + .show(ui, |ui| { + for (_i, (var1, _var2)) in self.vars.iter().enumerate() { + if var1.is_empty() { + // self.vars.remove() + } + // ui.add(egui::TextEdit::singleline(var1.as_mut())); + // ui.add(egui::TextEdit::singleline(var2.as_mut())); + ui.end_row(); + } + }); + if ui.button("ADD").clicked() { + self.vars.push(("VAR".to_string(), "Change Me".to_string())); + } + }); + } + } +} + +// #[derive(serde::Serialize, serde::Deserialize, Clone)] +// pub struct Constant_Edit_Popup { +// pub data: Vec, +// pub has_changed: bool, +// } +// #[typetag::serde] +// impl Pane for Constant_Edit_Popup { +// fn new() -> PaneState where Self: Sized { +// let mut s = Self { +// node: None, +// has_changed: false, +// }; +// PaneState { +// id: s.name().to_string(), +// mode: PaneMode::Popup, +// pane: Box::new(s), +// } +// } +// fn init(&mut self, _pcc: &PsudoCreationContext) {} +// fn name(&mut self) -> &str {"ERROR"} +// fn render(&mut self, _ui: &mut Ui){} +// fn context_menu(&mut self, _ui: &mut Ui) {} +// } diff --git a/src/nodes/mod.rs b/src/nodes/mod.rs new file mode 100644 index 0000000..987b09f --- /dev/null +++ b/src/nodes/mod.rs @@ -0,0 +1 @@ +pub mod constants; \ No newline at end of file diff --git a/src/pane_manager.rs b/src/pane_manager.rs new file mode 100644 index 0000000..8493ecc --- /dev/null +++ b/src/pane_manager.rs @@ -0,0 +1,313 @@ +use crate::panes::*; +use eframe::egui_glow::glow; +use egui::Ui; +use std::sync::Arc; +// use erased_serde::serialize_trait_object; + +#[derive(serde::Deserialize, serde::Serialize, PartialEq)] +pub enum PaneMode { + Hidden, + Windowed, + Right, + Left, + Bottom, + Center, + Popup, +} + +#[typetag::serde(tag = "type")] +pub trait Pane { + fn new() -> PaneState + where + Self: Sized; + fn init(&mut self, pcc: &PsudoCreationContext); + fn name(&mut self) -> &str; + fn render(&mut self, ui: &mut Ui); + fn context_menu(&mut self, ui: &mut Ui); +} + +// impl Deserializer for Pane { + +// } + +#[derive(serde::Deserialize, serde::Serialize)] +pub struct PaneState { + // #[serde(skip)] + pub pane: Box, + pub id: String, + pub mode: PaneMode, + // pub window_location: Pos2, +} + +#[derive(serde::Serialize, serde::Deserialize)] +pub struct NoPane {} +#[typetag::serde] +impl Pane for NoPane { + fn new() -> PaneState + where + Self: Sized, + { + let mut s = Self {}; + PaneState { + id: s.name().to_string(), + mode: PaneMode::Left, + pane: Box::new(s), + } + } + fn init(&mut self, _pcc: &PsudoCreationContext) {} + fn name(&mut self) -> &str { + "ERROR" + } + fn render(&mut self, _ui: &mut Ui) {} + fn context_menu(&mut self, _ui: &mut Ui) {} +} + +impl PaneState { + pub fn render(&mut self, ui: &mut Ui) { + self.pane.render(ui); + } +} + +pub struct PsudoCreationContext { + pub gl: Option>, +} + +pub struct PaneManager { + pcc: PsudoCreationContext, + pub panes: Vec, +} + +impl PaneManager { + pub fn new(cc: &eframe::CreationContext<'_>) -> Self { + // if let Some(cc) = cc { + + let mut panes = vec![ + PointRendererPane::new(), + PipelinePane::new(), + CameraPane::new(), + ]; + + let pcc = PsudoCreationContext { gl: cc.gl.clone() }; + + for pane in &mut panes { + pane.pane.init(&pcc); + } + + Self { pcc, panes } + } + + pub fn render(&mut self, ui: &mut Ui) { + let len = self.panes.len(); + + egui::TopBottomPanel::top("top_panel").show(ui.ctx(), |ui| { + egui::menu::bar(ui, |ui| { + // NOTE: no File->Quit on web pages! + + egui::widgets::global_theme_preference_switch(ui); + + ui.menu_button("File", |ui| { + if ui.button("Save Layout").clicked() { + self.save_layout(); + } + if ui.button("Load Layout").clicked() { + self.load_layout(); + } + if ui.button("Quit").clicked() { + ui.ctx().send_viewport_cmd(egui::ViewportCommand::Close); + } + }); + + ui.menu_button("View", |ui| { + for i in 0..len { + if self.panes[i].mode == PaneMode::Popup { + continue; + } + ui.menu_button(self.panes[i].id.clone(), |ui| { + if ui + .button( + ({ + if self.panes[i].mode == PaneMode::Center { + "*" + } else { + " " + } + }) + .to_owned() + + "Center", + ) + .clicked() + { + for a in 0..len { + let pane2: &mut PaneState = &mut self.panes[a]; + if pane2.mode == PaneMode::Center { + pane2.mode = PaneMode::Windowed; + } + } + self.panes[i].mode = PaneMode::Center; + ui.close_menu(); + } + if ui + .button( + ({ + if self.panes[i].mode == PaneMode::Windowed { + "*" + } else { + " " + } + }) + .to_owned() + + "Window", + ) + .clicked() + { + self.panes[i].mode = PaneMode::Windowed; + ui.close_menu(); + } + if ui + .button( + ({ + if self.panes[i].mode == PaneMode::Left { + "*" + } else { + " " + } + }) + .to_owned() + + "Left", + ) + .clicked() + { + self.panes[i].mode = PaneMode::Left; + ui.close_menu(); + } + if ui + .button( + ({ + if self.panes[i].mode == PaneMode::Right { + "*" + } else { + " " + } + }) + .to_owned() + + "Right", + ) + .clicked() + { + self.panes[i].mode = PaneMode::Right; + ui.close_menu(); + } + if ui + .button( + ({ + if self.panes[i].mode == PaneMode::Bottom { + "*" + } else { + " " + } + }) + .to_owned() + + "Bottom", + ) + .clicked() + { + self.panes[i].mode = PaneMode::Bottom; + ui.close_menu(); + } + if ui + .button( + ({ + if self.panes[i].mode == PaneMode::Hidden { + "*" + } else { + " " + } + }) + .to_owned() + + "Hidden", + ) + .clicked() + { + self.panes[i].mode = PaneMode::Hidden; + ui.close_menu(); + } + }); + } + }); + + ui.separator(); + + for i in 0..len { + if self.panes[i].mode != PaneMode::Hidden + && self.panes[i].mode != PaneMode::Popup + { + ui.menu_button(self.panes[i].id.clone(), |ui| { + let _ = &mut self.panes[i].pane.context_menu(ui); + }); + } + } + }); + }); + + for i in 0..len { + let pane: &mut PaneState = &mut self.panes[i]; + + match pane.mode { + PaneMode::Hidden => {} + PaneMode::Left => { + egui::panel::SidePanel::left(pane.id.clone()) + .resizable(true) + .show(ui.ctx(), |ui| { + pane.render(ui); + }); + } + PaneMode::Right => { + egui::panel::SidePanel::right(pane.id.clone()) + .resizable(true) + .show(ui.ctx(), |ui| { + pane.render(ui); + }); + } + PaneMode::Bottom => { + egui::panel::TopBottomPanel::bottom(pane.id.clone()) + .resizable(true) + .show(ui.ctx(), |ui| { + pane.render(ui); + }); + } + PaneMode::Windowed | PaneMode::Popup => { + egui::Window::new(pane.id.clone()) + .resizable(true) + .max_width(ui.clip_rect().width()) + .max_height(ui.clip_rect().height()) + .show(ui.ctx(), |ui| { + pane.render(ui); + }); + } + PaneMode::Center => { + egui::CentralPanel::default().show(ui.ctx(), |ui| { + pane.render(ui); + }); + } + } + } + } + + fn save_layout(&self) { + if let Ok(json) = serde_json::to_string_pretty(&self.panes) { + let _ = std::fs::write("pane_layout.json", json); + } + } + + fn load_layout(&mut self) { + if let Ok(panes) = std::fs::read_to_string("pane_layout.json") { + if let Ok(panes) = serde_json::from_str(&panes) { + self.panes = panes; + + for pane in &mut self.panes { + pane.pane.init(&self.pcc); + } + } + } + } +} diff --git a/src/panes/camera.rs b/src/panes/camera.rs new file mode 100644 index 0000000..c023ffb --- /dev/null +++ b/src/panes/camera.rs @@ -0,0 +1,184 @@ +use std::{ + mem, + sync::{ + Arc, + mpsc::{self, Receiver, Sender}, + }, + thread, +}; + +use std::io::Cursor; + +use byteorder::{LittleEndian, ReadBytesExt}; +use egui::{Ui, mutex::Mutex}; + +use crate::{ + fetch_frame::{FrameMessage, ProcessedFrames, decode_frame, frame_config_encode, normalize}, + pane_manager::{Pane, PaneMode, PaneState, PsudoCreationContext}, +}; + +// Constants (replace with your actual values) +const HOST: &str = "192.168.233.1"; +const PORT: u16 = 80; + +#[derive(serde::Serialize, serde::Deserialize)] +pub struct CameraPane { + #[serde(skip)] + frames: Arc>, + #[serde(skip)] + thread_handle: Option>, +} + +impl Default for CameraPane { + fn default() -> Self { + // Shared state for the latest processed frames + let frames = Arc::new(Mutex::new(ProcessedFrames::default())); + + let frames_clone = Arc::clone(&frames); + let decoder_handle = thread::spawn(move || { + loop { + match fetch_frame() { + Ok(frame_data) => match decode_frame(&frame_data) { + Ok(processed) => { + mem::replace(&mut *frames_clone.lock(), processed); + } + Err(e) => warn!("Error decoding frame: {}", e), + }, + Err(e) => warn!("Error fetching frame: {}", e), + } + } + }); + + Self { + frames, + thread_handle: Some(decoder_handle), + } + } +} + +#[typetag::serde] +impl Pane for CameraPane { + fn new() -> PaneState { + let mut s = CameraPane::default(); + PaneState { + id: s.name().to_string(), + mode: PaneMode::Hidden, + pane: Box::new(s), + } + } + + fn init(&mut self, pcc: &PsudoCreationContext) { + // decoder_thread(rx, tx); + + // let mut frames_lock = self.frames.lock(); + } + + fn name(&mut self) -> &str { + "Raw Camera" + } + + fn render(&mut self, ui: &mut Ui) { + let frames_lock = self.frames.lock(); + let ref frames = *frames_lock; + + let mut processed = false; + + // Display depth image + if let Some(ref depth) = frames.depth { + let depth_viz = normalize(depth); + ui.heading("Depth"); + image_widget(ui, "depth_img", &depth_viz, [320.0, 240.0]); + processed = true; + } + + // Display IR image + if let Some(ref ir) = frames.ir { + let ir_viz = normalize(ir); + ui.heading("IR"); + image_widget(ui, "ir_img", &ir_viz, [320.0, 240.0]); + processed = true; + } + + // Display status image if available + if let Some(ref status) = frames.status { + let status_viz = normalize(status); + ui.heading("Status"); + image_widget(ui, "status_img", &status_viz, [320.0, 240.0]); + processed = true; + } + + // Display RGB image if available + if let Some(ref rgb) = frames.rgb { + let rgb_viz = rgb.as_slice().unwrap(); + let size = match rgb.dim().1 { + 640 => [640.0, 480.0], + 800 => [800.0, 600.0], + _ => [640.0, 480.0], // Default + }; + ui.heading("RGB"); + image_widget(ui, "rgb_img", rgb_viz, size); + processed = true; + } + + if !processed { + ui.heading("Waiting for frames..."); + } + } + + fn context_menu(&mut self, ui: &mut Ui) {} +} + +fn fetch_frame() -> Result, Box> { + is_success(&frame_config_encode(1, 0, 255, 0, 2, 7, 1, 0, 0))?; + + let url = format!("http://{}:{}/getdeep", HOST, PORT); + + let response = ureq::get(url).call()?; + + if response.status() != 200 { + return Err(format!("Failed to get frame: HTTP {}", response.status()).into()); + } + + warn!("Got deep image"); + let deep_img = response.into_body().read_to_vec()?; + warn!("Length={}", deep_img.len()); + + // Parse frame ID and timestamp + if deep_img.len() >= 16 { + let mut cursor = Cursor::new(&deep_img[0..16]); + let frame_id = cursor.read_u64::()?; + let stamp_msec = cursor.read_u64::()?; + warn!( + "Frame ID: {}, Timestamp: {:.3}s", + frame_id, + stamp_msec as f64 / 1000.0 + ); + } + + return Ok(deep_img); +} + +fn is_success(data: &[u8]) -> Result<(), Box> { + let url = format!("http://{}:{}/set_cfg", HOST, PORT); + + let response = ureq::post(url).send(data.to_vec())?; + if response.status() == 200 { + return Ok(()); + } else { + return Err(format!("Status code: {}", response.status().to_string()).into()); + } +} + +// Helper to display images in egui +fn image_widget(ui: &mut egui::Ui, id: &str, rgb_data: &[u8], size: [f32; 2]) { + let color_image = egui::ColorImage::from_rgb([size[0] as usize, size[1] as usize], rgb_data); + + let handle = ui + .ctx() + .load_texture(id, color_image, egui::TextureOptions::LINEAR); + + let sized_image = + egui::load::SizedTexture::new(handle.id(), egui::vec2(size[0] as f32, size[1] as f32)); + + ui.image(sized_image); +} diff --git a/src/panes/mod.rs b/src/panes/mod.rs new file mode 100644 index 0000000..a5e589e --- /dev/null +++ b/src/panes/mod.rs @@ -0,0 +1,7 @@ +pub mod camera; +pub mod pipeline_editor; +pub mod point_cloud_renderer; + +pub use camera::CameraPane; +pub use pipeline_editor::PipelinePane; +pub use point_cloud_renderer::PointRendererPane; diff --git a/src/panes/pipeline_editor.rs b/src/panes/pipeline_editor.rs new file mode 100644 index 0000000..abc8a5b --- /dev/null +++ b/src/panes/pipeline_editor.rs @@ -0,0 +1,442 @@ +use crate::pane_manager::{Pane, PaneMode, PaneState, PsudoCreationContext}; + +use egui::Ui; +use egui::{Color32, Id, Pos2}; +use egui_snarl::ui::WireStyle; +use egui_snarl::{ + InPin, NodeId, OutPin, OutPinId, Snarl, + ui::{PinInfo, SnarlStyle, SnarlViewer}, +}; + +#[derive(serde::Serialize, serde::Deserialize)] +pub struct PipelinePane { + snarl: Option>>, + style: Option, + snarl_ui_id: Option, +} +#[typetag::serde] +impl Pane for PipelinePane { + fn new() -> PaneState + where + Self: Sized, + { + let mut s = Self { + snarl: Some(Snarl::new()), + style: Some(SnarlStyle::new()), + snarl_ui_id: None, + }; + PaneState { + id: s.name().to_string(), + mode: PaneMode::Hidden, + pane: Box::new(s), + } + } + fn init(&mut self, _cc: &PsudoCreationContext) {} + fn name(&mut self) -> &str { + "Pipeline Pane" + } + fn render(&mut self, ui: &mut Ui) { + self.snarl_ui_id = Some(ui.id()); + + if let Some(snarl) = &mut self.snarl { + if let Some(style) = &self.style { + snarl.show(&mut NodeViewer, style, "snarl", ui); + } + } + } + fn context_menu(&mut self, ui: &mut Ui) { + ui.menu_button("Add Node", |ui| { + if let Some(snarl) = &mut self.snarl { + NodeViewer::add_node_menu(Pos2 { x: 0., y: 0. }, ui, snarl); + } + }); + if ui.button("Run").clicked() { + ui.close_menu(); + self.run(); + } + // if !self.snarl.is_none() { + // self.snarl.unwrap().add_node_menu(ui, ui.clip_rect().min.clone(), ) + // } + } +} + +impl PipelinePane { + fn run(&mut self) { + if let Some(snarl) = &mut self.snarl { + fn remove_duplicates(nodes: Vec) -> Vec { + let mut new_vec: Vec = Vec::new(); + for node in nodes { + if !new_vec.contains(&node) { + new_vec.push(node); + } + } + new_vec + } + fn has_input_wire(snarl: &Snarl>, nodeid: NodeId) -> bool { + for wire in snarl.wires() { + if wire.1.node == nodeid { + return true; + } + } + false + } + fn get_output_wires(snarl: &Snarl>, nodeid: &NodeId) -> Vec { + let mut arr: Vec = Vec::new(); + for wire in snarl.wires() { + if &wire.0.node == nodeid { + arr.push(wire.0) + } + } + arr + } + + // let wires = snarl.wires().map(|| {}) + + let mut nodes: Vec> = Vec::new(); + let mut starting_nodes: Vec = Vec::new(); + for node in snarl.nodes_ids_data() { + if !has_input_wire(snarl, node.0) { + starting_nodes.push(node.0.clone()) + } + } + starting_nodes = remove_duplicates(starting_nodes); + nodes.push(starting_nodes); + + for i in 1..50 { + if nodes.get(i - 1).is_none() { + break; + } + let prevarr = nodes.get(i - 1).unwrap(); + if prevarr.len() == 0 { + break; + } + + let mut newarr: Vec = Vec::new(); + + for node in prevarr { + for wire in get_output_wires(snarl, node) { + newarr.push(wire.node); + } + } + + newarr = remove_duplicates(newarr); + + nodes.push(newarr); + } + + for nodearr in nodes { + info!("Nodes: "); + for node in nodearr { + info!("{}", snarl.get_node(node).unwrap().get_name()); + } + } + } + } +} + +fn _format_float(v: f64) -> String { + let v = (v * 1000.0).round() / 1000.0; + format!("{}", v) +} + +#[typetag::serde(tag = "type")] +pub trait Node { + fn new() -> Self + where + Self: Sized; + fn get_name(&self) -> &str; + fn get_description(&self) -> &str; + fn duplicate(&self) -> Box; + fn inputs(&self) -> usize; + fn outputs(&self) -> usize; + fn show_input(&mut self, pin: &InPin, ui: &mut Ui, scale: f32) -> PinInfo; + fn show_output(&mut self, pin: &OutPin, ui: &mut Ui, scale: f32) -> PinInfo; + fn can_rx(&self, other: &Box) -> bool; + fn can_tx(&self, other: &Box) -> bool; + fn context_menu(&mut self, ui: &mut Ui); + fn update(&mut self, ui: &mut Ui); +} + +#[derive(Clone, serde::Serialize, serde::Deserialize)] +struct Node1; +#[typetag::serde] +impl Node for Node1 { + fn new() -> Self { + Self + } + fn get_name(&self) -> &str { + "Test" + } + fn get_description(&self) -> &str { + "Test Node" + } + fn duplicate(&self) -> Box { + Box::new(Self::new()) + } + fn inputs(&self) -> usize { + 1 + } + fn outputs(&self) -> usize { + 1 + } + fn show_input(&mut self, _pin: &InPin, _ui: &mut Ui, _scale: f32) -> PinInfo { + PinInfo::square() + } + fn show_output(&mut self, _pin: &OutPin, _ui: &mut Ui, _scale: f32) -> PinInfo { + PinInfo::square() + .with_fill(Color32::RED) + .with_wire_style(WireStyle::Bezier3) + } + fn can_rx(&self, _other: &Box) -> bool { + true + } + fn can_tx(&self, _other: &Box) -> bool { + true + } + fn context_menu(&mut self, ui: &mut Ui) { + ui.label("Test!"); + } + fn update(&mut self, _ui: &mut Ui) {} +} + +#[derive(Clone, serde::Serialize, serde::Deserialize)] +struct Node2; +#[typetag::serde] +impl Node for Node2 { + fn new() -> Self { + Self + } + fn get_name(&self) -> &str { + "Test 2-1" + } + fn get_description(&self) -> &str { + "Test Node" + } + fn duplicate(&self) -> Box { + Box::new(Self::new()) + } + fn inputs(&self) -> usize { + 2 + } + fn outputs(&self) -> usize { + 1 + } + fn show_input(&mut self, _pin: &InPin, _ui: &mut Ui, _scale: f32) -> PinInfo { + PinInfo::square() + } + fn show_output(&mut self, _pin: &OutPin, _ui: &mut Ui, _scale: f32) -> PinInfo { + PinInfo::square() + .with_fill(Color32::RED) + .with_wire_style(WireStyle::Bezier3) + } + fn can_rx(&self, _other: &Box) -> bool { + true + } + fn can_tx(&self, _other: &Box) -> bool { + true + } + fn context_menu(&mut self, ui: &mut Ui) { + ui.label("Test!"); + } + fn update(&mut self, _ui: &mut Ui) {} +} + +#[derive(Clone, serde::Serialize, serde::Deserialize)] +struct Node3; +#[typetag::serde] +impl Node for crate::panes::pipeline_editor::Node3 { + fn new() -> Self { + Self + } + fn get_name(&self) -> &str { + "Test 1-2" + } + fn get_description(&self) -> &str { + "Test Node" + } + fn duplicate(&self) -> Box { + Box::new(Self::new()) + } + fn inputs(&self) -> usize { + 1 + } + fn outputs(&self) -> usize { + 2 + } + fn show_input(&mut self, _pin: &InPin, _ui: &mut Ui, _scale: f32) -> PinInfo { + PinInfo::square() + } + fn show_output(&mut self, _pin: &OutPin, _ui: &mut Ui, _scale: f32) -> PinInfo { + PinInfo::square() + .with_fill(Color32::RED) + .with_wire_style(WireStyle::Bezier3) + } + fn can_rx(&self, _other: &Box) -> bool { + true + } + fn can_tx(&self, _other: &Box) -> bool { + true + } + fn context_menu(&mut self, ui: &mut Ui) { + ui.label("Test!"); + } + fn update(&mut self, _ui: &mut Ui) {} +} + +#[derive(Clone, serde::Serialize, serde::Deserialize)] +struct NodeViewer; + +impl SnarlViewer> for NodeViewer { + fn connect(&mut self, from: &OutPin, to: &InPin, snarl: &mut Snarl>) { + // Validate connection + + let rx = snarl.get_node(to.id.node).unwrap(); + let tx = snarl.get_node(from.id.node).unwrap(); + + if rx.can_rx(tx) && tx.can_tx(rx) { + for &remote in &to.remotes { + snarl.disconnect(remote, to.id); + } + + snarl.connect(from.id, to.id); + } + } + + fn disconnect(&mut self, _from: &OutPin, to: &InPin, snarl: &mut Snarl>) { + for &remote in &to.remotes { + snarl.disconnect(remote, to.id); + } + } + + fn title(&mut self, node: &Box) -> String { + node.get_name().to_string() + } + + fn outputs(&mut self, node: &Box) -> usize { + node.outputs() + } + + fn inputs(&mut self, node: &Box) -> usize { + node.inputs() + } + + fn show_input( + &mut self, + pin: &InPin, + ui: &mut Ui, + scale: f32, + snarl: &mut Snarl>, + ) -> PinInfo { + snarl + .get_node_mut(pin.id.node) + .unwrap() + .show_input(pin, ui, scale) + } + + fn show_output( + &mut self, + pin: &OutPin, + ui: &mut Ui, + scale: f32, + snarl: &mut Snarl>, + ) -> PinInfo { + snarl + .get_node_mut(pin.id.node) + .unwrap() + .show_output(pin, ui, scale) + } + + fn has_graph_menu(&mut self, _pos: Pos2, _snarl: &mut Snarl>) -> bool { + true + } + + fn show_graph_menu( + &mut self, + pos: egui::Pos2, + ui: &mut Ui, + _scale: f32, + snarl: &mut Snarl>, + ) { + NodeViewer::add_node_menu(pos, ui, snarl); + } + + fn has_on_hover_popup(&mut self, _: &Box) -> bool { + true + } + + fn show_on_hover_popup( + &mut self, + node: NodeId, + _inputs: &[InPin], + _outputs: &[OutPin], + ui: &mut Ui, + _scale: f32, + snarl: &mut Snarl>, + ) { + ui.label(snarl.get_node(node).unwrap().get_description()); + } + + fn has_node_menu(&mut self, _node: &Box) -> bool { + true + } + + fn show_node_menu( + &mut self, + nodeid: NodeId, + _inputs: &[InPin], + _outputs: &[OutPin], + ui: &mut Ui, + _scale: f32, + snarl: &mut Snarl>, + ) { + ui.label("Node menu"); + snarl.get_node_mut(nodeid).unwrap().context_menu(ui); + if ui.button("Remove").clicked() { + snarl.remove_node(nodeid); + ui.close_menu(); + } else if ui.button("Duplicate").clicked() { + let node = snarl.get_node_mut(nodeid).unwrap().duplicate(); + snarl.insert_node(egui::pos2(0., 0.), node); + ui.close_menu(); + // }// else if ui.button("Remove All Connections").clicked() { + // ui. + // ui.close_menu(); + } + } + + fn has_body(&mut self, _node: &Box) -> bool { + true + } + + fn show_body( + &mut self, + node: NodeId, + _inputs: &[InPin], + _outputs: &[OutPin], + ui: &mut Ui, + _scale: f32, + snarl: &mut Snarl>, + ) { + snarl.get_node_mut(node).unwrap().update(ui); + } +} + +impl NodeViewer { + pub fn add_node_menu(pos: Pos2, ui: &mut Ui, snarl: &mut Snarl>) { + ui.label("Add node"); + + if ui.button("Test").clicked() { + snarl.insert_node(pos, Box::new(Node1::new())); + ui.close_menu(); + } else if ui.button("Constants").clicked() { + snarl.insert_node(pos, Box::new(crate::nodes::constants::Constants::new())); + ui.close_menu(); + } else if ui.button("Test 2-1").clicked() { + snarl.insert_node(pos, Box::new(Node2::new())); + ui.close_menu(); + } else if ui.button("Test 1-2").clicked() { + snarl.insert_node(pos, Box::new(Node3::new())); + ui.close_menu(); + } + } +} diff --git a/src/panes/point_cloud_renderer/mod.rs b/src/panes/point_cloud_renderer/mod.rs new file mode 100644 index 0000000..19538ac --- /dev/null +++ b/src/panes/point_cloud_renderer/mod.rs @@ -0,0 +1,3 @@ +mod pane; +mod renderer; +pub use pane::PointRendererPane; diff --git a/src/panes/point_cloud_renderer/pane.rs b/src/panes/point_cloud_renderer/pane.rs new file mode 100644 index 0000000..8ef43ea --- /dev/null +++ b/src/panes/point_cloud_renderer/pane.rs @@ -0,0 +1,235 @@ +use std::{sync::Arc, time::Instant}; + +use eframe::egui_glow; +use egui::{Align2, Color32, FontId, InputState, Stroke, Ui, mutex::Mutex}; + +use crate::pane_manager::{Pane, PaneMode, PaneState, PsudoCreationContext}; + +use super::renderer::{Camera, PointRenderer}; + +#[derive(serde::Serialize, serde::Deserialize)] +pub struct PointRendererPane { + #[serde(skip)] + renderer: Arc>, + #[serde(skip)] + points: Vec<(i32, i32, i32, Color32)>, + #[serde(skip)] + file_dialog_open: bool, + #[serde(skip)] + cur_path: String, +} + +#[typetag::serde] +impl Pane for PointRendererPane { + fn new() -> PaneState + where + Self: Sized, + { + let renderer = PointRenderer::default(); + let mut s = Self { + renderer: Arc::new(Mutex::new(renderer)), + points: Vec::new(), + file_dialog_open: false, + cur_path: "./".to_string(), + }; + PaneState { + id: s.name().to_string(), + mode: PaneMode::Hidden, + pane: Box::new(s), + } + } + fn init(&mut self, pcc: &PsudoCreationContext) { + self.renderer.lock().init(pcc.gl.clone(), 1_000_000); + } + fn name(&mut self) -> &str { + "Point Cloud" + } + fn render(&mut self, ui: &mut Ui) { + let max_rect = ui.max_rect(); + + let renderer = self.renderer.clone(); + if renderer.lock().gl.is_none() { + return; + // renderer.lock().expect("Renderer Not Initialized").init(ui.ctx()., 1_000_000); + } + renderer.lock().clear(); + + if self.file_dialog_open { + egui::Window::new("Load PLY File").show(ui.ctx(), |ui| { + ui.label("Enter PLY file path:"); + ui.text_edit_singleline(&mut self.cur_path); // Add proper path handling + + ui.horizontal(|ui| { + if ui.button("Load").clicked() { + let renderer = &mut renderer.lock(); + // Add proper path handling and error reporting + let ply = renderer.load_ply(); + if let Err(e) = ply { + warn!("Failed to load PLY: {}", e); + } else { + // self.renderer.lock().camera.reset(); + self.points = ply.unwrap(); + } + + self.file_dialog_open = false; + } + if ui.button("Cancel").clicked() { + self.file_dialog_open = false; + } + }); + }); + } + + let start_time = Instant::now(); + + let (rect, response) = ui.allocate_exact_size( + egui::Vec2 { + x: max_rect.width(), + y: max_rect.height(), + }, + egui::Sense::drag(), + ); + + let input_state: Option = ui.input(|input_state| { + if response.hovered() { + //&& response.has_focus() { + Some(input_state.clone()) + } else { + None + } + }); + + if self.points.is_empty() { + let radius = 1000i32; + for i in 0..100000 { + // let theta = (i as f32 * 0.1).sin() * std::f32::consts::PI; + // let phi = (i as f32 * 0.1).cos() * std::f32::consts::PI; + + let x = (radius as f32 * (i as f32).cos()) as i32; + let y = (radius as f32 * (i as f32).sin()) as i32; + let z = (i as f32 * 0.05) as i32; + + // let x = (i as f32 * 0.1) as u32; + // let y = (i as f32 * 0.1) as u32 ; + // let z = (i as f32 * 0.1) as u32; + + // Color based on position + let color = Color32::from_rgba_premultiplied( + ((x as f32 / radius as f32) * 255.0) as u8, + ((y as f32 / radius as f32) * 255.0) as u8, + ((z as f32 / radius as f32) * 255.0) as u8, + 255, + ); + + self.points.push((x, y, z, color)); + } + } + + // let painter = ui.painter(); + + for &(x, y, z, color) in &self.points { + renderer.lock().add_point(x, y, z, color); + } + + let o = as Clone>::clone(&renderer.lock().camera) + .unwrap() + .orientation + .clone(); + + let cb = egui_glow::CallbackFn::new(move |_info, _painter| { + renderer.lock().render(max_rect, input_state.clone()); + }); + + let callback = egui::PaintCallback { + rect: max_rect, + callback: Arc::new(cb), + }; + + ui.painter().add(callback); + let line_length: f32 = 20.; + + // if let Some(input_state) = input_state { + // if input_state.pointer.any_down() { + + let pos1 = o.inverse() * glam::Vec3::X; + let pos2 = o.inverse() * glam::Vec3::Y; + let pos3 = o.inverse() * glam::Vec3::Z; + + ui.painter().line_segment( + [ + rect.center(), + rect.center() + + egui::Vec2 { + x: line_length * pos1.x, + y: -line_length * pos1.y, + }, + ], + Stroke { + width: 1.5, + color: Color32::RED, + }, + ); + + ui.painter().line_segment( + [ + rect.center(), + rect.center() + + egui::Vec2 { + x: line_length * pos2.x, + y: -line_length * pos2.y, + }, + ], + Stroke { + width: 1.5, + color: Color32::BLUE, + }, + ); + + ui.painter().line_segment( + [ + rect.center(), + rect.center() + + egui::Vec2 { + x: line_length * pos3.x, + y: -line_length * pos3.y, + }, + ], + Stroke { + width: 1.5, + color: Color32::GREEN, + }, + ); + // }} + + let end_time = Instant::now(); + + // println!("{}", end_time.duration_since(start_time).as_millis()); + + let text_size = 12.; + + ui.painter().text( + max_rect.min, + Align2::LEFT_TOP, + format!("{} ms", end_time.duration_since(start_time).as_millis()), + FontId::monospace(text_size), + Color32::WHITE, + ); + + ui.painter().text( + max_rect.min + + egui::Vec2 { + x: 0., + y: text_size, + }, + Align2::LEFT_TOP, + format!("{} points", self.points.len()), + FontId::monospace(text_size), + Color32::WHITE, + ); + } + fn context_menu(&mut self, ui: &mut Ui) { + if ui.button("Load PLY").clicked() { + self.file_dialog_open = true; + } + } +} diff --git a/src/panes/point_cloud_renderer/renderer.rs b/src/panes/point_cloud_renderer/renderer.rs new file mode 100644 index 0000000..1ba3edf --- /dev/null +++ b/src/panes/point_cloud_renderer/renderer.rs @@ -0,0 +1,626 @@ +use eframe::egui_glow; +use egui::{Color32, InputState, Rect}; +use egui_glow::glow; +use glam::{Mat4, Quat, Vec3}; +use pasture_core::containers::{ + BorrowedBuffer, BorrowedBufferExt, InterleavedBufferMut, VectorBuffer, +}; +use pasture_core::layout::attributes::{COLOR_RGB, POSITION_3D}; +use pasture_core::nalgebra::Vector3; +use pasture_io::base::read_all; +use std::fs::File; +use std::io::{BufRead, BufReader}; +use std::sync::Arc; + +// Shader sources updated for 3D rendering with fixed-point positions +const VERTEX_SHADER: &str = r#" + #version 330 core + layout (location = 0) in ivec3 position; // Using unsigned ints for position + layout (location = 1) in ivec4 color; // Using unsigned ints for color + + uniform mat4 u_view_projection; + uniform float u_position_scale; // Scale factor to convert from uint to world space + uniform float u_point_size_scale; // Added point size scaling + + out vec4 v_color; + + void main() { + // Convert uint positions to world space + vec3 worldPos = vec3(position) * u_position_scale; + gl_Position = u_view_projection * vec4(worldPos, 1.0); + gl_PointSize = max(u_point_size_scale * 10.0 * (1.0 - gl_Position.z / gl_Position.w), 1.0); + v_color = vec4(color) / 255.0; // Convert uint colors to float + } +"#; + +const FRAGMENT_SHADER: &str = r#" + #version 330 core + in vec4 v_color; + out vec4 FragColor; + + void main() { + // Create circular points + vec2 coord = gl_PointCoord * 2.0 - 1.0; + float r = dot(coord, coord); + if (r > 1.0) discard; + // if (coord.x > 1.0) discard; + // if (coord.y > 1.0) discard; + + // Apply simple lighting based on depth + // float depth = gl_FragCoord.z; + FragColor = v_color; + } +"#; + +// Camera controller for 3D navigation +#[derive(Clone)] +pub struct Camera { + position: Vec3, + pub orientation: Quat, + distance: f32, + pub point_size_scale: f32, + // last_pos: Option, +} + +impl Camera { + pub fn new() -> Self { + Self { + position: Vec3::new(0.0, 0.0, 5.0), + orientation: Quat::IDENTITY, + distance: 5.0, + point_size_scale: 0.1, + // last_pos: None, + } + } + + // pub fn reset(&mut self) { + // self.position = Vec3::new(0.0, 0.0, 5.0); + // self.orientation = Quat::IDENTITY; + // self.distance = 5.0; + // // self.point_size_scale = 0.1; + // self.update_view(); + // } + + pub fn update(&mut self, i: InputState) { + let mut changed = false; + + if i.pointer.secondary_down() && !i.modifiers.shift { + let delta = i.pointer.delta(); + + let rotation_speed = 0.01; + let pitch = delta.y * rotation_speed; + let yaw = delta.x * rotation_speed; + + let pitch_rotation = Quat::from_axis_angle(Vec3::X, -pitch); + let yaw_rotation = Quat::from_axis_angle(Vec3::Y, -yaw); + let roll_rotation = Quat::from_axis_angle(Vec3::Z, 0.); + + self.orientation = self.orientation * pitch_rotation * yaw_rotation * roll_rotation; + self.orientation = self.orientation.normalize(); + + changed = true; + } // else if i.pointer.secondary_down() && i.modifiers.shift { + // let cur_pos = i.pointer.latest_pos(); + + // if let Some(last_pos) = self.last_pos { + // let last_angle = f32::atan2(last_pos.y, last_pos.x); + // if let Some(cur_pos) = cur_pos { + // let cur_angle = f32::atan2(cur_pos.y, cur_pos.x); + + // println!("{}",cur_angle - last_angle); + + // let pitch_rotation = Quat::from_axis_angle(Vec3::X, 0.); + // let yaw_rotation = Quat::from_axis_angle(Vec3::Y, 0.); + // let roll_rotation = Quat::from_axis_angle(Vec3::Z,cur_angle-last_angle); + + // self.orientation = self.orientation * pitch_rotation * yaw_rotation * roll_rotation; + // self.orientation = self.orientation.normalize(); + + // changed = true; + + // } + // } + + // self.last_pos = cur_pos; + // } + + let zoom_delta = i.smooth_scroll_delta.x + i.smooth_scroll_delta.y; + if zoom_delta != 0. { + if i.modifiers.shift { + // self.point_size_scale = (self.point_size_scale * (1. - zoom_delta * 0.001)); + let scale_delta = zoom_delta * 0.01; + self.point_size_scale = (self.point_size_scale + scale_delta).clamp(0.1, 1000.0); + // println!("{}", self.point_size_scale); + } else { + self.distance *= (1.0 - zoom_delta * 0.001).max(0.1); + } + changed = true; + } + + if i.pointer.primary_down() { + let delta = i.pointer.delta(); + let pan_speed = self.distance * 0.001; + + // Get camera-relative right and up vectors + let right = self.get_right(); + let up = self.get_up(); + + // Move camera in the camera plane + let pan = right * (-delta.x * pan_speed) + up * (delta.y * pan_speed); + self.position += pan; + + changed = true; + } + + if changed { + self.update_view(); + } + } + + fn get_right(&self) -> Vec3 { + self.orientation * Vec3::X + } + + fn get_up(&self) -> Vec3 { + self.orientation * Vec3::Y + } + + fn get_forward(&self) -> Vec3 { + self.orientation * -Vec3::Z + } + + fn update_view(&mut self) { + // Ensure orientation stays normalized + self.orientation = self.orientation.normalize(); + } + + pub fn get_view_matrix(&self) -> Mat4 { + // Calculate view position by moving back from target along view direction + let forward = self.get_forward(); + let view_pos = self.position - forward * self.distance; + + Mat4::look_at_rh(view_pos, self.position, self.get_up()) + } + + // pub fn set_point_size_scale(&mut self, scale: f32) { + // self.point_size_scale = scale.clamp(0.1, 10.0); + // } +} + +// PLY parsing structures +#[derive(Debug)] +struct PlyHeader { + vertex_count: usize, + has_colors: bool, + is_binary: bool, +} + +// #[derive(Debug)] +// pub struct PlyPoint { +// position: (i32, i32, i32), +// color: Color32, +// } + +#[derive(Default)] +pub struct PointRenderer { + pub gl: Option>, + program: Option, + vao: Option, + vbo: Option, + points: Option>, + // capacity: usize, + pub camera: Option, +} + +// impl Defalt for PointRenderer { +// fn default() -> Self { +// Self { +// gl: Option>, +// program: Option, +// vao: Option, +// vbo: Option, +// points: Option>, +// // capacity: usize, +// camera: Option, +// } +// } +// } +// } + +impl PointRenderer { + pub fn init( + &mut self, + gl: Option>, + initial_capacity: usize, + ) -> Result<(), Box> { + use glow::HasContext; + + let gl = if let Some(gl) = gl { + gl + } else { + return Err("GL Not initilized!".into()); + }; + + let program = unsafe { + let program = gl.create_program().expect("Cannot create program"); + + let vertex_shader = gl + .create_shader(glow::VERTEX_SHADER) + .expect("Cannot create vertex shader"); + gl.shader_source(vertex_shader, VERTEX_SHADER); + gl.compile_shader(vertex_shader); + + let fragment_shader = gl + .create_shader(glow::FRAGMENT_SHADER) + .expect("Cannot create fragment shader"); + gl.shader_source(fragment_shader, FRAGMENT_SHADER); + gl.compile_shader(fragment_shader); + + gl.attach_shader(program, vertex_shader); + gl.attach_shader(program, fragment_shader); + gl.link_program(program); + + gl.delete_shader(vertex_shader); + gl.delete_shader(fragment_shader); + + program + }; + + let vao = unsafe { + let vao = gl + .create_vertex_array() + .expect("Cannot create vertex array"); + gl.bind_vertex_array(Some(vao)); + vao + }; + + let vbo = unsafe { + let vbo = gl.create_buffer().expect("Cannot create vertex buffer"); + gl.bind_buffer(glow::ARRAY_BUFFER, Some(vbo)); + + // Position (3) + Color (4) = 7 u32s per vertex + let buffer_size = initial_capacity * 7 * std::mem::size_of::(); + gl.buffer_data_size(glow::ARRAY_BUFFER, buffer_size as i32, glow::DYNAMIC_DRAW); + + // Position attribute (uvec3) + gl.vertex_attrib_pointer_i32(0, 3, glow::INT, 28, 0); + gl.enable_vertex_attrib_array(0); + + // Color attribute (uvec4) + gl.vertex_attrib_pointer_i32(1, 4, glow::INT, 28, 12); + gl.enable_vertex_attrib_array(1); + + vbo + }; + + self.gl = Some(gl); + self.program = Some(program); + self.vao = Some(vao); + self.vbo = Some(vbo); + self.points = Some(Vec::with_capacity(initial_capacity * 7)); + // capacity: initial_capacity, + self.camera = Some(Camera::new()); + + Ok(()) + } + + pub fn add_point(&mut self, x: i32, y: i32, z: i32, color: Color32) { + let [r, g, b, a] = color.to_array(); + self.points + .as_mut() + .as_mut() + .expect("Not Initialised") + .extend_from_slice(&[x, y, z, r as i32, g as i32, b as i32, a as i32]); + } + + pub fn clear(&mut self) { + self.points + .as_mut() + .as_mut() + .expect("Not Initialised") + .clear(); + } + + pub fn render(&mut self, rect: Rect, input_state: Option) { + use glow::HasContext; + + // Update camera + if let Some(i) = input_state { + self.camera.as_mut().expect("Not Initialised").update(i); + } + + unsafe { + self.gl + .as_mut() + .expect("Not Initialised") + .use_program(self.program); + + // Set up view-projection matrix + let aspect = rect.width() / rect.height(); + let projection = Mat4::perspective_rh(45.0f32.to_radians(), aspect, 0.1, 1000.0); + let view = self + .camera + .as_mut() + .expect("Not Initialised") + .get_view_matrix(); + let view_projection = projection * view; + + let location = self + .gl + .as_mut() + .expect("Not Initialised") + .get_uniform_location( + *self.program.as_mut().expect("Not Initialised"), + "u_view_projection", + ) + .expect("Cannot get uniform location"); + self.gl + .as_mut() + .expect("Not Initialised") + .uniform_matrix_4_f32_slice( + Some(&location), + false, + &view_projection.to_cols_array(), + ); + + // Set position scale factor (converts uint positions to world space) + let scale_location = self + .gl + .as_mut() + .expect("Not Initialised") + .get_uniform_location( + *self.program.as_mut().expect("Not Initialised"), + "u_position_scale", + ) + .expect("Cannot get scale uniform location"); + self.gl + .as_mut() + .expect("Not Initialised") + .uniform_1_f32(Some(&scale_location), 0.001); // Adjust this value to scale your point cloud + + let point_size_location = self + .gl + .as_mut() + .expect("Not Initialised") + .get_uniform_location( + *self.program.as_mut().expect("Not Initialised"), + "u_point_size_scale", + ) + .expect("Cannot get point size scale location"); + self.gl.as_mut().expect("Not Initialised").uniform_1_f32( + Some(&point_size_location), + self.camera + .as_mut() + .expect("Not Initialised") + .point_size_scale, + ); + + self.gl + .as_mut() + .expect("Not Initialised") + .bind_vertex_array(self.vao); + self.gl.as_mut().expect("Not Initialised").bind_buffer( + glow::ARRAY_BUFFER, + Some(*self.vbo.as_mut().expect("Not Initialised")), + ); + + self.gl + .as_mut() + .expect("Not Initialised") + .buffer_sub_data_u8_slice( + glow::ARRAY_BUFFER, + 0, + bytemuck::cast_slice(&self.points.as_mut().expect("Not Initialised")), + ); + + self.gl + .as_mut() + .expect("Not Initialised") + .enable(glow::PROGRAM_POINT_SIZE); + self.gl + .as_mut() + .expect("Not Initialised") + .enable(glow::DEPTH_TEST); + + self.gl + .as_mut() + .expect("Not Initialised") + .clear_depth_f32(1.0); + self.gl + .as_mut() + .expect("Not Initialised") + .depth_func(glow::LESS); + self.gl.as_mut().expect("Not Initialised").depth_mask(true); + + // self.gl.clear_color(0.3, 0.3, 0.3, 1.0); + self.gl + .as_mut() + .expect("Not Initialised") + .clear(glow::COLOR_BUFFER_BIT | glow::DEPTH_BUFFER_BIT); + + self.gl.as_mut().expect("Not Initialised").draw_arrays( + glow::POINTS, + 0, + (self + .points + .as_mut() + .as_mut() + .expect("Not Initialised") + .len() + / 7) as i32, + ); + + self.gl + .as_mut() + .expect("Not Initialised") + .disable(glow::DEPTH_TEST); + self.gl + .as_mut() + .expect("Not Initialised") + .disable(glow::PROGRAM_POINT_SIZE); + } + } + + // Add method to load points from PLY file + pub fn load_ply( + &mut self, + ) -> Result, Box> { + use dialog::DialogBox; + + let choice = dialog::FileSelection::new("Please select a file") + .title("File Selection") + // .path("/home/user/Downloads") + .show() + .expect("Could not display dialog box"); + + let mut points = read_all::("pointcloud.las")?; + + let loaded_points: Vec<(i32, i32, i32, Color32)> = Vec::with_capacity(points.len()); + + let has_pos = points.point_layout().has_attribute(&POSITION_3D); + let has_color = points.point_layout().has_attribute(&COLOR_RGB); + + if has_pos { + for position in points + .view_attribute::>(&POSITION_3D) + .into_iter() + .take(10) + { + info!("({};{};{})", position.x, position.y, position.z); + } + } + + if has_color { + for i in 0..points.len() { + let point = points.get_point_mut(i); + + warn!("{:?}", point); + + // println!("({};{};{})", color.x, position.y, position.z); + } + } + + Err("".into()) + + // let file = File::open(path).map_err(|e| format!("Failed to open file: {}", e))?; + // let reader = BufReader::new(file); + // let mut lines = reader.lines(); + + // // Parse header + // let header = Self::parse_ply_header(&mut lines)?; + + // // Clear existing points + // self.clear(); + + // // Reserve capacity + // self.points + // .as_mut() + // .as_mut() + // .expect("Not Initialised") + // .reserve(header.vertex_count * 7); + + // // Parse vertices based on format + // if header.is_binary { + // return Err("Binary PLY files not yet supported".to_string()); + // } else { + // self.parse_ascii_ply_data(lines, header) + // } + } + + fn parse_ply_header(lines: &mut std::io::Lines) -> Result { + let mut vertex_count = 0; + let mut has_colors = false; + let mut is_binary = false; + let in_header = true; + + while in_header { + let line = lines + .next() + .ok_or("Unexpected end of file") + .unwrap() + .unwrap() + .trim() + .to_string(); + + match line.as_str() { + "ply" => continue, + "format ascii 1.0" => is_binary = false, + "format binary_little_endian 1.0" => is_binary = true, + "end_header" => break, + _ => { + if line.starts_with("element vertex ") { + vertex_count = line + .split_whitespace() + .last() + .ok_or("Invalid vertex count")? + .parse() + .map_err(|_| "Invalid vertex count")?; + } else if line.starts_with("property") && line.contains("red") { + has_colors = true; + } + } + } + } + + Ok(PlyHeader { + vertex_count, + has_colors, + is_binary, + }) + } + + // fn parse_ascii_ply_data( + // &mut self, + // lines: std::io::Lines, + // header: PlyHeader, + // ) -> Result, String> { + // let mut vec: Vec<(i32, i32, i32, Color32)> = Vec::new(); + + // for line in lines.take(header.vertex_count) { + // let line = line.map_err(|e| format!("Failed to read line: {}", e))?; + // let parts: Vec<&str> = line.split_whitespace().collect(); + + // if parts.len() < 3 { + // return Err("Invalid vertex data".to_string()); + // } + + // // Parse position + // let x = parts[0] + // .parse::() + // .map_err(|_| "Invalid X coordinate")?; + // let y = parts[1] + // .parse::() + // .map_err(|_| "Invalid Y coordinate")?; + // let z = parts[2] + // .parse::() + // .map_err(|_| "Invalid Z coordinate")?; + + // // Convert to fixed point (scale by 1000 for better precision) + // let x = (x * 1000.0) as i32; + // let y = (y * 1000.0) as i32; + // let z = (z * 1000.0) as i32; + + // // Parse colors if present + // let color = if header.has_colors && parts.len() >= 6 { + // let r = parts[3].parse::().unwrap_or(255); + // let g = parts[4].parse::().unwrap_or(255); + // let b = parts[5].parse::().unwrap_or(255); + // Color32::from_rgb(r, g, b) + // } else { + // Color32::WHITE + // }; + + // vec.push((x, y, z, color)); + + // // self.add_point(x, y, z, color); + // } + + // Ok(vec) + // } +} + +impl Drop for PointRenderer { + fn drop(&mut self) { + // Clean up GPU resources + } +} diff --git a/tof.py b/tof.py deleted file mode 100644 index 80c66c2..0000000 --- a/tof.py +++ /dev/null @@ -1,304 +0,0 @@ -import struct -import numpy as np -import cv2 -from PIL import Image - -#import matplotlib.pyplot as plt -import requests - -from depth import img2depth -from matchdepth import align_depth_maps - -# import open3d as o3d - -HOST = '192.168.233.1' -PORT = 80 - -def get_frame_from_http(host=HOST, port=PORT): - r = requests.get('http://{}:{}/getdeep'.format(host, port)) - if(r.status_code == requests.codes.ok): - # print('Get deep image') - deepimg = r.content - # print('Length={}'.format(len(deepimg))) - (frameid, stamp_msec) = struct.unpack('> with_config[1] - deepth_img = struct.unpack("<%us" % deepth_size, frame_payload[:deepth_size])[ - 0] if 0 != deepth_size else None - frame_payload = frame_payload[deepth_size:] - - # 0:16bit 1:8bit, resolution: 320*240 - ir_size = (320*240*2) >> with_config[3] - ir_img = struct.unpack("<%us" % ir_size, frame_payload[:ir_size])[ - 0] if 0 != ir_size else None - frame_payload = frame_payload[ir_size:] - - status_size = (320*240//8) * (16 if 0 == with_config[4] else - 2 if 1 == with_config[4] else 8 if 2 == with_config[4] else 1) - status_img = struct.unpack("<%us" % status_size, frame_payload[:status_size])[ - 0] if 0 != status_size else None - frame_payload = frame_payload[status_size:] - - assert(deep_data_size == deepth_size+ir_size+status_size) - - rgb_size = len(frame_payload) - assert(rgb_data_size == rgb_size) - rgb_img = struct.unpack("<%us" % rgb_size, frame_payload[:rgb_size])[ - 0] if 0 != rgb_size else None - - if (not rgb_img is None): - if (1 == with_config[6]): - jpeg = cv2.imdecode(np.frombuffer( - rgb_img, 'uint8', rgb_size), cv2.IMREAD_COLOR) - if not jpeg is None: - rgb = cv2.cvtColor(jpeg, cv2.COLOR_BGR2RGB) - rgb_img = rgb.tobytes() - else: - rgb_img = None - # elif 0 == with_config[6]: - # yuv = np.frombuffer(rgb_img, 'uint8', rgb_size) - # print(len(yuv)) - # if not yuv is None: - # rgb = cv2.cvtColor(yuv, cv2.COLOR_YUV420P2RGB) - # rgb_img = rgb.tobytes() - # else: - # rgb_img = None - - return (deepth_img, ir_img, status_img, rgb_img) - - - - - - -def scale_and_shift(image, scale_factor, shift_x, shift_y): - """ - Scale an RGB image and shift it by n pixels in x and y direction. - - Parameters: - ----------- - image : numpy.ndarray - Input RGB image with shape (height, width, 3) - scale_factor : float - Scale factor (e.g., 0.5 for half size, 2.0 for double size) - shift_x : int - Number of pixels to shift in x direction (positive: right, negative: left) - shift_y : int - Number of pixels to shift in y direction (positive: down, negative: up) - - Returns: - -------- - numpy.ndarray - Scaled and shifted image with the same shape as the input image - """ - # Get original image dimensions - height, width = image.shape[:2] - - # Calculate new dimensions after scaling - new_height = int(height * scale_factor) - new_width = int(width * scale_factor) - - # Scale the image - scaled_image = cv2.resize(image, (new_width, new_height), interpolation=cv2.INTER_LINEAR) - - # Create a transformation matrix for the shift - M = np.float32([[1, 0, shift_x], [0, 1, shift_y]]) - - # Apply the shift to the scaled image - shifted_image = cv2.warpAffine(scaled_image, M, (new_width, new_height)) - - # Create a blank canvas with original dimensions - result = np.zeros_like(image) - - # Calculate the region to copy from the shifted_scaled image - y_start = max(0, -shift_y) - y_end = min(new_height, height - shift_y) - x_start = max(0, -shift_x) - x_end = min(new_width, width - shift_x) - - # Calculate the region to paste into the result image - result_y_start = max(0, shift_y) - result_y_end = min(height, new_height + shift_y) - result_x_start = max(0, shift_x) - result_x_end = min(width, new_width + shift_x) - - # Copy the visible part of the shifted image to the result - if (y_end > y_start and x_end > x_start and - result_y_end > result_y_start and result_x_end > result_x_start): - result[result_y_start:result_y_end, result_x_start:result_x_end] = shifted_image[y_start:y_end, x_start:x_end] - - return result - - -prev_status = None -prev_depth = None - -def show_frame(frame_data: bytes): - global prev_status - global prev_depth - config = frame_config_decode(frame_data[16:16+12]) - frame_bytes = frame_payload_decode(frame_data[16+12:], config) - - depth = np.frombuffer(frame_bytes[0], 'uint16' if 0 == config[1] else 'uint8').reshape( - 240, 320) if frame_bytes[0] else None - - ir = np.frombuffer(frame_bytes[1], 'uint16' if 0 == config[3] else 'uint8').reshape( - 240, 320) if frame_bytes[1] else None - - status = np.frombuffer(frame_bytes[2], 'uint16' if 0 == config[4] else 'uint8').reshape( - 240, 320) if frame_bytes[2] else None - - rgb = np.frombuffer(frame_bytes[3], 'uint8').reshape( - (480, 640, 3) if config[6] == 1 else (600, 800, 3)) if frame_bytes[3] else None - - if not (depth is None or status is None or rgb is None): - rgb = cv2.resize(rgb, dsize=(320, 240), interpolation=cv2.INTER_CUBIC) # Resize - rgb = scale_and_shift(rgb, 1.1, -10, -10) - status = 1-status - - if prev_status is None: - mask = (status) - else: - mask = (status)*(prev_status) - prev_status = status - - depth = depth*mask - if prev_depth is not None: - new_depth = (depth + prev_depth)/2 - prev_depth = depth - depth = new_depth - else: - prev_depth = depth - - - img_depth = img2depth(rgb) - - aligned_img_depth = align_depth_maps(depth, img_depth, mask)*(1-mask) - - - return (aligned_img_depth + depth), rgb, mask - return None - - -# create visualizer and window. -# vis = o3d.visualization.Visualizer() -# vis.create_window(height=480, width=640) - -# pcd = o3d.geometry.PointCloud() -# pcd.points = o3d.utility.Vector3dVector(np.random.rand(10, 3)) - -# vis.add_geometry(pcd) - - -# depth_to_color_translation = np.array([0, 0, 0]) # 5cm offset in x -# depth_to_color_rotation = np.eye(3) # Identity matrix if cameras are parallel - -# color_intrinsics = (520, 520, 325, 245) - -keep_running = True - -photocount = 0 - -while keep_running: - if post_encode_config(frame_config_encode(1,0,255,0,2,7,1,0,0)): - p = get_frame_from_http() - depth_image, rgb, mask = show_frame(p) - if depth_image is None: continue - depth_colored = cv2.applyColorMap((depth_image).astype(np.uint8), cv2.COLORMAP_JET) - - # mask = (depth_image>1000) - - # b = np.repeat((depth_image>10)[:, :, np.newaxis], 3, axis=2) - # b = np.repeat((mask==1)[:, :, np.newaxis], 3, axis=2) - - - cv2.imshow("depth", depth_colored) - cv2.imshow("rgb", rgb) - - key = cv2.waitKey(1) - - if key & 0xFF == 27: - break - elif key & 0xFF == 32: - photocount += 1 - depth = Image.fromarray(depth_image) - rgb = Image.fromarray(rgb) - - depth.save(f"./depth/depth-{photocount}.png") - rgb.save(f"./rgb/rgb-{photocount}.png") - - - print(f"Took photo {photocount}!") - - - - # points, colors = depth_to_colored_points( - # depth_image, - # color_image, - # x_map, - # y_map, - # color_intrinsics, - # depth_to_color_translation, - # depth_to_color_rotation - # ) - - - # points = depth_image.reshape((-1, 3)) - # colors = color_image.reshape((-1, 3)).astype(np.float64) / 255.0 - - # colors[:, [0, 2]] = colors[:, [2, 0]] - - # print(points.shape) - # print(colors.shape) - - # pcd.points = o3d.utility.Vector3dVector(points) - # pcd.colors = o3d.utility.Vector3dVector(colors) - - - # vis.update_geometry(pcd) - - # keep_running = vis.poll_events() - # vis.update_renderer() - - # pcd.points.extend(np.random.rand(n_new, 3)) - # cv2.waitKey(1) - # with open("rgbd.raw", 'wb') as f: - # f.write(p) - # f.flush() -cv2.destroyAllWindows() \ No newline at end of file