From b7cbed9980c8bafcfcdaa55bf946e30d4d0b79d8 Mon Sep 17 00:00:00 2001 From: Robert Bragg Date: Fri, 10 Apr 2026 20:58:22 +0100 Subject: [PATCH] Add agdk-winit-wgpu-egui example This is a example of a Winit + WGPU based application that then uses Egui to render an overlay UI. This builds on top of agdk-winit-wgpu but needed to downgrade to wgpu 0.27 to be compatible with egui-wgpu 0.33 --- agdk-winit-wgpu-egui/.gitignore | 16 + agdk-winit-wgpu-egui/.vscode/settings.json | 7 + agdk-winit-wgpu-egui/Cargo.lock | 3430 +++++++++++++++++ agdk-winit-wgpu-egui/Cargo.toml | 52 + agdk-winit-wgpu-egui/README.md | 38 + agdk-winit-wgpu-egui/app/.gitignore | 1 + agdk-winit-wgpu-egui/app/build.gradle | 43 + agdk-winit-wgpu-egui/app/proguard-rules.pro | 21 + .../app/src/main/AndroidManifest.xml | 23 + .../agdkwinitwgpuegui/MainActivity.java | 70 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + .../mipmap-anydpi-v26/ic_launcher_round.xml | 5 + .../src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 0 -> 3082 bytes .../mipmap-hdpi/ic_launcher_foreground.webp | Bin 0 -> 4408 bytes .../res/mipmap-hdpi/ic_launcher_round.webp | Bin 0 -> 5540 bytes .../src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 0 -> 1966 bytes .../mipmap-mdpi/ic_launcher_foreground.webp | Bin 0 -> 2880 bytes .../res/mipmap-mdpi/ic_launcher_round.webp | Bin 0 -> 3290 bytes .../main/res/mipmap-xhdpi/ic_launcher.webp | Bin 0 -> 4422 bytes .../mipmap-xhdpi/ic_launcher_foreground.webp | Bin 0 -> 6082 bytes .../res/mipmap-xhdpi/ic_launcher_round.webp | Bin 0 -> 7622 bytes .../main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 0 -> 7150 bytes .../mipmap-xxhdpi/ic_launcher_foreground.webp | Bin 0 -> 9530 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 0 -> 11662 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 0 -> 9746 bytes .../ic_launcher_foreground.webp | Bin 0 -> 13862 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 0 -> 16500 bytes .../app/src/main/res/values/colors.xml | 10 + .../res/values/ic_launcher_background.xml | 4 + .../app/src/main/res/values/themes.xml | 8 + agdk-winit-wgpu-egui/build.gradle | 5 + agdk-winit-wgpu-egui/gradle.properties | 15 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + agdk-winit-wgpu-egui/gradlew | 185 + agdk-winit-wgpu-egui/gradlew.bat | 89 + agdk-winit-wgpu-egui/index.html | 132 + agdk-winit-wgpu-egui/settings.gradle | 16 + agdk-winit-wgpu-egui/src/app.rs | 1186 ++++++ agdk-winit-wgpu-egui/src/lib.rs | 50 + agdk-winit-wgpu-egui/src/main.rs | 75 + agdk-winit-wgpu-egui/src/shader.wgsl | 56 + 42 files changed, 5548 insertions(+) create mode 100644 agdk-winit-wgpu-egui/.gitignore create mode 100644 agdk-winit-wgpu-egui/.vscode/settings.json create mode 100644 agdk-winit-wgpu-egui/Cargo.lock create mode 100644 agdk-winit-wgpu-egui/Cargo.toml create mode 100644 agdk-winit-wgpu-egui/README.md create mode 100644 agdk-winit-wgpu-egui/app/.gitignore create mode 100644 agdk-winit-wgpu-egui/app/build.gradle create mode 100644 agdk-winit-wgpu-egui/app/proguard-rules.pro create mode 100644 agdk-winit-wgpu-egui/app/src/main/AndroidManifest.xml create mode 100644 agdk-winit-wgpu-egui/app/src/main/java/com/github/rust_mobile/agdkwinitwgpuegui/MainActivity.java create mode 100644 agdk-winit-wgpu-egui/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 agdk-winit-wgpu-egui/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml create mode 100644 agdk-winit-wgpu-egui/app/src/main/res/mipmap-hdpi/ic_launcher.webp create mode 100644 agdk-winit-wgpu-egui/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp create mode 100644 agdk-winit-wgpu-egui/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp create mode 100644 agdk-winit-wgpu-egui/app/src/main/res/mipmap-mdpi/ic_launcher.webp create mode 100644 agdk-winit-wgpu-egui/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp create mode 100644 agdk-winit-wgpu-egui/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp create mode 100644 agdk-winit-wgpu-egui/app/src/main/res/mipmap-xhdpi/ic_launcher.webp create mode 100644 agdk-winit-wgpu-egui/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.webp create mode 100644 agdk-winit-wgpu-egui/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp create mode 100644 agdk-winit-wgpu-egui/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp create mode 100644 agdk-winit-wgpu-egui/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp create mode 100644 agdk-winit-wgpu-egui/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp create mode 100644 agdk-winit-wgpu-egui/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 agdk-winit-wgpu-egui/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp create mode 100644 agdk-winit-wgpu-egui/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp create mode 100644 agdk-winit-wgpu-egui/app/src/main/res/values/colors.xml create mode 100644 agdk-winit-wgpu-egui/app/src/main/res/values/ic_launcher_background.xml create mode 100644 agdk-winit-wgpu-egui/app/src/main/res/values/themes.xml create mode 100644 agdk-winit-wgpu-egui/build.gradle create mode 100644 agdk-winit-wgpu-egui/gradle.properties create mode 100644 agdk-winit-wgpu-egui/gradle/wrapper/gradle-wrapper.jar create mode 100644 agdk-winit-wgpu-egui/gradle/wrapper/gradle-wrapper.properties create mode 100755 agdk-winit-wgpu-egui/gradlew create mode 100644 agdk-winit-wgpu-egui/gradlew.bat create mode 100644 agdk-winit-wgpu-egui/index.html create mode 100644 agdk-winit-wgpu-egui/settings.gradle create mode 100644 agdk-winit-wgpu-egui/src/app.rs create mode 100644 agdk-winit-wgpu-egui/src/lib.rs create mode 100644 agdk-winit-wgpu-egui/src/main.rs create mode 100644 agdk-winit-wgpu-egui/src/shader.wgsl diff --git a/agdk-winit-wgpu-egui/.gitignore b/agdk-winit-wgpu-egui/.gitignore new file mode 100644 index 0000000..967e10c --- /dev/null +++ b/agdk-winit-wgpu-egui/.gitignore @@ -0,0 +1,16 @@ +*.iml +.gradle +/local.properties +/.idea +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties +*.so + + +# Added by cargo + +/target diff --git a/agdk-winit-wgpu-egui/.vscode/settings.json b/agdk-winit-wgpu-egui/.vscode/settings.json new file mode 100644 index 0000000..bcdfe24 --- /dev/null +++ b/agdk-winit-wgpu-egui/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "rust-analyzer.cargo.target": "aarch64-linux-android", + "editor.formatOnSave": true, + "[xml]": { + "editor.formatOnSave": false + } +} \ No newline at end of file diff --git a/agdk-winit-wgpu-egui/Cargo.lock b/agdk-winit-wgpu-egui/Cargo.lock new file mode 100644 index 0000000..354a728 --- /dev/null +++ b/agdk-winit-wgpu-egui/Cargo.lock @@ -0,0 +1,3430 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ab_glyph" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01c0457472c38ea5bd1c3b5ada5e368271cb550be7a4ca4a0b4634e9913f6cc2" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "agdk-winit-wgpu-egui" +version = "0.1.0" +dependencies = [ + "bytemuck", + "console_error_panic_hook", + "egui", + "egui-wgpu", + "egui-winit", + "egui_demo_lib", + "paranoid-android", + "pollster", + "raw-window-handle", + "tracing", + "tracing-log", + "tracing-subscriber", + "tracing-web", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu", + "winit", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.4", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "android-activity" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f2a1bb052857d5dd49572219344a7332b31b76405648eabac5bc68978251bcd" +dependencies = [ + "android-properties", + "bitflags 2.11.0", + "cc", + "jni", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys 0.6.0+11769913", + "num_enum", + "simd_cesu8", + "thiserror 2.0.18", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + +[[package]] +name = "ash" +version = "0.38.0+1.3.281" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" +dependencies = [ + "libloading", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2 0.5.2", +] + +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[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.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" + +[[package]] +name = "calloop" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" +dependencies = [ + "bitflags 2.11.0", + "log", + "polling", + "rustix 0.38.44", + "slab", + "thiserror 1.0.69", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" +dependencies = [ + "calloop", + "rustix 0.38.44", + "wayland-backend", + "wayland-client", +] + +[[package]] +name = "cc" +version = "1.2.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1e928d4b69e3077709075a938a05ffbedfa53a84c8f766efbf8220bb1ff60e1" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "codespan-reporting" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" +dependencies = [ + "serde", + "termcolor", + "unicode-width", +] + +[[package]] +name = "color-hex" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecdffb913a326b6c642290a0d0ec8e8d6597291acdc07cc4c9cb4b3635d44cf9" + +[[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 = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +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 0.1.3", + "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 = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.11.0", + "core-foundation 0.10.1", + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "cursor-icon" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" + +[[package]] +name = "data-url" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dlib" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" +dependencies = [ + "libloading", +] + +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" + +[[package]] +name = "ecolor" +version = "0.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71ddb8ac7643d1dba1bb02110e804406dd459a838efcb14011ced10556711a8e" +dependencies = [ + "bytemuck", + "color-hex", + "emath", +] + +[[package]] +name = "egui" +version = "0.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a9b567d356674e9a5121ed3fedfb0a7c31e059fe71f6972b691bcd0bfc284e3" +dependencies = [ + "ahash", + "bitflags 2.11.0", + "emath", + "epaint", + "log", + "nohash-hasher", + "profiling", + "smallvec", + "unicode-segmentation", +] + +[[package]] +name = "egui-wgpu" +version = "0.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e4d209971c84b2352a06174abdba701af1e552ce56b144d96f2bd50a3c91236" +dependencies = [ + "ahash", + "bytemuck", + "document-features", + "egui", + "epaint", + "log", + "profiling", + "thiserror 2.0.18", + "type-map", + "web-time", + "wgpu", +] + +[[package]] +name = "egui-winit" +version = "0.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec6687e5bb551702f4ad10ac428bab12acf9d53047ebb1082d4a0ed8c6251a29" +dependencies = [ + "bytemuck", + "egui", + "log", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-ui-kit", + "profiling", + "raw-window-handle", + "web-time", + "webbrowser", + "winit", +] + +[[package]] +name = "egui_demo_lib" +version = "0.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea461aeb68aa53bbb710da961299fa1fb92651bd0149f9612cf14cf7b4dfdebb" +dependencies = [ + "egui", + "egui_extras", + "unicode_names2", +] + +[[package]] +name = "egui_extras" +version = "0.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d01d34e845f01c62e3fded726961092e70417d66570c499b9817ab24674ca4ed" +dependencies = [ + "ahash", + "egui", + "enum-map", + "image", + "log", + "profiling", + "resvg", +] + +[[package]] +name = "emath" +version = "0.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "491bdf728bf25ddd9ad60d4cf1c48588fa82c013a2440b91aa7fc43e34a07c32" +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", +] + +[[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.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "009d0dd3c2163823a0abdb899451ecbc78798dec545ee91b43aff1fa790bab62" +dependencies = [ + "ab_glyph", + "ahash", + "bytemuck", + "ecolor", + "emath", + "epaint_default_fonts", + "log", + "nohash-hasher", + "parking_lot", + "profiling", +] + +[[package]] +name = "epaint_default_fonts" +version = "0.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c4fbe202b6578d3d56428fa185cdf114a05e49da05f477b3c7f0fbb221f1862" + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "euclid" +version = "0.22.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a05365e3b1c6d1650318537c7460c6923f1abdd272ad6842baa2b509957a06" +dependencies = [ + "num-traits", +] + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "slab", +] + +[[package]] +name = "gethostname" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" +dependencies = [ + "rustix 1.1.4", + "windows-link", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glow" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "gpu-alloc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" +dependencies = [ + "bitflags 2.11.0", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "gpu-allocator" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" +dependencies = [ + "log", + "presser", + "thiserror 1.0.69", + "windows", +] + +[[package]] +name = "gpu-descriptor" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" +dependencies = [ + "bitflags 2.11.0", + "gpu-descriptor-types", + "hashbrown 0.15.5", +] + +[[package]] +name = "gpu-descriptor-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "num-traits", + "zerocopy", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash 0.1.5", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "foldhash 0.2.0", +] + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + +[[package]] +name = "icu_collections" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" + +[[package]] +name = "icu_properties" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" + +[[package]] +name = "icu_provider" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "image" +version = "0.25.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" +dependencies = [ + "bytemuck", + "byteorder-lite", + "moxcms", + "num-traits", +] + +[[package]] +name = "imagesize" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" + +[[package]] +name = "indexmap" +version = "2.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +dependencies = [ + "equivalent", + "hashbrown 0.16.1", +] + +[[package]] +name = "jni" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine", + "jni-macros", + "jni-sys 0.4.1", + "log", + "simd_cesu8", + "thiserror 2.0.18", + "walkdir", + "windows-link", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "simd_cesu8", + "syn", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9" +dependencies = [ + "cfg-if", + "futures-util", + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "khronos-egl" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" +dependencies = [ + "libc", + "libloading", + "pkg-config", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[package]] +name = "kurbo" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62026ae44756f8a599ba21140f350303d4f08dcdcc71b5ad9c9bb8128c13c62" +dependencies = [ + "arrayvec", + "euclid", + "smallvec", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.184" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link", +] + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libredox" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ddbf48fd451246b1f8c2610bd3b4ac0cc6e149d89832867093ab69a17194f08" +dependencies = [ + "bitflags 2.11.0", + "libc", + "plain", + "redox_syscall 0.7.3", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" + +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "memmap2" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3" +dependencies = [ + "libc", +] + +[[package]] +name = "metal" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00c15a6f673ff72ddcc22394663290f870fb224c1bfce55734a75c414150e605" +dependencies = [ + "bitflags 2.11.0", + "block", + "core-graphics-types 0.2.0", + "foreign-types", + "log", + "objc", + "paste", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "moxcms" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" +dependencies = [ + "num-traits", + "pxfm", +] + +[[package]] +name = "naga" +version = "27.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "066cf25f0e8b11ee0df221219010f213ad429855f57c494f995590c861a9a7d8" +dependencies = [ + "arrayvec", + "bit-set", + "bitflags 2.11.0", + "cfg-if", + "cfg_aliases", + "codespan-reporting", + "half", + "hashbrown 0.16.1", + "hexf-parse", + "indexmap", + "libm", + "log", + "num-traits", + "once_cell", + "rustc-hash 1.1.0", + "spirv", + "thiserror 2.0.18", + "unicode-ident", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.11.0", + "jni-sys 0.3.1", + "log", + "ndk-sys 0.6.0+11769913", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.5.0+25.2.9519653" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys 0.3.1", +] + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +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" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.11.0", + "block2", + "libc", + "objc2 0.5.2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation 0.2.2", + "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.11.0", + "block2", + "objc2 0.5.2", + "objc2-core-location", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal", +] + +[[package]] +name = "objc2-core-location" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +dependencies = [ + "block2", + "objc2 0.5.2", + "objc2-contacts", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.11.0", + "block2", + "dispatch", + "libc", + "objc2 0.5.2", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.11.0", + "objc2 0.6.4", +] + +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2", + "objc2 0.5.2", + "objc2-app-kit", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal", +] + +[[package]] +name = "objc2-symbols" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +dependencies = [ + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2 0.5.2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-image", + "objc2-core-location", + "objc2-foundation 0.2.2", + "objc2-link-presentation", + "objc2-quartz-core", + "objc2-symbols", + "objc2-uniform-type-identifiers", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-uniform-type-identifiers" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" +dependencies = [ + "block2", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.11.0", + "block2", + "objc2 0.5.2", + "objc2-core-location", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "orbclient" +version = "0.3.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59aed3b33578edcfa1bc96a321d590d31832b6ad55a26f0313362ce687e9abd6" +dependencies = [ + "libc", + "libredox", +] + +[[package]] +name = "ordered-float" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e" +dependencies = [ + "num-traits", +] + +[[package]] +name = "owned_ttf_parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" +dependencies = [ + "ttf-parser", +] + +[[package]] +name = "paranoid-android" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "101795d63d371b43e38d6e7254677657be82f17022f7f7893c268f33ac0caadc" +dependencies = [ + "lazy_static", + "ndk-sys 0.5.0+25.2.9519653", + "sharded-slab", + "smallvec", + "tracing-core", + "tracing-subscriber", +] + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link", +] + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_codegen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared", + "rand", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pico-args" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" + +[[package]] +name = "pin-project" +version = "1.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix 1.1.4", + "windows-sys 0.61.2", +] + +[[package]] +name = "pollster" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5da3b0203fd7ee5720aa0b5e790b591aa5d3f41c3ed2c34a3a393382198af2f7" + +[[package]] +name = "portable-atomic" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" + +[[package]] +name = "portable-atomic-util" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "091397be61a01d4be58e7841595bd4bfedb15f1cd54977d79b8271e94ed799a3" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "presser" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" + +[[package]] +name = "pxfm" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a041e753da8b807c9255f28de81879c78c876392ff2469cde94799b2896b9d" + +[[package]] +name = "quick-xml" +version = "0.39.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958f21e8e7ceb5a1aa7fa87fab28e7c75976e0bfe7e23ff069e0a260f894067d" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[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 0.2.17", +] + +[[package]] +name = "range-alloc" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca45419789ae5a7899559e9512e58ca889e41f04f1f2445e9f4b290ceccd1d08" + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[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.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "redox_syscall" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce70a74e890531977d37e532c34d45e9055d2409ed08ddba14529471ed0be16" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "regex-automata" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" + +[[package]] +name = "renderdoc-sys" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" + +[[package]] +name = "resvg" +version = "0.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8928798c0a55e03c9ca6c4c6846f76377427d2c1e1f7e6de3c06ae57942df43" +dependencies = [ + "log", + "pico-args", + "rgb", + "svgtypes", + "tiny-skia", + "usvg", +] + +[[package]] +name = "rgb" +version = "0.8.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "roxmltree" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hash" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.11.0", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.11.0", + "errno", + "libc", + "linux-raw-sys 0.12.1", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[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 = "sctk-adwaita" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" +dependencies = [ + "ab_glyph", + "log", + "memmap2", + "smithay-client-toolkit", + "tiny-skia", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[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.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" + +[[package]] +name = "simd_cesu8" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33" +dependencies = [ + "rustc_version", + "simdutf8", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "simplecss" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a9c6883ca9c3c7c90e888de77b7a5c849c779d25d74a1269b0218b14e8b136c" +dependencies = [ + "log", +] + +[[package]] +name = "siphasher" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "slotmap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "smithay-client-toolkit" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" +dependencies = [ + "bitflags 2.11.0", + "calloop", + "calloop-wayland-source", + "cursor-icon", + "libc", + "log", + "memmap2", + "rustix 0.38.44", + "thiserror 1.0.69", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", +] + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] + +[[package]] +name = "spirv" +version = "0.3.0+sdk-1.3.268.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" +dependencies = [ + "float-cmp", +] + +[[package]] +name = "svgtypes" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" +dependencies = [ + "kurbo", + "siphasher", +] + +[[package]] +name = "syn" +version = "2.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "tiny-skia" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "log", + "png", + "tiny-skia-path", +] + +[[package]] +name = "tiny-skia-path" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + +[[package]] +name = "tinystr" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.25.10+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a82418ca169e235e6c399a84e395ab6debeb3bc90edc959bf0f48647c6a32d1b" +dependencies = [ + "indexmap", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" +dependencies = [ + "winnow", +] + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "tracing-web" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e6a141feebd51f8d91ebfd785af50fca223c570b86852166caa3b141defe7c" +dependencies = [ + "js-sys", + "tracing-core", + "tracing-subscriber", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "ttf-parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" + +[[package]] +name = "type-map" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90" +dependencies = [ + "rustc-hash 2.1.2", +] + +[[package]] +name = "unicode-ident" +version = "1.0.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-segmentation" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unicode_names2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d189085656ca1203291e965444e7f6a2723fbdd1dd9f34f8482e79bafd8338a0" +dependencies = [ + "phf", + "unicode_names2_generator", +] + +[[package]] +name = "unicode_names2_generator" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1262662dc96937c71115228ce2e1d30f41db71a7a45d3459e98783ef94052214" +dependencies = [ + "phf_codegen", + "rand", +] + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "usvg" +version = "0.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80be9b06fbae3b8b303400ab20778c80bbaf338f563afe567cf3c9eea17b47ef" +dependencies = [ + "base64", + "data-url", + "flate2", + "imagesize", + "kurbo", + "log", + "pico-args", + "roxmltree", + "simplecss", + "siphasher", + "strict-num", + "svgtypes", + "tiny-skia-path", + "xmlwriter", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03623de6905b7206edd0a75f69f747f134b7f0a2323392d664448bf2d3c5d87e" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wayland-backend" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2857dd20b54e916ec7253b3d6b4d5c4d7d4ca2c33c2e11c6c76a99bd8744755d" +dependencies = [ + "cc", + "downcast-rs", + "rustix 1.1.4", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c7c96bb74690c3189b5c9cb4ca1627062bb23693a4fad9d8c3de958260144" +dependencies = [ + "bitflags 2.11.0", + "rustix 1.1.4", + "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.11.0", + "cursor-icon", + "wayland-backend", +] + +[[package]] +name = "wayland-cursor" +version = "0.31.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a52d18780be9b1314328a3de5f930b73d2200112e3849ca6cb11822793fb34d" +dependencies = [ + "rustix 1.1.4", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "563a85523cade2429938e790815fd7319062103b9f4a2dc806e9b53b95982d8f" +dependencies = [ + "bitflags 2.11.0", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b6d8cf1eb2c1c31ed1f5643c88a6e53538129d4af80030c8cabd1f9fa884d91" +dependencies = [ + "bitflags 2.11.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234" +dependencies = [ + "bitflags 2.11.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c324a910fd86ebdc364a3e61ec1f11737d3b1d6c273c0239ee8ff4bc0d24b4a" +dependencies = [ + "proc-macro2", + "quick-xml", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8eab23fefc9e41f8e841df4a9c707e8a8c4ed26e944ef69297184de2785e3be" +dependencies = [ + "dlib", + "log", + "once_cell", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd70027e39b12f0849461e08ffc50b9cd7688d942c1c8e3c7b22273236b4dd0a" +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.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe985f41e291eecef5e5c0770a18d28390addb03331c043964d9e916453d6f16" +dependencies = [ + "core-foundation 0.10.1", + "jni", + "log", + "ndk-context", + "objc2 0.6.4", + "objc2-foundation 0.3.2", + "url", + "web-sys", +] + +[[package]] +name = "wgpu" +version = "27.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfe68bac7cde125de7a731c3400723cadaaf1703795ad3f4805f187459cd7a77" +dependencies = [ + "arrayvec", + "bitflags 2.11.0", + "cfg-if", + "cfg_aliases", + "document-features", + "hashbrown 0.16.1", + "js-sys", + "log", + "naga", + "parking_lot", + "portable-atomic", + "profiling", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core" +version = "27.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27a75de515543b1897b26119f93731b385a19aea165a1ec5f0e3acecc229cae7" +dependencies = [ + "arrayvec", + "bit-set", + "bit-vec", + "bitflags 2.11.0", + "bytemuck", + "cfg_aliases", + "document-features", + "hashbrown 0.16.1", + "indexmap", + "log", + "naga", + "once_cell", + "parking_lot", + "portable-atomic", + "profiling", + "raw-window-handle", + "rustc-hash 1.1.0", + "smallvec", + "thiserror 2.0.18", + "wgpu-core-deps-apple", + "wgpu-core-deps-emscripten", + "wgpu-core-deps-wasm", + "wgpu-core-deps-windows-linux-android", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core-deps-apple" +version = "27.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0772ae958e9be0c729561d5e3fd9a19679bcdfb945b8b1a1969d9bfe8056d233" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-emscripten" +version = "27.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b06ac3444a95b0813ecfd81ddb2774b66220b264b3e2031152a4a29fda4da6b5" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-wasm" +version = "27.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b1027dcf3b027a877e44819df7ceb0e2e98578830f8cd34cd6c3c7c2a7a50b7" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-windows-linux-android" +version = "27.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71197027d61a71748e4120f05a9242b2ad142e3c01f8c1b47707945a879a03c3" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-hal" +version = "27.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b21cb61c57ee198bc4aff71aeadff4cbb80b927beb912506af9c780d64313ce" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bit-set", + "bitflags 2.11.0", + "block", + "bytemuck", + "cfg-if", + "cfg_aliases", + "core-graphics-types 0.2.0", + "glow", + "glutin_wgl_sys", + "gpu-alloc", + "gpu-allocator", + "gpu-descriptor", + "hashbrown 0.16.1", + "js-sys", + "khronos-egl", + "libc", + "libloading", + "log", + "metal", + "naga", + "ndk-sys 0.6.0+11769913", + "objc", + "once_cell", + "ordered-float", + "parking_lot", + "portable-atomic", + "portable-atomic-util", + "profiling", + "range-alloc", + "raw-window-handle", + "renderdoc-sys", + "smallvec", + "thiserror 2.0.18", + "wasm-bindgen", + "web-sys", + "wgpu-types", + "windows", + "windows-core", +] + +[[package]] +name = "wgpu-types" +version = "27.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afdcf84c395990db737f2dd91628706cb31e86d72e53482320d368e52b5da5eb" +dependencies = [ + "bitflags 2.11.0", + "bytemuck", + "js-sys", + "log", + "thiserror 2.0.18", + "web-sys", +] + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core", + "windows-targets", +] + +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-result", + "windows-strings", + "windows-targets", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[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.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[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.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[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.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[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.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6755fa58a9f8350bd1e472d4c3fcc25f824ec358933bba33306d0b63df5978d" +dependencies = [ + "ahash", + "android-activity", + "atomic-waker", + "bitflags 2.11.0", + "block2", + "bytemuck", + "calloop", + "cfg_aliases", + "concurrent-queue", + "core-foundation 0.9.4", + "core-graphics", + "cursor-icon", + "dpi", + "js-sys", + "libc", + "memmap2", + "ndk", + "objc2 0.5.2", + "objc2-app-kit", + "objc2-foundation 0.2.2", + "objc2-ui-kit", + "orbclient", + "percent-encoding", + "pin-project", + "raw-window-handle", + "redox_syscall 0.4.1", + "rustix 0.38.44", + "sctk-adwaita", + "smithay-client-toolkit", + "smol_str", + "tracing", + "unicode-segmentation", + "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-plasma", + "web-sys", + "web-time", + "windows-sys 0.52.0", + "x11-dl", + "x11rb", + "xkbcommon-dl", +] + +[[package]] +name = "winnow" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" + +[[package]] +name = "writeable" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" + +[[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.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" +dependencies = [ + "as-raw-xcb-connection", + "gethostname", + "libc", + "libloading", + "once_cell", + "rustix 1.1.4", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" + +[[package]] +name = "xcursor" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" + +[[package]] +name = "xkbcommon-dl" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" +dependencies = [ + "bitflags 2.11.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.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" + +[[package]] +name = "xmlwriter" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" + +[[package]] +name = "yoke" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/agdk-winit-wgpu-egui/Cargo.toml b/agdk-winit-wgpu-egui/Cargo.toml new file mode 100644 index 0000000..dd97f4b --- /dev/null +++ b/agdk-winit-wgpu-egui/Cargo.toml @@ -0,0 +1,52 @@ +[package] +name = "agdk-winit-wgpu-egui" +version = "0.1.0" +edition = "2021" + +[dependencies] +tracing = "0.1" +tracing-subscriber = { version = "0.3", features = [ + "fmt", + "env-filter", + "tracing-log", +] } +winit = { version = "0.30", features = ["android-game-activity"] } +wgpu = "27" +pollster = "0.2" +raw-window-handle = "0.6.0" +bytemuck = "1.14" + +egui = { version = "0.33" } +egui-wgpu = { version = "0.33" } +egui-winit = { version = "0.33", default-features = false, features = [ + "wayland", + "android-game-activity", + "links", +] } +egui_demo_lib = "0.33" + +[target.'cfg(target_os = "android")'.dependencies] +paranoid-android = "0.2" +tracing-log = "0.2" + +[target.'cfg(target_arch = "wasm32")'.dependencies] +console_error_panic_hook = "0.1" +tracing-web = "0.1" +wasm-bindgen = "0.2" +wasm-bindgen-futures = "0.4" +web-sys = { version = "0.3.92", features = [ + "Window", + "Document", + "HtmlElement", + "Text", +] } + +[features] +default = [] +_bin = [] +desktop = ["_bin"] +web = ["_bin", "wgpu/webgl"] + +[lib] +name = "main" +crate-type = ["cdylib"] diff --git a/agdk-winit-wgpu-egui/README.md b/agdk-winit-wgpu-egui/README.md new file mode 100644 index 0000000..efcfca7 --- /dev/null +++ b/agdk-winit-wgpu-egui/README.md @@ -0,0 +1,38 @@ +This tests using `GameActivity` with winit, wgpu and egui + +This example also aims to show how it's possible to use Winit + WGPU to write +portable code that can run on Android, desktop platforms (enable "desktop" +feature) and Web (enable "web" feature) + +Egui is then used to show a demo UI that overlays the wgpu rendering. + +The aim with this example is to show how Egui can be integrated with an existing +winit + wgpu app (as opposed to making egui-wgpu be fully responsible for the +rendering state). + +# Android Build + +```bash +export ANDROID_HOME="path/to/sdk" + +rustup target add aarch64-linux-android +cargo install cargo-ndk + +cargo ndk -t arm64-v8a -o app/src/main/jniLibs/ build +./gradlew build +./gradlew installDebug +adb shell am start -n com.github.rust_mobile.agdkwinitwgpuegui/.MainActivity +``` + +# Desktop Build + +```bash +cargo run --features desktop +``` + +# WebGL Build + +```bash +cargo install --locked trunk +trunk serve --features web --open +``` diff --git a/agdk-winit-wgpu-egui/app/.gitignore b/agdk-winit-wgpu-egui/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/agdk-winit-wgpu-egui/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/agdk-winit-wgpu-egui/app/build.gradle b/agdk-winit-wgpu-egui/app/build.gradle new file mode 100644 index 0000000..50f3fe5 --- /dev/null +++ b/agdk-winit-wgpu-egui/app/build.gradle @@ -0,0 +1,43 @@ +plugins { + id 'com.android.application' +} + +android { + compileSdk = 35 + + defaultConfig { + applicationId = "com.github.rust_mobile.agdkwinitwgpuegui" + minSdk = 31 + targetSdk = 35 + versionCode = 1 + versionName = "1.0" + } + + buildTypes { + release { + minifyEnabled = false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + debug { + minifyEnabled = false + //packagingOptions { + // doNotStrip '**/*.so' + //} + //debuggable true + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + namespace = 'com.github.rust_mobile.agdkwinitwgpuegui' +} + +dependencies { + implementation 'androidx.appcompat:appcompat:1.7.0' + + // To use the Games Activity library + implementation "androidx.games:games-activity:4.4.0" + // Note: don't include game-text-input separately, since it's integrated into game-activity +} + diff --git a/agdk-winit-wgpu-egui/app/proguard-rules.pro b/agdk-winit-wgpu-egui/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/agdk-winit-wgpu-egui/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/agdk-winit-wgpu-egui/app/src/main/AndroidManifest.xml b/agdk-winit-wgpu-egui/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..ba8b539 --- /dev/null +++ b/agdk-winit-wgpu-egui/app/src/main/AndroidManifest.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/agdk-winit-wgpu-egui/app/src/main/java/com/github/rust_mobile/agdkwinitwgpuegui/MainActivity.java b/agdk-winit-wgpu-egui/app/src/main/java/com/github/rust_mobile/agdkwinitwgpuegui/MainActivity.java new file mode 100644 index 0000000..7b10221 --- /dev/null +++ b/agdk-winit-wgpu-egui/app/src/main/java/com/github/rust_mobile/agdkwinitwgpuegui/MainActivity.java @@ -0,0 +1,70 @@ +package com.github.rust_mobile.agdkwinitwgpuegui; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.view.WindowCompat; +import androidx.core.view.WindowInsetsCompat; +import androidx.core.view.WindowInsetsControllerCompat; + +import com.google.androidgamesdk.GameActivity; + +import android.os.Bundle; +import android.content.pm.PackageManager; +import android.os.Build.VERSION; +import android.os.Build.VERSION_CODES; +import android.os.Bundle; +import android.view.View; +import android.view.WindowManager; + +public class MainActivity extends GameActivity { + + static { + // Load the STL first to workaround issues on old Android versions: + // "if your app targets a version of Android earlier than Android 4.3 + // (Android API level 18), + // and you use libc++_shared.so, you must load the shared library before any other + // library that depends on it." + // See https://developer.android.com/ndk/guides/cpp-support#shared_runtimes + //System.loadLibrary("c++_shared"); + + // Load the native library. + // The name "android-game" depends on your CMake configuration, must be + // consistent here and inside AndroidManifect.xml + System.loadLibrary("main"); + } + + private void hideSystemUI() { + // This will put the game behind any cutouts and waterfalls on devices which have + // them, so the corresponding insets will be non-zero. + if (VERSION.SDK_INT >= VERSION_CODES.P) { + getWindow().getAttributes().layoutInDisplayCutoutMode + = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS; + } + // From API 30 onwards, this is the recommended way to hide the system UI, rather than + // using View.setSystemUiVisibility. + View decorView = getWindow().getDecorView(); + WindowInsetsControllerCompat controller = new WindowInsetsControllerCompat(getWindow(), + decorView); + controller.hide(WindowInsetsCompat.Type.systemBars()); + controller.hide(WindowInsetsCompat.Type.displayCutout()); + controller.setSystemBarsBehavior( + WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + // When true, the app will fit inside any system UI windows. + // When false, we render behind any system UI windows. + WindowCompat.setDecorFitsSystemWindows(getWindow(), false); + hideSystemUI(); + // You can set IME fields here or in native code using GameActivity_setImeEditorInfoFields. + // We set the fields in native_engine.cpp. + // super.setImeEditorInfoFields(InputType.TYPE_CLASS_TEXT, + // IME_ACTION_NONE, IME_FLAG_NO_FULLSCREEN ); + super.onCreate(savedInstanceState); + } + + public boolean isGooglePlayGames() { + PackageManager pm = getPackageManager(); + return pm.hasSystemFeature("com.google.android.play.feature.HPE_EXPERIENCE"); + } +} \ No newline at end of file diff --git a/agdk-winit-wgpu-egui/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/agdk-winit-wgpu-egui/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/agdk-winit-wgpu-egui/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/agdk-winit-wgpu-egui/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/agdk-winit-wgpu-egui/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/agdk-winit-wgpu-egui/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/agdk-winit-wgpu-egui/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/agdk-winit-wgpu-egui/app/src/main/res/mipmap-hdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..f08a41248a18c62825d189df237b0034afb6b865 GIT binary patch literal 3082 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 Y#AV14|2#8zgLkggX`9Ix_InBj0N88;NdN!< literal 0 HcmV?d00001 diff --git a/agdk-winit-wgpu-egui/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp b/agdk-winit-wgpu-egui/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..a7af7759cb9885155f33f5544999d9e8a5b33420 GIT binary patch literal 4408 zcmV-85y$RQNk&F65dZ*JMM6+kP&iB^5dZ)$p+G1Q2{mrpMv;@v{{M%2P2D57h*s{T&^{6S`bf@@0a z98@G!s!*ma0jPq`Maxpk&jwHh-5NDt>8>OT&oBZ2?<)X)s3x4XZ<%NVUH~)zOY$!n zjN3MHB=+C-ri<^0n1FsEVJpM?v=`|lWqr^+o%wE0+qNB(bZgssg_C7l_poi-w$&Rg z<2Q`%XpYeuZMJONF58HT%&3ewk7dbV=5k)u97PS=w&QVhK3_6MZQJeIwr$(CZQHhO z@BXURuHB~Nx=klVXqTlVC<-{5qC(%o$V zIx2U%bU7%QfrAB7=g1ORsSCga-u+37!~flqV%t`2XUzTn?_rw*4x%6yA}Nagvl9i( z4Da6~hqi4~d*+R8+qP|Wwrx8dJKMHZIb|x_{#7CNcNs{M)MUtTToKgu4FtFk`oMo4 zTmUi5WHzC-K^t~brS#C5UF=}WnxFzNGK-z1hd)ULo2a@52=fYw;H~mk8A&|&kw2#g zgV7xfA))+`L@$6BNS_uI!DpVEDo9XD>gc03|jxeH2lx9YhC?Qdz%d-y;uD-Q7{PfaoD}da% ziS7gwp)1wc&3AMp$QBkeq7vR5o{C=!R7YC`bI5h!YqyXpDzn?4390mOw}Vk`oCe^&|m6SDf;cHazv>-rNKr5`c`qv>pXO z1E7fjGpBLm%E9m~Xp6(hT0pxX!V^yL$_EsI*)+-#I*_=X!vIAnG9W??_7b8Kvs17P zL&uCf@^Wuz0-!*q9smFUB>>7_kpRG;!PP69kpaE2EDMnVcM1}T#~tV42Ox%Z1Q|jT zJQRws%0dRz;!% zWVyIYUtlphB@nQgi?jllu-vL&l8Er!>s0b+MfD7!9Cl^^U|#^csIm|~p0fq=pbr2b zKeo1sY?r@cR00qZ$)XK>1LPFUuJg%v>qKnCLM z(pK5A4Y>gT?a5#PI6*q1q~9(`Y#L_&b_mlu$LA~-0suS_kW}N{Ia|Zy0?-2hFbh=< zpK@3O004J4Z_Az(Hh({aTVK2mUwr!|;~@$G1>k_(I(B{wjqvCu;r+1yKuCm{vJ$9` zsQ?i032#)(!{8znP^(hpB@z*i>;bewjursGLzyRpBJuADDqo)dsg040$H&=AJs1ekobb+#?BCv-Uel;`Zv`CLQxF80>!rw$ zlZ5=>Z(IZbP-Qa$PzgX*01Sd-rVS_n3V}1OaQMa1XJ@AEy>#Q!cS9F1jbNISBMfaxtkxnOXm6HCSy2}0I!fhLll}*Is&qx z?HC!U)#M8WB(4B7eHPPycdF|P%|H~XBuFIY`@^6f+?++i8PfBEfA~IyKP02vNqz!w z7SIx=cLM-G03al*75P#N5CPJK1@`<(-(3M3f=g%@Boc|?7~$g2zz@g|qC9|~Co2rI z%$Jik{Dy;o1~3Ky01AXe10>@iQ%|KVlD%cCiH!)g6l?1f>a&T}*{IHh%B;BihX6oP z@C(jQl9FJ!6hw0NN8lr5C=YP)8b3*fxW<=~6L6hj_z9>6g9Jd6b7xtpg~0y*n{7W2 zzT5ciosVDQiyz*pBvr-Q5URu-qp%;%0002^gKtQ}OCAKTk$UA%|9Vd%F(?ISFLr4v zvUw9Z$}sZR*&P7s#r=Ygi8X&d1Hccdh&WBFb?2OusLY|U98qt0@2_BgN8T zicUX_K%Ns{V$s~@W@Mm z>x6Rtk-+ZD90xDX%tK|?5Fp|=Iv^s#KOb1le?K@_Bu}{A?%h$Aj>uVdMfiS#h48wJ zz-(qf+ql4{RtCR_< zH5Nt!y-7j-a)ZmbwaCvN_pB@J-$A9qxM^Fe6|N*ocJFLqut%KZ&=KSWsa>@iC`<*E zLH_4`vZ4f=hB~&d$Dd;NmJm#rA&4-|E_?kS9&@=?cR|ouqT2vO$d7W!W%lqeeMrV! zFP~Uxnq!t@QM{xgF9?YG~f>DD2;qaPWp35gg+B%HKv&g5vDxdI*WX7Uw^#8 z?=JVRNA*_$KXC#jlIuLeEy?w1f*>*RG>T9>w*UbOfU_UN^`C(#Ke37P_+JI?@GmY* zlt={QOA#>D=>`-8z_m%hMV{vouA*%65stqv5hO-;!%%6esW8Y8?JoZSj7ACNIsEr6 zokpt}CYOrb4Q0ZmZ-J})SVs7Ozq+md`iNk3M1bi^fwUGV`QH=3Gbkfuuou6*!E&p_ zxYE>F5dsOWPtt2cCI4vLjw>NR5fBN0AP7#q` z2h|Ecy$S&XXhy00p*6!u;Ra_pLlwO7QyYd#>n*kD7cKNR{X!rVL;@5Htwkg&%T+2B zo9%lThvcPy zdFfwXI8m!Ra!@OCsD`5lc;ba3AV?*UNsPZ~Oe$qHtl-jD{&aoN1A{`h!M|?OT_n~+k$2=m$F9&@Zh5h8!OC*;{cRWs zNJW(#836q?Kx*#qq_|s)Qr zZQ#}HpAkHaCtPZ#kHqiq1X6i}M$GQTPeYVr$X!NLquI&BPt)h`&jP;?Az(F8 zJaoPt+X2rKB3KmwWoSVIs!@VG#1kczYndG!YH z&)b0ykUhjP9|sRq@1oP7Rtt0|AjA@~(Ch+4X*U7@5GF#HDA{C^iAgdE0CzC!iE>RRr`U)aq(+v^O-URw7DI0s;c+@(Tc#uNme8{6cF2)?j`EuNvzWLu}j; z_<_e!21%hIX8U>@4_yTONQ8iZfD|@!7hEH8t?)JpJj^Eq-sm5Avkh@Z=C^TGZWV6k&BS~`7Xv_-$ zm48&ydg~D;MJa0A1~Pwq15gaR-u+JikQJ;^1AvVLz?BWapw>kkbh>_>_z*-)Z~7fw zBGiUTA}y4%vIzrpQ~quN0A*#})$4}^t1GJq5EC{45Y?&yfHxGhZNnt|VYfRFB4Pqq zt6~4)jV+~Z+m1=j{l4GVwqx72?W}BPsXvhJ{}Hcp*jV-06WeBc)TpZW9n{D919xnD z{Kd8^PQEOReU776wThjLAxM(kw&?{RIsgBmIS^R6wQZ}ev-Y`9W@ct~$Sif>h#3me zSMCzrft&b>95KbrY>V~o-I4`>F=Q!8RdtVNZQHhO+qU=QlkpAv3$|_B_OoWD2VDsR zw~?GAC+?0qbohez`TtKj)3$A?6?VtQ#va?YZQHhO+qP}n_DpOit)#Wq`u(ahy}Gl_ zU+|gPy{fAQkM?w>b}QAD$9w&D@B3)C2D|yl)}xuCY}>YJOB!?Ui+3L*ZQHhOo24kH zQOqpm4@5mnQA*pk&8M*S7*}VnNy)Zt)3!9m+~?eB82ZQ_bG7OM#*-}d~X1d9@UJ54w59HEd+!^ z&&Ln+fXcka8V3ZhHYou0+WQ+g&%scD+6=V^tpEm?B#$-YX1(>I@~VR7w;V>F$f{L) z&F@PpfDB2l=@A`<- z;w$2pXnLG>=_OD^w%4Kqq5Pzsu3kaY2JGQ}&FHN$4m=U1r{)^e0NXSIKtcK7`$(KL z|LfDdX#;S3UG3W(8|X;LuIp-V6)hL_B+Zqn0RpTb93~V5L6T$u22GNn1Zg0L2`Y)) z7VM9%syBlb%<|3tjJ=8G+BisH2Y6T_0oa5DYLH_j0sd&%a7C3-FV@)gC&Myb^p4gc zh8-VoHI}$) zNR%jw`#A*CHz#mR3~}aJhAt!NP)?s6_IX=W;c}`P{6)w((G8w7z8RT-QN@B`%-F|J zA=4cGx|nz$v;L}|y8IvJKoTlP3ziez8ik;UoEkg1Aa=58{!K;%_BmoDFY>P+gD+qw zIk-?*z%iysJsBaG&ImV~f;7T-h==X(IK+f(b6gv#z_&f z5gs2nt`yZ+JvCMop=&%+fe**9y_U9rB;3^A#YP-Hc~bHa0Kgoe)f&=vZVqX3bhB|Y zg6x5ZZ9JL@dZ1Ex$>1>2b5h=e+oRlO%$u5tLBxYDV5!*WKCU&t=|F8|pG4j`7$XoN zeJ*qCP>yzJS>yxSzF4H?vP5)Z;DRWR`8N&xt=(&SH1oV*8R;Zx!FJ_D2b9rOE~i;} z(&8x$3Ph6M5m0=q4z8$)w&MV+*4hC^nIT{S0J8ODsIs=DsiBuKNK{ETr9_?!`mK!Y5(KCnw~E^WuxcKi1l`~7*P)P4vN zG=dPs@%oo0->Rjj9=6$^H{126(=9Xkh_Z!W?OY8WGMEOhwIijujt8Q+5CDq*G(bV} zmJNYlTc?L5x7R%k4A%raBtQTYfsCr-+PR~J&wB)nK(K!Q5dauE3mnzoW{K&??f1{+ zX5aF$%-$+Oyv_m6000h|tC?Z5-&tz>VcY$9J;TO#>{-n{Y8gVjv7soB3%K*giQ~Sf92);ha`C);2-O1bt6prTq+0v569;Ub|0m*zzOCi9RAnw z@t~%GZ(QN$mGLd$;n`1Jy!ugFdDWCzoF#*HOLU|fI-mp3_p3%bVRmCC5`=}^J4u6+ zs==o91y+Fn9~YysrI8AyQoyk7feBA5*Ym3H1NTTk)?`eTyY&DcAad}VhsKTZqErI6mZQ1qkOr(bbNHFs3wW0G-A$bRI^ zI|o_9(2QviYKCPD31g#L{{&!6B_<#TV^`Fqu_QGRuzUDW*@%0__mReqT=M|Tbu4xP zCO#B`U>QJQ0Q3XkrCE~f3A1PA5(DTTwfzUig+JXL zW!%(hGD?m>@xg;D-da?6NJ-fpY6jnc*eE@0B9z{sWXO!W?&3#Hz(O0z13@gC(~h## z5-c~yF^&#Vy#-1D5EK3e&jOOQtebT;{jW@&0Uek@IO}!M(9q{uNM#r|G74^;?6$LH`n zypEpQvVmFnjv@4>b!XY49(SDx* zkMsv$V>=0{GX=7tJgIIotq+=7TiWXbSG_2?LsFyE8k)nTCPT`mWC@>0Ly3Z=wZJ?uVQDQg zHhMw|?Sa44I4u?F&@J6_jp`=*FjO^gdyD{(_dIK&#_Wb}KAoE89y|F(Uz?55lf9 zb}glILnm?1rl+VGDMko)(>#hUVr`t`$wGBVQ~}b4y92l6SIu`88n&Tsi>6G+Q#?>S zw`e+rKnM;2@rpsj01$xZ!@vswFbIN>zg#*v?5+E4BASYmuw}3%T!W+QgJBaa$ zsioPZC&A7_-VKBCuEtaQl?$V=P?7{RgiDf9AnpC^W9f4Rd&1a)REK$N-8u1?i*~)& zu>Ao>g(zcD&Y~z9?I#KNCN=Q#%M33wP^*1iuXKI0Nz$$bT}PG~mX=}X>zu4cBV1<{ zkR+Qar`fmvc2zxi%HOcm!q#Bn45lHVF1Ag{km_c{LhpK0+1os-NP~&pJh?XxKR+_nW(ykDfqnlyF^DuMyWksDTHX35&5eVvI91T|oRxRo`|x*K}MP8g*q% z-fLD!Kp1{Ww2V~H2Y!;lfxZ*Kt>p)urRbC>SMR@$OU1kdECz-cdVM;J0h(^a<KBkZ5EQV?LrnE+c{j{OdC+D1=JA4_vmFKi0N#jE1KJ!h z2K>8cvFDi5?tb4C3IO347A5FYeM}90qSrVn0AF=@MgisGLu9p>y62_e4Z9wH1B<-@ zYJ}7Wrd2}JeXqh2!vR!8T?94ZQlz3H1XrELbAUT&0=a=T93J_|>uCLt0_?;`x{PzI z6CQtG#!1C?IPf>d8Jgj1;@^nDy)kOPi6U^X)q%e4N2NePT0#zJIF&A59sjH8V-1ZhY= z?)q!=u;B+9w2)DCNiTc;&CRa_1tgdE41nB~hf6jO8WJtw2E&ii!9^kA#C7)5H}KJ^ zcoP*bgBC>eF+B#BbKZiH?s=UwP{7kd+5v}(eO*BD3PS%bFUKm%b@ zpRPE@XdjLrAT^MD_ynH=0G=Ij%L4b^U)y;9BODTV4*-A}M1567M_)_MKfR+vK1s65 zD+5G#nBTXXsIJL^(1L1|qj65#H2wuMYJ}pBp$WCtql$Q(q~_^(O8kV-{NyL`pM0mc z3*Yq3HkGfV;VT)2G{v)bGYm`ZKx|4H0A~ObKGbxcqANp+0pPDn*rL=`x0*k9eEloq zI1sARLA{%=eJYaY2?oh%tpvd3kOm`8)TnOc=o*B zc(3Ot|0WK(6K%ht`onOJmv1KRqvQjmwxzUTJu>X~H_hKbUR2SQP1dPR%O1Mlq5uE~ znaMCyrqi~W--rBC1#OAEH#87idJQ&9fD&w}L{y?^Sv#S)Lvp9~pI*%$P4{dw>U^Z^ ziCdR9N>5^4az{PeVQeY;8f0CqXSSt&}?@lVVt?Yyguz9SM7?b)EcImVt{bw zA`k3>*iub`7LXozvl;Kk;P=;s)+#A*UyROhw1Iu{d-91saGB8%Wxm`r8auk!pKQAR zh4UTQfraRGf6QTHNFIRj>2?{~B7og&Gu8XvTO4Nr0&_e=E2P+_Og;X-GLCMp6?Wl0 zb_Kkk+_Iw~^hFf3Q&k>4Mz*7({avirk4%Y20FNO;uGr75aouu?O?s?Ds7k1_q03F8 zIdU@zus)&RZxVv-sQ#)<)$Q$=-eHi?N0GqX8S?)-YWZn5V$~3dkswe215gkem!i_y zhI&V6$5_YP;{eWri+bs(E*Y$UM=}zuz&04sRvFVvJnAEpf(b0|+GTuEA|eLJ3D0IW zRbODHdT(E8rE!rfYMutnjP2DlLf9rmnvpA98c`tapWl&;`o?fdB4oyi z5TN=(xl0CM9U(ydgBPL1i-Q)VVVMojUIn}m+#bN&P$H$b9zx>^R;S_sk{0R*b zPs!S33;15@*-)6e@hl?&OOE=Fk>}(8_{uLm;#?22k9ywJrnVmU5=Oa;t&i6tx|n|B z&BmYgGmr7uJOvB}B`g&D+9hBHv4mED{sJ!T+&k6R((6E`6#RwfV>NCL|Kn#_90sDB z_|;>XHC!~Ealc%J(g2|n0tG>sbjk!4EyQ31C_>OA@x|ue?70^lJ;B^xK)Tfb?D5uT z1A2Ds!afHtwLW?c!a!ub(eJQa{!ExQ8c>LunFQZclhp(XsbB&GB*E~klH^$d5KxQ} zv;rECcXsC7z$-^4N6!N+eetbX5N<@c7C|65GuK#uq<%Aoer0jne5#vX zz>MHC%hQL6`~Hgn`c!{vq}LZT?i_x6`^dfUDUc|Imk;lF>oWmKpBl3x)TST0P{RR2 zfHNgkT0v!mZH6T2kIL*Wdu$tP z+qP}nwr$(CZQE+w?owvNMRnyy%-OyF#%}Ab*yK*!M{-AvJ(s@=0 zDqM`8P6P~0YAVtomZQ~*mtp;Q5c?D}xDPgygp8R&ctg!TMgm9@N0v)6!Q%|@I5J)ge?3E@w#k# z=iajJoszEzOKdGsYdlla;`fYU`ENKY3TqHyO>Rob>kto60TY zk&z8|e$L$g%|d|~xSNw?qPRmT)=82d{(Myhp7eNoLijmVv1~DTV)9!cQo;^3osyoy zwo9s^1BF}p!9TWI?PuOZOppD_q{@mX5$=Ulpotusf={yrF5K{Te5EK1vGEQ}+m_h- z78GQ0W28(a1{Rb(k;zTs zR{0xK3lzi^rQjPy?x?4Re_h0rb*>Pk08^kDSU`eivkNsJ@#DmXYnC=$x1#Ajkzx(a zvYMZxx_rnNcMbSq^C1JxOvd~8t80h=VE`~7KquzJs$sNZwTofm;ax@*4K{k$KtHbQ z>zZD!9>_8kf2J{G?^Wv-os;olsNxp1@&wTcX%>zwSPGpC2oIwjRd0}g6nYLrHk#af ze;M6~)O1YTHBjR~7YDL5!4UUPNz+)ld6Fk{loC{22olM>5!u8IhB5T3s(Pw`=U#7ZgsCBOW+NGoD}BScMYi$wiI&?=c~r=5(g6&ldEQrT~KWkMMDS(mD%6KW;OC z=#WMvKstCJIeGRoPu>XHu(~Us{t0df8c^N4EA#$gnV?Q(MIFq8P&Sp#wbj~xIhv`e AivR!s literal 0 HcmV?d00001 diff --git a/agdk-winit-wgpu-egui/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp b/agdk-winit-wgpu-egui/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..e4bdf4e3feffae09147860f4d21fe4ca9ba8d595 GIT binary patch literal 2880 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 Y1s=l-F9_ilp3*Wxo7$?ITj^e)QeN0YZU6uP literal 0 HcmV?d00001 diff --git a/agdk-winit-wgpu-egui/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/agdk-winit-wgpu-egui/app/src/main/res/mipmap-xhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..8d9755591f9fb5f71c4a35209cccc007883da968 GIT binary patch literal 4422 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 I{xfD>0Einab^rhX literal 0 HcmV?d00001 diff --git a/agdk-winit-wgpu-egui/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/agdk-winit-wgpu-egui/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..d8424d37ec042b67dc5a3c8858a5099a9665b8a6 GIT binary patch literal 7622 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 literal 0 HcmV?d00001 diff --git a/agdk-winit-wgpu-egui/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/agdk-winit-wgpu-egui/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..61526f2a59ce19b2ac608fceb391a8e8f27a6408 GIT binary patch literal 7150 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 literal 0 HcmV?d00001 diff --git a/agdk-winit-wgpu-egui/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp b/agdk-winit-wgpu-egui/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..90692d1af862e8716b0f3e733a2326997beacb8c GIT binary patch literal 9530 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 Bi?;v( literal 0 HcmV?d00001 diff --git a/agdk-winit-wgpu-egui/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/agdk-winit-wgpu-egui/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..717f69d46a2cf899f89f02f7608ff1e61baf82b2 GIT binary patch literal 11662 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 literal 0 HcmV?d00001 diff --git a/agdk-winit-wgpu-egui/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/agdk-winit-wgpu-egui/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp new file mode 100644 index 0000000000000000000000000000000000000000..1349310fa9828f4fb96cd3457f4116015edb5c7d GIT binary patch literal 9746 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 literal 0 HcmV?d00001 diff --git a/agdk-winit-wgpu-egui/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp b/agdk-winit-wgpu-egui/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.webp new file mode 100644 index 0000000000000000000000000000000000000000..c055957db883783faff7f5699023af3c0f48f08c GIT binary patch literal 13862 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 QxR#c<`~Q8sjQNZH51o#uApigX literal 0 HcmV?d00001 diff --git a/agdk-winit-wgpu-egui/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/agdk-winit-wgpu-egui/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp new file mode 100644 index 0000000000000000000000000000000000000000..91c850d2af69d23b5978590d5fc32d5d25d243bd GIT binary patch literal 16500 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 f;kq_z3I$7h8!XKs0Vu5PMA + + #FFBB86FC + #FF6200EE + #FF3700B3 + #FF03DAC5 + #FF018786 + #FF000000 + #FFFFFFFF + \ No newline at end of file diff --git a/agdk-winit-wgpu-egui/app/src/main/res/values/ic_launcher_background.xml b/agdk-winit-wgpu-egui/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..ece04f8 --- /dev/null +++ b/agdk-winit-wgpu-egui/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #C8C49F + \ No newline at end of file diff --git a/agdk-winit-wgpu-egui/app/src/main/res/values/themes.xml b/agdk-winit-wgpu-egui/app/src/main/res/values/themes.xml new file mode 100644 index 0000000..1ac5631 --- /dev/null +++ b/agdk-winit-wgpu-egui/app/src/main/res/values/themes.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/agdk-winit-wgpu-egui/build.gradle b/agdk-winit-wgpu-egui/build.gradle new file mode 100644 index 0000000..49d1228 --- /dev/null +++ b/agdk-winit-wgpu-egui/build.gradle @@ -0,0 +1,5 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. +plugins { + id 'com.android.application' version '9.1.0' apply false + id 'com.android.library' version '9.1.0' apply false +} diff --git a/agdk-winit-wgpu-egui/gradle.properties b/agdk-winit-wgpu-egui/gradle.properties new file mode 100644 index 0000000..a400a79 --- /dev/null +++ b/agdk-winit-wgpu-egui/gradle.properties @@ -0,0 +1,15 @@ +# Enable Gradle Daemon +org.gradle.daemon=true + +# JVM arguments +org.gradle.jvmargs=-Xmx4g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +# Enable AndroidX +android.useAndroidX=true +# Build caching and parallel execution +org.gradle.caching=true +org.gradle.parallel=true +# Incremental Kotlin compilation +kotlin.incremental=true + +# File system watching for faster builds +org.gradle.unsafe.watch-fs=true \ No newline at end of file diff --git a/agdk-winit-wgpu-egui/gradle/wrapper/gradle-wrapper.jar b/agdk-winit-wgpu-egui/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f GIT binary patch literal 59203 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

