diff --git a/.gitignore b/.gitignore index b471067..85c2d00 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ /target -Cargo.lock +# Cargo.lock .idea diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..92db7a8 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,3040 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[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 = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "aligned-vec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + +[[package]] +name = "android-activity" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" +dependencies = [ + "android-properties", + "bitflags 2.6.0", + "cc", + "cesu8", + "jni", + "jni-sys", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "num_enum", + "thiserror", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "anyhow" +version = "1.0.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37bf3594c4c988a53154954629820791dde498571819ae4ca50ca811e060cc95" + +[[package]] +name = "approx" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f2a05fd1bd10b2527e20a2cd32d8873d115b8b39fe219ee25f42a8aca6ba278" +dependencies = [ + "num-traits", +] + +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" + +[[package]] +name = "arboard" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df099ccb16cd014ff054ac1bf392c67feeef57164b05c42f037cd40f5d4357f4" +dependencies = [ + "clipboard-win", + "log", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "parking_lot", + "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", +] + +[[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.37.3+1.3.251" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a" +dependencies = [ + "libloading 0.7.4", +] + +[[package]] +name = "ash" +version = "0.38.0+1.3.281" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" +dependencies = [ + "libloading 0.8.5", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e335041290c43101ca215eed6f43ec437eb5a42125573f600fc3fa42b9bddd62" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "bit_field" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "bitstream-io" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b81e1519b0d82120d2fd469d5bfb2919a9361c48b02d82d04befc1cdd2002452" + +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2", +] + +[[package]] +name = "built" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c360505aed52b7ec96a3636c3f039d99103c37d1d9b4f7a8c743d3ea9ffcd03b" + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bytemuck" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[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.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" + +[[package]] +name = "calloop" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" +dependencies = [ + "bitflags 2.6.0", + "log", + "polling", + "rustix", + "slab", + "thiserror", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" +dependencies = [ + "calloop", + "rustix", + "wayland-backend", + "wayland-client", +] + +[[package]] +name = "cc" +version = "1.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +dependencies = [ + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "cgmath" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a98d30140e3296250832bbaaff83b27dcd6fa3cc70fb6f1f3e5c9c0023b5317" +dependencies = [ + "approx", + "num-traits", +] + +[[package]] +name = "clipboard-win" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" +dependencies = [ + "error-code", +] + +[[package]] +name = "cmake" +version = "0.1.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb1e43aa7fd152b1f968787f7dbcdeb306d1867ff373c69955211876c053f91a" +dependencies = [ + "cc", +] + +[[package]] +name = "color-hex" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecdffb913a326b6c642290a0d0ec8e8d6597291acdc07cc4c9cb4b3635d44cf9" + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "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]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "cursor-icon" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading 0.8.5", +] + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" + +[[package]] +name = "ecolor" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "775cfde491852059e386c4e1deb4aef381c617dc364184c6f6afee99b87c402b" +dependencies = [ + "bytemuck", + "color-hex", + "emath", +] + +[[package]] +name = "egui" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53eafabcce0cb2325a59a98736efe0bf060585b437763f8c476957fb274bb974" +dependencies = [ + "ahash", + "emath", + "epaint", + "log", + "nohash-hasher", +] + +[[package]] +name = "egui-winit" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a9c430f4f816340e8e8c1b20eec274186b1be6bc4c7dfc467ed50d57abc36c6" +dependencies = [ + "ahash", + "arboard", + "egui", + "log", + "raw-window-handle 0.6.2", + "smithay-clipboard", + "web-time", + "webbrowser", + "winit", +] + +[[package]] +name = "egui_demo_lib" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcc5e2dd86a62a644db35f89f712c87432ae58266f793d06683c827d67018aa1" +dependencies = [ + "egui", + "egui_extras", + "unicode_names2", +] + +[[package]] +name = "egui_extras" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf3c1f5cd8dfe2ade470a218696c66cf556fcfd701e7830fa2e9f4428292a2a1" +dependencies = [ + "ahash", + "egui", + "enum-map", + "log", + "mime_guess2", +] + +[[package]] +name = "egui_winit_vulkano" +version = "0.27.0" +dependencies = [ + "ahash", + "cgmath", + "egui", + "egui-winit", + "egui_demo_lib", + "image", + "vulkano 0.34.0", + "vulkano-shaders", + "vulkano-util", + "winit", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "emath" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1fe0049ce51d0fb414d029e668dd72eb30bc2b739bf34296ed97bd33df544f3" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "enum-map" +version = "2.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9" +dependencies = [ + "enum-map-derive", + "serde", +] + +[[package]] +name = "enum-map-derive" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "epaint" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a32af8da821bd4f43f2c137e295459ee2e1661d87ca8779dfa0eaf45d870e20f" +dependencies = [ + "ab_glyph", + "ahash", + "bytemuck", + "ecolor", + "emath", + "epaint_default_fonts", + "log", + "nohash-hasher", + "parking_lot", +] + +[[package]] +name = "epaint_default_fonts" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "483440db0b7993cf77a20314f08311dbe95675092405518c0677aa08c151a3ea" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "error-code" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d9305ccc6942a704f4335694ecd3de2ea531b114ac2d51f5f843750787a92f" + +[[package]] +name = "exr" +version = "1.72.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4" +dependencies = [ + "bit_field", + "flume", + "half", + "lebe", + "miniz_oxide 0.7.4", + "rayon-core", + "smallvec", + "zune-inflate", +] + +[[package]] +name = "fdeflate" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8090f921a24b04994d9929e204f50b498a33ea6ba559ffaa05e04f7ee7fb5ab" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "flate2" +version = "1.0.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" +dependencies = [ + "crc32fast", + "miniz_oxide 0.8.0", +] + +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "spin", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "gethostname" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" +dependencies = [ + "libc", + "windows-targets 0.48.5", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[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 = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "bytemuck", + "cfg-if", + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +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 = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "image" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc144d44a31d753b02ce64093d532f55ff8dc4ebf2ffb8a63c0dda691385acae" +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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e031e8e3d94711a9ccb5d6ea357439ef3dcbed361798bd4071dc4d9793fbe22f" +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 = "indexmap" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror", + "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.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +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.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +dependencies = [ + "wasm-bindgen", +] + +[[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.161" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" + +[[package]] +name = "libfuzzer-sys" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" +dependencies = [ + "arbitrary", + "cc", + "once_cell", +] + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libloading" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +dependencies = [ + "cfg-if", + "windows-targets 0.52.6", +] + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", + "redox_syscall 0.5.7", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[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.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[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 = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memmap2" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +dependencies = [ + "libc", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess2" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a3333bb1609500601edc766a39b4c1772874a4ce26022f4d866854dc020c41" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +dependencies = [ + "adler", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.6.0", + "jni-sys", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle 0.6.2", + "thiserror", +] + +[[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.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 = "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-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[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", +] + +[[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-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.6.0", + "block2", + "libc", + "objc2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", + "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", + "objc2-contacts", + "objc2-foundation", +] + +[[package]] +name = "objc2-encode" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.6.0", + "block2", + "dispatch", + "libc", + "objc2", +] + +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2", + "objc2", + "objc2-app-kit", + "objc2-foundation", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-symbols" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +dependencies = [ + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-image", + "objc2-core-location", + "objc2-foundation", + "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", + "objc2-foundation", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-core-location", + "objc2-foundation", +] + +[[package]] +name = "once_cell" +version = "1.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" + +[[package]] +name = "orbclient" +version = "0.3.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba0b26cec2e24f08ed8bb31519a9333140a6599b867dac464bb150bdb796fd43" +dependencies = [ + "libredox", +] + +[[package]] +name = "owned_ttf_parser" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec719bbf3b2a81c109a4e20b1f129b5566b7dce654bc3872f6a05abf82b2c4" +dependencies = [ + "ttf-parser", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.7", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf123a161dde1e524adf36f90bc5d8d3462824a9c43553ad07a8183161189ec" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4502d8515ca9f32f1fb543d987f63d95a14934883db45bdb48060b6b69257f8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + +[[package]] +name = "png" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f9d46a34a05a6a57566bc2bfae066ef07585a6e3fa30fbbdff5936380623f0" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide 0.8.0", +] + +[[package]] +name = "polling" +version = "3.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro-crate" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.88" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" +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", +] + +[[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.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[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", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand", + "rand_chacha", + "simd_helpers", + "system-deps", + "thiserror", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2413fd96bd0ea5cdeeb37eaf446a22e6ed7b981d792828721e74ded1980a45c6" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rgb", +] + +[[package]] +name = "raw-window-handle" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "raw-window-metal" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2000e45d7daa9b6d946e88dfa1d7ae330424a81918a6545741821c989eb80a9" +dependencies = [ + "objc2", + "objc2-foundation", + "objc2-quartz-core", +] + +[[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.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "regex" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "rgb" +version = "0.8.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" + +[[package]] +name = "roxmltree" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "921904a62e410e37e215c40381b7117f830d9d89ba60ab5236170541dd25646b" +dependencies = [ + "xmlparser", +] + +[[package]] +name = "rustix" +version = "0.38.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "serde" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.210" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.132" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "shaderc" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27e07913ada18607bb60d12431cbe3358d3bbebbe95948e1618851dc01e63b7b" +dependencies = [ + "libc", + "shaderc-sys", +] + +[[package]] +name = "shaderc-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73120d240fe22196300f39ca8547ca2d014960f27b19b47b21288b396272f7f7" +dependencies = [ + "cmake", + "libc", + "roxmltree", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[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 = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slabbin" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8305086044614627ed85432d27b87cf9fc047204eaa036a11de6cf0120f273" + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "smithay-client-toolkit" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" +dependencies = [ + "bitflags 2.6.0", + "calloop", + "calloop-wayland-source", + "cursor-icon", + "libc", + "log", + "memmap2", + "rustix", + "thiserror", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", +] + +[[package]] +name = "smithay-clipboard" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc8216eec463674a0e90f29e0ae41a4db573ec5b56b1c6c1c71615d249b6d846" +dependencies = [ + "libc", + "smithay-client-toolkit", + "wayland-backend", +] + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "syn" +version = "2.0.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "198514704ca887dd5a1e408c6c6cdcba43672f9b4062e1b24aa34e74e6d7faae" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "thiserror" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" + +[[package]] +name = "ttf-parser" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5902c5d130972a0000f60860bfbf46f7ca3db5391eddfedd1b8728bd9dc96c0e" + +[[package]] +name = "unicase" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" + +[[package]] +name = "unicode-bidi" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode_names2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "446c96c6dd42604779487f0a981060717156648c1706aa1f464677f03c6cc059" + +[[package]] +name = "url" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "v_frame" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + +[[package]] +name = "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 = "vk-parse" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81086c28be67a8759cd80cbb3c8f7b520e0874605fc5eb74d5a1c9c2d1878e79" +dependencies = [ + "xml-rs", +] + +[[package]] +name = "vk-parse" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3859da4d7b98bec73e68fb65815d47a263819c415c90eed42b80440a02cbce8c" +dependencies = [ + "xml-rs", +] + +[[package]] +name = "vulkano" +version = "0.34.0" +source = "git+https://github.com/vulkano-rs/vulkano.git#0815e76659ee0c9fdef39f5064ff70b45470eeca" +dependencies = [ + "ahash", + "ash 0.38.0+1.3.281", + "bytemuck", + "crossbeam-queue", + "half", + "heck 0.4.1", + "indexmap", + "libloading 0.8.5", + "nom", + "once_cell", + "parking_lot", + "proc-macro2", + "quote", + "raw-window-handle 0.6.2", + "raw-window-metal", + "serde", + "serde_json", + "slabbin", + "smallvec", + "thread_local", + "vk-parse 0.15.0", + "vulkano-macros", + "x11-dl", + "x11rb", +] + +[[package]] +name = "vulkano" +version = "0.34.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70f4278f76307b3c388679234b397b4f90de29cdba53873c26b624ed82653d75" +dependencies = [ + "ahash", + "ash 0.37.3+1.3.251", + "bytemuck", + "core-graphics-types", + "crossbeam-queue", + "half", + "heck 0.4.1", + "indexmap", + "libloading 0.8.5", + "objc", + "once_cell", + "parking_lot", + "proc-macro2", + "quote", + "raw-window-handle 0.5.2", + "regex", + "serde", + "serde_json", + "smallvec", + "thread_local", + "vk-parse 0.12.0", +] + +[[package]] +name = "vulkano-macros" +version = "0.34.0" +source = "git+https://github.com/vulkano-rs/vulkano.git#0815e76659ee0c9fdef39f5064ff70b45470eeca" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "vulkano-shaders" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1f63401297565d74afb96e9add12587d8e46235140cee325a8eb6ba4602f4ee" +dependencies = [ + "ahash", + "heck 0.4.1", + "proc-macro2", + "quote", + "shaderc", + "syn", + "vulkano 0.34.1", +] + +[[package]] +name = "vulkano-util" +version = "0.34.0" +source = "git+https://github.com/vulkano-rs/vulkano.git#0815e76659ee0c9fdef39f5064ff70b45470eeca" +dependencies = [ + "ahash", + "vulkano 0.34.0", + "winit", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +dependencies = [ + "cfg-if", + "once_cell", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" + +[[package]] +name = "wayland-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "056535ced7a150d45159d3a8dc30f91a2e2d588ca0b23f70e56033622b8016f6" +dependencies = [ + "cc", + "downcast-rs", + "rustix", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3f45d1222915ef1fd2057220c1d9d9624b7654443ea35c3877f7a52bd0a5a2d" +dependencies = [ + "bitflags 2.6.0", + "rustix", + "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.6.0", + "cursor-icon", + "wayland-backend", +] + +[[package]] +name = "wayland-cursor" +version = "0.31.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a94697e66e76c85923b0d28a0c251e8f0666f58fc47d316c0f4da6da75d37cb" +dependencies = [ + "rustix", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b5755d77ae9040bb872a25026555ce4cb0ae75fd923e90d25fba07d81057de0" +dependencies = [ + "bitflags 2.6.0", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0a41a6875e585172495f7a96dfa42ca7e0213868f4f15c313f7c33221a7eff" +dependencies = [ + "bitflags 2.6.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dad87b5fd1b1d3ca2f792df8f686a2a11e3fe1077b71096f7a175ab699f89109" +dependencies = [ + "bitflags 2.6.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597f2001b2e5fc1121e3d5b9791d3e78f05ba6bfa4641053846248e3a13661c3" +dependencies = [ + "proc-macro2", + "quick-xml", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efa8ac0d8e8ed3e3b5c9fc92c7881406a268e11555abe36493efabe649a29e09" +dependencies = [ + "dlib", + "log", + "once_cell", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.72" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webbrowser" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e5f07fb9bc8de2ddfe6b24a71a75430673fd679e568c48b52716cef1cfae923" +dependencies = [ + "block2", + "core-foundation 0.10.0", + "home", + "jni", + "log", + "ndk-context", + "objc2", + "objc2-foundation", + "url", + "web-sys", +] + +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winit" +version = "0.30.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0be9e76a1f1077e04a411f0b989cbd3c93339e1771cb41e71ac4aee95bfd2c67" +dependencies = [ + "ahash", + "android-activity", + "atomic-waker", + "bitflags 2.6.0", + "block2", + "bytemuck", + "calloop", + "cfg_aliases", + "concurrent-queue", + "core-foundation 0.9.4", + "core-graphics", + "cursor-icon", + "dpi", + "js-sys", + "libc", + "memmap2", + "ndk", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "objc2-ui-kit", + "orbclient", + "percent-encoding", + "pin-project", + "raw-window-handle 0.6.2", + "redox_syscall 0.4.1", + "rustix", + "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.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +dependencies = [ + "memchr", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" +dependencies = [ + "as-raw-xcb-connection", + "gethostname", + "libc", + "libloading 0.8.5", + "once_cell", + "rustix", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" + +[[package]] +name = "xcursor" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef33da6b1660b4ddbfb3aef0ade110c8b8a781a3b6382fa5f2b5b040fd55f61" + +[[package]] +name = "xkbcommon-dl" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" +dependencies = [ + "bitflags 2.6.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.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af4e2e2f7cba5a093896c1e150fbfe177d1883e7448200efb81d40b9d339ef26" + +[[package]] +name = "xmlparser" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "byteorder", + "zerocopy-derive", +] + +[[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", +] + +[[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.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16099418600b4d8f028622f73ff6e3deaabdff330fb9a2a131dea781ee8b0768" +dependencies = [ + "zune-core", +] diff --git a/Cargo.toml b/Cargo.toml index 95b4eaf..eceea11 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,15 +19,15 @@ wayland = ["winit/wayland", "winit/wayland-dlopen", "egui-winit/wayland"] x11 = ["winit/x11", "egui-winit/x11"] [dependencies] -ahash = "0.8.3" -egui-winit = { version = "0.24", default-features = false } -egui = "0.24" -image = { version = "0.24.5", optional = true } -winit = { version = "0.28", default-features = false } -vulkano = "0.34" +ahash = "0.8" +egui-winit = { version = "0.29", default-features = false } +egui = "0.29" +image = { version = "0.25", optional = true } +winit = { version = "0.30", default-features = false, features = [ "rwh_06" ] } +vulkano = { version = "0.34", git = "https://github.com/vulkano-rs/vulkano.git"} vulkano-shaders = "0.34" [dev-dependencies] cgmath = "0.18.0" -egui_demo_lib = "0.24" -vulkano-util = "0.34" +egui_demo_lib = "0.29.1" +vulkano-util = { version = "0.34", git = "https://github.com/vulkano-rs/vulkano.git"} diff --git a/examples/demo_app.rs b/examples/demo_app.rs index d35ac7d..d3d18e7 100644 --- a/examples/demo_app.rs +++ b/examples/demo_app.rs @@ -7,135 +7,183 @@ // notice may not be copied, modified, or distributed except // according to those terms. +use egui_demo_lib::{ColorTest, DemoWindows}; use egui_winit_vulkano::{Gui, GuiConfig}; use vulkano_util::{ context::{VulkanoConfig, VulkanoContext}, window::{VulkanoWindows, WindowDescriptor}, }; use winit::{ - event::{Event, WindowEvent}, - event_loop::{ControlFlow, EventLoop}, + application::ApplicationHandler, error::EventLoopError, event::WindowEvent, + event_loop::EventLoop, window::WindowId, }; // Simply create egui demo apps to test everything works correctly. // Creates two windows with different color formats for their swapchain. -pub fn main() { - // Winit event loop - let event_loop = EventLoop::new(); - // Vulkano context - let context = VulkanoContext::new(VulkanoConfig::default()); - // Vulkano windows (create one) - let mut windows = VulkanoWindows::default(); - let window1 = windows.create_window( - &event_loop, - &context, - &WindowDescriptor { - title: String::from("egui_winit_vulkano SRGB"), - ..WindowDescriptor::default() - }, - |ci| { - ci.image_format = vulkano::format::Format::B8G8R8A8_SRGB; - ci.min_image_count = ci.min_image_count.max(2); - }, - ); - let window2 = windows.create_window( - &event_loop, - &context, - &WindowDescriptor { - title: String::from("egui_winit_vulkano UNORM"), - ..WindowDescriptor::default() - }, - |ci| { - ci.image_format = vulkano::format::Format::B8G8R8A8_UNORM; - ci.min_image_count = ci.min_image_count.max(2); - }, - ); - // Create gui as main render pass (no overlay means it clears the image each frame) - let mut gui1 = { - let renderer = windows.get_renderer_mut(window1).unwrap(); - Gui::new( - &event_loop, - renderer.surface(), - renderer.graphics_queue(), - renderer.swapchain_format(), - GuiConfig { allow_srgb_render_target: true, ..GuiConfig::default() }, - ) - }; - let mut gui2 = { - let renderer = windows.get_renderer_mut(window2).unwrap(); - Gui::new( - &event_loop, - renderer.surface(), - renderer.graphics_queue(), - renderer.swapchain_format(), - GuiConfig::default(), - ) - }; - // Display the demo application that ships with egui. - let mut demo_app1 = egui_demo_lib::DemoWindows::default(); - let mut demo_app2 = egui_demo_lib::DemoWindows::default(); - let mut egui_test1 = egui_demo_lib::ColorTest::default(); - let mut egui_test2 = egui_demo_lib::ColorTest::default(); - - event_loop.run(move |event, _, control_flow| { - for (wi, renderer) in windows.iter_mut() { - // Quick and ugly... - let gui = if *wi == window1 { &mut gui1 } else { &mut gui2 }; - let demo_app = if *wi == window1 { &mut demo_app1 } else { &mut demo_app2 }; - let egui_test = if *wi == window1 { &mut egui_test1 } else { &mut egui_test2 }; - match &event { - Event::WindowEvent { event, window_id } if window_id == wi => { - // Update Egui integration so the UI works! - let _pass_events_to_game = !gui.update(event); - match event { - WindowEvent::Resized(_) => { - renderer.resize(); - } - WindowEvent::ScaleFactorChanged { .. } => { - renderer.resize(); - } - WindowEvent::CloseRequested => { - *control_flow = ControlFlow::Exit; - } - _ => (), - } - } - Event::RedrawRequested(window_id) if window_id == wi => { - // Set immediate UI in redraw here - gui.immediate_ui(|gui| { - let ctx = gui.context(); - demo_app.ui(&ctx); - - egui::Window::new("Colors").vscroll(true).show(&ctx, |ui| { - egui_test.ui(ui); - }); +pub struct App { + context: VulkanoContext, + windows: VulkanoWindows, + window1: Option, + window2: Option, +} + +pub struct Window { + id: WindowId, + gui: Gui, + demo_app: DemoWindows, + egui_test: ColorTest, +} + +impl Default for App { + fn default() -> Self { + // Vulkano context + let context = VulkanoContext::new(VulkanoConfig::default()); + // Vulkano windows (create one) + let windows = VulkanoWindows::default(); + + Self { context, windows, window1: None, window2: None } + } +} + +impl ApplicationHandler for App { + fn resumed(&mut self, event_loop: &winit::event_loop::ActiveEventLoop) { + // Display the demo application that ships with egui. + let demo_app1 = DemoWindows::default(); + let demo_app2 = DemoWindows::default(); + let egui_test1 = ColorTest::default(); + let egui_test2 = ColorTest::default(); + + let window1 = self.windows.create_window( + event_loop, + &self.context, + &WindowDescriptor { + title: String::from("egui_winit_vulkano SRGB"), + ..WindowDescriptor::default() + }, + |ci| { + ci.image_format = vulkano::format::Format::B8G8R8A8_SRGB; + ci.min_image_count = ci.min_image_count.max(2); + }, + ); + + let window2 = self.windows.create_window( + event_loop, + &self.context, + &WindowDescriptor { + title: String::from("egui_winit_vulkano UNORM"), + ..WindowDescriptor::default() + }, + |ci| { + ci.image_format = vulkano::format::Format::B8G8R8A8_UNORM; + ci.min_image_count = ci.min_image_count.max(2); + }, + ); + + // Create gui as main render pass (no overlay means it clears the image each frame) + let gui1 = { + let renderer = self.windows.get_renderer_mut(window1).unwrap(); + Gui::new( + event_loop, + renderer.surface(), + renderer.graphics_queue(), + renderer.swapchain_format(), + GuiConfig { allow_srgb_render_target: true, ..GuiConfig::default() }, + ) + }; + + let gui2 = { + let renderer = self.windows.get_renderer_mut(window2).unwrap(); + Gui::new( + event_loop, + renderer.surface(), + renderer.graphics_queue(), + renderer.swapchain_format(), + GuiConfig::default(), + ) + }; + + self.window1 = + Some(Window { id: window1, gui: gui1, demo_app: demo_app1, egui_test: egui_test1 }); + + self.window2 = + Some(Window { id: window2, gui: gui2, demo_app: demo_app2, egui_test: egui_test2 }); + } + + fn window_event( + &mut self, + event_loop: &winit::event_loop::ActiveEventLoop, + window_id: winit::window::WindowId, + event: WindowEvent, + ) { + let renderer = self.windows.get_renderer_mut(window_id).unwrap(); + + let w1 = self.window1.as_mut().unwrap(); + let w2 = self.window2.as_mut().unwrap(); + + // Quick and ugly... + let gui = if window_id == w1.id { &mut w1.gui } else { &mut w2.gui }; + let demo_app = if window_id == w1.id { &mut w1.demo_app } else { &mut w2.demo_app }; + let egui_test = if window_id == w1.id { &mut w1.egui_test } else { &mut w2.egui_test }; + + // Update Egui integration so the UI works! + let _pass_events_to_game = !gui.update(&event); + match event { + WindowEvent::Resized(_) => { + renderer.resize(); + } + WindowEvent::ScaleFactorChanged { .. } => { + renderer.resize(); + } + WindowEvent::CloseRequested => { + event_loop.exit(); + } + WindowEvent::RedrawRequested => { + // Set immediate UI in redraw here + gui.immediate_ui(|gui| { + let ctx = gui.context(); + demo_app.ui(&ctx); + + egui::Window::new("Colors").vscroll(true).show(&ctx, |ui| { + egui_test.ui(ui); }); - // Alternatively you could - // gui.begin_frame(); - // let ctx = gui.context(); - // demo_app.ui(&ctx); - - // Render UI - // Acquire swapchain future - match renderer.acquire() { - Ok(future) => { - let after_future = - gui.draw_on_image(future, renderer.swapchain_image_view()); - // Present swapchain - renderer.present(after_future, true); - } - Err(vulkano::VulkanError::OutOfDate) => { - renderer.resize(); - } - Err(e) => panic!("Failed to acquire swapchain future: {}", e), - }; - } - Event::MainEventsCleared => { - renderer.window().request_redraw(); - } - _ => (), + }); + // Alternatively you could + // gui.begin_frame(); + // let ctx = gui.context(); + // demo_app.ui(&ctx); + + // Render UI + // Acquire swapchain future + match renderer.acquire(Some(std::time::Duration::from_millis(10)), |_| {}) { + Ok(future) => { + let after_future = + gui.draw_on_image(future, renderer.swapchain_image_view()); + // Present swapchain + renderer.present(after_future, true); + } + Err(vulkano::VulkanError::OutOfDate) => { + renderer.resize(); + } + Err(e) => panic!("Failed to acquire swapchain future: {}", e), + }; } + _ => (), + } + } + + fn about_to_wait(&mut self, _event_loop: &winit::event_loop::ActiveEventLoop) { + for (_, renderer) in self.windows.iter_mut() { + renderer.window().request_redraw(); } - }); + } +} + +pub fn main() -> Result<(), EventLoopError> { + // Winit event loop + let event_loop = EventLoop::new().unwrap(); + + let mut app = App::default(); + + event_loop.run_app(&mut app) } diff --git a/examples/minimal.rs b/examples/minimal.rs index f16ef0a..caad726 100644 --- a/examples/minimal.rs +++ b/examples/minimal.rs @@ -16,58 +16,79 @@ use vulkano_util::{ window::{VulkanoWindows, WindowDescriptor}, }; use winit::{ - event::{Event, WindowEvent}, - event_loop::{ControlFlow, EventLoop}, + application::ApplicationHandler, error::EventLoopError, event::WindowEvent, + event_loop::EventLoop, }; fn sized_text(ui: &mut egui::Ui, text: impl Into, size: f32) { ui.label(egui::RichText::new(text).size(size)); } -pub fn main() { - // Winit event loop - let event_loop = EventLoop::new(); - // Vulkano context - let context = VulkanoContext::new(VulkanoConfig::default()); - // Vulkano windows (create one) - let mut windows = VulkanoWindows::default(); - windows.create_window(&event_loop, &context, &WindowDescriptor::default(), |ci| { - ci.image_format = vulkano::format::Format::B8G8R8A8_UNORM; - ci.min_image_count = ci.min_image_count.max(2); - }); - // Create gui as main render pass (no overlay means it clears the image each frame) - let mut gui = { - let renderer = windows.get_primary_renderer_mut().unwrap(); - Gui::new( - &event_loop, - renderer.surface(), - renderer.graphics_queue(), - renderer.swapchain_format(), - GuiConfig::default(), - ) - }; - // Create gui state (pass anything your state requires) - let mut code = CODE.to_owned(); - event_loop.run(move |event, _, control_flow| { - let renderer = windows.get_primary_renderer_mut().unwrap(); +pub struct App { + context: VulkanoContext, + windows: VulkanoWindows, + code: String, + gui: Option, +} + +impl Default for App { + fn default() -> Self { + // Vulkano context + let context = VulkanoContext::new(VulkanoConfig::default()); + + // Vulkano windows + let windows = VulkanoWindows::default(); + + let code = CODE.to_owned(); + + Self { context, windows, code, gui: None } + } +} + +impl ApplicationHandler for App { + fn resumed(&mut self, event_loop: &winit::event_loop::ActiveEventLoop) { + self.windows.create_window(event_loop, &self.context, &WindowDescriptor::default(), |ci| { + ci.image_format = vulkano::format::Format::B8G8R8A8_UNORM; + ci.min_image_count = ci.min_image_count.max(2); + }); + + // Create gui as main render pass (no overlay means it clears the image each frame) + self.gui = Some({ + let renderer = self.windows.get_primary_renderer_mut().unwrap(); + Gui::new( + event_loop, + renderer.surface(), + renderer.graphics_queue(), + renderer.swapchain_format(), + GuiConfig::default(), + ) + }); + } + + fn window_event( + &mut self, + event_loop: &winit::event_loop::ActiveEventLoop, + window_id: winit::window::WindowId, + event: WindowEvent, + ) { + let renderer = self.windows.get_renderer_mut(window_id).unwrap(); + + let gui = self.gui.as_mut().unwrap(); + + // Update Egui integration so the UI works! + let _pass_events_to_game = !gui.update(&event); match event { - Event::WindowEvent { event, window_id } if window_id == renderer.window().id() => { - // Update Egui integration so the UI works! - let _pass_events_to_game = !gui.update(&event); - match event { - WindowEvent::Resized(_) => { - renderer.resize(); - } - WindowEvent::ScaleFactorChanged { .. } => { - renderer.resize(); - } - WindowEvent::CloseRequested => { - *control_flow = ControlFlow::Exit; - } - _ => (), - } + WindowEvent::Resized(_) => { + renderer.resize(); + } + WindowEvent::ScaleFactorChanged { .. } => { + renderer.resize(); + } + WindowEvent::CloseRequested => { + event_loop.exit(); } - Event::RedrawRequested(window_id) if window_id == window_id => { + WindowEvent::RedrawRequested => { + // Set immediate UI in redraw here // Set immediate UI in redraw here gui.immediate_ui(|gui| { let ctx = gui.context(); @@ -78,18 +99,15 @@ pub fn main() { }); ui.separator(); ui.columns(2, |columns| { - ScrollArea::vertical().id_source("source").show( - &mut columns[0], - |ui| { - ui.add( - TextEdit::multiline(&mut code).font(TextStyle::Monospace), - ); - }, - ); - ScrollArea::vertical().id_source("rendered").show( + ScrollArea::vertical().id_salt("source").show(&mut columns[0], |ui| { + ui.add( + TextEdit::multiline(&mut self.code).font(TextStyle::Monospace), + ); + }); + ScrollArea::vertical().id_salt("rendered").show( &mut columns[1], |ui| { - egui_demo_lib::easy_mark::easy_mark(ui, &code); + egui_demo_lib::easy_mark::easy_mark(ui, &self.code); }, ); }); @@ -97,11 +115,14 @@ pub fn main() { }); // Render UI // Acquire swapchain future - match renderer.acquire() { + match renderer.acquire(Some(std::time::Duration::from_millis(10)), |_| {}) { Ok(future) => { // Render gui - let after_future = - gui.draw_on_image(future, renderer.swapchain_image_view()); + let after_future = self + .gui + .as_mut() + .unwrap() + .draw_on_image(future, renderer.swapchain_image_view()); // Present swapchain renderer.present(after_future, true); } @@ -111,12 +132,22 @@ pub fn main() { Err(e) => panic!("Failed to acquire swapchain future: {}", e), }; } - Event::MainEventsCleared => { - renderer.window().request_redraw(); - } _ => (), } - }); + } + fn about_to_wait(&mut self, _event_loop: &winit::event_loop::ActiveEventLoop) { + let renderer = self.windows.get_primary_renderer_mut().unwrap(); + renderer.window().request_redraw(); + } +} + +pub fn main() -> Result<(), EventLoopError> { + // Winit event loop + let event_loop = EventLoop::new().unwrap(); + + let mut app = App::default(); + + event_loop.run_app(&mut app) } const CODE: &str = r" diff --git a/examples/multisample.rs b/examples/multisample.rs index 55a27e0..0efb96e 100644 --- a/examples/multisample.rs +++ b/examples/multisample.rs @@ -11,7 +11,7 @@ use std::sync::Arc; -use egui::{epaint::Shadow, style::Margin, vec2, Align, Align2, Color32, Frame, Rounding, Window}; +use egui::{epaint::Shadow, vec2, Align, Align2, Color32, Frame, Margin, Rounding, Window}; use egui_winit_vulkano::{Gui, GuiConfig}; use vulkano::{ buffer::{Buffer, BufferContents, BufferCreateInfo, BufferUsage, Subbuffer}, @@ -45,64 +45,83 @@ use vulkano_util::{ window::{VulkanoWindows, WindowDescriptor}, }; use winit::{ - event::{Event, WindowEvent}, - event_loop::{ControlFlow, EventLoop}, + application::ApplicationHandler, error::EventLoopError, event::WindowEvent, + event_loop::EventLoop, }; -pub fn main() { - // Winit event loop - let event_loop = EventLoop::new(); - // Vulkano context - let context = VulkanoContext::new(VulkanoConfig::default()); - // Vulkano windows (create one) - let mut windows = VulkanoWindows::default(); - windows.create_window(&event_loop, &context, &WindowDescriptor::default(), |ci| { - ci.image_format = vulkano::format::Format::B8G8R8A8_UNORM; - ci.image_usage = ImageUsage::TRANSFER_DST | ci.image_usage; - ci.min_image_count = ci.min_image_count.max(2); - }); - // Create out gui pipeline - let mut pipeline = MSAAPipeline::new( - context.graphics_queue().clone(), - windows.get_primary_renderer_mut().unwrap().swapchain_format(), - context.memory_allocator(), - SampleCount::Sample4, - ); - // Create gui subpass - let mut gui = Gui::new_with_subpass( - &event_loop, - windows.get_primary_renderer_mut().unwrap().surface(), - windows.get_primary_renderer_mut().unwrap().graphics_queue(), - pipeline.gui_pass(), - windows.get_primary_renderer_mut().unwrap().swapchain_format(), - GuiConfig { - // Must match your pipeline's sample count - samples: SampleCount::Sample4, - ..Default::default() - }, - ); +pub struct App { + context: VulkanoContext, + windows: VulkanoWindows, + pipeline: Option, + gui: Option, +} + +impl Default for App { + fn default() -> Self { + // Vulkano context + let context = VulkanoContext::new(VulkanoConfig::default()); + + // Vulkano windows + let windows = VulkanoWindows::default(); + + Self { context, windows, pipeline: None, gui: None } + } +} + +impl ApplicationHandler for App { + fn resumed(&mut self, event_loop: &winit::event_loop::ActiveEventLoop) { + self.windows.create_window(event_loop, &self.context, &WindowDescriptor::default(), |ci| { + ci.image_format = vulkano::format::Format::B8G8R8A8_UNORM; + ci.image_usage = ImageUsage::TRANSFER_DST | ci.image_usage; + ci.min_image_count = ci.min_image_count.max(2); + }); + + // Create out gui pipeline + let pipeline = MSAAPipeline::new( + self.context.graphics_queue().clone(), + self.windows.get_primary_renderer_mut().unwrap().swapchain_format(), + self.context.memory_allocator(), + SampleCount::Sample4, + ); + + // Create gui subpass + self.gui = Some(Gui::new_with_subpass( + event_loop, + self.windows.get_primary_renderer_mut().unwrap().surface(), + self.windows.get_primary_renderer_mut().unwrap().graphics_queue(), + pipeline.gui_pass(), + self.windows.get_primary_renderer_mut().unwrap().swapchain_format(), + GuiConfig { + // Must match your pipeline's sample count + samples: SampleCount::Sample4, + ..Default::default() + }, + )); + + self.pipeline = Some(pipeline); + } + + fn window_event( + &mut self, + event_loop: &winit::event_loop::ActiveEventLoop, + window_id: winit::window::WindowId, + event: WindowEvent, + ) { + let renderer = self.windows.get_renderer_mut(window_id).unwrap(); - // Create gui state (pass anything your state requires) - event_loop.run(move |event, _, control_flow| { - let renderer = windows.get_primary_renderer_mut().unwrap(); + let gui = self.gui.as_mut().unwrap(); + + // Update Egui integration so the UI works! + let _pass_events_to_game = !gui.update(&event); match event { - Event::WindowEvent { event, window_id } if window_id == renderer.window().id() => { - // Update Egui integration so the UI works! - let _pass_events_to_game = !gui.update(&event); - match event { - WindowEvent::Resized(_) => { - renderer.resize(); - } - WindowEvent::ScaleFactorChanged { .. } => { - renderer.resize(); - } - WindowEvent::CloseRequested => { - *control_flow = ControlFlow::Exit; - } - _ => (), - } + WindowEvent::Resized(_) => { + renderer.resize(); } - Event::RedrawRequested(window_id) if window_id == window_id => { + WindowEvent::ScaleFactorChanged { .. } => { + renderer.resize(); + } + WindowEvent::CloseRequested => event_loop.exit(), + WindowEvent::RedrawRequested => { // Set immediate UI in redraw here gui.immediate_ui(|gui| { let ctx = gui.context(); @@ -114,8 +133,10 @@ pub fn main() { Frame::none() .fill(Color32::from_white_alpha(125)) .shadow(Shadow { - extrusion: 8.0, + spread: 8.0, + blur: 10.0, color: Color32::from_black_alpha(125), + ..Default::default() }) .rounding(Rounding::same(5.0)) .inner_margin(Margin::same(10.0)), @@ -126,11 +147,14 @@ pub fn main() { }); // Render // Acquire swapchain future - match renderer.acquire() { + match renderer.acquire(Some(std::time::Duration::from_millis(10)), |_| {}) { Ok(future) => { // Render - let after_future = - pipeline.render(future, renderer.swapchain_image_view(), &mut gui); + let after_future = self.pipeline.as_mut().unwrap().render( + future, + renderer.swapchain_image_view(), + gui, + ); // Present swapchain renderer.present(after_future, true); } @@ -140,12 +164,23 @@ pub fn main() { Err(e) => panic!("Failed to acquire swapchain future: {}", e), }; } - Event::MainEventsCleared => { - renderer.window().request_redraw(); - } _ => (), } - }); + } + + fn about_to_wait(&mut self, _event_loop: &winit::event_loop::ActiveEventLoop) { + let renderer = self.windows.get_primary_renderer().unwrap(); + renderer.window().request_redraw(); + } +} + +pub fn main() -> Result<(), EventLoopError> { + // Winit event loop + let event_loop = EventLoop::new().unwrap(); + + let mut app = App::default(); + + event_loop.run_app(&mut app) } struct MSAAPipeline { @@ -156,7 +191,7 @@ struct MSAAPipeline { subpass: Subpass, intermediary: Arc, vertex_buffer: Subbuffer<[MyVertex]>, - command_buffer_allocator: StandardCommandBufferAllocator, + command_buffer_allocator: Arc, } impl MSAAPipeline { @@ -194,7 +229,8 @@ impl MSAAPipeline { secondary_buffer_count: 32, ..Default::default() }, - ); + ) + .into(); let intermediary = ImageView::new_default( Image::new( @@ -274,8 +310,7 @@ impl MSAAPipeline { .entry_point("main") .unwrap(); - let vertex_input_state = - MyVertex::per_vertex().definition(&vs.info().input_interface).unwrap(); + let vertex_input_state = MyVertex::per_vertex().definition(&vs).unwrap(); let stages = [PipelineShaderStageCreateInfo::new(vs), PipelineShaderStageCreateInfo::new(fs)]; @@ -320,7 +355,7 @@ impl MSAAPipeline { gui: &mut Gui, ) -> Box { let mut builder = AutoCommandBufferBuilder::primary( - &self.command_buffer_allocator, + self.command_buffer_allocator.clone(), self.queue.queue_family_index(), CommandBufferUsage::OneTimeSubmit, ) @@ -370,7 +405,7 @@ impl MSAAPipeline { // Render first draw pass let mut secondary_builder = AutoCommandBufferBuilder::secondary( - &self.command_buffer_allocator, + self.command_buffer_allocator.clone(), self.queue.queue_family_index(), CommandBufferUsage::MultipleSubmit, CommandBufferInheritanceInfo { @@ -394,9 +429,10 @@ impl MSAAPipeline { ) .unwrap() .bind_vertex_buffers(0, self.vertex_buffer.clone()) - .unwrap() - .draw(self.vertex_buffer.len() as u32, 1, 0, 0) .unwrap(); + unsafe { + secondary_builder.draw(self.vertex_buffer.len() as u32, 1, 0, 0).unwrap(); + } let cb = secondary_builder.build().unwrap(); builder.execute_commands(cb).unwrap(); diff --git a/examples/paint_callback.rs b/examples/paint_callback.rs index 1599d76..9b1a419 100644 --- a/examples/paint_callback.rs +++ b/examples/paint_callback.rs @@ -32,33 +32,44 @@ use vulkano_util::{ context::{VulkanoConfig, VulkanoContext}, window::{VulkanoWindows, WindowDescriptor}, }; -use winit::{ - event::{Event, WindowEvent}, - event_loop::{ControlFlow, EventLoop}, -}; +use winit::{application::ApplicationHandler, event::WindowEvent, event_loop::EventLoop}; -pub fn main() { - // Winit event loop - let event_loop = EventLoop::new(); - // Vulkano context - let context = VulkanoContext::new(VulkanoConfig::default()); - // Vulkano windows (create one) - let mut windows = VulkanoWindows::default(); - windows.create_window( - &event_loop, - &context, - &WindowDescriptor { width: 400.0, height: 400.0, ..Default::default() }, - |ci| { - ci.image_format = vulkano::format::Format::B8G8R8A8_UNORM; - ci.min_image_count = ci.min_image_count.max(2); - }, - ); - // Create gui as main render pass (no overlay means it clears the image each frame) - let (mut gui, scene) = { - let renderer = windows.get_primary_renderer_mut().unwrap(); +pub struct App { + context: VulkanoContext, + windows: VulkanoWindows, + gui: Option, + scene: Option>>, +} + +impl Default for App { + fn default() -> Self { + // Vulkano context + let context = VulkanoContext::new(VulkanoConfig::default()); + + // Vulkano windows + let windows = VulkanoWindows::default(); + + Self { context, windows, gui: None, scene: None } + } +} + +impl ApplicationHandler for App { + fn resumed(&mut self, event_loop: &winit::event_loop::ActiveEventLoop) { + self.windows.create_window( + event_loop, + &self.context, + &WindowDescriptor { width: 400.0, height: 400.0, ..Default::default() }, + |ci| { + ci.image_format = vulkano::format::Format::B8G8R8A8_UNORM; + ci.min_image_count = ci.min_image_count.max(2); + }, + ); + + // Create gui as main render pass (no overlay means it clears the image each frame) + let renderer = self.windows.get_primary_renderer_mut().unwrap(); let gui = Gui::new( - &event_loop, + event_loop, renderer.surface(), renderer.graphics_queue(), renderer.swapchain_format(), @@ -67,31 +78,34 @@ pub fn main() { let scene = Arc::new(Mutex::new(Scene::new(gui.render_resources()))); - (gui, scene) - }; + self.gui = Some(gui); + self.scene = Some(scene); + } - // Create gui state (pass anything your state requires) - event_loop.run(move |event, _, control_flow| { - let renderer = windows.get_primary_renderer_mut().unwrap(); + fn window_event( + &mut self, + event_loop: &winit::event_loop::ActiveEventLoop, + window_id: winit::window::WindowId, + event: WindowEvent, + ) { + let renderer = self.windows.get_renderer_mut(window_id).unwrap(); + + let gui = self.gui.as_mut().unwrap(); + + // Update Egui integration so the UI works! + let _pass_events_to_game = !gui.update(&event); match event { - Event::WindowEvent { event, window_id } if window_id == renderer.window().id() => { - // Update Egui integration so the UI works! - let _pass_events_to_game = !gui.update(&event); - match event { - WindowEvent::Resized(_) => { - renderer.resize(); - } - WindowEvent::ScaleFactorChanged { .. } => { - renderer.resize(); - } - WindowEvent::CloseRequested => { - *control_flow = ControlFlow::Exit; - } - _ => (), - } + WindowEvent::Resized(_) => { + renderer.resize(); + } + WindowEvent::ScaleFactorChanged { .. } => { + renderer.resize(); + } + WindowEvent::CloseRequested => { + event_loop.exit(); } - Event::RedrawRequested(window_id) if window_id == renderer.window().id() => { - let scene = scene.clone(); + WindowEvent::RedrawRequested => { + let scene = self.scene.clone().unwrap(); // Set immediate UI in redraw here gui.immediate_ui(|gui| { let ctx = gui.context(); @@ -119,7 +133,7 @@ pub fn main() { }); // Render UI // Acquire swapchain future - match renderer.acquire() { + match renderer.acquire(Some(std::time::Duration::from_millis(10)), |_| {}) { Ok(future) => { // Render gui let after_future = @@ -133,12 +147,24 @@ pub fn main() { Err(e) => panic!("Failed to acquire swapchain future: {}", e), }; } - Event::MainEventsCleared => { - renderer.window().request_redraw(); - } _ => (), } - }); + } + + fn about_to_wait(&mut self, _event_loop: &winit::event_loop::ActiveEventLoop) { + let renderer = self.windows.get_primary_renderer().unwrap(); + + renderer.window().request_redraw(); + } +} + +pub fn main() -> Result<(), winit::error::EventLoopError> { + // Winit event loop + let event_loop = EventLoop::new().unwrap(); + + let mut app = App::default(); + + event_loop.run_app(&mut app) } struct Scene { @@ -174,8 +200,7 @@ impl Scene { .entry_point("main") .unwrap(); - let vertex_input_state = - MyVertex::per_vertex().definition(&vs.info().input_interface).unwrap(); + let vertex_input_state = MyVertex::per_vertex().definition(&vs).unwrap(); let stages = [PipelineShaderStageCreateInfo::new(vs), PipelineShaderStageCreateInfo::new(fs)]; @@ -220,9 +245,10 @@ impl Scene { .bind_pipeline_graphics(self.pipeline.clone()) .unwrap() .bind_vertex_buffers(0, self.vertex_buffer.clone()) - .unwrap() - .draw(self.vertex_buffer.len() as u32, 1, 0, 0) .unwrap(); + unsafe { + context.builder.draw(self.vertex_buffer.len() as u32, 1, 0, 0).unwrap(); + } } } diff --git a/examples/subpass.rs b/examples/subpass.rs index ccb5199..5744faf 100644 --- a/examples/subpass.rs +++ b/examples/subpass.rs @@ -11,7 +11,7 @@ use std::sync::Arc; -use egui::{epaint::Shadow, style::Margin, vec2, Align, Align2, Color32, Frame, Rounding, Window}; +use egui::{epaint::Shadow, vec2, Align, Align2, Color32, Frame, Margin, Rounding, Window}; use egui_winit_vulkano::{Gui, GuiConfig}; use vulkano::{ buffer::{Buffer, BufferContents, BufferCreateInfo, BufferUsage, Subbuffer}, @@ -45,59 +45,78 @@ use vulkano_util::{ window::{VulkanoWindows, WindowDescriptor}, }; use winit::{ - event::{Event, WindowEvent}, - event_loop::{ControlFlow, EventLoop}, + application::ApplicationHandler, error::EventLoopError, event::WindowEvent, + event_loop::EventLoop, }; // Render a triangle (scene) and a gui from a subpass on top of it (with some transparent fill) -pub fn main() { - // Winit event loop - let event_loop = EventLoop::new(); - // Vulkano context - let context = VulkanoContext::new(VulkanoConfig::default()); - // Vulkano windows (create one) - let mut windows = VulkanoWindows::default(); - windows.create_window(&event_loop, &context, &WindowDescriptor::default(), |ci| { - ci.image_format = vulkano::format::Format::B8G8R8A8_UNORM; - ci.min_image_count = ci.min_image_count.max(2); - }); - // Create out gui pipeline - let mut gui_pipeline = SimpleGuiPipeline::new( - context.graphics_queue().clone(), - windows.get_primary_renderer_mut().unwrap().swapchain_format(), - context.memory_allocator(), - ); - // Create gui subpass - let mut gui = Gui::new_with_subpass( - &event_loop, - windows.get_primary_renderer_mut().unwrap().surface(), - windows.get_primary_renderer_mut().unwrap().graphics_queue(), - gui_pipeline.gui_pass(), - windows.get_primary_renderer_mut().unwrap().swapchain_format(), - GuiConfig::default(), - ); - - // Create gui state (pass anything your state requires) - event_loop.run(move |event, _, control_flow| { - let renderer = windows.get_primary_renderer_mut().unwrap(); +pub struct App { + context: VulkanoContext, + windows: VulkanoWindows, + gui_pipeline: Option, + gui: Option, +} + +impl Default for App { + fn default() -> Self { + // Vulkano context + let context = VulkanoContext::new(VulkanoConfig::default()); + + // Vulkano windows + let windows = VulkanoWindows::default(); + + Self { context, windows, gui_pipeline: None, gui: None } + } +} + +impl ApplicationHandler for App { + fn resumed(&mut self, event_loop: &winit::event_loop::ActiveEventLoop) { + self.windows.create_window(event_loop, &self.context, &WindowDescriptor::default(), |ci| { + ci.image_format = vulkano::format::Format::B8G8R8A8_UNORM; + ci.min_image_count = ci.min_image_count.max(2); + }); + + // Create out gui pipeline + let gui_pipeline = SimpleGuiPipeline::new( + self.context.graphics_queue().clone(), + self.windows.get_primary_renderer_mut().unwrap().swapchain_format(), + self.context.memory_allocator(), + ); + + // Create gui subpass + self.gui = Some(Gui::new_with_subpass( + event_loop, + self.windows.get_primary_renderer_mut().unwrap().surface(), + self.windows.get_primary_renderer_mut().unwrap().graphics_queue(), + gui_pipeline.gui_pass(), + self.windows.get_primary_renderer_mut().unwrap().swapchain_format(), + GuiConfig::default(), + )); + + self.gui_pipeline = Some(gui_pipeline); + } + + fn window_event( + &mut self, + event_loop: &winit::event_loop::ActiveEventLoop, + window_id: winit::window::WindowId, + event: WindowEvent, + ) { + let renderer = self.windows.get_renderer_mut(window_id).unwrap(); + + let gui = self.gui.as_mut().unwrap(); + match event { - Event::WindowEvent { event, window_id } if window_id == renderer.window().id() => { - // Update Egui integration so the UI works! - let _pass_events_to_game = !gui.update(&event); - match event { - WindowEvent::Resized(_) => { - renderer.resize(); - } - WindowEvent::ScaleFactorChanged { .. } => { - renderer.resize(); - } - WindowEvent::CloseRequested => { - *control_flow = ControlFlow::Exit; - } - _ => (), - } + WindowEvent::Resized(_) => { + renderer.resize(); + } + WindowEvent::ScaleFactorChanged { .. } => { + renderer.resize(); + } + WindowEvent::CloseRequested => { + event_loop.exit(); } - Event::RedrawRequested(window_id) if window_id == window_id => { + WindowEvent::RedrawRequested => { // Set immediate UI in redraw here gui.immediate_ui(|gui| { let ctx = gui.context(); @@ -109,8 +128,10 @@ pub fn main() { Frame::none() .fill(Color32::from_white_alpha(125)) .shadow(Shadow { - extrusion: 8.0, + spread: 8.0, + blur: 10.0, color: Color32::from_black_alpha(125), + ..Default::default() }) .rounding(Rounding::same(5.0)) .inner_margin(Margin::same(10.0)), @@ -121,11 +142,14 @@ pub fn main() { }); // Acquire swapchain future - match renderer.acquire() { + match renderer.acquire(Some(std::time::Duration::from_millis(10)), |_| {}) { Ok(future) => { // Render gui - let after_future = - gui_pipeline.render(future, renderer.swapchain_image_view(), &mut gui); + let after_future = self.gui_pipeline.as_mut().unwrap().render( + future, + renderer.swapchain_image_view(), + gui, + ); // Present swapchain renderer.present(after_future, true); @@ -136,12 +160,29 @@ pub fn main() { Err(e) => panic!("Failed to acquire swapchain future: {}", e), }; } - Event::MainEventsCleared => { - renderer.window().request_redraw(); - } _ => (), } - }); + + if window_id == renderer.window().id() { + // Update Egui integration so the UI works! + let _pass_events_to_game = !gui.update(&event); + } + } + + fn about_to_wait(&mut self, _event_loop: &winit::event_loop::ActiveEventLoop) { + let renderer = self.windows.get_primary_renderer().unwrap(); + + renderer.window().request_redraw(); + } +} + +pub fn main() -> Result<(), EventLoopError> { + // Winit event loop + let event_loop = EventLoop::new().unwrap(); + + let mut app = App::default(); + + event_loop.run_app(&mut app) } struct SimpleGuiPipeline { @@ -150,7 +191,7 @@ struct SimpleGuiPipeline { pipeline: Arc, subpass: Subpass, vertex_buffer: Subbuffer<[MyVertex]>, - command_buffer_allocator: StandardCommandBufferAllocator, + command_buffer_allocator: Arc, } impl SimpleGuiPipeline { @@ -186,7 +227,8 @@ impl SimpleGuiPipeline { secondary_buffer_count: 32, ..Default::default() }, - ); + ) + .into(); Self { queue, render_pass, pipeline, subpass, vertex_buffer, command_buffer_allocator } } @@ -227,8 +269,7 @@ impl SimpleGuiPipeline { .entry_point("main") .unwrap(); - let vertex_input_state = - MyVertex::per_vertex().definition(&vs.info().input_interface).unwrap(); + let vertex_input_state = MyVertex::per_vertex().definition(&vs).unwrap(); let stages = [PipelineShaderStageCreateInfo::new(vs), PipelineShaderStageCreateInfo::new(fs)]; @@ -270,7 +311,7 @@ impl SimpleGuiPipeline { gui: &mut Gui, ) -> Box { let mut builder = AutoCommandBufferBuilder::primary( - &self.command_buffer_allocator, + self.command_buffer_allocator.clone(), self.queue.queue_family_index(), CommandBufferUsage::OneTimeSubmit, ) @@ -299,7 +340,7 @@ impl SimpleGuiPipeline { // Render first draw pass let mut secondary_builder = AutoCommandBufferBuilder::secondary( - &self.command_buffer_allocator, + self.command_buffer_allocator.clone(), self.queue.queue_family_index(), CommandBufferUsage::MultipleSubmit, CommandBufferInheritanceInfo { @@ -323,9 +364,10 @@ impl SimpleGuiPipeline { ) .unwrap() .bind_vertex_buffers(0, self.vertex_buffer.clone()) - .unwrap() - .draw(self.vertex_buffer.len() as u32, 1, 0, 0) .unwrap(); + unsafe { + secondary_builder.draw(self.vertex_buffer.len() as u32, 1, 0, 0).unwrap(); + } let cb = secondary_builder.build().unwrap(); builder.execute_commands(cb).unwrap(); diff --git a/examples/wholesome/frame_system.rs b/examples/wholesome/frame_system.rs index 0bb047f..f4cc5f9 100644 --- a/examples/wholesome/frame_system.rs +++ b/examples/wholesome/frame_system.rs @@ -17,7 +17,7 @@ use cgmath::Matrix4; use vulkano::{ command_buffer::{ AutoCommandBufferBuilder, CommandBufferUsage, PrimaryAutoCommandBuffer, - RenderPassBeginInfo, SecondaryCommandBufferAbstract, SubpassBeginInfo, SubpassContents, + RenderPassBeginInfo, SecondaryAutoCommandBuffer, SubpassBeginInfo, SubpassContents, }, device::Queue, format::Format, @@ -125,7 +125,7 @@ impl FrameSystem { }) .unwrap(); let mut command_buffer_builder = AutoCommandBufferBuilder::primary( - self.allocators.command_buffers.as_ref(), + self.allocators.command_buffers.clone(), self.gfx_queue.queue_family_index(), CommandBufferUsage::OneTimeSubmit, ) @@ -148,7 +148,7 @@ impl FrameSystem { before_main_cb_future: Some(Box::new(before_future)), framebuffer, num_pass: 0, - command_buffer_builder: Some(command_buffer_builder), + recording_command_buffer: Some(command_buffer_builder), world_to_framebuffer, } } @@ -159,27 +159,27 @@ pub struct Frame<'a> { num_pass: u8, before_main_cb_future: Option>, framebuffer: Arc, - command_buffer_builder: Option>, + recording_command_buffer: Option>, #[allow(dead_code)] world_to_framebuffer: Matrix4, } impl<'a> Frame<'a> { pub fn next_pass<'f>(&'f mut self) -> Option> { - let res = { + let current_pass = { let current_pass = self.num_pass; self.num_pass += 1; current_pass }; - match res { + match current_pass { 0 => Some(Pass::Deferred(DrawPass { frame: self })), 1 => { - self.command_buffer_builder + self.recording_command_buffer .as_mut() .unwrap() .end_render_pass(Default::default()) .unwrap(); - let command_buffer = self.command_buffer_builder.take().unwrap().build().unwrap(); + let command_buffer = self.recording_command_buffer.take().unwrap().build().unwrap(); let after_main_cb = self .before_main_cb_future .take() @@ -204,12 +204,9 @@ pub struct DrawPass<'f, 's: 'f> { impl<'f, 's: 'f> DrawPass<'f, 's> { #[inline] - pub fn execute(&mut self, command_buffer: Arc) - where - C: SecondaryCommandBufferAbstract + Send + Sync + 'static, - { + pub fn execute(&mut self, command_buffer: Arc) { self.frame - .command_buffer_builder + .recording_command_buffer .as_mut() .unwrap() .execute_commands(command_buffer) diff --git a/examples/wholesome/main.rs b/examples/wholesome/main.rs index 7263c2f..15b545b 100644 --- a/examples/wholesome/main.rs +++ b/examples/wholesome/main.rs @@ -26,10 +26,7 @@ use vulkano_util::{ renderer::DEFAULT_IMAGE_FORMAT, window::{VulkanoWindows, WindowDescriptor}, }; -use winit::{ - event::{Event, WindowEvent}, - event_loop::{ControlFlow, EventLoop}, -}; +use winit::{application::ApplicationHandler, event::WindowEvent, event_loop::EventLoop}; use crate::{renderer::RenderPipeline, time_info::TimeInfo}; @@ -122,7 +119,7 @@ impl GuiState { ]))); }, ); - egui::Area::new("fps") + egui::Area::new("fps".into()) .fixed_pos(egui::pos2(window_size[0] - 0.05 * window_size[0], 10.0)) .show(&egui_context, |ui| { ui.label(format!("{fps:.2}")); @@ -130,120 +127,174 @@ impl GuiState { } } -pub fn main() { - // Winit event loop & our time tracking initialization - let event_loop = EventLoop::new(); - let mut time = TimeInfo::new(); - // Create renderer for our scene & ui - let scene_view_size = [256, 256]; - // Vulkano context - let context = VulkanoContext::new(VulkanoConfig::default()); - // Vulkano windows (create one) - let mut windows = VulkanoWindows::default(); - windows.create_window(&event_loop, &context, &WindowDescriptor::default(), |ci| { - ci.image_format = Format::B8G8R8A8_UNORM; - ci.min_image_count = ci.min_image_count.max(2); - }); - // Create gui as main render pass (no overlay means it clears the image each frame) - let mut gui = { - let renderer = windows.get_primary_renderer_mut().unwrap(); - Gui::new( - &event_loop, - renderer.surface(), - renderer.graphics_queue(), - renderer.swapchain_format(), - GuiConfig::default(), - ) - }; - // Create a simple image to which we'll draw the triangle scene - let scene_image = ImageView::new_default( - Image::new( - context.memory_allocator().clone(), - ImageCreateInfo { - image_type: ImageType::Dim2d, - format: DEFAULT_IMAGE_FORMAT, - extent: [scene_view_size[0], scene_view_size[1], 1], - array_layers: 1, - usage: ImageUsage::SAMPLED | ImageUsage::COLOR_ATTACHMENT, - ..Default::default() - }, - AllocationCreateInfo::default(), - ) - .unwrap(), - ) - .unwrap(); - - // Create our render pipeline - let mut scene_render_pipeline = RenderPipeline::new( - context.graphics_queue().clone(), - DEFAULT_IMAGE_FORMAT, - &renderer::Allocators { - command_buffers: Arc::new(StandardCommandBufferAllocator::new( - context.device().clone(), - StandardCommandBufferAllocatorCreateInfo { - secondary_buffer_count: 32, +pub struct App { + context: VulkanoContext, + windows: VulkanoWindows, + scene_view_size: [u32; 2], + scene_image: Arc, + time: TimeInfo, + scene_render_pipeline: RenderPipeline, + gui: Option, + gui_state: Option, +} + +impl Default for App { + fn default() -> Self { + // Vulkano context + let context = VulkanoContext::new(VulkanoConfig::default()); + + // Vulkano windows + let windows = VulkanoWindows::default(); + + // Create renderer for our scene & ui + let scene_view_size = [256, 256]; + // Create a simple image to which we'll draw the triangle scene + let scene_image = ImageView::new_default( + Image::new( + context.memory_allocator().clone(), + ImageCreateInfo { + image_type: ImageType::Dim2d, + format: DEFAULT_IMAGE_FORMAT, + extent: [scene_view_size[0], scene_view_size[1], 1], + array_layers: 1, + usage: ImageUsage::SAMPLED | ImageUsage::COLOR_ATTACHMENT, ..Default::default() }, - )), - memory: context.memory_allocator().clone(), - }, - ); - // Create gui state (pass anything your state requires) - let mut gui_state = GuiState::new(&mut gui, scene_image.clone(), scene_view_size); - // Event loop run - event_loop.run(move |event, _, control_flow| { - let renderer = windows.get_primary_renderer_mut().unwrap(); - // Update Egui integration so the UI works! - match event { - Event::WindowEvent { event, window_id } if window_id == renderer.window().id() => { - let _pass_events_to_game = !gui.update(&event); - match event { - WindowEvent::Resized(_) => { - renderer.resize(); - } - WindowEvent::ScaleFactorChanged { .. } => { - renderer.resize(); - } - WindowEvent::CloseRequested => { - *control_flow = ControlFlow::Exit; - } - _ => (), + AllocationCreateInfo::default(), + ) + .unwrap(), + ) + .unwrap(); + + let time = TimeInfo::new(); + + // Create our render pipeline + let scene_render_pipeline = RenderPipeline::new( + context.graphics_queue().clone(), + DEFAULT_IMAGE_FORMAT, + &renderer::Allocators { + command_buffers: Arc::new(StandardCommandBufferAllocator::new( + context.device().clone(), + StandardCommandBufferAllocatorCreateInfo { + secondary_buffer_count: 32, + ..Default::default() + }, + )), + memory: context.memory_allocator().clone(), + }, + ); + + Self { + context, + windows, + scene_view_size, + scene_image, + time, + scene_render_pipeline, + gui: None, + gui_state: None, + } + } +} + +impl ApplicationHandler for App { + fn resumed(&mut self, event_loop: &winit::event_loop::ActiveEventLoop) { + self.windows.create_window(event_loop, &self.context, &WindowDescriptor::default(), |ci| { + ci.image_format = Format::B8G8R8A8_UNORM; + ci.min_image_count = ci.min_image_count.max(2); + }); + // Create gui as main render pass (no overlay means it clears the image each frame) + let mut gui = { + let renderer = self.windows.get_primary_renderer_mut().unwrap(); + Gui::new( + event_loop, + renderer.surface(), + renderer.graphics_queue(), + renderer.swapchain_format(), + GuiConfig::default(), + ) + }; + + // Create gui state (pass anything your state requires) + self.gui_state = + Some(GuiState::new(&mut gui, self.scene_image.clone(), self.scene_view_size)); + + self.gui = Some(gui); + } + + fn window_event( + &mut self, + event_loop: &winit::event_loop::ActiveEventLoop, + window_id: winit::window::WindowId, + event: WindowEvent, + ) { + let renderer = self.windows.get_renderer_mut(window_id).unwrap(); + + let gui = self.gui.as_mut().unwrap(); + + if window_id == renderer.window().id() { + let _pass_events_to_game = !gui.update(&event); + match event { + WindowEvent::Resized(_) => { + renderer.resize(); } + WindowEvent::ScaleFactorChanged { .. } => { + renderer.resize(); + } + WindowEvent::CloseRequested => { + event_loop.exit(); + } + WindowEvent::RedrawRequested => { + // Set immediate UI in redraw here + // It's a closure giving access to egui context inside which you can call anything. + // Here we're calling the layout of our `gui_state`. + gui.immediate_ui(|gui| { + let ctx = gui.context(); + self.gui_state.as_mut().unwrap().layout( + ctx, + renderer.window_size(), + self.time.fps(), + ) + }); + // Render UI + // Acquire swapchain future + match renderer.acquire(Some(std::time::Duration::from_millis(10)), |_| {}) { + Ok(future) => { + // Draw scene + let after_scene_draw = + self.scene_render_pipeline.render(future, self.scene_image.clone()); + // Render gui + let after_future = gui + .draw_on_image(after_scene_draw, renderer.swapchain_image_view()); + // Present swapchain + renderer.present(after_future, true); + } + Err(vulkano::VulkanError::OutOfDate) => { + renderer.resize(); + } + Err(e) => panic!("Failed to acquire swapchain future: {}", e), + }; + + // Update fps & dt + self.time.update(); + } + _ => (), } - Event::RedrawRequested(window_id) if window_id == window_id => { - // Set immediate UI in redraw here - // It's a closure giving access to egui context inside which you can call anything. - // Here we're calling the layout of our `gui_state`. - gui.immediate_ui(|gui| { - let ctx = gui.context(); - gui_state.layout(ctx, renderer.window_size(), time.fps()) - }); - // Render UI - // Acquire swapchain future - match renderer.acquire() { - Ok(future) => { - // Draw scene - let after_scene_draw = - scene_render_pipeline.render(future, scene_image.clone()); - // Render gui - let after_future = - gui.draw_on_image(after_scene_draw, renderer.swapchain_image_view()); - // Present swapchain - renderer.present(after_future, true); - } - Err(vulkano::VulkanError::OutOfDate) => { - renderer.resize(); - } - Err(e) => panic!("Failed to acquire swapchain future: {}", e), - }; - - // Update fps & dt - time.update(); - } - Event::MainEventsCleared => { - renderer.window().request_redraw(); - } - _ => (), } - }); + } + + fn about_to_wait(&mut self, _event_loop: &winit::event_loop::ActiveEventLoop) { + let renderer = self.windows.get_primary_renderer_mut().unwrap(); + renderer.window().request_redraw(); + } +} + +pub fn main() -> Result<(), winit::error::EventLoopError> { + // Winit event loop & our time tracking initialization + let event_loop = EventLoop::new().unwrap(); + + let mut app = App::default(); + + // Event loop run + event_loop.run_app(&mut app) } diff --git a/examples/wholesome/renderer.rs b/examples/wholesome/renderer.rs index 65e6d2e..886e6b3 100644 --- a/examples/wholesome/renderer.rs +++ b/examples/wholesome/renderer.rs @@ -58,7 +58,7 @@ impl RenderPipeline { while let Some(pass) = frame.next_pass() { match pass { Pass::Deferred(mut draw_pass) => { - let cb = Arc::new(self.draw_pipeline.draw([dims[0], dims[1]])); + let cb = self.draw_pipeline.draw([dims[0], dims[1]]); draw_pass.execute(cb); } Pass::Finished(af) => { diff --git a/examples/wholesome/triangle_draw_system.rs b/examples/wholesome/triangle_draw_system.rs index cbeb8a0..149cb47 100644 --- a/examples/wholesome/triangle_draw_system.rs +++ b/examples/wholesome/triangle_draw_system.rs @@ -80,8 +80,7 @@ impl TriangleDrawSystem { .entry_point("main") .unwrap(); - let vertex_input_state = - MyVertex::per_vertex().definition(&vs.info().input_interface).unwrap(); + let vertex_input_state = MyVertex::per_vertex().definition(&vs).unwrap(); let stages = [PipelineShaderStageCreateInfo::new(vs), PipelineShaderStageCreateInfo::new(fs)]; @@ -122,12 +121,9 @@ impl TriangleDrawSystem { } } - pub fn draw( - &self, - viewport_dimensions: [u32; 2], - ) -> Arc>> { + pub fn draw(&self, viewport_dimensions: [u32; 2]) -> Arc { let mut builder = AutoCommandBufferBuilder::secondary( - &self.command_buffer_allocator, + self.command_buffer_allocator.clone(), self.gfx_queue.queue_family_index(), CommandBufferUsage::MultipleSubmit, CommandBufferInheritanceInfo { @@ -151,9 +147,10 @@ impl TriangleDrawSystem { ) .unwrap() .bind_vertex_buffers(0, self.vertex_buffer.clone()) - .unwrap() - .draw(self.vertex_buffer.len() as u32, 1, 0, 0) .unwrap(); + unsafe { + builder.draw(self.vertex_buffer.len() as u32, 1, 0, 0).unwrap(); + } builder.build().unwrap() } } diff --git a/run_all_examples.ps1 b/run_all_examples.ps1 index 129e66f..f64d08d 100644 --- a/run_all_examples.ps1 +++ b/run_all_examples.ps1 @@ -1,3 +1,4 @@ +cargo build --examples --release cargo run --example wholesome --release cargo run --example minimal --release cargo run --example subpass --release diff --git a/run_all_examples.sh b/run_all_examples.sh index 129e66f..f64d08d 100755 --- a/run_all_examples.sh +++ b/run_all_examples.sh @@ -1,3 +1,4 @@ +cargo build --examples --release cargo run --example wholesome --release cargo run --example minimal --release cargo run --example subpass --release diff --git a/run_checks.sh b/run_checks.sh index e2d9b2a..603a7ad 100755 --- a/run_checks.sh +++ b/run_checks.sh @@ -1,2 +1,2 @@ -cargo fmt -- --check --color always -cargo clippy --all-targets -- -D warnings \ No newline at end of file +cargo +nightly fmt -- --check --color always +cargo +nightly clippy --all-targets -- -D warnings diff --git a/src/integration.rs b/src/integration.rs index d9ab63c..e407e3f 100644 --- a/src/integration.rs +++ b/src/integration.rs @@ -9,7 +9,7 @@ use std::sync::Arc; use egui::{ClippedPrimitive, TexturesDelta}; -use egui_winit::winit::event_loop::EventLoopWindowTarget; +use egui_winit::winit::event_loop::ActiveEventLoop; use vulkano::{ command_buffer::SecondaryAutoCommandBuffer, device::Queue, @@ -83,8 +83,8 @@ impl Gui { /// This is to be called once we have access to vulkano_win's winit window surface /// and gfx queue. Created with this, the renderer will own a render pass which is useful to e.g. place your render pass' images /// onto egui windows - pub fn new( - event_loop: &EventLoopWindowTarget, + pub fn new( + event_loop: &ActiveEventLoop, surface: Arc, gfx_queue: Arc, output_format: Format, @@ -101,8 +101,8 @@ impl Gui { } /// Same as `new` but instead of integration owning a render pass, egui renders on your subpass - pub fn new_with_subpass( - event_loop: &EventLoopWindowTarget, + pub fn new_with_subpass( + event_loop: &ActiveEventLoop, surface: Arc, gfx_queue: Arc, subpass: Subpass, @@ -115,8 +115,8 @@ impl Gui { } /// Same as `new` but instead of integration owning a render pass, egui renders on your subpass - fn new_internal( - event_loop: &EventLoopWindowTarget, + fn new_internal( + event_loop: &ActiveEventLoop, surface: Arc, renderer: Renderer, ) -> Gui { @@ -124,10 +124,16 @@ impl Gui { renderer.queue().device().physical_device().properties().max_image_dimension2_d as usize; let egui_ctx: egui::Context = Default::default(); + let theme = match egui_ctx.theme() { + egui::Theme::Dark => winit::window::Theme::Dark, + egui::Theme::Light => winit::window::Theme::Light, + }; let egui_winit = egui_winit::State::new( + egui_ctx.clone(), egui_ctx.viewport_id(), event_loop, Some(surface_window(&surface).scale_factor() as f32), + Some(theme), Some(max_texture_side), ); Gui { @@ -158,14 +164,14 @@ impl Gui { /// and only when this returns `false` pass on the events to your game. /// /// Note that egui uses `tab` to move focus between elements, so this will always return `true` for tabs. - pub fn update(&mut self, winit_event: &winit::event::WindowEvent<'_>) -> bool { - self.egui_winit.on_window_event(&self.egui_ctx, winit_event).consumed + pub fn update(&mut self, winit_event: &winit::event::WindowEvent) -> bool { + self.egui_winit.on_window_event(surface_window(&self.surface), winit_event).consumed } /// Begins Egui frame & determines what will be drawn later. This must be called before draw, and after `update` (winit event). pub fn immediate_ui(&mut self, layout_function: impl FnOnce(&mut Self)) { let raw_input = self.egui_winit.take_egui_input(surface_window(&self.surface)); - self.egui_ctx.begin_frame(raw_input); + self.egui_ctx.begin_pass(raw_input); // Render Egui layout_function(self); } @@ -174,7 +180,7 @@ impl Gui { /// (Finish by drawing) pub fn begin_frame(&mut self) { let raw_input = self.egui_winit.take_egui_input(surface_window(&self.surface)); - self.egui_ctx.begin_frame(raw_input); + self.egui_ctx.begin_pass(raw_input); } /// Renders ui on `final_image` & Updates cursor icon @@ -246,13 +252,9 @@ impl Gui { shapes, pixels_per_point: _, viewport_output: _, - } = self.egui_ctx.end_frame(); + } = self.egui_ctx.end_pass(); - self.egui_winit.handle_platform_output( - surface_window(&self.surface), - &self.egui_ctx, - platform_output, - ); + self.egui_winit.handle_platform_output(surface_window(&self.surface), platform_output); self.shapes = shapes; self.textures_delta = textures_delta; } diff --git a/src/renderer.rs b/src/renderer.rs index 9158ddc..72da71b 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -19,12 +19,12 @@ use vulkano::{ command_buffer::{ allocator::StandardCommandBufferAllocator, AutoCommandBufferBuilder, BufferImageCopy, CommandBufferInheritanceInfo, CommandBufferUsage, CopyBufferToImageInfo, - PrimaryAutoCommandBuffer, PrimaryCommandBufferAbstract, RenderPassBeginInfo, - SecondaryAutoCommandBuffer, SubpassBeginInfo, SubpassContents, + PrimaryAutoCommandBuffer, RenderPassBeginInfo, SecondaryAutoCommandBuffer, + SubpassBeginInfo, SubpassContents, }, descriptor_set::{ - allocator::StandardDescriptorSetAllocator, layout::DescriptorSetLayout, - PersistentDescriptorSet, WriteDescriptorSet, + allocator::StandardDescriptorSetAllocator, layout::DescriptorSetLayout, DescriptorSet, + WriteDescriptorSet, }, device::Queue, format::{Format, NumericFormat}, @@ -102,7 +102,7 @@ pub struct Renderer { pipeline: Arc, subpass: Subpass, - texture_desc_sets: AHashMap>, + texture_desc_sets: AHashMap>, texture_images: AHashMap>, next_native_tex_id: u64, } @@ -235,8 +235,7 @@ impl Renderer { ..ColorBlendState::default() }; - let vertex_input_state = - Some(EguiVertex::per_vertex().definition(&vs.info().input_interface).unwrap()); + let vertex_input_state = Some(EguiVertex::per_vertex().definition(&vs).unwrap()); let stages = [PipelineShaderStageCreateInfo::new(vs), PipelineShaderStageCreateInfo::new(fs)]; @@ -273,9 +272,9 @@ impl Renderer { layout: &Arc, image: Arc, sampler: Arc, - ) -> Arc { - PersistentDescriptorSet::new( - &self.allocators.descriptor_set, + ) -> Arc { + DescriptorSet::new( + self.allocators.descriptor_set.clone(), layout.clone(), [WriteDescriptorSet::image_view_sampler(0, image, sampler)], [], @@ -502,7 +501,7 @@ impl Renderer { // Shared command buffer for every upload in this batch. let mut cbb = AutoCommandBufferBuilder::primary( - &self.allocators.command_buffer, + self.allocators.command_buffer.clone(), self.gfx_queue.queue_family_index(), CommandBufferUsage::OneTimeSubmit, ) @@ -572,7 +571,7 @@ impl Renderer { &self, ) -> AutoCommandBufferBuilder { AutoCommandBufferBuilder::secondary( - &self.allocators.command_buffer, + self.allocators.command_buffer.clone(), self.gfx_queue.queue_family_index(), CommandBufferUsage::MultipleSubmit, CommandBufferInheritanceInfo { @@ -583,7 +582,7 @@ impl Renderer { .unwrap() } - // Starts the rendering pipeline and returns [`AutoCommandBufferBuilder`] for drawing + // Starts the rendering pipeline and returns [`RecordingCommandBuffer`] for drawing fn start( &mut self, final_image: Arc, @@ -603,7 +602,7 @@ impl Renderer { ) .unwrap(); let mut command_buffer_builder = AutoCommandBufferBuilder::primary( - &self.allocators.command_buffer, + self.allocators.command_buffer.clone(), self.gfx_queue.queue_family_index(), CommandBufferUsage::OneTimeSubmit, ) @@ -864,15 +863,17 @@ impl Renderer { } // All set up to draw! - builder - .draw_indexed( - mesh.indices.len() as u32, - 1, - index_cursor, - vertex_cursor as i32, - 0, - ) - .unwrap(); + unsafe { + builder + .draw_indexed( + mesh.indices.len() as u32, + 1, + index_cursor, + vertex_cursor as i32, + 0, + ) + .unwrap(); + } // Consume this mesh for next iteration index_cursor += mesh.indices.len() as u32; @@ -964,8 +965,9 @@ impl Renderer { } } -/// A set of objects used to perform custom rendering in a `PaintCallback`. It -/// includes [`RenderResources`] for constructing a subpass pipeline and a secondary +/// A set of objects used to perform custom rendering in a `PaintCallback`. +/// +/// It includes [`RenderResources`] for constructing a subpass pipeline and a secondary /// command buffer for pushing render commands onto it. /// /// # Example diff --git a/src/utils.rs b/src/utils.rs index e6aa93b..b501d28 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -16,7 +16,6 @@ use vulkano::{ command_buffer::{ allocator::{StandardCommandBufferAllocator, StandardCommandBufferAllocatorCreateInfo}, AutoCommandBufferBuilder, CommandBufferUsage, CopyBufferToImageInfo, - PrimaryCommandBufferAbstract, }, descriptor_set::allocator::StandardDescriptorSetAllocator, device::{Device, Queue}, @@ -41,7 +40,7 @@ pub fn immutable_texture_from_bytes( format: vulkano::format::Format, ) -> Result, ImageCreationError> { let mut cbb = AutoCommandBufferBuilder::primary( - &allocators.command_buffer, + allocators.command_buffer.clone(), queue.queue_family_index(), CommandBufferUsage::OneTimeSubmit, ) @@ -114,22 +113,24 @@ pub fn immutable_texture_from_file( pub struct Allocators { pub memory: Arc, - pub descriptor_set: StandardDescriptorSetAllocator, - pub command_buffer: StandardCommandBufferAllocator, + pub descriptor_set: Arc, + pub command_buffer: Arc, } impl Allocators { pub fn new_default(device: &Arc) -> Self { Self { memory: Arc::new(StandardMemoryAllocator::new_default(device.clone())), - descriptor_set: StandardDescriptorSetAllocator::new(device.clone(), Default::default()), + descriptor_set: StandardDescriptorSetAllocator::new(device.clone(), Default::default()) + .into(), command_buffer: StandardCommandBufferAllocator::new( device.clone(), StandardCommandBufferAllocatorCreateInfo { secondary_buffer_count: 32, ..Default::default() }, - ), + ) + .into(), } } }