diff --git a/Cargo.lock b/Cargo.lock index 593b67ca..a846d43a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -50,6 +50,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" dependencies = [ "cfg-if", + "getrandom", "once_cell", "serde", "version_check", @@ -95,20 +96,23 @@ dependencies = [ [[package]] name = "android-activity" -version = "0.4.3" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64529721f27c2314ced0890ce45e469574a73e5e6fdd6e9da1860eb29285f5e0" +checksum = "052ad56e336bcc615a214bffbeca6c181ee9550acec193f0327e0b103b033a4d" dependencies = [ "android-properties", - "bitflags 1.3.2", + "bitflags 2.4.1", "cc", + "cesu8", + "jni 0.21.1", "jni-sys", "libc", "log", - "ndk", + "ndk 0.8.0", "ndk-context", - "ndk-sys", - "num_enum 0.6.1", + "ndk-sys 0.5.0+25.2.9519653", + "num_enum 0.7.1", + "thiserror", ] [[package]] @@ -135,6 +139,21 @@ dependencies = [ "winapi", ] +[[package]] +name = "anymap" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33954243bd79057c2de7338850b85983a44588021f8a5fee574a8888c6de4344" + +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + [[package]] name = "arc-swap" version = "1.6.0" @@ -153,6 +172,12 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + [[package]] name = "ash" version = "0.37.3+1.3.251" @@ -169,13 +194,22 @@ dependencies = [ "common", "egui", "egui-inspect", - "egui_dock", "engine", "geom", "inline_tweak", "log", + "yakui", + "yakui-wgpu", + "yakui-widgets", + "yakui-winit", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "atty" version = "0.2.14" @@ -284,21 +318,21 @@ checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" [[package]] name = "block-sys" -version = "0.1.0-beta.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa55741ee90902547802152aaf3f8e5248aab7e21468089560d4c8840561146" +checksum = "2dd7cf50912cddc06dc5ea7c08c5e81c1b2c842a70d19def1848d54c586fed92" dependencies = [ "objc-sys", ] [[package]] name = "block2" -version = "0.2.0-alpha.6" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dd9e63c1744f755c2f60332b88de39d341e5e86239014ad839bd71c106dec42" +checksum = "15b55663a85f33501257357e6421bb33e769d5c9ffb5ba0921c975a123e35e68" dependencies = [ "block-sys", - "objc2-encode", + "objc2", ] [[package]] @@ -341,16 +375,28 @@ checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "calloop" -version = "0.10.6" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e0d00eb1ea24371a97d2da6201c6747a633dc6dc1988ef503403b4c59504a8" +checksum = "7b50b5a44d59a98c55a9eeb518f39bf7499ba19fd98ee7d22618687f3f10adbf" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.1", "log", - "nix 0.25.1", - "slotmap", + "polling", + "rustix", + "slab", "thiserror", - "vec_map", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0ea9b9476c7fad82841a8dbb380e2eae480c21910feba80725b46931ed8f02" +dependencies = [ + "calloop", + "rustix", + "wayland-backend", + "wayland-client", ] [[package]] @@ -475,6 +521,15 @@ dependencies = [ "serde_json", ] +[[package]] +name = "concurrent-queue" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "convert_case" version = "0.4.0" @@ -499,14 +554,14 @@ checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "core-graphics" -version = "0.22.3" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +checksum = "970a29baf4110c26fedbc7f82107d42c23f7e88e404c4577ed73fe99ff85a212" dependencies = [ "bitflags 1.3.2", "core-foundation", "core-graphics-types", - "foreign-types 0.3.2", + "foreign-types", "libc", ] @@ -555,7 +610,7 @@ dependencies = [ "js-sys", "libc", "mach2", - "ndk", + "ndk 0.7.0", "ndk-context", "oboe", "once_cell", @@ -608,6 +663,12 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "cursor-icon" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" + [[package]] name = "d3d12" version = "0.7.0" @@ -715,16 +776,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" -[[package]] -name = "duplicate" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de78e66ac9061e030587b2a2e75cc88f22304913c907b11307bca737141230cb" -dependencies = [ - "heck 0.4.1", - "proc-macro-error", -] - [[package]] name = "easybench" version = "1.1.1" @@ -733,9 +784,8 @@ checksum = "0fe5e0c7c863ab37184b6310b4ff6b857c71814ff38e93c5b99fbda1467a5a32" [[package]] name = "ecolor" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b7637fc2e74d17e52931bac90ff4fc061ac776ada9c7fa272f24cdca5991972" +version = "0.24.2" +source = "git+https://github.com/emilk/egui#4a2cafee7cc9bbe01c95d08d7737e08657fb6d5b" dependencies = [ "bytemuck", "serde", @@ -743,9 +793,8 @@ dependencies = [ [[package]] name = "egui" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55bcb864b764eb889515a38b8924757657a250738ad15126637ee2df291ee6b" +version = "0.24.2" +source = "git+https://github.com/emilk/egui#4a2cafee7cc9bbe01c95d08d7737e08657fb6d5b" dependencies = [ "accesskit", "ahash", @@ -776,9 +825,8 @@ dependencies = [ [[package]] name = "egui-wgpu" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d8ea73b329649be625fac2c9b190a2a8f9a66f98610c4b09124b596c6695053" +version = "0.24.2" +source = "git+https://github.com/emilk/egui#4a2cafee7cc9bbe01c95d08d7737e08657fb6d5b" dependencies = [ "bytemuck", "egui", @@ -791,33 +839,20 @@ dependencies = [ [[package]] name = "egui-winit" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b673606b6606b12b95e3a3194d7882bf5cff302db36a520b8144c7c342e4e84" +version = "0.24.2" +source = "git+https://github.com/emilk/egui#4a2cafee7cc9bbe01c95d08d7737e08657fb6d5b" dependencies = [ "egui", "log", - "raw-window-handle", + "raw-window-handle 0.5.2", "web-time", "winit", ] -[[package]] -name = "egui_dock" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cabf77568b8da81f419596357583fbc14fd761c72c3433856d30c7669e5b5679" -dependencies = [ - "duplicate", - "egui", - "paste", -] - [[package]] name = "egui_extras" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b880044250106e673610c9a15d62692ef8af396593058f334be6f2a4d9544a5" +version = "0.24.2" +source = "git+https://github.com/emilk/egui#4a2cafee7cc9bbe01c95d08d7737e08657fb6d5b" dependencies = [ "egui", "enum-map", @@ -828,9 +863,8 @@ dependencies = [ [[package]] name = "egui_plot" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b37b2edcdd197db41825266ae7979bd7591fa2eb6b40152375ac05eb323eb9d2" +version = "0.24.2" +source = "git+https://github.com/emilk/egui#4a2cafee7cc9bbe01c95d08d7737e08657fb6d5b" dependencies = [ "egui", ] @@ -843,9 +877,8 @@ checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "emath" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a045c6c0b44b35e98513fc1e9d183ab42881ac27caccb9fa345465601f56cce4" +version = "0.24.2" +source = "git+https://github.com/emilk/egui#4a2cafee7cc9bbe01c95d08d7737e08657fb6d5b" dependencies = [ "bytemuck", "serde", @@ -868,6 +901,7 @@ dependencies = [ "image", "inline_tweak", "itertools", + "lazy_static", "lewton", "log", "oddio", @@ -877,8 +911,12 @@ dependencies = [ "serde", "slotmapd", "smallvec", + "smol_str 0.2.0", "wgpu", "winit", + "yakui", + "yakui-wgpu", + "yakui-winit", ] [[package]] @@ -937,9 +975,8 @@ dependencies = [ [[package]] name = "epaint" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d1b9e000d21bab9b535ce78f9f7745be28b3f777f6c7223936561c5c7fefab8" +version = "0.24.2" +source = "git+https://github.com/emilk/egui#4a2cafee7cc9bbe01c95d08d7737e08657fb6d5b" dependencies = [ "ab_glyph", "ahash", @@ -977,6 +1014,15 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "find-crate" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59a98bbaacea1c0eb6a0876280051b892eb73594fd90cf3b20e9c817029c57d2" +dependencies = [ + "toml", +] + [[package]] name = "fixedbitset" version = "0.4.2" @@ -1023,12 +1069,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] -name = "foreign-types" -version = "0.3.2" +name = "fontdue" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +checksum = "0793f5137567643cf65ea42043a538804ff0fbf288649e2141442b602d81f9bc" dependencies = [ - "foreign-types-shared 0.1.1", + "hashbrown 0.13.2", + "ttf-parser 0.15.2", ] [[package]] @@ -1038,7 +1085,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" dependencies = [ "foreign-types-macros", - "foreign-types-shared 0.3.1", + "foreign-types-shared", ] [[package]] @@ -1052,12 +1099,6 @@ dependencies = [ "syn 2.0.39", ] -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - [[package]] name = "foreign-types-shared" version = "0.3.1" @@ -1100,6 +1141,16 @@ dependencies = [ "serde", ] +[[package]] +name = "gethostname" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb65d4ba3173c56a500b555b532f72c42e8d1fe64962b518897f8959fae2c177" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "getrandom" version = "0.2.11" @@ -1130,6 +1181,15 @@ dependencies = [ "xml-rs", ] +[[package]] +name = "glam" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5418c17512bdf42730f9032c74e1ae39afc408745ebb2acf72fbc4691c17945" +dependencies = [ + "bytemuck", +] + [[package]] name = "glob" version = "0.3.1" @@ -1236,7 +1296,7 @@ checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c" dependencies = [ "bitflags 2.4.1", "gpu-descriptor-types", - "hashbrown", + "hashbrown 0.14.3", ] [[package]] @@ -1248,6 +1308,15 @@ dependencies = [ "bitflags 2.4.1", ] +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + [[package]] name = "hashbrown" version = "0.14.3" @@ -1293,12 +1362,6 @@ dependencies = [ "unicode-segmentation", ] -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - [[package]] name = "hermit-abi" version = "0.1.19" @@ -1320,6 +1383,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" +[[package]] +name = "icrate" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d3aaff8a54577104bafdf686ff18565c3b6903ca5782a2026ef06e2c7aa319" +dependencies = [ + "block2", + "dispatch", + "objc2", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -1367,7 +1441,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.14.3", ] [[package]] @@ -1385,18 +1459,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - [[package]] name = "integer-sqrt" version = "0.1.5" @@ -1460,6 +1522,22 @@ dependencies = [ "walkdir", ] +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", + "windows-sys 0.45.0", +] + [[package]] name = "jni-sys" version = "0.3.0" @@ -1490,6 +1568,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "keyboard-types" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7668b7cff6a51fe61cdde64cd27c8a220786f399501b57ebe36f7d8112fd68" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "khronos-egl" version = "6.0.0" @@ -1647,18 +1734,18 @@ checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" [[package]] name = "memmap2" -version = "0.5.10" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +checksum = "39a69c7c189ae418f83003da62820aca28d15a07725ce51fb924999335d622ff" dependencies = [ "libc", ] [[package]] name = "memoffset" -version = "0.6.5" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" dependencies = [ "autocfg", ] @@ -1681,7 +1768,7 @@ dependencies = [ "bitflags 2.4.1", "block", "core-graphics-types", - "foreign-types 0.5.0", + "foreign-types", "log", "objc", "paste", @@ -1725,18 +1812,6 @@ version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e53debba6bda7a793e5f99b8dacf19e626084f525f7829104ba9898f367d85ff" -[[package]] -name = "mio" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" -dependencies = [ - "libc", - "log", - "wasi", - "windows-sys 0.48.0", -] - [[package]] name = "naga" version = "0.14.1" @@ -1790,7 +1865,6 @@ dependencies = [ "serde", "simulation", "slotmapd", - "winit", ] [[package]] @@ -1801,9 +1875,25 @@ checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" dependencies = [ "bitflags 1.3.2", "jni-sys", - "ndk-sys", + "ndk-sys 0.4.1+23.1.7779620", "num_enum 0.5.11", - "raw-window-handle", + "raw-window-handle 0.5.2", + "thiserror", +] + +[[package]] +name = "ndk" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" +dependencies = [ + "bitflags 2.4.1", + "jni-sys", + "log", + "ndk-sys 0.5.0+25.2.9519653", + "num_enum 0.7.1", + "raw-window-handle 0.5.2", + "raw-window-handle 0.6.0", "thiserror", ] @@ -1822,6 +1912,15 @@ dependencies = [ "jni-sys", ] +[[package]] +name = "ndk-sys" +version = "0.5.0+25.2.9519653" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" +dependencies = [ + "jni-sys", +] + [[package]] name = "networking" version = "0.1.0" @@ -1841,20 +1940,18 @@ dependencies = [ "bitflags 1.3.2", "cfg-if", "libc", - "memoffset 0.6.5", ] [[package]] name = "nix" -version = "0.25.1" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" dependencies = [ - "autocfg", "bitflags 1.3.2", "cfg-if", "libc", - "memoffset 0.6.5", + "memoffset 0.7.1", ] [[package]] @@ -1935,11 +2032,11 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +checksum = "683751d591e6d81200c39fb0d1032608b77724f34114db54f571ff1317b337c0" dependencies = [ - "num_enum_derive 0.6.1", + "num_enum_derive 0.7.1", ] [[package]] @@ -1956,9 +2053,9 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.6.1" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +checksum = "6c11e44798ad209ccdd91fc192f0526a369a01234f7373e1b141c96d7cee4f0e" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -1987,29 +2084,25 @@ dependencies = [ [[package]] name = "objc-sys" -version = "0.2.0-beta.2" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b9834c1e95694a05a828b59f55fa2afec6288359cda67146126b3f90a55d7" +checksum = "c7c71324e4180d0899963fc83d9d241ac39e699609fc1025a850aadac8257459" [[package]] name = "objc2" -version = "0.3.0-beta.3.patch-leaks.3" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e01640f9f2cb1220bbe80325e179e532cb3379ebcd1bf2279d703c19fe3a468" +checksum = "559c5a40fdd30eb5e344fbceacf7595a81e242529fb4e21cf5f43fb4f11ff98d" dependencies = [ - "block2", "objc-sys", "objc2-encode", ] [[package]] name = "objc2-encode" -version = "2.0.0-pre.2" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abfcac41015b00a120608fdaa6938c44cb983fee294351cc4bac7638b4e50512" -dependencies = [ - "objc-sys", -] +checksum = "d079845b37af429bfe5dfa76e6d087d788031045b25cfc6fd898486fd9847666" [[package]] name = "objc_exception" @@ -2036,7 +2129,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8868cc237ee02e2d9618539a23a8d228b9bb3fc2e7a5b11eed3831de77c395d0" dependencies = [ "jni 0.20.0", - "ndk", + "ndk 0.7.0", "ndk-context", "num-derive", "num-traits", @@ -2106,7 +2199,31 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4586edfe4c648c71797a74c84bacb32b52b212eff5dfe2bb9f2c599844023e7" dependencies = [ - "ttf-parser", + "ttf-parser 0.20.0", +] + +[[package]] +name = "palette" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f9cd68f7112581033f157e56c77ac4a5538ec5836a2e39284e65bd7d7275e49" +dependencies = [ + "approx", + "num-traits", + "palette_derive", + "phf", +] + +[[package]] +name = "palette_derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05eedf46a8e7c27f74af0c9cfcdb004ceca158cb1b918c6f68f8d7a549b3e427" +dependencies = [ + "find-crate", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] @@ -2165,6 +2282,48 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_macros", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared", + "rand", +] + +[[package]] +name = "phf_macros" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project-lite" version = "0.2.13" @@ -2190,6 +2349,20 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "polling" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf63fa624ab313c11656b4cda960bfc46c410187ad493c41f6ba2d8c1e991c9e" +dependencies = [ + "cfg-if", + "concurrent-queue", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys 0.52.0", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -2265,6 +2438,15 @@ dependencies = [ "syn 2.0.39", ] +[[package]] +name = "quick-xml" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" +dependencies = [ + "memchr", +] + [[package]] name = "quickcheck" version = "1.0.3" @@ -2315,6 +2497,12 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" +[[package]] +name = "raw-window-handle" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42a9830a0e1b9fb145ebb365b8bc4ccd75f290f98c0247deafbbe2c75cefb544" + [[package]] name = "rayon" version = "1.8.0" @@ -2472,9 +2660,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sctk-adwaita" -version = "0.5.4" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda4e97be1fd174ccc2aae81c8b694e803fa99b34e8fd0f057a9d70698e3ed09" +checksum = "1729a30a469de249c6effc17ec8d039b0aa29b3af79b819b7f51cb6ab8046a90" dependencies = [ "ab_glyph", "log", @@ -2586,6 +2774,21 @@ dependencies = [ "slotmapd", ] +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + [[package]] name = "slotmap" version = "1.0.7" @@ -2612,21 +2815,45 @@ checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "smithay-client-toolkit" -version = "0.16.1" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "870427e30b8f2cbe64bf43ec4b86e88fe39b0a84b3f15efd9c9c2d020bc86eb9" +checksum = "60e3d9941fa3bacf7c2bf4b065304faa14164151254cd16ce1b1bc8fc381600f" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.1", "calloop", - "dlib", - "lazy_static", + "calloop-wayland-source", + "cursor-icon", + "libc", "log", "memmap2", - "nix 0.24.3", - "pkg-config", + "rustix", + "thiserror", + "wayland-backend", "wayland-client", + "wayland-csd-frame", "wayland-cursor", "wayland-protocols", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", +] + +[[package]] +name = "smol_str" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fad6c857cbab2627dcf01ec85a623ca4e7dcb5691cbaa3d7fb7653671f0d09c9" +dependencies = [ + "serde", +] + +[[package]] +name = "smol_str" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74212e6bbe9a4352329b2f68ba3130c15a3f26fe88ff22dbdc6cdd58fa85e99c" +dependencies = [ + "serde", ] [[package]] @@ -2689,7 +2916,7 @@ version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" dependencies = [ - "heck 0.3.3", + "heck", "proc-macro-error", "proc-macro2", "quote", @@ -2766,6 +2993,12 @@ dependencies = [ "once_cell", ] +[[package]] +name = "thunderdome" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e170f93360bf9ae6fe3c31116bbf27adb1d054cedd6bc3d7857e34f2d98d0b" + [[package]] name = "time" version = "0.3.30" @@ -2799,23 +3032,23 @@ dependencies = [ [[package]] name = "tiny-skia" -version = "0.8.4" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df8493a203431061e901613751931f047d1971337153f96d0e5e363d6dbf6a67" +checksum = "b6a067b809476893fce6a254cf285850ff69c847e6cfbade6a20b655b6c7e80d" dependencies = [ "arrayref", "arrayvec", "bytemuck", "cfg-if", - "png", + "log", "tiny-skia-path", ] [[package]] name = "tiny-skia-path" -version = "0.8.4" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adbfb5d3f3dd57a0e11d12f4f13d4ebbbc1b5c15b7ab0a156d030b21da5f677c" +checksum = "5de35e8a90052baaaf61f171680ac2f8e925a1e43ea9d2e3a00514772250e541" dependencies = [ "arrayref", "bytemuck", @@ -2837,6 +3070,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + [[package]] name = "toml_datetime" version = "0.6.5" @@ -2935,6 +3177,12 @@ dependencies = [ "cc", ] +[[package]] +name = "ttf-parser" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b3e06c9b9d80ed6b745c7159c40b311ad2916abb34a49e9be2653b90db0d8dd" + [[package]] name = "ttf-parser" version = "0.20.0" @@ -3090,75 +3338,111 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" [[package]] -name = "wayland-client" -version = "0.29.5" +name = "wayland-backend" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715" +checksum = "19152ddd73f45f024ed4534d9ca2594e0ef252c1847695255dae47f34df9fbe4" dependencies = [ - "bitflags 1.3.2", + "cc", "downcast-rs", - "libc", - "nix 0.24.3", + "nix 0.26.4", "scoped-tls", - "wayland-commons", - "wayland-scanner", + "smallvec", "wayland-sys", ] [[package]] -name = "wayland-commons" -version = "0.29.5" +name = "wayland-client" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8691f134d584a33a6606d9d717b95c4fa20065605f798a3f350d78dced02a902" +checksum = "1ca7d52347346f5473bf2f56705f360e8440873052e575e55890c4fa57843ed3" dependencies = [ - "nix 0.24.3", - "once_cell", - "smallvec", - "wayland-sys", + "bitflags 2.4.1", + "nix 0.26.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.4.1", + "cursor-icon", + "wayland-backend", ] [[package]] name = "wayland-cursor" -version = "0.29.5" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6865c6b66f13d6257bef1cd40cbfe8ef2f150fb8ebbdb1e8e873455931377661" +checksum = "a44aa20ae986659d6c77d64d808a046996a932aa763913864dc40c359ef7ad5b" dependencies = [ - "nix 0.24.3", + "nix 0.26.4", "wayland-client", "xcursor", ] [[package]] name = "wayland-protocols" -version = "0.29.5" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" +checksum = "e253d7107ba913923dc253967f35e8561a3c65f914543e46843c88ddd729e21c" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.1", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23803551115ff9ea9bce586860c5c5a971e360825a0309264102a9495a5ff479" +dependencies = [ + "bitflags 2.4.1", + "wayland-backend", "wayland-client", - "wayland-commons", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" +dependencies = [ + "bitflags 2.4.1", + "wayland-backend", + "wayland-client", + "wayland-protocols", "wayland-scanner", ] [[package]] name = "wayland-scanner" -version = "0.29.5" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" +checksum = "fb8e28403665c9f9513202b7e1ed71ec56fde5c107816843fb14057910b2c09c" dependencies = [ "proc-macro2", + "quick-xml", "quote", - "xml-rs", ] [[package]] name = "wayland-sys" -version = "0.29.5" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4" +checksum = "15a0c8eaff5216d07f226cb7a549159267f3467b289d9a2e52fd3ef5aae2b7af" dependencies = [ "dlib", - "lazy_static", + "log", + "once_cell", "pkg-config", ] @@ -3196,7 +3480,7 @@ dependencies = [ "naga", "parking_lot", "profiling", - "raw-window-handle", + "raw-window-handle 0.5.2", "smallvec", "static_assertions", "wasm-bindgen", @@ -3221,7 +3505,7 @@ dependencies = [ "naga", "parking_lot", "profiling", - "raw-window-handle", + "raw-window-handle 0.5.2", "rustc-hash", "smallvec", "thiserror", @@ -3262,7 +3546,7 @@ dependencies = [ "parking_lot", "profiling", "range-alloc", - "raw-window-handle", + "raw-window-handle 0.5.2", "renderdoc-sys", "rustc-hash", "smallvec", @@ -3315,6 +3599,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "winapi-wsapoll" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c17110f57155602a80dca10be03852116403c9ff3cd25b079d666f2aa3df6e" +dependencies = [ + "winapi", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -3558,37 +3851,51 @@ checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winit" -version = "0.28.7" +version = "0.29.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9596d90b45384f5281384ab204224876e8e8bf7d58366d9b795ad99aa9894b94" +checksum = "d25d662bb83b511acd839534bb2d88521b0bbc81440969cb077d23c4db9e62c7" dependencies = [ + "ahash", "android-activity", - "bitflags 1.3.2", + "atomic-waker", + "bitflags 2.4.1", + "bytemuck", + "calloop", "cfg_aliases", "core-foundation", "core-graphics", - "dispatch", - "instant", + "cursor-icon", + "icrate", + "js-sys", "libc", "log", - "mio", - "ndk", + "memmap2", + "ndk 0.8.0", + "ndk-sys 0.5.0+25.2.9519653", "objc2", "once_cell", "orbclient", "percent-encoding", - "raw-window-handle", + "raw-window-handle 0.5.2", + "raw-window-handle 0.6.0", "redox_syscall 0.3.5", + "rustix", "sctk-adwaita", "smithay-client-toolkit", + "smol_str 0.2.0", + "unicode-segmentation", "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-backend", "wayland-client", - "wayland-commons", "wayland-protocols", - "wayland-scanner", + "wayland-protocols-plasma", "web-sys", - "windows-sys 0.45.0", + "web-time", + "windows-sys 0.48.0", "x11-dl", + "x11rb", + "xkbcommon-dl", ] [[package]] @@ -3611,6 +3918,32 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "x11rb" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1641b26d4dec61337c35a1b1aaf9e3cba8f46f0b43636c609ab0291a648040a" +dependencies = [ + "as-raw-xcb-connection", + "gethostname", + "libc", + "libloading 0.7.4", + "nix 0.26.4", + "once_cell", + "winapi", + "winapi-wsapoll", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d6c3f9a0fb6701fab8f6cea9b0c0bd5d6876f1f89f7fada07e558077c344bc" +dependencies = [ + "nix 0.26.4", +] + [[package]] name = "xcursor" version = "0.3.4" @@ -3620,12 +3953,89 @@ dependencies = [ "nom", ] +[[package]] +name = "xkbcommon-dl" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6924668544c48c0133152e7eec86d644a056ca3d09275eb8d5cdb9855f9d8699" +dependencies = [ + "bitflags 2.4.1", + "dlib", + "log", + "once_cell", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "054a8e68b76250b253f671d1268cb7f1ae089ec35e195b2efb2a4e9a836d0621" + [[package]] name = "xml-rs" version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" +[[package]] +name = "yakui" +version = "0.2.0" +source = "git+https://github.com/SecondHalfGames/yakui#64279098bb16174044d579e4be239ca32c595ee6" +dependencies = [ + "yakui-core", + "yakui-widgets", +] + +[[package]] +name = "yakui-core" +version = "0.2.0" +source = "git+https://github.com/SecondHalfGames/yakui#64279098bb16174044d579e4be239ca32c595ee6" +dependencies = [ + "anymap", + "bitflags 1.3.2", + "glam", + "keyboard-types", + "log", + "palette", + "profiling", + "smallvec", + "thunderdome", +] + +[[package]] +name = "yakui-wgpu" +version = "0.2.0" +source = "git+https://github.com/SecondHalfGames/yakui#64279098bb16174044d579e4be239ca32c595ee6" +dependencies = [ + "bytemuck", + "glam", + "profiling", + "thunderdome", + "wgpu", + "yakui-core", +] + +[[package]] +name = "yakui-widgets" +version = "0.2.0" +source = "git+https://github.com/SecondHalfGames/yakui#64279098bb16174044d579e4be239ca32c595ee6" +dependencies = [ + "fontdue", + "smol_str 0.1.24", + "thunderdome", + "yakui-core", +] + +[[package]] +name = "yakui-winit" +version = "0.2.0" +source = "git+https://github.com/SecondHalfGames/yakui#64279098bb16174044d579e4be239ca32c595ee6" +dependencies = [ + "winit", + "yakui-core", +] + [[package]] name = "zerocopy" version = "0.7.28" diff --git a/Cargo.toml b/Cargo.toml index c2a690ad..68a00b36 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,13 +17,11 @@ resolver = "2" default-members = ["native_app"] [workspace.dependencies] -egui = "0.24.1" +egui = { git = "https://github.com/emilk/egui" } flat_spatial = "0.6" -egui_extras = "0.24.1" -egui-winit = { version = "0.24.1", default-features = false } -egui_plot = "0.24.1" +egui_extras = { git = "https://github.com/emilk/egui" } +egui_plot = { git = "https://github.com/emilk/egui" } ordered-float = { version = "4.2.0", default-features = false } -winit = "0.28.7" oddio = "0.6.2" derive_more = "0.99.17" diff --git a/assets/shaders/pbr/render.wgsl b/assets/shaders/pbr/render.wgsl index 0abbc269..5c27d275 100644 --- a/assets/shaders/pbr/render.wgsl +++ b/assets/shaders/pbr/render.wgsl @@ -166,7 +166,7 @@ fn render(sun: vec3, color += atmo; #endif - let autoexposure = 1.0 + smoothstep(0.0, 0.1, -sun.z) * 5.0; + let autoexposure = 1.0 + smoothstep(0.0, 0.1, -sun.z) * 10.0; color = tonemap(autoexposure * color); diff --git a/assets_gui/Cargo.toml b/assets_gui/Cargo.toml index a09e9df5..5c545cb6 100644 --- a/assets_gui/Cargo.toml +++ b/assets_gui/Cargo.toml @@ -6,9 +6,12 @@ edition = "2021" [dependencies] common = { path = "../common" } geom = { path = "../geom" } -engine = { path = "../engine" } +engine = { path = "../engine", features=["yakui"] } egui-inspect = { path = "../egui-inspect" } log = { version = "0.4.11", features=["max_level_info", "release_max_level_info"] } inline_tweak = "1.0.8" -egui_dock = "0.9.0" egui = { workspace = true } +yakui = { git = "https://github.com/SecondHalfGames/yakui" } +yakui-wgpu = { git = "https://github.com/SecondHalfGames/yakui" } +yakui-winit = { git = "https://github.com/SecondHalfGames/yakui" } +yakui-widgets = { git = "https://github.com/SecondHalfGames/yakui" } \ No newline at end of file diff --git a/assets_gui/src/companies.rs b/assets_gui/src/companies.rs index ef18e014..9f243e51 100644 --- a/assets_gui/src/companies.rs +++ b/assets_gui/src/companies.rs @@ -17,6 +17,7 @@ impl Companies { }) } + #[allow(dead_code)] pub fn save(&self) { common::saveload::JSONPretty::save(&self.companies, "companies"); } diff --git a/assets_gui/src/gui.rs b/assets_gui/src/gui.rs deleted file mode 100644 index c9749d66..00000000 --- a/assets_gui/src/gui.rs +++ /dev/null @@ -1,358 +0,0 @@ -use common::descriptions::{BuildingGen, CompanyKind}; -use egui::{Color32, Ui}; -use egui_dock::{ - DockArea, DockState, NodeIndex, Style, TabBodyStyle, TabInteractionStyle, TabStyle, -}; -use egui_inspect::{Inspect, InspectArgs}; - -use engine::meshload::MeshProperties; -use engine::wgpu::RenderPass; -use engine::{Drawable, GfxContext, Mesh, SpriteBatch}; -use geom::{Matrix4, Vec2}; - -use crate::companies::Companies; -use crate::State; - -#[derive(Copy, Clone, Debug)] -pub enum Tab { - View, - Explorer, - Properties, - ModelProperties, -} - -#[derive(PartialEq, Eq, Copy, Clone)] -pub enum Inspected { - None, - Company(usize), -} - -#[derive(Clone)] -pub enum Shown { - None, - Error(String), - Model((Mesh, MeshProperties)), - Sprite(SpriteBatch), -} - -pub struct Gui { - pub tree: Option>, - pub companies: Companies, - pub inspected: Inspected, - pub shown: Shown, -} - -impl Gui { - pub fn new() -> Self { - let mut tree = DockState::new(vec![Tab::View]); - - let view = NodeIndex::root(); - let [view, _] = tree - .main_surface_mut() - .split_left(view, 0.2, vec![Tab::Explorer]); - let [view, _] = tree - .main_surface_mut() - .split_right(view, 0.8, vec![Tab::Properties]); - tree.main_surface_mut() - .split_below(view, 0.8, vec![Tab::ModelProperties]); - - Self { - tree: Some(tree), - companies: Companies::new().expect("could not load companies.json"), - inspected: Inspected::None, - shown: Shown::None, - } - } -} - -impl State { - pub fn gui(&mut self, ui: &egui::Context) { - let mut tree = self.gui.tree.take().unwrap(); - DockArea::new(&mut tree) - .show_close_buttons(false) - .draggable_tabs(false) - .style(Style::from_egui(ui.style().as_ref())) - .show(ui, &mut TabViewer { state: self }); - self.gui.tree = Some(tree); - } -} - -fn explorer(state: &mut State, ui: &mut Ui) { - if state.gui.companies.changed { - if ui.button("Save").clicked() { - state.gui.companies.save(); - } - } - for (i, comp) in state.gui.companies.companies.iter().enumerate() { - let r = ui.add_sized([ui.available_width(), 40.0], egui::Button::new(&comp.name)); - if r.clicked() { - state.gui.inspected = Inspected::Company(i); - } - } -} - -fn properties(state: &mut State, ui: &mut Ui) { - match state.gui.inspected { - Inspected::None => {} - Inspected::Company(i) => { - let comp = &mut state.gui.companies.companies[i]; - text_inp(ui, "name", &mut comp.name); - - let mut selected = match comp.kind { - CompanyKind::Store => 0, - CompanyKind::Factory { .. } => 1, - CompanyKind::Network => 2, - }; - - if egui::ComboBox::new("company_kind", "company kind") - .show_index(ui, &mut selected, 3, |idx| match idx { - 0 => "Store", - 1 => "Factory", - 2 => "Network", - _ => unreachable!(), - }) - .changed() - { - match selected { - 0 => comp.kind = CompanyKind::Store, - 1 => comp.kind = CompanyKind::Factory { n_trucks: 1 }, - 2 => comp.kind = CompanyKind::Network, - _ => unreachable!(), - } - } - - match &mut comp.kind { - CompanyKind::Store | CompanyKind::Network => {} - CompanyKind::Factory { n_trucks } => { - inspect(ui, "n_trucks", n_trucks); - } - } - - let mut selected = match comp.bgen { - BuildingGen::House => unreachable!(), - BuildingGen::Farm => 0, - BuildingGen::CenteredDoor { .. } => 1, - BuildingGen::NoWalkway { .. } => 2, - }; - if egui::ComboBox::new("bgen_kind", "bgen kind") - .show_index(ui, &mut selected, 3, |idx| match idx { - 0 => "Farm", - 1 => "Centered door", - 2 => "No walkway", - _ => unreachable!(), - }) - .changed() - { - match selected { - 0 => comp.bgen = BuildingGen::Farm, - 1 => { - comp.bgen = BuildingGen::CenteredDoor { - vertical_factor: 1.0, - } - } - 2 => { - comp.bgen = BuildingGen::NoWalkway { - door_pos: Vec2::ZERO, - } - } - _ => unreachable!(), - } - } - - match &mut comp.bgen { - BuildingGen::House | BuildingGen::Farm => {} - BuildingGen::CenteredDoor { vertical_factor } => { - inspect(ui, "vertical factor", vertical_factor); - } - BuildingGen::NoWalkway { door_pos } => { - inspect(ui, "door_pos", door_pos); - } - } - - ui.add_space(5.0); - ui.label("Recipe"); - inspect(ui, "complexity", &mut comp.recipe.complexity); - inspect( - ui, - "storage_multiplier", - &mut comp.recipe.storage_multiplier, - ); - ui.label("consumption"); - ui.indent("consumption", |ui| { - for (name, amount) in comp.recipe.consumption.iter_mut() { - inspect_item(ui, name, amount); - } - }); - - ui.label("production"); - ui.indent("production", |ui| { - for (name, amount) in comp.recipe.production.iter_mut() { - inspect_item(ui, name, amount); - } - }); - - inspect(ui, "n_workers", &mut comp.n_workers); - inspect(ui, "size", &mut comp.size); - text_inp(ui, "asset_location", &mut comp.asset_location); - inspect(ui, "price", &mut comp.price); - - ui_opt(ui, "zone", &mut comp.zone, |ui, zone| { - ui.indent("zone", |ui| { - inspect(ui, "floor", &mut zone.floor); - inspect(ui, "filler", &mut zone.filler); - inspect(ui, "price_per_area", &mut zone.price_per_area); - }); - }); - } - } -} - -fn inspect_item(ui: &mut Ui, name: &mut String, amount: &mut i32) { - ui.horizontal(|ui| { - ui.label(&*name); - ui.add(egui::DragValue::new(amount)); - }); -} - -fn inspect>(ui: &mut Ui, label: &'static str, x: &mut T) -> bool { - >::render_mut(x, label, ui, &InspectArgs::default()) -} - -fn text_inp(ui: &mut Ui, label: &'static str, v: &mut String) { - ui.horizontal(|ui| { - ui.label(label); - ui.text_edit_singleline(v); - }); -} - -fn ui_opt( - ui: &mut Ui, - label: &'static str, - v: &mut Option, - f: impl FnOnce(&mut Ui, &mut T), -) { - ui.horizontal(|ui| { - let mut is_some = v.is_some(); - ui.checkbox(&mut is_some, label); - if is_some != v.is_some() { - if is_some { - *v = Some(Default::default()); - } else { - *v = None; - } - } - }); - if let Some(v) = v { - f(ui, v); - } -} - -fn model_properties(state: &mut State, ui: &mut Ui) { - match &state.gui.shown { - Shown::None => {} - Shown::Error(e) => { - ui.label(e); - } - Shown::Model((_, props)) => { - ui.columns(2, |ui| { - ui[0].label("Vertices"); - ui[1].label(format!("{}", props.n_vertices)); - - ui[0].label("Triangles"); - ui[1].label(format!("{}", props.n_triangles)); - - ui[0].label("Materials"); - ui[1].label(format!("{}", props.n_materials)); - - ui[0].label("Textures"); - ui[1].label(format!("{}", props.n_textures)); - - ui[0].label("Draw calls"); - ui[1].label(format!("{}", props.n_draw_calls)); - }); - } - Shown::Sprite(_sprite) => { - ui.label("Sprite"); - } - } -} - -struct TabViewer<'a> { - state: &'a mut State, -} - -impl<'a> egui_dock::TabViewer for TabViewer<'a> { - type Tab = Tab; - - fn ui(&mut self, ui: &mut Ui, tab: &mut Self::Tab) { - match tab { - Tab::View => return, - Tab::Explorer => explorer(self.state, ui), - Tab::Properties => properties(self.state, ui), - Tab::ModelProperties => model_properties(self.state, ui), - } - } - - fn title(&mut self, tab: &mut Tab) -> egui::WidgetText { - match tab { - Tab::Explorer => "Explorer".into(), - Tab::Properties => "Properties".into(), - Tab::ModelProperties => "Model Properties".into(), - Tab::View => "View".into(), - } - } - - #[inline] - fn tab_style_override(&self, tab: &Self::Tab, global_style: &TabStyle) -> Option { - if matches!(tab, Tab::View) { - return Some(TabStyle { - active: TabInteractionStyle { - bg_fill: Color32::TRANSPARENT, - ..global_style.active - }, - focused: TabInteractionStyle { - bg_fill: Color32::TRANSPARENT, - ..global_style.focused - }, - hovered: TabInteractionStyle { - bg_fill: Color32::TRANSPARENT, - ..global_style.hovered - }, - inactive: TabInteractionStyle { - bg_fill: Color32::TRANSPARENT, - ..global_style.inactive - }, - tab_body: TabBodyStyle { - bg_fill: Color32::TRANSPARENT, - ..global_style.tab_body - }, - hline_below_active_tab_name: false, - ..global_style.clone() - }); - } - None - } -} - -impl Drawable for Shown { - fn draw<'a>(&'a self, gfx: &'a GfxContext, rp: &mut RenderPass<'a>) { - match self { - Shown::None | Shown::Error(_) => {} - Shown::Model((mesh, _)) => mesh.draw(gfx, rp), - Shown::Sprite(sprite) => sprite.draw(gfx, rp), - } - } - - fn draw_depth<'a>( - &'a self, - gfx: &'a GfxContext, - rp: &mut RenderPass<'a>, - shadow_cascade: Option<&Matrix4>, - ) { - match self { - Shown::None | Shown::Error(_) => {} - Shown::Model((mesh, _)) => mesh.draw_depth(gfx, rp, shadow_cascade), - Shown::Sprite(sprite) => sprite.draw_depth(gfx, rp, shadow_cascade), - } - } -} diff --git a/assets_gui/src/main.rs b/assets_gui/src/main.rs index 289626ab..99d33840 100644 --- a/assets_gui/src/main.rs +++ b/assets_gui/src/main.rs @@ -1,23 +1,19 @@ -use std::path::Path; - -use egui::FontFamily::{Monospace, Proportional}; -use egui::FontId; - use engine::meshload::load_mesh_with_properties; use engine::{Context, FrameContext, GfxContext, GfxSettings, SpriteBatchBuilder}; use geom::{vec3, InfiniteFrustrum, LinearColor, Plane, Vec2, Vec3}; +use std::path::Path; -use crate::gui::{Gui, Inspected, Shown}; use crate::orbit_camera::OrbitCamera; +use crate::yakui_gui::{Gui, Inspected, Shown}; mod companies; -mod gui; mod orbit_camera; +mod yakui_gui; struct State { - gui: Gui, camera: OrbitCamera, last_inspect: Inspected, + gui: Gui, } impl engine::framework::State for State { @@ -28,25 +24,29 @@ impl engine::framework::State for State { gfx.sun_shadowmap = GfxContext::mk_shadowmap(&gfx.device, 2048); gfx.update_simplelit_bg(); - let mut style = (*ctx.egui.egui.style()).clone(); + //let mut style = (*ctx.egui.egui.style()).clone(); + // + //style.text_styles = [ + // (egui::TextStyle::Small, FontId::new(15.0, Proportional)), + // (egui::TextStyle::Body, FontId::new(18.5, Proportional)), + // (egui::TextStyle::Button, FontId::new(18.5, Proportional)), + // (egui::TextStyle::Heading, FontId::new(25.0, Proportional)), + // (egui::TextStyle::Monospace, FontId::new(18.0, Monospace)), + //] + //.into(); + // + //ctx.egui.egui.set_style(style); - style.text_styles = [ - (egui::TextStyle::Small, FontId::new(15.0, Proportional)), - (egui::TextStyle::Body, FontId::new(18.5, Proportional)), - (egui::TextStyle::Button, FontId::new(18.5, Proportional)), - (egui::TextStyle::Heading, FontId::new(25.0, Proportional)), - (egui::TextStyle::Monospace, FontId::new(18.0, Monospace)), - ] - .into(); + let camera = OrbitCamera::new(); - ctx.egui.egui.set_style(style); + let mut gui = Gui::new(); - let camera = OrbitCamera::new(); + gui.inspected = Inspected::Company(3); Self { camera, - gui: Gui::new(), last_inspect: Inspected::None, + gui, } } @@ -92,8 +92,8 @@ impl engine::framework::State for State { self.camera.resize(ctx, size.0 as f32, size.1 as f32); } - fn render_gui(&mut self, ui: &egui::Context) { - self.gui(ui); + fn render_yakui(&mut self) { + self.gui_yakui(); } } diff --git a/assets_gui/src/yakui_gui.rs b/assets_gui/src/yakui_gui.rs new file mode 100644 index 00000000..d70d2881 --- /dev/null +++ b/assets_gui/src/yakui_gui.rs @@ -0,0 +1,550 @@ +use common::descriptions::{BuildingGen, CompanyKind}; +use std::rc::Rc; +use yakui::context::dom; +use yakui::event::{EventInterest, EventResponse, WidgetEvent}; +use yakui::paint::PaintRect; +use yakui::widget::{EventContext, Widget}; +use yakui::{ + Alignment, Color, Constraints, CrossAxisAlignment, Dim2, MainAxisAlignment, Response, Vec2, + WidgetId, +}; +use yakui_widgets::util::widget; +use yakui_widgets::widgets::{Button, Layer, List, Pad, Slider, StateResponse}; +use yakui_widgets::*; + +use engine::meshload::MeshProperties; +use engine::wgpu::RenderPass; +use engine::{set_cursor_icon, CursorIcon, Drawable, GfxContext, Mesh, SpriteBatch}; +use geom::Matrix4; + +use crate::companies::Companies; +use crate::State; + +#[derive(PartialEq, Eq, Copy, Clone)] +pub enum Inspected { + None, + Company(usize), +} + +#[derive(Clone)] +pub enum Shown { + None, + Error(String), + Model((Mesh, MeshProperties)), + Sprite(SpriteBatch), +} + +pub struct Gui { + pub companies: Companies, + pub inspected: Inspected, + pub shown: Shown, +} + +impl Gui { + pub fn new() -> Self { + Self { + companies: Companies::new().expect("could not load companies.json"), + inspected: Inspected::None, + shown: Shown::None, + } + } +} + +impl State { + pub fn gui_yakui(&mut self) { + row(|| { + self.explorer(); + self.model_properties(); + self.properties(); + }); + } + + fn explorer(&mut self) { + let mut off = use_state(|| 300.0); + constrained( + Constraints::loose(Vec2::new(off.get(), f32::INFINITY)), + || { + colored_box_container(Color::GRAY.with_alpha(0.8), || { + scroll_vertical(|| { + let mut l = List::column(); + l.cross_axis_alignment = CrossAxisAlignment::Stretch; + l.show(|| { + label("Companies"); + if self.gui.companies.changed { + if button("Save").clicked { + self.gui.companies.save(); + } + } + for (i, comp) in self.gui.companies.companies.iter().enumerate() { + let b = Button::styled(comp.name.to_string()); + + Pad::all(3.0).show(|| { + if b.show().clicked { + self.gui.inspected = Inspected::Company(i); + } + }); + } + }); + }); + }); + }, + ); + Self::scrollbar(&mut off, false); + } + + fn scrollbar(off: &mut Response>, scrollbar_on_left_side: bool) { + colored_box_container(Color::GRAY.adjust(0.5), || { + constrained(Constraints::tight(Vec2::new(5.0, f32::INFINITY)), || { + let last_val = use_state(|| None); + let mut hovered = false; + let d = draggable(|| { + hovered = *widget::(()); + }) + .dragging; + let delta = d + .map(|v| { + let delta = v.current.x - last_val.get().unwrap_or(v.current.x); + last_val.set(Some(v.current.x)); + delta + }) + .unwrap_or_else(|| { + last_val.set(None); + 0.0 + }); + off.modify(|v| { + if scrollbar_on_left_side { + v - delta + } else { + v + delta + } + .clamp(100.0, 600.0) + }); + + let should_show_mouse_icon = d.is_some() || hovered; + on_changed(should_show_mouse_icon, || { + set_colresize_icon(should_show_mouse_icon); + }); + }); + }); + } + + fn model_properties(&mut self) { + let mut l = List::column(); + l.main_axis_alignment = MainAxisAlignment::End; + l.cross_axis_alignment = CrossAxisAlignment::Stretch; + l.show(|| { + colored_box_container(Color::GRAY, || { + column(|| { + label("Model properties"); + match &self.gui.shown { + Shown::None => { + label("No model selected"); + } + Shown::Error(e) => { + label(e.clone()); + } + Shown::Model((_, props)) => { + row(|| { + column(|| { + label("Vertices"); + label("Triangles"); + label("Materials"); + label("Textures"); + label("Draw calls"); + }); + column(|| { + label(format!("{}", props.n_vertices)); + label(format!("{}", props.n_triangles)); + label(format!("{}", props.n_materials)); + label(format!("{}", props.n_textures)); + label(format!("{}", props.n_draw_calls)); + }); + }); + } + Shown::Sprite(_sprite) => { + label("Sprite"); + } + } + }); + }); + }); + } + + fn properties(&mut self) { + match self.gui.inspected { + Inspected::None => {} + Inspected::Company(i) => { + let mut off = use_state(|| 350.0); + Self::scrollbar(&mut off, true); + constrained( + Constraints::loose(Vec2::new(off.get(), f32::INFINITY)), + || { + colored_box_container(Color::GRAY, || { + let comp = &mut self.gui.companies.companies[i]; + let mut props = PropertiesBuilder::new(); + + props.add("Name", || text_inp(&mut comp.name)); + + props.add("Kind", || { + let mut selected = match comp.kind { + CompanyKind::Store => 0, + CompanyKind::Factory { .. } => 1, + CompanyKind::Network => 2, + }; + + if combo_box(&mut selected, &["Store", "Factory", "Network"]) { + match selected { + 0 => comp.kind = CompanyKind::Store, + 1 => comp.kind = CompanyKind::Factory { n_trucks: 1 }, + 2 => comp.kind = CompanyKind::Network, + _ => unreachable!(), + } + } + }); + props.add("Building generator", || { + let mut selected = match comp.bgen { + BuildingGen::House => unreachable!(), + BuildingGen::Farm => 0, + BuildingGen::CenteredDoor { .. } => 1, + BuildingGen::NoWalkway { .. } => 2, + }; + + if combo_box( + &mut selected, + &["Farm", "Centered door", "No walkway"], + ) { + match selected { + 0 => comp.bgen = BuildingGen::Farm, + 1 => { + comp.bgen = BuildingGen::CenteredDoor { + vertical_factor: 1.0, + } + } + 2 => { + comp.bgen = BuildingGen::NoWalkway { + door_pos: geom::Vec2::ZERO, + } + } + _ => unreachable!(), + } + } + }); + props.add("Recipe", || { + label(" "); + }); + + let recipe = &mut comp.recipe; + props.add("complexity", || inspect_v(&mut recipe.complexity)); + props.add("storage_multiplier", || { + inspect_v(&mut recipe.storage_multiplier) + }); + props.add("consumption", || { + label(" "); + }); + let consumption: Vec<_> = recipe + .consumption + .iter() + .map(|(_, v)| Rc::new(std::cell::RefCell::new(*v))) + .collect(); + for ((name, _), amount) in + recipe.consumption.iter().zip(consumption.iter()) + { + let amount = amount.clone(); + props.add(&*name, move || inspect_v(&mut *amount.borrow_mut())); + } + + props.add("production", || { + label(" "); + }); + //for (name, amount) in recipe.production.iter_mut() { + // props.add(name, || inspect_v(amount)); + //} + + props.add("n_workers", || inspect_v(&mut comp.n_workers)); + props.add("size", || inspect_v(&mut comp.size)); + props.add("asset_location", || text_inp(&mut comp.asset_location)); + props.add("price", || inspect_v(&mut comp.price)); + + let mut v = comp.zone.is_some(); + props.add("zone", || { + center(|| { + v = checkbox(v).checked; + }); + }); + + if let Some(ref mut z) = comp.zone { + props.add("floor", || text_inp(&mut z.floor)); + props.add("filler", || text_inp(&mut z.filler)); + props.add("price_per_area", || inspect_v(&mut z.price_per_area)); + } + + props.show(); + + if v != comp.zone.is_some() { + if v { + comp.zone = Some(Default::default()); + } else { + comp.zone = None; + } + } + + for ((_, amt), amount_ref) in + recipe.consumption.iter_mut().zip(consumption.iter()) + { + *amt = *amount_ref.borrow(); + } + + /* + column(|| { + inspect_v("complexity", &mut comp.recipe.complexity); + inspect_v("storage_multiplier", &mut comp.recipe.storage_multiplier); + label("consumption"); + for (name, amount) in comp.recipe.consumption.iter_mut() { + inspect_v(name, amount); + } + + label("production"); + for (name, amount) in comp.recipe.production.iter_mut() { + inspect_v(name, amount); + } + + inspect_v("n_workers", &mut comp.n_workers); + inspect_v("size", &mut comp.size); + text_inp("asset_location", &mut comp.asset_location); + inspect_v("price", &mut comp.price); + + ui_opt("zone", &mut comp.zone, |zone| { + text_inp("floor", &mut zone.floor); + text_inp("filler", &mut zone.filler); + inspect_v("price_per_area", &mut zone.price_per_area); + }); + });*/ + }); + }, + ); + } + } + } +} + +fn on_changed(v: T, f: impl FnOnce()) { + let old_v = use_state(|| None); + if old_v.get() != Some(v) { + old_v.set(Some(v)); + f(); + } +} + +struct PropertiesBuilder<'a> { + props: Vec<(&'a str, Box)>, +} + +impl<'a> PropertiesBuilder<'a> { + fn new() -> Self { + Self { props: Vec::new() } + } + + fn add(&mut self, name: &'a str, f: impl FnOnce() + 'a) { + self.props.push((name, Box::new(f))); + } + + fn show(self) { + row(|| { + column(|| { + let parent = dom().current(); + label("Properties"); + let c = Constraints { + min: Vec2::new(50.0, 50.0), + max: Vec2::new(f32::INFINITY, f32::INFINITY), + }; + Self::horiz_line(parent); + for (name, _) in &self.props { + constrained(c, || { + pad(Pad::all(3.0), || { + center(|| { + label(name.to_string()); + }); + }); + }); + Self::horiz_line(parent); + } + }); + let mut c = List::column(); + c.cross_axis_alignment = CrossAxisAlignment::Stretch; + c.show(|| { + let parent = dom().current(); + label(" "); + let c = Constraints { + min: Vec2::new(50.0, 50.0), + max: Vec2::new(f32::INFINITY, 50.0), + }; + for (_, f) in self.props { + constrained(c, || { + pad(Pad::all(3.0), || { + f(); + }); + }); + Self::horiz_line(parent); + } + }); + }); + } + + fn horiz_line(width_id: WidgetId) { + canvas(move |ctx| { + let w = ctx.layout.get(width_id).unwrap().rect.size().x; + let layout = ctx.layout.get(ctx.dom.current()).unwrap(); + + let mut r = layout.rect; + r.set_size(Vec2::new(w, 3.0)); + r.set_pos(Vec2::new(r.pos().x, r.pos().y - 3.0 / 2.0)); + let mut pr = PaintRect::new(r); + pr.color = Color::GRAY.adjust(0.8); + pr.add(ctx.paint); + }); + } +} + +trait Slidable: Copy { + fn to_f64(self) -> f64; + fn from_f64(v: f64) -> Self; +} + +macro_rules! impl_slidable { + ($($t:ty),*) => { + $( + impl Slidable for $t { + fn to_f64(self) -> f64 { + self as f64 + } + + fn from_f64(v: f64) -> Self { + v as Self + } + } + )* + }; +} + +impl_slidable!(i32, u32, i64, u64, f32, f64); + +fn inspect_v(amount: &mut T) { + let mut l = List::column(); + l.main_axis_alignment = MainAxisAlignment::Center; + l.cross_axis_alignment = CrossAxisAlignment::Stretch; + l.show(|| { + let mut slider = Slider::new((*amount).to_f64(), 1.0, 10.0); + slider.step = Some(1.0); + if let Some(v) = slider.show().value { + *amount = Slidable::from_f64(v); + } + }); +} + +fn text_inp(v: &mut String) { + center(|| { + if let Some(x) = textbox(v.clone()).into_inner().text { + *v = x; + } + }); +} + +impl Drawable for Shown { + fn draw<'a>(&'a self, gfx: &'a GfxContext, rp: &mut RenderPass<'a>) { + match self { + Shown::None | Shown::Error(_) => {} + Shown::Model((mesh, _)) => mesh.draw(gfx, rp), + Shown::Sprite(sprite) => sprite.draw(gfx, rp), + } + } + + fn draw_depth<'a>( + &'a self, + gfx: &'a GfxContext, + rp: &mut RenderPass<'a>, + shadow_cascade: Option<&Matrix4>, + ) { + match self { + Shown::None | Shown::Error(_) => {} + Shown::Model((mesh, _)) => mesh.draw_depth(gfx, rp, shadow_cascade), + Shown::Sprite(sprite) => sprite.draw_depth(gfx, rp, shadow_cascade), + } + } +} + +fn set_colresize_icon(enabled: bool) { + if enabled { + set_cursor_icon(CursorIcon::ColResize); + } else { + set_cursor_icon(CursorIcon::Default); + } +} + +#[derive(Debug)] +struct IsHovered { + hovered: bool, +} + +impl Widget for IsHovered { + type Props<'a> = (); + type Response = bool; + + fn new() -> Self { + Self { hovered: false } + } + + fn update(&mut self, _: Self::Props<'_>) -> Self::Response { + self.hovered + } + + fn event_interest(&self) -> EventInterest { + EventInterest::MOUSE_INSIDE + } + + fn event(&mut self, _: EventContext<'_>, event: &WidgetEvent) -> EventResponse { + match *event { + WidgetEvent::MouseEnter => self.hovered = true, + WidgetEvent::MouseLeave => self.hovered = false, + _ => {} + }; + EventResponse::Bubble + } +} + +pub fn combo_box(selected: &mut usize, items: &[&str]) -> bool { + let open = use_state(|| false); + let mut changed = false; + + center(|| { + let mut l = List::column(); + l.main_axis_alignment = MainAxisAlignment::Center; + l.show(|| { + if button(items[*selected].to_string()).clicked { + open.modify(|x| !x); + } + + if open.get() { + Layer::new().show(|| { + reflow(Alignment::BOTTOM_LEFT, Dim2::ZERO, || { + column(|| { + for (i, item) in items.iter().enumerate() { + if i == *selected { + continue; + } + colored_box_container(Color::BLUE, || { + if button(item.to_string()).clicked { + *selected = i; + open.set(false); + changed = true; + } + }); + } + }); + }); + }); + } + }); + }); + + changed +} diff --git a/engine/Cargo.toml b/engine/Cargo.toml index e32e1910..377c6884 100644 --- a/engine/Cargo.toml +++ b/engine/Cargo.toml @@ -10,12 +10,13 @@ edition = "2021" geom = { path = "../geom" } common = { path = "../common" } ordered-float = { workspace = true } -egui-winit = { workspace = true, default-features = false } egui = { workspace = true } -winit = { workspace = true } oddio = { workspace = true } derive_more = { workspace = true } wgpu = { version = "0.18.0", default-features = false, features=["wgsl"] } +winit = { version = "0.29.4" } +smol_str = { version = "0.2.0", features = ["serde"] } +egui-winit = { git = "https://github.com/emilk/egui", default-features = false } bytemuck = "1.7.2" image = { version = "0.24.3", default-features = false, features = ["png"] } log = "0.4.11" @@ -27,7 +28,15 @@ beul = "1.0.0" slotmapd = "1.0" smallvec = "1.10.0" inline_tweak = "1.0.8" -egui-wgpu = { version = "0.24.1" } +egui-wgpu = { git = "https://github.com/emilk/egui" } cpal = "0.15.0" lewton = "0.10.2" -serde = { version = "1.0.183", features = ["derive"] } \ No newline at end of file +serde = { version = "1.0.183", features = ["derive"] } + +yakui = { git = "https://github.com/SecondHalfGames/yakui", optional = true } +yakui-wgpu = { git = "https://github.com/SecondHalfGames/yakui", optional = true } +yakui-winit = { git = "https://github.com/SecondHalfGames/yakui", optional = true } +lazy_static = "1.4.0" + +[features] +yakui = ["dep:yakui", "dep:yakui-wgpu", "dep:yakui-winit"] \ No newline at end of file diff --git a/engine/src/egui.rs b/engine/src/egui.rs index b1e5690a..523f9d32 100644 --- a/engine/src/egui.rs +++ b/engine/src/egui.rs @@ -3,13 +3,13 @@ use egui::TextureId; use egui_wgpu::renderer; use egui_wgpu::renderer::ScreenDescriptor; use winit::event_loop::EventLoopWindowTarget; +use winit::window::Window; /// EguiWrapper is a wrapper around egui and egui_wgpu /// It handles the rendering of the UI pub struct EguiWrapper { - pub egui: egui::Context, pub renderer: renderer::Renderer, - platform: egui_winit::State, + pub platform: egui_winit::State, pub last_mouse_captured: bool, pub last_kb_captured: bool, pub to_remove: Vec, @@ -20,13 +20,12 @@ impl EguiWrapper { pub fn new(gfx: &GfxContext, el: &EventLoopWindowTarget<()>) -> Self { let egui = egui::Context::default(); - let platform = - egui_winit::State::new(egui.viewport_id(), el, Some(gfx.size.2 as f32), None); + let viewport_id = egui.viewport_id(); + let platform = egui_winit::State::new(egui, viewport_id, el, Some(gfx.size.2 as f32), None); let renderer = renderer::Renderer::new(&gfx.device, gfx.fbos.format, None, 1); Self { - egui, renderer, last_mouse_captured: false, last_kb_captured: false, @@ -38,35 +37,34 @@ impl EguiWrapper { pub fn render( &mut self, - gfx: GuiRenderContext<'_, '_>, + gfx: GuiRenderContext<'_>, ui_render: impl for<'ui> FnOnce(&'ui egui::Context), ) { for id in self.to_remove.drain(..) { self.renderer.free_texture(&id); } - let rinput = self.platform.take_egui_input(gfx.window); - self.egui.set_zoom_factor(self.zoom_factor); + let rinput = self.platform.take_egui_input(&gfx.gfx.window); + let egui = self.platform.egui_ctx(); + egui.set_zoom_factor(self.zoom_factor); - let output = self.egui.run(rinput, |ctx| { + let output = egui.run(rinput, |ctx| { ui_render(ctx); }); - let clipped_primitives = self - .egui - .tessellate(output.shapes, self.egui.pixels_per_point()); + let clipped_primitives = egui.tessellate(output.shapes, egui.pixels_per_point()); //let mut rpass = gfx.rpass.take().unwrap(); for (id, delta) in output.textures_delta.set { self.renderer - .update_texture(gfx.device, gfx.queue, id, &delta); + .update_texture(&gfx.gfx.device, &gfx.gfx.queue, id, &delta); } let desc = ScreenDescriptor { size_in_pixels: [gfx.size.0, gfx.size.1], - pixels_per_point: self.egui.pixels_per_point(), + pixels_per_point: egui.pixels_per_point(), }; self.renderer.update_buffers( - gfx.device, - gfx.queue, + &gfx.gfx.device, + &gfx.gfx.queue, gfx.encoder, &clipped_primitives, &desc, @@ -92,27 +90,26 @@ impl EguiWrapper { self.renderer .render(&mut render_pass, &clipped_primitives, &desc); - //} self.platform - .handle_platform_output(gfx.window, &self.egui, output.platform_output); + .handle_platform_output(&gfx.gfx.window, output.platform_output); - self.last_mouse_captured = self.egui.wants_pointer_input(); - self.last_kb_captured = self.egui.wants_keyboard_input(); + self.last_mouse_captured = self.platform.egui_ctx().wants_pointer_input(); + self.last_kb_captured = self.platform.egui_ctx().wants_keyboard_input(); } - pub fn handle_event(&mut self, e: &winit::event::WindowEvent<'_>) { - if let winit::event::WindowEvent::KeyboardInput { - input: - winit::event::KeyboardInput { - virtual_keycode: Some(winit::event::VirtualKeyCode::Tab), - .. - }, - .. - } = e - { - return; - } - let _ = self.platform.on_window_event(&self.egui, e); + pub fn handle_event(&mut self, window: &Window, e: &winit::event::WindowEvent) { + //if let winit::event::WindowEvent::KeyboardInput { + // input: + // winit::event::KeyboardInput { + // virtual_keycode: Some(winit::event::VirtualKeyCode::Tab), + // .. + // }, + // .. + //} = e + //{ + // return; + //} + let _ = self.platform.on_window_event(window, e); } } diff --git a/engine/src/framework.rs b/engine/src/framework.rs index 7bdc6d9d..f325beb8 100644 --- a/engine/src/framework.rs +++ b/engine/src/framework.rs @@ -1,5 +1,5 @@ use crate::egui::EguiWrapper; -use crate::{AudioContext, FrameContext, GfxContext, InputContext}; +use crate::{get_cursor_icon, AudioContext, FrameContext, GfxContext, InputContext}; use std::mem::ManuallyDrop; use std::time::Instant; use winit::dpi::PhysicalSize; @@ -30,6 +30,10 @@ pub trait State: 'static { /// Called every frame to prepare the gui rendering. fn render_gui(&mut self, ui: &egui::Context) {} + + /// Called every frame to prepare the gui rendering. + #[cfg(feature = "yakui")] + fn render_yakui(&mut self) {} } async fn run(el: EventLoop<()>, window: Window) { @@ -43,8 +47,13 @@ async fn run(el: EventLoop<()>, window: Window) { let mut new_size: Option<(PhysicalSize, f64)> = None; let mut last_update = Instant::now(); - el.run(move |event, _, control_flow| { - *control_flow = ControlFlow::Poll; + el.run(move |event, target| { + target.set_control_flow(ControlFlow::Poll); + #[cfg(feature = "yakui")] + if ctx.yakui.handle_event(&event) { + return; + } + match event { Event::DeviceEvent { event, @@ -53,7 +62,8 @@ async fn run(el: EventLoop<()>, window: Window) { ctx.input.handle_device(&event); } Event::WindowEvent { event, .. } => { - ctx.egui.handle_event(&event); + ctx.egui.handle_event(&ctx.gfx.window, &event); + ctx.input.handle(&event); match event { @@ -64,22 +74,22 @@ async fn run(el: EventLoop<()>, window: Window) { } WindowEvent::ScaleFactorChanged { scale_factor: sf, - new_inner_size + .. } => { log::info!("scale_factor: {:?}", scale_factor); scale_factor = sf; - new_size = Some((*new_inner_size, scale_factor)); + new_size = Some((PhysicalSize::new(ctx.gfx.size.0, ctx.gfx.size.1), scale_factor)); frame.take().map(|v| ManuallyDrop::into_inner(v)); } WindowEvent::CloseRequested => { if state.exit() { - *control_flow = ControlFlow::Exit; + target.exit(); } }, _ => (), } } - Event::MainEventsCleared => match frame.take() { + Event::AboutToWait => match frame.take() { None => { if let Some((new_size, sf)) = new_size.take() { if new_size.height != 0 || new_size.width != 0 { @@ -126,8 +136,13 @@ async fn run(el: EventLoop<()>, window: Window) { let (mut enc, view) = ctx.gfx.start_frame(&sco); ctx.gfx.render_objs(&mut enc, &view, |fc| state.render(fc)); - ctx.gfx - .render_gui(&mut enc, &view, |gctx| { + #[allow(unused_mut)] + ctx.gfx + .render_gui(&mut enc, &view, |mut gctx| { + #[cfg(feature = "yakui")] + ctx.yakui.render(&mut gctx, || { + state.render_yakui(); + }); ctx.egui.render(gctx, |ui| { state.render_gui(ui); }); @@ -135,16 +150,18 @@ async fn run(el: EventLoop<()>, window: Window) { ctx.gfx.finish_frame(enc); sco.present(); + ctx.gfx.window.set_cursor_icon(get_cursor_icon()); + ctx.input.end_frame(); } }, _ => (), } - }) + }).expect("Failed to run event loop"); } pub fn start() { - let el = EventLoop::new(); + let el = EventLoop::new().expect("Failed to create event loop"); #[cfg(target_arch = "wasm32")] { @@ -215,6 +232,8 @@ pub struct Context { pub audio: AudioContext, pub delta: f32, pub egui: EguiWrapper, + #[cfg(feature = "yakui")] + pub yakui: crate::yakui::YakuiWrapper, } impl Context { @@ -225,11 +244,13 @@ impl Context { let egui = EguiWrapper::new(&gfx, el); Self { - gfx, input, audio, delta: 0.0, egui, + #[cfg(feature = "yakui")] + yakui: crate::yakui::YakuiWrapper::new(&gfx, &gfx.window), + gfx, } } } diff --git a/engine/src/gfx.rs b/engine/src/gfx.rs index 3706a98b..abe228c3 100644 --- a/engine/src/gfx.rs +++ b/engine/src/gfx.rs @@ -215,14 +215,11 @@ impl Default for RenderParams { u8slice_impl!(RenderParams); -pub struct GuiRenderContext<'a, 'b> { - pub window: &'a Window, +pub struct GuiRenderContext<'a> { + pub gfx: &'a mut GfxContext, pub encoder: &'a mut CommandEncoder, pub view: &'a TextureView, pub size: (u32, u32, f64), - pub device: &'a Device, - pub queue: &'a Queue, - pub rpass: Option>, } pub struct FrameContext<'a> { @@ -776,17 +773,14 @@ impl GfxContext { &mut self, encoders: &mut Encoders, frame: &TextureView, - mut render_gui: impl FnMut(GuiRenderContext<'_, '_>), + mut render_gui: impl FnMut(GuiRenderContext<'_>), ) { profiling::scope!("gfx::render_gui"); render_gui(GuiRenderContext { - window: &self.window, + size: self.size, + gfx: self, encoder: &mut encoders.end, view: frame, - size: self.size, - device: &self.device, - queue: &self.queue, - rpass: None, }); } diff --git a/engine/src/input.rs b/engine/src/input.rs index 27143ff7..d7c900f7 100644 --- a/engine/src/input.rs +++ b/engine/src/input.rs @@ -1,10 +1,25 @@ use common::FastSet; use geom::{vec2, Vec2}; +use lazy_static::lazy_static; use serde::{Deserialize, Serialize}; use std::fmt::Debug; -use winit::event::{ - ElementState, KeyboardInput, MouseScrollDelta, ScanCode, VirtualKeyCode, WindowEvent, -}; +use std::sync::{Arc, Mutex}; +use winit::event::{ElementState, KeyEvent, MouseScrollDelta, WindowEvent}; +use winit::keyboard::{NamedKey, PhysicalKey, SmolStr}; +use winit::platform::scancode::PhysicalKeyExtScancode; +use winit::window::CursorIcon; + +lazy_static! { + static ref CURSOR_ICON: Arc> = Arc::new(Mutex::new(CursorIcon::Default)); +} + +pub fn set_cursor_icon(icon: CursorIcon) { + *CURSOR_ICON.lock().unwrap() = icon; +} + +pub fn get_cursor_icon() -> CursorIcon { + *CURSOR_ICON.lock().unwrap() +} #[derive(Default)] pub struct InputContext { @@ -31,35 +46,45 @@ impl InputContext { } } - pub fn handle(&mut self, event: &WindowEvent<'_>) -> bool { + pub fn handle(&mut self, event: &WindowEvent) -> bool { match event { - WindowEvent::ReceivedCharacter(c) => { - self.keyboard.last_characters.push(*c); - true - } WindowEvent::CursorLeft { .. } => { self.cursor_left = true; true } WindowEvent::KeyboardInput { - input: - KeyboardInput { + event: + KeyEvent { + text, + logical_key, + physical_key, state, - virtual_keycode: Some(kc), - scancode, .. }, .. } => { - let code = KeyCode::from(*kc); + if let Some(k) = text { + self.keyboard.last_characters.extend(k.chars()); + } + + let code = Key::from(logical_key.clone()); match state { ElementState::Pressed => { self.keyboard.pressed.insert(code); - self.keyboard.pressed_scancode.insert(*scancode); + + if let PhysicalKey::Code(scancode) = physical_key { + self.keyboard + .pressed_scancode + .insert(scancode.to_scancode().unwrap_or(0)); + } } ElementState::Released => { self.keyboard.pressed.remove(&code); - self.keyboard.pressed_scancode.remove(scancode); + if let PhysicalKey::Code(scancode) = physical_key { + self.keyboard + .pressed_scancode + .remove(&scancode.to_scancode().unwrap_or(0)); + } } }; true @@ -109,8 +134,8 @@ pub struct MouseInfo { #[derive(Clone, Default)] pub struct KeyboardInfo { - pub pressed: FastSet, - pub pressed_scancode: FastSet, + pub pressed: FastSet, + pub pressed_scancode: FastSet, pub last_characters: Vec, } @@ -121,176 +146,75 @@ impl From for MouseButton { winit::event::MouseButton::Right => MouseButton::Right, winit::event::MouseButton::Middle => MouseButton::Middle, winit::event::MouseButton::Other(v) => MouseButton::Other(v), + winit::event::MouseButton::Back => MouseButton::Other(4), + winit::event::MouseButton::Forward => MouseButton::Other(5), } } } -impl From for KeyCode { - fn from(x: VirtualKeyCode) -> KeyCode { +impl From for Key { + fn from(x: winit::keyboard::Key) -> Key { match x { - VirtualKeyCode::Key1 => KeyCode::Key1, - VirtualKeyCode::Key2 => KeyCode::Key2, - VirtualKeyCode::Key3 => KeyCode::Key3, - VirtualKeyCode::Key4 => KeyCode::Key4, - VirtualKeyCode::Key5 => KeyCode::Key5, - VirtualKeyCode::Key6 => KeyCode::Key6, - VirtualKeyCode::Key7 => KeyCode::Key7, - VirtualKeyCode::Key8 => KeyCode::Key8, - VirtualKeyCode::Key9 => KeyCode::Key9, - VirtualKeyCode::Key0 => KeyCode::Key0, - VirtualKeyCode::A => KeyCode::A, - VirtualKeyCode::B => KeyCode::B, - VirtualKeyCode::C => KeyCode::C, - VirtualKeyCode::D => KeyCode::D, - VirtualKeyCode::E => KeyCode::E, - VirtualKeyCode::F => KeyCode::F, - VirtualKeyCode::G => KeyCode::G, - VirtualKeyCode::H => KeyCode::H, - VirtualKeyCode::I => KeyCode::I, - VirtualKeyCode::J => KeyCode::J, - VirtualKeyCode::K => KeyCode::K, - VirtualKeyCode::L => KeyCode::L, - VirtualKeyCode::M => KeyCode::M, - VirtualKeyCode::N => KeyCode::N, - VirtualKeyCode::O => KeyCode::O, - VirtualKeyCode::P => KeyCode::P, - VirtualKeyCode::Q => KeyCode::Q, - VirtualKeyCode::R => KeyCode::R, - VirtualKeyCode::S => KeyCode::S, - VirtualKeyCode::T => KeyCode::T, - VirtualKeyCode::U => KeyCode::U, - VirtualKeyCode::V => KeyCode::V, - VirtualKeyCode::W => KeyCode::W, - VirtualKeyCode::X => KeyCode::X, - VirtualKeyCode::Y => KeyCode::Y, - VirtualKeyCode::Z => KeyCode::Z, - VirtualKeyCode::Escape => KeyCode::Escape, - VirtualKeyCode::F1 => KeyCode::F1, - VirtualKeyCode::F2 => KeyCode::F2, - VirtualKeyCode::F3 => KeyCode::F3, - VirtualKeyCode::F4 => KeyCode::F4, - VirtualKeyCode::F5 => KeyCode::F5, - VirtualKeyCode::F6 => KeyCode::F6, - VirtualKeyCode::F7 => KeyCode::F7, - VirtualKeyCode::F8 => KeyCode::F8, - VirtualKeyCode::F9 => KeyCode::F9, - VirtualKeyCode::F10 => KeyCode::F10, - VirtualKeyCode::F11 => KeyCode::F11, - VirtualKeyCode::F12 => KeyCode::F12, - VirtualKeyCode::F13 => KeyCode::F13, - VirtualKeyCode::F14 => KeyCode::F14, - VirtualKeyCode::F15 => KeyCode::F15, - VirtualKeyCode::F16 => KeyCode::F16, - VirtualKeyCode::F17 => KeyCode::F17, - VirtualKeyCode::F18 => KeyCode::F18, - VirtualKeyCode::F19 => KeyCode::F19, - VirtualKeyCode::F20 => KeyCode::F20, - VirtualKeyCode::F21 => KeyCode::F21, - VirtualKeyCode::F22 => KeyCode::F22, - VirtualKeyCode::F23 => KeyCode::F23, - VirtualKeyCode::Snapshot => KeyCode::Snapshot, - VirtualKeyCode::F24 => KeyCode::F24, - VirtualKeyCode::Scroll => KeyCode::Scroll, - VirtualKeyCode::Pause => KeyCode::Pause, - VirtualKeyCode::Insert => KeyCode::Insert, - VirtualKeyCode::Home => KeyCode::Home, - VirtualKeyCode::Delete => KeyCode::Delete, - VirtualKeyCode::End => KeyCode::End, - VirtualKeyCode::PageDown => KeyCode::PageDown, - VirtualKeyCode::PageUp => KeyCode::PageUp, - VirtualKeyCode::Left => KeyCode::Left, - VirtualKeyCode::Up => KeyCode::Up, - VirtualKeyCode::Right => KeyCode::Right, - VirtualKeyCode::Down => KeyCode::Down, - VirtualKeyCode::Back => KeyCode::Backspace, - VirtualKeyCode::Return => KeyCode::Return, - VirtualKeyCode::Space => KeyCode::Space, - VirtualKeyCode::Compose => KeyCode::Compose, - VirtualKeyCode::Caret => KeyCode::Caret, - VirtualKeyCode::Numlock => KeyCode::Numlock, - VirtualKeyCode::Numpad0 => KeyCode::Numpad0, - VirtualKeyCode::Numpad1 => KeyCode::Numpad1, - VirtualKeyCode::Numpad2 => KeyCode::Numpad2, - VirtualKeyCode::Numpad3 => KeyCode::Numpad3, - VirtualKeyCode::Numpad4 => KeyCode::Numpad4, - VirtualKeyCode::Numpad5 => KeyCode::Numpad5, - VirtualKeyCode::Numpad6 => KeyCode::Numpad6, - VirtualKeyCode::Numpad7 => KeyCode::Numpad7, - VirtualKeyCode::Numpad8 => KeyCode::Numpad8, - VirtualKeyCode::Numpad9 => KeyCode::Numpad9, - VirtualKeyCode::AbntC1 => KeyCode::AbntC1, - VirtualKeyCode::AbntC2 => KeyCode::AbntC2, - VirtualKeyCode::NumpadAdd => KeyCode::Add, - VirtualKeyCode::Apostrophe => KeyCode::Apostrophe, - VirtualKeyCode::Apps => KeyCode::Apps, - VirtualKeyCode::At => KeyCode::At, - VirtualKeyCode::Ax => KeyCode::Ax, - VirtualKeyCode::Backslash => KeyCode::Backslash, - VirtualKeyCode::Calculator => KeyCode::Calculator, - VirtualKeyCode::Capital => KeyCode::Capital, - VirtualKeyCode::Colon => KeyCode::Colon, - VirtualKeyCode::Comma => KeyCode::Comma, - VirtualKeyCode::Convert => KeyCode::Convert, - VirtualKeyCode::NumpadDecimal => KeyCode::Decimal, - VirtualKeyCode::NumpadDivide => KeyCode::Divide, - VirtualKeyCode::Equals => KeyCode::Equals, - VirtualKeyCode::Grave => KeyCode::Grave, - VirtualKeyCode::Kana => KeyCode::Kana, - VirtualKeyCode::Kanji => KeyCode::Kanji, - VirtualKeyCode::LAlt => KeyCode::LAlt, - VirtualKeyCode::LBracket => KeyCode::LBracket, - VirtualKeyCode::LControl => KeyCode::LControl, - VirtualKeyCode::LShift => KeyCode::LShift, - VirtualKeyCode::LWin => KeyCode::LWin, - VirtualKeyCode::Mail => KeyCode::Mail, - VirtualKeyCode::MediaSelect => KeyCode::MediaSelect, - VirtualKeyCode::MediaStop => KeyCode::MediaStop, - VirtualKeyCode::Minus => KeyCode::Minus, - VirtualKeyCode::NumpadMultiply => KeyCode::Multiply, - VirtualKeyCode::Mute => KeyCode::Mute, - VirtualKeyCode::MyComputer => KeyCode::MyComputer, - VirtualKeyCode::NavigateForward => KeyCode::NavigateForward, - VirtualKeyCode::NavigateBackward => KeyCode::NavigateBackward, - VirtualKeyCode::NextTrack => KeyCode::NextTrack, - VirtualKeyCode::NoConvert => KeyCode::NoConvert, - VirtualKeyCode::NumpadComma => KeyCode::NumpadComma, - VirtualKeyCode::NumpadEnter => KeyCode::NumpadEnter, - VirtualKeyCode::NumpadEquals => KeyCode::NumpadEquals, - VirtualKeyCode::OEM102 => KeyCode::OEM102, - VirtualKeyCode::Period => KeyCode::Period, - VirtualKeyCode::PlayPause => KeyCode::PlayPause, - VirtualKeyCode::Power => KeyCode::Power, - VirtualKeyCode::PrevTrack => KeyCode::PrevTrack, - VirtualKeyCode::RAlt => KeyCode::RAlt, - VirtualKeyCode::RBracket => KeyCode::RBracket, - VirtualKeyCode::RControl => KeyCode::RControl, - VirtualKeyCode::RShift => KeyCode::RShift, - VirtualKeyCode::RWin => KeyCode::RWin, - VirtualKeyCode::Semicolon => KeyCode::Semicolon, - VirtualKeyCode::Slash => KeyCode::Slash, - VirtualKeyCode::Sleep => KeyCode::Sleep, - VirtualKeyCode::Stop => KeyCode::Stop, - VirtualKeyCode::NumpadSubtract => KeyCode::Subtract, - VirtualKeyCode::Sysrq => KeyCode::Sysrq, - VirtualKeyCode::Tab => KeyCode::Tab, - VirtualKeyCode::Underline => KeyCode::Underline, - VirtualKeyCode::Unlabeled => KeyCode::Unlabeled, - VirtualKeyCode::VolumeDown => KeyCode::VolumeDown, - VirtualKeyCode::VolumeUp => KeyCode::VolumeUp, - VirtualKeyCode::Wake => KeyCode::Wake, - VirtualKeyCode::WebBack => KeyCode::WebBack, - VirtualKeyCode::WebFavorites => KeyCode::WebFavorites, - VirtualKeyCode::WebForward => KeyCode::WebForward, - VirtualKeyCode::WebHome => KeyCode::WebHome, - VirtualKeyCode::WebRefresh => KeyCode::WebRefresh, - VirtualKeyCode::WebSearch => KeyCode::WebSearch, - VirtualKeyCode::WebStop => KeyCode::WebStop, - VirtualKeyCode::Yen => KeyCode::Yen, - VirtualKeyCode::Copy => KeyCode::Copy, - VirtualKeyCode::Paste => KeyCode::Paste, - VirtualKeyCode::Cut => KeyCode::Cut, - VirtualKeyCode::Plus => KeyCode::Plus, - VirtualKeyCode::Asterisk => KeyCode::Asterisk, + winit::keyboard::Key::Named(named) => match named { + NamedKey::Escape => Key::Escape, + NamedKey::F1 => Key::F1, + NamedKey::F2 => Key::F2, + NamedKey::F3 => Key::F3, + NamedKey::F4 => Key::F4, + NamedKey::F5 => Key::F5, + NamedKey::F6 => Key::F6, + NamedKey::F7 => Key::F7, + NamedKey::F8 => Key::F8, + NamedKey::F9 => Key::F9, + NamedKey::F10 => Key::F10, + NamedKey::F11 => Key::F11, + NamedKey::F12 => Key::F12, + NamedKey::F13 => Key::F13, + NamedKey::F14 => Key::F14, + NamedKey::F15 => Key::F15, + NamedKey::F16 => Key::F16, + NamedKey::F17 => Key::F17, + NamedKey::F18 => Key::F18, + NamedKey::F19 => Key::F19, + NamedKey::F20 => Key::F20, + NamedKey::F21 => Key::F21, + NamedKey::F22 => Key::F22, + NamedKey::F23 => Key::F23, + NamedKey::F24 => Key::F24, + NamedKey::Pause => Key::Pause, + NamedKey::Insert => Key::Insert, + NamedKey::Home => Key::Home, + NamedKey::Delete => Key::Delete, + NamedKey::End => Key::End, + NamedKey::PageDown => Key::PageDown, + NamedKey::PageUp => Key::PageUp, + NamedKey::ArrowLeft => Key::Left, + NamedKey::ArrowUp => Key::Up, + NamedKey::ArrowRight => Key::Right, + NamedKey::ArrowDown => Key::Down, + NamedKey::Backspace => Key::Backspace, + NamedKey::Enter => Key::Return, + NamedKey::Space => Key::Space, + NamedKey::Compose => Key::Compose, + NamedKey::NumLock => Key::Numlock, + NamedKey::Convert => Key::Convert, + NamedKey::MediaPlayPause => Key::MediaSelect, + NamedKey::MediaStop => Key::MediaStop, + NamedKey::Power => Key::Power, + NamedKey::Tab => Key::Tab, + NamedKey::Copy => Key::Copy, + NamedKey::Paste => Key::Paste, + NamedKey::Cut => Key::Cut, + NamedKey::Control => Key::Control, + NamedKey::Shift => Key::Shift, + NamedKey::Alt => Key::Alt, + NamedKey::PrintScreen => Key::PrintScreen, + NamedKey::ScrollLock => Key::ScrollLock, + _ => Key::Unlabeled, + }, + winit::keyboard::Key::Character(c) => Key::Char(SmolStr::new(c.to_uppercase())), + winit::keyboard::Key::Unidentified(_) => Key::Unlabeled, + winit::keyboard::Key::Dead(_) => Key::Unlabeled, } } } @@ -303,58 +227,25 @@ pub enum MouseButton { Other(u16), } -impl KeyCode { +impl Key { #[allow(dead_code)] fn is_modifier(&self) -> bool { - use KeyCode::*; - matches!(self, LShift | RShift | LControl | RControl | LAlt | RAlt) + use Key::*; + matches!(self, Control | Shift | Alt) + } + + pub const fn c(s: &str) -> Key { + Key::Char(SmolStr::new_inline(s)) } } /// Symbolic name for a keyboard key. -#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] -#[repr(u32)] -#[serde(from = "u32", into = "u32")] -pub enum KeyCode { - Key1, - Key2, - Key3, - Key4, - Key5, - Key6, - Key7, - Key8, - Key9, - Key0, - - A, - B, - C, - D, - E, - F, - G, - H, - I, - J, - K, - L, - M, - N, - O, - P, - Q, - R, - S, - T, - U, - V, - W, - X, - Y, - Z, +/// We copy this from winit because we want to serialize it without implementing serialize for ALL +/// of winit's structs which would eat up compile time. +#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] +pub enum Key { + Char(SmolStr), - /// The Escape key, next to F1. Escape, F1, @@ -382,14 +273,10 @@ pub enum KeyCode { F23, F24, - /// Print Screen/SysRq. - Snapshot, - /// Scroll Lock. - Scroll, - /// Pause/Break key, next to Scroll lock. + PrintScreen, + ScrollLock, Pause, - /// `Insert`, next to Backspace. Insert, Home, Delete, @@ -402,120 +289,25 @@ pub enum KeyCode { Right, Down, - /// The Backspace key, right over Enter. Backspace, - /// The Enter key. Return, - /// The space bar. Space, - /// The "Compose" key on Linux. Compose, - Caret, - - Plus, - Asterisk, - Numlock, - Numpad0, - Numpad1, - Numpad2, - Numpad3, - Numpad4, - Numpad5, - Numpad6, - Numpad7, - Numpad8, - Numpad9, - AbntC1, - AbntC2, - Add, - Apostrophe, - Apps, - At, - Ax, - Backslash, - Calculator, - Capital, - Colon, - Comma, Convert, - Decimal, - Divide, - Equals, - Grave, - Kana, - Kanji, - LAlt, - LBracket, - LControl, - LShift, - LWin, - Mail, + Alt, + Control, + Shift, MediaSelect, MediaStop, - Minus, - Multiply, Mute, - MyComputer, - NavigateForward, // also called "Prior" - NavigateBackward, // also called "Next" - NextTrack, - NoConvert, - NumpadComma, - NumpadEnter, - NumpadEquals, - OEM102, - Period, - PlayPause, Power, - PrevTrack, - RAlt, - RBracket, - RControl, - RShift, - RWin, - Semicolon, - Slash, - Sleep, - Stop, - Subtract, - Sysrq, Tab, - Underline, Unlabeled, - VolumeDown, - VolumeUp, - Wake, - WebBack, - WebFavorites, - WebForward, - WebHome, - WebRefresh, - WebSearch, - WebStop, - Yen, Copy, Paste, Cut, - - LastValue, -} - -impl From for KeyCode { - fn from(x: u32) -> Self { - if x <= KeyCode::LastValue as u32 { - unsafe { std::mem::transmute(x) } - } else { - KeyCode::Unlabeled - } - } -} - -impl From for u32 { - fn from(x: KeyCode) -> Self { - x as u32 - } } diff --git a/engine/src/lib.rs b/engine/src/lib.rs index 135cc566..90d2e558 100644 --- a/engine/src/lib.rs +++ b/engine/src/lib.rs @@ -23,6 +23,9 @@ mod texture; mod uniform; mod vertex_types; +#[cfg(feature = "yakui")] +pub mod yakui; + pub use audio::*; pub use drawables::*; pub use framework::Context; @@ -40,8 +43,8 @@ pub use u8slice::*; pub use uniform::*; pub use vertex_types::*; -pub use winit::event::ScanCode; pub use winit::window::CursorGrabMode; +pub use winit::window::CursorIcon; pub use image; pub use wgpu; diff --git a/engine/src/yakui.rs b/engine/src/yakui.rs new file mode 100644 index 00000000..f38ba43e --- /dev/null +++ b/engine/src/yakui.rs @@ -0,0 +1,55 @@ +use crate::{GfxContext, GuiRenderContext}; +use wgpu::TextureFormat; +use winit::window::Window; +use yakui::Yakui; + +pub struct YakuiWrapper { + pub yakui: Yakui, + pub renderer: yakui_wgpu::YakuiWgpu, + platform: yakui_winit::YakuiWinit, + pub zoom_factor: f32, + pub format: TextureFormat, +} + +impl YakuiWrapper { + pub fn new(gfx: &GfxContext, el: &Window) -> Self { + let yakui = Yakui::new(); + + let platform = yakui_winit::YakuiWinit::new(el); + + let renderer = yakui_wgpu::YakuiWgpu::new(&gfx.device, &gfx.queue); + + Self { + yakui, + renderer, + platform, + zoom_factor: 1.0, + format: gfx.fbos.format, + } + } + + pub fn render(&mut self, gfx: &mut GuiRenderContext<'_>, ui_render: impl for<'ui> FnOnce()) { + self.yakui.set_scale_factor(self.zoom_factor); + + self.yakui.start(); + ui_render(); + self.yakui.finish(); + + self.renderer.paint_with_encoder( + &mut self.yakui, + &gfx.gfx.device, + &gfx.gfx.queue, + gfx.encoder, + yakui_wgpu::SurfaceInfo { + format: self.format, + sample_count: gfx.gfx.samples, + color_attachment: &gfx.gfx.fbos.color_msaa, + resolve_target: Some(&gfx.view), + }, + ); + } + + pub fn handle_event(&mut self, e: &winit::event::Event<()>) -> bool { + self.platform.handle_event(&mut self.yakui, e) + } +} diff --git a/engine_demo/src/main.rs b/engine_demo/src/main.rs index ef90f0ae..eb017fb8 100644 --- a/engine_demo/src/main.rs +++ b/engine_demo/src/main.rs @@ -1,7 +1,7 @@ use common::{AudioKind, History}; use engine::meshload::load_mesh; use engine::{ - Context, FrameContext, GfxSettings, InstancedMeshBuilder, KeyCode, MeshInstance, MouseButton, + Context, FrameContext, GfxSettings, InstancedMeshBuilder, Key, MeshInstance, MouseButton, ShadowQuality, }; use geom::{ @@ -235,7 +235,7 @@ impl State { self.is_captured = false; } - if ctx.input.keyboard.pressed.contains(&KeyCode::Escape) { + if ctx.input.keyboard.pressed.contains(&Key::Escape) { let _ = ctx.gfx.window.set_cursor_grab(engine::CursorGrabMode::None); ctx.gfx.window.set_cursor_visible(true); self.is_captured = false; diff --git a/native_app/Cargo.toml b/native_app/Cargo.toml index 4c9d754b..491a6af8 100644 --- a/native_app/Cargo.toml +++ b/native_app/Cargo.toml @@ -17,7 +17,6 @@ egui_extras = { workspace = true } egui_plot = { workspace = true } flat_spatial = { workspace = true } ordered-float = { workspace = true } -winit = { workspace = true } oddio = { workspace = true } log = { version = "0.4.11", features=["max_level_info", "release_max_level_info"] } inline_tweak = "1.0.6" diff --git a/native_app/src/game_loop.rs b/native_app/src/game_loop.rs index 440c052b..f803d43e 100644 --- a/native_app/src/game_loop.rs +++ b/native_app/src/game_loop.rs @@ -40,7 +40,7 @@ impl engine::framework::State for State { fn new(ctx: &mut Context) -> Self { let camera = OrbitCamera::load((ctx.gfx.size.0, ctx.gfx.size.1)); - Gui::set_style(&ctx.egui.egui); + Gui::set_style(ctx.egui.platform.egui_ctx()); log::info!("loaded egui_render"); let sim: Simulation = @@ -59,7 +59,7 @@ impl engine::framework::State for State { uiworld.write::().build_input_tree(&mut bindings); drop(bindings); - uiworld.insert(UiTextures::new(&mut ctx.egui.egui)); + uiworld.insert(UiTextures::new(&mut ctx.egui.platform.egui_ctx().clone())); let gui: Gui = common::saveload::JSON::load("gui").unwrap_or_default(); uiworld.insert(camera.camera); diff --git a/native_app/src/gui/windows/settings.rs b/native_app/src/gui/windows/settings.rs index c34619a5..e42e99c6 100644 --- a/native_app/src/gui/windows/settings.rs +++ b/native_app/src/gui/windows/settings.rs @@ -232,7 +232,7 @@ pub fn settings(window: egui::Window<'_>, ui: &Context, uiworld: &mut UiWorld, _ } }); - let mut sorted_inps = bindings.0.keys().copied().collect::>(); + let mut sorted_inps = bindings.0.keys().cloned().collect::>(); sorted_inps.sort(); egui_extras::TableBuilder::new(ui) diff --git a/native_app/src/inputmap.rs b/native_app/src/inputmap.rs index 937853b1..946f649f 100644 --- a/native_app/src/inputmap.rs +++ b/native_app/src/inputmap.rs @@ -1,6 +1,5 @@ use common::{FastMap, FastSet}; -use engine::ScanCode; -use engine::{InputContext, KeyCode, MouseButton}; +use engine::{InputContext, Key, MouseButton}; use geom::{Ray3, Vec2, Vec3}; use std::collections::hash_map::Entry; use std::collections::{BTreeMap, HashSet}; @@ -10,16 +9,16 @@ use std::fmt::{Debug, Display, Formatter}; #[derive(Serialize, Deserialize)] pub struct InputCombinations(pub Vec); -#[derive(Copy, Clone, Hash, Eq, PartialEq, Ord, PartialOrd, Serialize, Deserialize)] +#[derive(Clone, Hash, Eq, PartialEq, Ord, PartialOrd, Serialize, Deserialize)] enum UnitInput { - Key(KeyCode), - KeyScan(ScanCode), + Key(Key), + KeyScan(u32), Mouse(MouseButton), WheelUp, WheelDown, } -#[derive(Copy, Clone, Hash, Eq, PartialEq, Ord, PartialOrd, Serialize, Deserialize)] +#[derive(Clone, Hash, Eq, PartialEq, Ord, PartialOrd, Serialize, Deserialize)] pub enum InputAction { GoLeft, GoRight, @@ -77,7 +76,7 @@ pub struct InputMap { pub struct Bindings(pub BTreeMap); use InputAction::*; -use KeyCode as K; +use Key as K; use MouseButton::*; use UnitInput::*; @@ -89,31 +88,31 @@ const DEFAULT_BINDINGS: &[(InputAction, &[&[UnitInput]])] = &[ (GoLeft, &[&[KeyScan(30)], &[Key(K::Left)]]), (GoRight, &[&[KeyScan(32)], &[Key(K::Right)]]), (CameraRotate, &[&[Mouse(Right)]]), - (CameraMove, &[&[Key(K::LShift), Mouse(Right)], &[Mouse(Middle)]]), - (Zoom, &[&[Key(K::Plus)], &[WheelUp]]), - (Dezoom, &[&[Key(K::Minus)], &[WheelDown]]), - (Rotate, &[&[Key(K::LControl), WheelUp], &[Key(K::LControl), WheelDown]]), - (SizeUp, &[&[Key(K::LControl), WheelUp]]), - (SizeDown, &[&[Key(K::LControl), WheelDown]]), + (CameraMove, &[&[Key(K::Shift), Mouse(Right)], &[Mouse(Middle)]]), + (Zoom, &[&[Key(K::c("+"))], &[WheelUp]]), + (Dezoom, &[&[Key(K::c("-"))], &[WheelDown]]), + (Rotate, &[&[Key(K::Control), WheelUp], &[Key(K::Control), WheelDown]]), + (SizeUp, &[&[Key(K::Control), WheelUp]]), + (SizeDown, &[&[Key(K::Control), WheelDown]]), (Close, &[&[Key(K::Escape)]]), (Select, &[&[Mouse(Left)]]), - (SecondarySelect, &[&[Key(K::LControl), Mouse(Left)]]), - (NoSnapping, &[&[Key(K::LControl)]]), - (HideInterface, &[&[Key(K::H)]]), - (UpElevation, &[&[Key(K::LControl), WheelUp]]), - (DownElevation, &[&[Key(K::LControl), WheelDown]]), - (OpenEconomyMenu, &[&[Key(K::E)]]), + (SecondarySelect, &[&[Key(K::Control), Mouse(Left)]]), + (NoSnapping, &[&[Key(K::Control)]]), + (HideInterface, &[&[Key(K::c("H"))]]), + (UpElevation, &[&[Key(K::Control), WheelUp]]), + (DownElevation, &[&[Key(K::Control), WheelDown]]), + (OpenEconomyMenu, &[&[Key(K::c("E"))]]), (PausePlay, &[&[Key(K::Space)]]), - (OpenChat, &[&[Key(K::T)]]), + (OpenChat, &[&[Key(K::c("T"))]]), ]; impl Default for Bindings { fn default() -> Self { let mut m = BTreeMap::default(); - for &(k, v) in DEFAULT_BINDINGS { + for (k, v) in DEFAULT_BINDINGS { if m.insert( - k, + k.clone(), InputCombinations(v.iter().map(|&x| InputCombination(x.to_vec())).collect()), ) .is_some() @@ -157,7 +156,7 @@ impl InputMap { std::mem::swap(&mut self.act, &mut acts); for v in &self.act { if !acts.contains(v) { - self.just_act.insert(*v); + self.just_act.insert(v.clone()); } } self.screen = input.mouse.screen; @@ -193,14 +192,14 @@ impl Display for UnitInput { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { match self { UnitInput::Key(code) => Debug::fmt(code, f), - UnitInput::Mouse(mb) => Debug::fmt(mb, f), - UnitInput::WheelUp => { + Mouse(mb) => Debug::fmt(mb, f), + WheelUp => { write!(f, "Scroll Up") } - UnitInput::WheelDown => { + WheelDown => { write!(f, "Scroll Down") } - UnitInput::KeyScan(scan) => write!(f, "ScanCode({scan})"), + KeyScan(scan) => write!(f, "ScanCode({scan})"), } } } @@ -237,11 +236,10 @@ impl InputTree { }; for (act, combs) in &bindings.0 { - log::info!("{} {}", act, combs); for comb in &combs.0 { let mut cur: &mut InputTree = &mut root; for inp in &comb.0 { - let ent = cur.childs.entry(*inp); + let ent = cur.childs.entry(inp.clone()); match ent { Entry::Occupied(_) => {} Entry::Vacant(v) => { @@ -253,7 +251,7 @@ impl InputTree { } cur = &mut **cur.childs.get_mut(inp).unwrap(); } - cur.actions.push(*act); + cur.actions.push(act.clone()); } } @@ -262,21 +260,21 @@ impl InputTree { pub fn query( &self, - kb: &FastSet, - kb_scans: &FastSet, + kb: &FastSet, + kb_scans: &FastSet, mouse: &FastSet, wheel: f32, ) -> impl Iterator + '_ { let mut units: HashSet = HashSet::with_capacity(kb.len() + mouse.len() + 1); - units.extend(kb.iter().map(|x| UnitInput::Key(*x))); - units.extend(mouse.iter().map(|x| UnitInput::Mouse(*x))); - units.extend(kb_scans.iter().map(|x| UnitInput::KeyScan(*x))); + units.extend(kb.iter().map(|x| UnitInput::Key(x.clone()))); + units.extend(mouse.iter().map(|x| Mouse(*x))); + units.extend(kb_scans.iter().map(|x| KeyScan(*x))); if wheel > 0.0 { - units.insert(UnitInput::WheelUp); + units.insert(WheelUp); } if wheel < 0.0 { - units.insert(UnitInput::WheelDown); + units.insert(WheelDown); } let mut matches = vec![]; @@ -284,7 +282,7 @@ impl InputTree { while !queue.is_empty() { for (input_stack, q) in std::mem::take(&mut queue) { - for key in units.iter().copied() { + for key in units.iter().cloned() { if let Some(inp) = q.childs.get(&key) { let mut newstack = input_stack.clone(); newstack.push(key); @@ -310,7 +308,7 @@ impl InputTree { Some(act) }) .flatten() - .copied() + .cloned() } }