K7UpUK$>l@ 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 E2O(~oYXATM literal 0 HcmV?d00001 diff --git a/agdk-winit-wgpu-egui/gradle/wrapper/gradle-wrapper.properties b/agdk-winit-wgpu-egui/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..6cd7fd1 --- /dev/null +++ b/agdk-winit-wgpu-egui/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Mon May 02 15:39:12 BST 2022 +distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/agdk-winit-wgpu-egui/gradlew b/agdk-winit-wgpu-egui/gradlew new file mode 100755 index 0000000..4f906e0 --- /dev/null +++ b/agdk-winit-wgpu-egui/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/agdk-winit-wgpu-egui/gradlew.bat b/agdk-winit-wgpu-egui/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/agdk-winit-wgpu-egui/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/agdk-winit-wgpu-egui/index.html b/agdk-winit-wgpu-egui/index.html new file mode 100644 index 0000000..d5eccb1 --- /dev/null +++ b/agdk-winit-wgpu-egui/index.html @@ -0,0 +1,132 @@ + + + + + + + + + + + + + Winit Wgpu Example + + + + + + + + + + + + + +

+ +

+ Loading… +

+
+
+ + + + + + + \ No newline at end of file diff --git a/agdk-winit-wgpu-egui/settings.gradle b/agdk-winit-wgpu-egui/settings.gradle new file mode 100644 index 0000000..f60920c --- /dev/null +++ b/agdk-winit-wgpu-egui/settings.gradle @@ -0,0 +1,16 @@ +pluginManagement { + repositories { + gradlePluginPortal() + google() + mavenCentral() + } +} +dependencyResolutionManagement { + repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositories { + google() + mavenCentral() + } +} + +include ':app' diff --git a/agdk-winit-wgpu-egui/src/app.rs b/agdk-winit-wgpu-egui/src/app.rs new file mode 100644 index 0000000..dc65767 --- /dev/null +++ b/agdk-winit-wgpu-egui/src/app.rs @@ -0,0 +1,1186 @@ +use std::borrow::Cow; +#[cfg(target_os = "android")] +use std::ffi::c_void; +#[cfg(target_os = "android")] +use std::ptr::NonNull; +use std::sync::Arc; + +use tracing::{debug, error, info, trace, warn}; + +use egui::ViewportId; +use egui_winit::State as EguiWinitState; + +use raw_window_handle::{HandleError, HasDisplayHandle, HasWindowHandle}; +use wgpu::{Adapter, Device, Instance, PipelineLayout, Queue, RenderPipeline, ShaderModule}; +use wgpu::{PipelineCompilationOptions, TextureFormat}; + +use winit::error::EventLoopError; +use winit::event_loop::{EventLoop, EventLoopProxy}; +use winit::{ + event::{Event, WindowEvent}, + event_loop::{ActiveEventLoop, ControlFlow}, +}; + +#[derive(Debug)] +pub enum AppEvent {} + +struct DeviceState { + adapter: Adapter, + device: Device, + queue: Queue, +} + +struct RenderState { + shader: ShaderModule, + target_format: TextureFormat, + pipeline_layout: PipelineLayout, + render_pipeline: RenderPipeline, + uniform_buffer: wgpu::Buffer, + uniform_bind_group: wgpu::BindGroup, +} + +/// On Android it's not safe to rely on Winit's Window implementing +/// HasWindowHandle because it doesn't (and can't) own the `ANativeWindow` that +/// is used as a raw window handle. (If it acquired a reference then it would +/// have to effectively leak that reference every time the app gets a new native +/// window) +/// +/// When an Android application suspends, the `ANativeWindow`s associated with +/// surfaces may be released and so a raw window handle obtained via +/// `winit::Window::window_handle()` may become an invalid pointer if nothing +/// `_acquire()`d a reference to it. +/// +/// To work around this, we create our own wrapper around the `ANativeWindow` so +/// we can `_acquire()` an owning reference that we `_release()` when Dropped. +struct OwnedWindowHandle { + #[cfg(not(target_os = "android"))] + window: Arc, + #[cfg(target_os = "android")] + native_window: NonNull, // ANativeWindow* +} + +unsafe impl Send for OwnedWindowHandle {} +unsafe impl Sync for OwnedWindowHandle {} +impl OwnedWindowHandle { + fn new(window: Arc) -> Result { + #[cfg(not(target_os = "android"))] + { + Ok(Self { window }) + } + + #[cfg(target_os = "android")] + { + let raw_handle = window.window_handle()?.as_raw(); + if let raw_window_handle::RawWindowHandle::AndroidNdk(handle) = raw_handle { + let native_window = handle.a_native_window; + extern "C" { + fn ANativeWindow_acquire(window: *mut c_void); + } + // SAFETY: We assume the caller has ensured that `native_window` is a valid + // pointer to an `ANativeWindow` and that we own a reference to it. + unsafe { + ANativeWindow_acquire(native_window.as_ptr()); + } + Ok(Self { native_window }) + } else { + panic!("Expected AndroidNdk window handle"); + } + } + } +} +impl Drop for OwnedWindowHandle { + fn drop(&mut self) { + #[cfg(target_os = "android")] + { + extern "C" { + fn ANativeWindow_release(window: *mut c_void); + } + // SAFETY: We assume that `native_window` is a valid pointer to an + // `ANativeWindow` that we own a reference to. + unsafe { + ANativeWindow_release(self.native_window.as_ptr()); + } + } + } +} +impl HasWindowHandle for OwnedWindowHandle { + fn window_handle( + &self, + ) -> Result, raw_window_handle::HandleError> { + #[cfg(not(target_os = "android"))] + { + self.window.window_handle() + } + + #[cfg(target_os = "android")] + unsafe { + Ok(raw_window_handle::WindowHandle::borrow_raw( + raw_window_handle::AndroidNdkWindowHandle::new(self.native_window).into(), + )) + } + } +} +impl HasDisplayHandle for OwnedWindowHandle { + fn display_handle( + &self, + ) -> Result, raw_window_handle::HandleError> { + #[cfg(not(target_os = "android"))] + { + self.window.display_handle() + } + + #[cfg(target_os = "android")] + unsafe { + Ok(raw_window_handle::DisplayHandle::borrow_raw( + raw_window_handle::AndroidDisplayHandle::new().into(), + )) + } + } +} + +struct SurfaceState { + window: Arc, + surface: wgpu::Surface<'static>, + needs_reconfigure: bool, +} + +struct AppInner { + instance: Instance, + _event_loop_proxy: EventLoopProxy, + #[cfg(target_arch = "wasm32")] + web_canvas_id: &'static str, + is_running: bool, + /// Set while we're asynchronously looking for an adaptor that's compatible with our surface + /// and connecting to a corresponding device + queue. + connecting_device: bool, + surface_state: Option, + device_state: Option, + render_state: Option, + rotation: f32, + position_x: f32, + position_y: f32, + last_drag_pos: Option<(f32, f32)>, + is_dragging: bool, + // egui state + egui_ctx: egui::Context, + egui_state: Option, + egui_renderer: Option, + egui_demo_windows: egui_demo_lib::DemoWindows, +} + +// We need a Send closure for `set_device_lost_callback` but +// `wgpu::backend::webgpu::WebDevice` is not `Send` even though we can assume we +// have a single-threaded environment. +// Also, `egui_demo_lib::DemoWindows` contains `Box` which is not Send, +// but we're always accessing it from the same thread via the Mutex. +#[cfg(target_arch = "wasm32")] +unsafe impl Send for AppInner {} + +// On native platforms, egui_demo_lib::DemoWindows is not Send, but we only +// access it through Arc> which ensures single-threaded access. +#[cfg(not(target_arch = "wasm32"))] +unsafe impl Send for AppInner {} + +pub struct App { + inner: Arc>, +} + +impl App { + #[allow(unused)] + pub fn new(proxy: EventLoopProxy) -> Self { + Self::new_with_canvas_id(proxy, "canvas") + } + + pub fn new_with_canvas_id(proxy: EventLoopProxy, _canvas: &'static str) -> Self { + let instance = Instance::new(&wgpu::InstanceDescriptor { + backends: wgpu::Backends::from_env().unwrap_or_default(), + //backends: wgpu::Backends::VULKAN, + //backends: wgpu::Backends::GL, + flags: wgpu::InstanceFlags::from_env_or_default(), + memory_budget_thresholds: wgpu::MemoryBudgetThresholds::default(), + backend_options: wgpu::BackendOptions::from_env_or_default(), + }); + + let egui_ctx = egui::Context::default(); + + Self { + inner: Arc::new(std::sync::Mutex::new(AppInner { + instance, + _event_loop_proxy: proxy, + #[cfg(target_arch = "wasm32")] + web_canvas_id: _canvas, + is_running: false, + connecting_device: false, + surface_state: None, + device_state: None, + render_state: None, + rotation: 0.0, + position_x: 0.0, + position_y: 0.0, + last_drag_pos: None, + is_dragging: false, + egui_ctx, + egui_state: None, + egui_renderer: None, + egui_demo_windows: egui_demo_lib::DemoWindows::default(), + })), + } + } +} + +impl AppInner { + fn create_window(&mut self, event_loop: &ActiveEventLoop) -> Arc { + info!("Creating Winit Window"); + let mut window_attributes = winit::window::WindowAttributes::default(); + + #[cfg(not(target_arch = "wasm32"))] + { + window_attributes = window_attributes.with_title("WGPU + Egui Example"); + } + + #[cfg(target_arch = "wasm32")] + { + use wasm_bindgen::{JsCast, UnwrapThrowExt as _}; + use web_sys::HtmlCanvasElement; + use winit::platform::web::WindowAttributesExtWebSys; + + let window = wgpu::web_sys::window().unwrap_throw(); + let document = window.document().unwrap_throw(); + let canvas = document + .get_element_by_id(self.web_canvas_id) + .unwrap_throw(); + let html_canvas_element: HtmlCanvasElement = canvas.unchecked_into(); + // Make sure the canvas can be given focus. + // https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/tabindex + html_canvas_element.set_tab_index(0); + + // Don't outline the canvas when it has focus: + html_canvas_element + .style() + .set_property("outline", "none") + .unwrap(); + + window_attributes = window_attributes.with_canvas(Some(html_canvas_element)); + } + + let window = event_loop.create_window(window_attributes).unwrap(); + Arc::new(window) + } + + fn create_surface(&mut self, event_loop: &ActiveEventLoop) { + let window = if let Some(existing_surface_state) = self.surface_state.as_ref() { + existing_surface_state.window.clone() + } else { + self.create_window(event_loop) + }; + info!("WGPU: creating surface for native window"); + + // Initialize egui state when we have a window + if self.egui_state.is_none() { + let native_pixels_per_point = Some(window.scale_factor() as f32); + self.egui_state = Some(EguiWinitState::new( + self.egui_ctx.clone(), + ViewportId::ROOT, + &window, + native_pixels_per_point, + None, + None, + )); + info!("Initialized egui state"); + } + + let window_handle = + OwnedWindowHandle::new(Arc::clone(&window)).expect("Failed to get owned window handle"); + + let surface_state = match self.instance.create_surface(window_handle) { + Ok(surface) => Some(SurfaceState { + window, + surface, + needs_reconfigure: true, + }), + Err(err) => { + tracing::error!("Failed to create surface: {err}"); + None + } + }; + self.surface_state = surface_state; + } + + fn create_render_pipeline( + device: &wgpu::Device, + pipeline_layout: &wgpu::PipelineLayout, + shader_module: &wgpu::ShaderModule, + target_format: TextureFormat, + ) -> wgpu::RenderPipeline { + info!("WGPU: creating render pipeline"); + device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { + label: None, + layout: Some(pipeline_layout), + vertex: wgpu::VertexState { + module: shader_module, + entry_point: Some("vs_main"), + compilation_options: PipelineCompilationOptions::default(), + buffers: &[], + }, + fragment: Some(wgpu::FragmentState { + module: shader_module, + entry_point: Some("fs_main"), + compilation_options: PipelineCompilationOptions::default(), + targets: &[Some(target_format.into())], + }), + primitive: wgpu::PrimitiveState::default(), + depth_stencil: None, + multisample: wgpu::MultisampleState::default(), + multiview: None, + cache: None, + }) + } + + fn find_swapchain_texture_format(&self) -> Option { + if let (Some(surface_state), Some(device_state)) = (&self.surface_state, &self.device_state) + { + info!("WGPU: finding supported swapchain format"); + let surface_caps = surface_state + .surface + .get_capabilities(&device_state.adapter); + for format in surface_caps.formats.iter() { + info!("WGPU: supported format: {format:?}"); + } + Some(surface_caps.formats[0]) + } else { + None + } + } + + fn ensure_render_pipeline_for_target_format(&mut self, target_format: TextureFormat) -> bool { + let Some(device_state) = self.device_state.as_ref() else { + error!("Can't update render pipeline because device state is not initialized yet"); + return false; + }; + + if let Some(render_state) = &self.render_state { + if render_state.target_format == target_format { + return false; + } + } + if self.render_state.is_none() { + error!("Can't update render pipeline because render state is not initialized yet"); + return false; + } + + let RenderState { + shader, + target_format, + render_pipeline: _, + pipeline_layout, + uniform_buffer, + uniform_bind_group, + } = self.render_state.take().unwrap(); + + let render_pipeline = Self::create_render_pipeline( + &device_state.device, + &pipeline_layout, + &shader, + target_format, + ); + + self.render_state = Some(RenderState { + shader, + target_format, + pipeline_layout, + render_pipeline, + uniform_buffer, + uniform_bind_group, + }); + true + } + + fn configure_surface_swapchain(&mut self) { + if let (Some(device_state), Some(surface_state)) = + (&self.device_state, &mut self.surface_state) + { + let size = surface_state.window.inner_size(); + + let config = surface_state + .surface + .get_default_config( + &device_state.adapter, + u32::max(size.width, 1), + u32::max(size.height, 1), + ) + .expect("Window surface can't be rendered to by adapter"); + + let swapchain_format = config.format; + info!("WGPU: Configuring surface swapchain: format = {swapchain_format:?}, size = {size:?}"); + surface_state + .surface + .configure(&device_state.device, &config); + surface_state.needs_reconfigure = false; + } + } + + fn init_render_state(&mut self, target_format: TextureFormat) -> RenderState { + info!("Initializing render state for target format: {target_format:?}"); + + let DeviceState { device, .. } = self + .device_state + .as_ref() + .expect("Device should be initialized"); + + info!("WGPU: loading shader"); + // Load the shaders from disk + let shader = device.create_shader_module(wgpu::ShaderModuleDescriptor { + label: None, + source: wgpu::ShaderSource::Wgsl(Cow::Borrowed(include_str!("shader.wgsl"))), + }); + + info!("WGPU: creating uniform buffer"); + let uniform_buffer = device.create_buffer(&wgpu::BufferDescriptor { + label: Some("Uniform Buffer"), + size: (std::mem::size_of::() * 4) as u64, // rotation, position_x, position_y, padding + usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, + mapped_at_creation: false, + }); + + let bind_group_layout = device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + label: Some("Bind Group Layout"), + entries: &[wgpu::BindGroupLayoutEntry { + binding: 0, + visibility: wgpu::ShaderStages::VERTEX, + ty: wgpu::BindingType::Buffer { + ty: wgpu::BufferBindingType::Uniform, + has_dynamic_offset: false, + min_binding_size: None, + }, + count: None, + }], + }); + + let uniform_bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { + label: Some("Uniform Bind Group"), + layout: &bind_group_layout, + entries: &[wgpu::BindGroupEntry { + binding: 0, + resource: uniform_buffer.as_entire_binding(), + }], + }); + + info!("WGPU: creating pipeline layout"); + let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { + label: None, + bind_group_layouts: &[&bind_group_layout], + push_constant_ranges: &[], + }); + + let render_pipeline = + Self::create_render_pipeline(device, &pipeline_layout, &shader, target_format); + + RenderState { + shader, + target_format, + pipeline_layout, + render_pipeline, + uniform_buffer, + uniform_bind_group, + } + } + + fn ensure_render_state_for_surface(&mut self) { + // Check if we have a swapchain format from the surface + let swapchain_format = if let Some(surface_state) = &self.surface_state { + if let Some(device_state) = &self.device_state { + let caps = surface_state + .surface + .get_capabilities(&device_state.adapter); + Some(caps.formats[0]) + } else { + None + } + } else { + None + }; + + if let Some(swapchain_format) = swapchain_format { + info!("Ensuring render state is initialized for surface swapchain format: {swapchain_format:?}"); + if self.render_state.is_none() { + let rs = self.init_render_state(swapchain_format); + self.render_state = Some(rs); + self.queue_redraw(); + } else { + info!("Render state already initialized, checking if it needs to be updated for new surface swapchain format"); + if self.ensure_render_pipeline_for_target_format(swapchain_format) { + self.queue_redraw(); + } + } + + // Also ensure egui renderer is initialized + if self.egui_renderer.is_none() { + if let Some(device_state) = &self.device_state { + info!("Initializing egui renderer for format: {swapchain_format:?}"); + let egui_renderer = egui_wgpu::Renderer::new( + &device_state.device, + swapchain_format, + egui_wgpu::RendererOptions::default(), + ); + self.egui_renderer = Some(egui_renderer); + } + } + } else { + warn!("Can't ensure render state for surface because surface format is not available"); + } + } + + fn queue_redraw(&self) { + if let Some(surface_state) = &self.surface_state { + trace!("Making Redraw Request"); + surface_state.window.request_redraw(); + } + } + + fn start_drag(&mut self, x: f32, y: f32) { + self.is_dragging = true; + self.last_drag_pos = Some((x, y)); + self.update_position(x, y); + } + + fn update_drag(&mut self, x: f32, y: f32) { + if let Some((last_x, last_y)) = self.last_drag_pos { + let delta_x = x - last_x; + let delta_y = y - last_y; + let distance = (delta_x * delta_x + delta_y * delta_y).sqrt(); + self.rotation += distance * 0.01; + self.last_drag_pos = Some((x, y)); + self.update_position(x, y); + self.queue_redraw(); + } else { + // First move after drag started without position + self.last_drag_pos = Some((x, y)); + self.update_position(x, y); + } + } + + fn end_drag(&mut self) { + self.is_dragging = false; + self.last_drag_pos = None; + } + + fn update_position(&mut self, x: f32, y: f32) { + if let Some(ref surface_state) = self.surface_state { + let size = surface_state.window.inner_size(); + self.position_x = (x / size.width as f32) * 2.0 - 1.0; + self.position_y = -((y / size.height as f32) * 2.0 - 1.0); + } + } + + fn render(&mut self, event_loop: &ActiveEventLoop) { + let mut queue_surface_reconfigure = false; + let mut queue_surface_recreate = false; + + if self.device_state.is_none() { + if self.connecting_device { + info!("Still connecting to device, skipping render"); + } else { + error!("Can't render because device state has been lost"); + } + return; + } + + if self + .surface_state + .as_ref() + .is_some_and(|surface_state| surface_state.needs_reconfigure) + { + info!("Surface needs reconfigure, reconfiguring now..."); + self.configure_surface_swapchain(); + } else { + info!("Surface doesn't need reconfigure, skipping"); + } + + self.ensure_render_state_for_surface(); + + let Some(device_state) = self.device_state.as_ref() else { + return; + }; + + let Some(surface_state) = self.surface_state.as_ref() else { + error!("Can't render because surface state has been lost"); + return; + }; + + let Some(rs) = self.render_state.as_ref() else { + error!("Can't render because render state has been lost"); + return; + }; + + // Update uniform buffer with rotation and position + device_state.queue.write_buffer( + &rs.uniform_buffer, + 0, + bytemuck::cast_slice(&[self.rotation, self.position_x, self.position_y, 0.0]), + ); + + let frame_view = match surface_state.surface.get_current_texture() { + Ok(surface_texture) => { + let view = surface_texture + .texture + .create_view(&wgpu::TextureViewDescriptor::default()); + Some((surface_texture, view)) + } + Err(wgpu::SurfaceError::Timeout) => { + warn!("Timeout while acquiring next surface texture, skipping frame"); + None + } + Err(wgpu::SurfaceError::Outdated) => { + warn!("Surface is outdated, reconfiguring"); + queue_surface_reconfigure = true; + None + } + Err(wgpu::SurfaceError::Lost) => { + warn!("Surface lost, recreating surface and render state"); + queue_surface_recreate = true; + None + } + Err(wgpu::SurfaceError::OutOfMemory) => { + error!("Out of memory when acquiring surface texture"); + None + } + Err(wgpu::SurfaceError::Other) => { + error!("Other surface error"); + None + } + }; + + if let Some((frame, view)) = frame_view { + // Prepare egui + let (egui_primitives, egui_textures_delta) = + if let (Some(egui_state), Some(egui_renderer)) = + (&mut self.egui_state, &mut self.egui_renderer) + { + let raw_input = egui_state.take_egui_input(&surface_state.window); + let full_output = self.egui_ctx.run(raw_input, |ctx| { + self.egui_demo_windows.ui(ctx); + }); + + egui_state + .handle_platform_output(&surface_state.window, full_output.platform_output); + + let screen_descriptor = egui_wgpu::ScreenDescriptor { + size_in_pixels: [ + surface_state.window.inner_size().width, + surface_state.window.inner_size().height, + ], + pixels_per_point: surface_state.window.scale_factor() as f32, + }; + + let clipped_primitives = self + .egui_ctx + .tessellate(full_output.shapes, full_output.pixels_per_point); + + // Update egui textures + for (id, image_delta) in &full_output.textures_delta.set { + egui_renderer.update_texture( + &device_state.device, + &device_state.queue, + *id, + image_delta, + ); + } + + // Update egui buffers + let user_cmd_bufs = egui_renderer.update_buffers( + &device_state.device, + &device_state.queue, + &mut device_state.device.create_command_encoder( + &wgpu::CommandEncoderDescriptor { + label: Some("egui encoder"), + }, + ), + &clipped_primitives, + &screen_descriptor, + ); + + device_state.queue.submit(user_cmd_bufs); + + ( + Some((clipped_primitives, screen_descriptor)), + Some(full_output.textures_delta), + ) + } else { + (None, None) + }; + + let mut encoder = device_state + .device + .create_command_encoder(&wgpu::CommandEncoderDescriptor { label: None }); + { + // First render pass: draw the triangle + let mut rpass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor { + label: Some("Triangle Render Pass"), + color_attachments: &[Some(wgpu::RenderPassColorAttachment { + view: &view, + resolve_target: None, + ops: wgpu::Operations { + load: wgpu::LoadOp::Clear(wgpu::Color::BLACK), + store: wgpu::StoreOp::Store, + }, + depth_slice: None, + })], + depth_stencil_attachment: None, + timestamp_writes: None, + occlusion_query_set: None, + }); + rpass.set_pipeline(&rs.render_pipeline); + rpass.set_bind_group(0, &rs.uniform_bind_group, &[]); + rpass.draw(0..3, 0..1); + } + + // Second render pass: draw egui on top + if let Some((clipped_primitives, screen_descriptor)) = egui_primitives { + if let Some(egui_renderer) = &self.egui_renderer { + { + let mut rpass = encoder + .begin_render_pass(&wgpu::RenderPassDescriptor { + label: Some("egui Render Pass"), + color_attachments: &[Some(wgpu::RenderPassColorAttachment { + view: &view, + resolve_target: None, + ops: wgpu::Operations { + load: wgpu::LoadOp::Load, // Load existing content (the triangle) + store: wgpu::StoreOp::Store, + }, + depth_slice: None, + })], + depth_stencil_attachment: None, + timestamp_writes: None, + occlusion_query_set: None, + }) + .forget_lifetime(); + egui_renderer.render(&mut rpass, &clipped_primitives, &screen_descriptor); + } + } + } + + device_state.queue.submit(Some(encoder.finish())); + + // Free egui textures + if let (Some(textures_delta), Some(egui_renderer)) = + (egui_textures_delta, &mut self.egui_renderer) + { + for id in &textures_delta.free { + egui_renderer.free_texture(id); + } + } + + surface_state.window.pre_present_notify(); + frame.present(); + } + //surface_state.window.request_redraw(); + + if queue_surface_recreate { + let prev_texture_format = self.render_state.as_ref().map(|rs| rs.target_format); + self.surface_state = None; + self.create_surface(event_loop); + queue_surface_reconfigure = true; + if let Some(prev_texture_format) = prev_texture_format { + let swapchain_format = self + .find_swapchain_texture_format() + .expect("Failed to find a supported swapchain format for our surface"); + + if prev_texture_format != swapchain_format { + info!("Surface lost and recreated with different format, updating render pipeline"); + self.ensure_render_pipeline_for_target_format(swapchain_format); + } + } + } + if queue_surface_reconfigure { + self.configure_surface_swapchain(); + self.queue_redraw(); + } + } +} + +impl App { + /// Once we have a surface we can find an adapter that is compatible with it + /// and connect to a device + create a corresponding render queue + /// + /// Note: the lifetime requirements for passing `compatible_surface: + /// Option<&Surface<'window_handle>>` to `request_adapter` are quite painful + /// to work with. + /// + /// We follow the common pattern of ensuring `'window_handle` is `'static`. + /// + /// Since the `Surface` is not a cheaply-cloneable handle we also give this + /// function temporary ownership of the `Surface` so it can be borrowed for + /// the duration of the async future that calls `request_adapter`. + /// + /// Since this function temporarily owns the `Surface` that means it's also + /// responsible for filling out the `SurfaceState` for the `App` once it is + /// finished. + /// + async fn ensure_adapter_and_connected_device_for_surface( + app_inner: Arc>, + ) { + let (instance, window, surface) = { + let mut app = app_inner.lock().unwrap(); + + if let Some(device_state) = &app.device_state { + if let Some(surface_state) = &app.surface_state { + if device_state + .adapter + .is_surface_supported(&surface_state.surface) + { + info!("Already have a compatible connected device"); + return; + } + } + } + + // In this case we implicitly know that any pre-existing device or render state + // is not compatible with any previous adapter + if app.device_state.is_some() { + info!("Dropping existing device / queue since we need to find a new compatible adapter"); + } + app.device_state = None; + if app.render_state.is_some() { + info!( + "Dropping existing render state since we need to find a new compatible adapter" + ); + } + app.render_state = None; + + // In case we need to find a compatible adapter we need temporary ownership + // of the Surface so it can be passed to the async `request_adapter` call. + let Some(SurfaceState { + window, surface, .. + }) = app.surface_state.take() + else { + error!("Surface should have been created before requesting adapter"); + return; + }; + (app.instance.clone(), window, surface) + }; + + info!("WGPU: finding a suitable adapter (compatible with our surface)"); + let adapter_result = instance + .request_adapter(&wgpu::RequestAdapterOptions { + power_preference: wgpu::PowerPreference::default(), + force_fallback_adapter: false, + // Request an adapter which can render to our surface + compatible_surface: Some(&surface), + }) + .await; + + { + let mut app = app_inner.lock().unwrap(); + + // Unconditionally put the borrowed surface back before we can return + app.surface_state = Some(SurfaceState { + window, + surface, + needs_reconfigure: true, + }); + } + + let adapter = match adapter_result { + Ok(adapter) => adapter, + Err(err) => { + error!("Failed to find an appropriate adapter: {err}"); + return; + } + }; + + // If the required adapter matches any existing adapter then we're done + // If the adapter has changed (or not previously set) then we need to create a new device + queue and update render state + + info!("WGPU: requesting device"); + // Create the logical device and command queue + let res = adapter + .request_device(&wgpu::DeviceDescriptor { + label: None, + experimental_features: wgpu::ExperimentalFeatures::default(), + required_features: wgpu::Features::empty(), + // Make sure we use the texture resolution limits from the adapter, so we can support images the size of the swapchain. + required_limits: wgpu::Limits::downlevel_webgl2_defaults() + .using_resolution(adapter.limits()), + memory_hints: wgpu::MemoryHints::default(), + trace: wgpu::Trace::Off, + }) + .await; + let (device, queue) = match res { + Ok((device, queue)) => (device, queue), + Err(err) => { + error!("Failed to connect to device: {err}"); + return; + } + }; + + let weak_inner = Arc::downgrade(&app_inner); + device.set_device_lost_callback(move |reason, message| { + error!("Device lost: {:?}, {}", reason, message); + if let Some(app_inner) = weak_inner.upgrade() { + let mut app = app_inner.lock().unwrap(); + app.device_state = None; + app.render_state = None; + } + }); + + let mut app = app_inner.lock().unwrap(); + app.device_state = Some(DeviceState { + adapter, + device, + queue, + }); + } + + fn ensure_device_state_for_surface(&self) { + #[cfg(not(target_arch = "wasm32"))] + pollster::block_on(App::ensure_adapter_and_connected_device_for_surface( + Arc::clone(&self.inner), + )); + #[cfg(target_arch = "wasm32")] + wasm_bindgen_futures::spawn_local(App::ensure_adapter_and_connected_device_for_surface( + Arc::clone(&self.inner), + )); + } + + fn resume(&self, event_loop: &ActiveEventLoop) { + info!("Resumed, creating render surface..."); + + let have_surface = { + let mut app = self.inner.lock().unwrap(); + app.is_running = true; + + app.create_surface(event_loop); + app.surface_state.is_some() + }; + + if have_surface { + self.ensure_device_state_for_surface(); + } + } + + pub fn handle_winit_event(&self, event: Event, event_loop: &ActiveEventLoop) { + info!("Received Winit event: {event:?}"); + + event_loop.set_control_flow(ControlFlow::Wait); + match event { + Event::Resumed => { + self.resume(event_loop); + } + Event::Suspended => { + info!("Suspended, dropping surface state..."); + let mut app = self.inner.lock().unwrap(); + app.is_running = false; + app.surface_state = None; + app.egui_state = None; + app.egui_renderer = None; + } + Event::WindowEvent { + event: WindowEvent::Resized(_size), + .. + } => { + let mut app = self.inner.lock().unwrap(); + if let Some(surface_state) = app.surface_state.as_mut() { + info!("Window resized, marking surface as needing reconfigure"); + surface_state.needs_reconfigure = true; + } + + // Winit: doesn't currently implicitly request a redraw + // for a resize which may be required on some platforms... + app.queue_redraw(); + } + Event::WindowEvent { + event: WindowEvent::RedrawRequested, + .. + } => { + info!("Handling Redraw Request"); + + let try_init_device = { + let inner = self.inner.lock().unwrap(); + if inner.device_state.is_none() + && inner.surface_state.is_some() + && !inner.connecting_device + { + warn!("Device state is not initialized but we have a surface and we're not currently connecting to a device, trying to ensure device state is initialized..."); + true + } else { + false + } + }; + + if try_init_device { + self.ensure_device_state_for_surface(); + } + + let mut inner = self.inner.lock().unwrap(); + inner.render(event_loop); + } + Event::WindowEvent { + event: WindowEvent::CloseRequested, + .. + } => event_loop.exit(), + Event::WindowEvent { + event: WindowEvent::Touch(touch), + window_id, + } => { + let mut app = self.inner.lock().unwrap(); + + // Get window and check if it matches + let window = app + .surface_state + .as_ref() + .filter(|s| s.window.id() == window_id) + .map(|s| s.window.clone()); + + // Pass to egui first + let egui_consumed = if let (Some(window), Some(egui_state)) = + (window.as_ref(), &mut app.egui_state) + { + let event = WindowEvent::Touch(touch); + let response = egui_state.on_window_event(window, &event); + if response.repaint { + window.request_redraw(); + } + response.consumed + } else { + false + }; + + // Only handle drag if egui didn't consume the event + if !egui_consumed { + use winit::event::TouchPhase; + match touch.phase { + TouchPhase::Started => { + app.start_drag(touch.location.x as f32, touch.location.y as f32); + } + TouchPhase::Moved => { + if app.is_dragging { + app.update_drag(touch.location.x as f32, touch.location.y as f32); + } + } + TouchPhase::Ended | TouchPhase::Cancelled => { + app.end_drag(); + } + } + } + } + Event::WindowEvent { + event: WindowEvent::CursorMoved { position, .. }, + window_id, + } => { + let mut app = self.inner.lock().unwrap(); + + // Get window and check if it matches + let window = app + .surface_state + .as_ref() + .filter(|s| s.window.id() == window_id) + .map(|s| s.window.clone()); + + // Pass to egui first + let egui_consumed = if let (Some(window), Some(egui_state)) = + (window.as_ref(), &mut app.egui_state) + { + let event = WindowEvent::CursorMoved { + device_id: winit::event::DeviceId::dummy(), + position, + }; + let response = egui_state.on_window_event(window, &event); + if response.repaint { + window.request_redraw(); + } + response.consumed + } else { + false + }; + + // Only handle drag if egui didn't consume + if !egui_consumed && app.is_dragging { + debug!("dragging, cursor moved to: {:?}", position); + app.update_drag(position.x as f32, position.y as f32); + } + } + Event::WindowEvent { + event: WindowEvent::MouseInput { state, button, .. }, + window_id, + } => { + use winit::event::{ElementState, MouseButton}; + let mut app = self.inner.lock().unwrap(); + + // Get window and check if it matches + let window = app + .surface_state + .as_ref() + .filter(|s| s.window.id() == window_id) + .map(|s| s.window.clone()); + + // Pass to egui first + let egui_consumed = if let (Some(window), Some(egui_state)) = + (window.as_ref(), &mut app.egui_state) + { + let event = WindowEvent::MouseInput { + device_id: winit::event::DeviceId::dummy(), + state, + button, + }; + let response = egui_state.on_window_event(window, &event); + if response.repaint { + window.request_redraw(); + } + response.consumed + } else { + false + }; + + // Only handle drag if egui didn't consume and it's left button + if !egui_consumed && button == MouseButton::Left { + match state { + ElementState::Pressed => { + app.is_dragging = true; + // Position will be set on first CursorMoved event + } + ElementState::Released => { + app.end_drag(); + } + } + } + } + Event::WindowEvent { window_id, event } => { + debug!("Window event {:#?}", event); + let mut app = self.inner.lock().unwrap(); + + // Get window and check if it matches + let window = app + .surface_state + .as_ref() + .filter(|s| s.window.id() == window_id) + .map(|s| s.window.clone()); + + // Pass all other window events to egui + if let (Some(window), Some(egui_state)) = (window.as_ref(), &mut app.egui_state) { + let response = egui_state.on_window_event(window, &event); + if response.repaint { + debug!("Requesting redraw from egui window event handler"); + window.request_redraw(); + } + } + } + _ => {} + } + } +} + +#[allow(unused)] +pub const DEFAULT_ENV_FILTER: &str = + "debug,wgpu_hal=info,winit=info,naga=info,android-activity=trace"; + +#[allow(unused)] +pub fn run(app: App, event_loop: EventLoop) -> Result<(), EventLoopError> { + info!("Running mainloop..."); + + #[allow(deprecated)] + event_loop.run(move |event, event_loop| { + //info!("Received Winit event: {event:?}"); + app.handle_winit_event(event, event_loop); + }) +} diff --git a/agdk-winit-wgpu-egui/src/lib.rs b/agdk-winit-wgpu-egui/src/lib.rs new file mode 100644 index 0000000..996056f --- /dev/null +++ b/agdk-winit-wgpu-egui/src/lib.rs @@ -0,0 +1,50 @@ +#[cfg(target_os = "android")] +use winit::platform::android::activity::AndroidApp; + +#[cfg(target_os = "android")] +mod app; + +#[allow(dead_code)] +#[cfg(target_os = "android")] +#[unsafe(no_mangle)] +fn android_main(app: AndroidApp) { + use app::App; + use std::sync::OnceLock; + use tracing::error; + use winit::event_loop::EventLoop; + use winit::platform::android::EventLoopBuilderExtAndroid; + + std::env::set_var("RUST_BACKTRACE", "full"); + std::env::set_var("WGPU_BACKEND", "vulkan"); + + // NB: android_main can be called multiple times if the application Activity + // is destroyed and recreated so we use a OnceLock to ensure that we only + // initialize our global state once (otherwise tracing_subscriber will panic + // if we try to initialize it multiple times). + static ONCE: OnceLock<()> = OnceLock::new(); + ONCE.get_or_init(|| { + use tracing_subscriber::prelude::*; + + let filter_layer = tracing_subscriber::EnvFilter::new(app::DEFAULT_ENV_FILTER); + let android_layer = paranoid_android::layer(env!("CARGO_PKG_NAME")) + .with_ansi(false) + .with_span_events(tracing_subscriber::fmt::format::FmtSpan::CLOSE) + .with_thread_names(true); + tracing_subscriber::registry() + .with(filter_layer) + .with(android_layer) + .init(); + }); + + let event_loop = EventLoop::with_user_event() + .with_android_app(app) + .build() + .unwrap(); + + let proxy = event_loop.create_proxy(); + let app = App::new(proxy); + + if let Err(err) = app::run(app, event_loop) { + error!("Error while running event loop: {err:?}"); + } +} diff --git a/agdk-winit-wgpu-egui/src/main.rs b/agdk-winit-wgpu-egui/src/main.rs new file mode 100644 index 0000000..1d0ae3e --- /dev/null +++ b/agdk-winit-wgpu-egui/src/main.rs @@ -0,0 +1,75 @@ +#[cfg(not(target_os = "android"))] +mod app; + +#[allow(dead_code)] +#[cfg(target_arch = "wasm32")] +pub fn main() { + use app::App; + use tracing_subscriber::layer::SubscriberExt; + use tracing_subscriber::util::SubscriberInitExt; + use winit::event_loop::EventLoop; + use winit::platform::web::EventLoopExtWebSys; + + console_error_panic_hook::set_once(); + + tracing_subscriber::registry() + .with( + tracing_subscriber::fmt::layer() + .with_ansi(false) + .without_time() + .with_writer(tracing_web::MakeWebConsoleWriter::new()), + ) + .init(); + + tracing::warn!("Starting application"); + + wasm_bindgen_futures::spawn_local(async { + let document = web_sys::window() + .expect("No window") + .document() + .expect("No document"); + + const CANVAS_ID: &str = "the_canvas_id"; + + let event_loop = EventLoop::with_user_event().build().unwrap(); + + let proxy = event_loop.create_proxy(); + let app = App::new_with_canvas_id(proxy, CANVAS_ID); + + #[allow(deprecated)] + event_loop.spawn(move |event, event_loop| app.handle_winit_event(event, event_loop)); + + // Remove the loading text and spinner: + if let Some(loading_text) = document.get_element_by_id("loading_text") { + loading_text.remove(); + } + }); +} + +#[cfg(not(any(target_os = "android", target_arch = "wasm32")))] +use winit::error::EventLoopError; + +#[allow(dead_code)] +#[cfg(not(any(target_os = "android", target_arch = "wasm32")))] +fn main() -> Result<(), EventLoopError> { + use winit::event_loop::EventLoop; + + use app::App; + + if std::option_env!("RUST_LOG").is_none() { + std::env::set_var("RUST_LOG", app::DEFAULT_ENV_FILTER); + } + tracing_subscriber::fmt::init(); + + let event_loop = EventLoop::with_user_event() + .build() + .expect("Failed to create event loop"); + + let proxy = event_loop.create_proxy(); + let app = App::new(proxy); + + app::run(app, event_loop) +} + +#[cfg(target_os = "android")] +fn main() {} diff --git a/agdk-winit-wgpu-egui/src/shader.wgsl b/agdk-winit-wgpu-egui/src/shader.wgsl new file mode 100644 index 0000000..17a5b93 --- /dev/null +++ b/agdk-winit-wgpu-egui/src/shader.wgsl @@ -0,0 +1,56 @@ +struct VertexOutput { + @builtin(position) position: vec4, + @location(0) color: vec4, +} + +struct Uniforms { + rotation: f32, + position_x: f32, + position_y: f32, + _padding: f32, +} + +@group(0) @binding(0) +var uniforms: Uniforms; + +@vertex +fn vs_main(@builtin(vertex_index) in_vertex_index: u32) -> VertexOutput { + // Original triangle vertices + let x = f32(i32(in_vertex_index) - 1); + let y = f32(i32(in_vertex_index & 1u) * 2 - 1); + let z = 0.0; + + // Apply Y-axis rotation + let cos_r = cos(uniforms.rotation); + let sin_r = sin(uniforms.rotation); + let rotated_x = x * cos_r + z * sin_r; + let rotated_z = -x * sin_r + z * cos_r; + let rotated_y = y; + + // Scale down to fit in middle third (scale by 1/3) + let scaled_x = rotated_x / 3.0; + let scaled_y = rotated_y / 3.0; + + // Apply position offset + let final_x = scaled_x + uniforms.position_x; + let final_y = scaled_y + uniforms.position_y; + + var out: VertexOutput; + out.position = vec4(final_x, final_y, 0.0, 1.0); + + // Assign colors: red, green, blue for the three vertices + if (in_vertex_index == 0u) { + out.color = vec4(1.0, 0.0, 0.0, 1.0); // Red + } else if (in_vertex_index == 1u) { + out.color = vec4(0.0, 1.0, 0.0, 1.0); // Green + } else { + out.color = vec4(0.0, 0.0, 1.0, 1.0); // Blue + } + + return out; +} + +@fragment +fn fs_main(in: VertexOutput) -> @location(0) vec4 { + return in.color; +}