diff --git a/Cargo.lock b/Cargo.lock index 4fa9039..9761473 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6,11 +6,83 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9fe5e32de01730eb1f6b7f5b51c17e03e2325bf40a74f754f04f130043affff" +[[package]] +name = "addr2line" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03345e98af8f3d786b6d9f656ccfa6ac316d954e92bc4841f0bba20789d5fb5a" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "ahash" -version = "0.4.6" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43bb833f0bf979d8475d38fbf09ed3b8a55e1885fe93ad3f93239fc6a4f17b98" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "andrew" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c4afb09dd642feec8408e33f92f3ffc4052946f6b20f32fb99c1f58cd4fa7cf" +dependencies = [ + "bitflags", + "rusttype", + "walkdir", + "xdg", + "xml-rs", +] + +[[package]] +name = "android_glue" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000444226fcff248f2bc4c7625be32c63caccfecc2723a2b9f78a7487a49c407" + +[[package]] +name = "atomic_refcell" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681b971236e0f76b20fcafca0236b8718c9186ee778d67cd78bd5f28fd85427f" + +[[package]] +name = "autocfg" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6789e291be47ace86a60303502173d84af8327e3627ecf334356ee0f87a164c" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "backtrace" +version = "0.3.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4717cfcbfaa661a0fd48f8453951837ae7e8f81e481fbb136e3202d72805a744" +dependencies = [ + "addr2line", + "cc", + "cfg-if 1.0.0", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" [[package]] name = "bitflags" @@ -18,11 +90,33 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + [[package]] name = "bumpalo" -version = "3.4.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820" +checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" + +[[package]] +name = "calloop" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b036167e76041694579972c28cf4877b4f92da222560ddb49008937b6a6727c" +dependencies = [ + "log", + "nix 0.18.0", +] + +[[package]] +name = "cc" +version = "1.0.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a72c244c1ff497a746a7e1fb3d14bd08420ecda70c8f25c7112f2781652d787" [[package]] name = "cfg-if" @@ -31,118 +125,921 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" [[package]] -name = "cloudabi" +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cgl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" +dependencies = [ + "libc", +] + +[[package]] +name = "clipboard-win" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fdf5e01086b6be750428ba4a40619f847eb2e95756eee84b18e06e5f0b50342" +dependencies = [ + "lazy-bytes-cast", + "winapi 0.3.9", +] + +[[package]] +name = "cocoa" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c54201c07dcf3a5ca33fececb8042aed767ee4bfd5a0235a8ceabcda956044b2" +dependencies = [ + "bitflags", + "block", + "cocoa-foundation", + "core-foundation 0.9.1", + "core-graphics 0.22.2", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63902e9223530efb4e26ccd0cf55ec30d592d3b42e21a28defc42a9586e832" +dependencies = [ + "bitflags", + "block", + "cocoa-foundation", + "core-foundation 0.9.1", + "core-graphics 0.22.2", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4344512281c643ae7638bbabc3af17a11307803ec8f0fcad9fae512a8bf36467" +checksum = "7ade49b65d560ca58c403a479bb396592b155c0185eada742ee323d1d68d6318" +dependencies = [ + "bitflags", + "block", + "core-foundation 0.9.1", + "core-graphics-types", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "copypasta" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4423d79fed83ebd9ab81ec21fa97144300a961782158287dc9bf7eddac37ff0b" +dependencies = [ + "clipboard-win", + "objc", + "objc-foundation", + "objc_id", + "smithay-clipboard", + "x11-clipboard", +] + +[[package]] +name = "core-foundation" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" +dependencies = [ + "core-foundation-sys 0.7.0", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a89e2ae426ea83155dccf10c0fa6b1463ef6d5fcb44cee0b224a408fa640a62" +dependencies = [ + "core-foundation-sys 0.8.2", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" + +[[package]] +name = "core-foundation-sys" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" + +[[package]] +name = "core-graphics" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3889374e6ea6ab25dba90bb5d96202f61108058361f6dc72e8b03e6f8bbe923" dependencies = [ "bitflags", + "core-foundation 0.7.0", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "269f35f69b542b80e736a20a89a05215c0ce80c2c03c514abb2e318b78379d86" +dependencies = [ + "bitflags", + "core-foundation 0.9.1", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a68b68b3446082644c91ac778bf50cd4104bfb002b5a6a7c44cca5a2c70788b" +dependencies = [ + "bitflags", + "core-foundation 0.9.1", + "foreign-types", + "libc", +] + +[[package]] +name = "core-video-sys" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34ecad23610ad9757664d644e369246edde1803fcb43ed72876565098a5d3828" +dependencies = [ + "cfg-if 0.1.10", + "core-foundation-sys 0.7.0", + "core-graphics 0.19.2", + "libc", + "objc", +] + +[[package]] +name = "darling" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0c960ae2da4de88a91b2d920c2a7233b400bc33cb28453a2987822d8392519b" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "directories-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339ee130d97a610ea5a5872d2bbb130fdf68884ff09d3028b81bec8a1ac23bbc" +dependencies = [ + "cfg-if 1.0.0", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi 0.3.9", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dlib" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b11f15d1e3268f140f68d390637d5e76d849782d971ae7063e0da69fe9709a76" +dependencies = [ + "libloading 0.6.7", +] + +[[package]] +name = "dlib" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac1b7517328c04c2aa68422fc60a41b92208182142ed04a25879c26c8f878794" +dependencies = [ + "libloading 0.7.0", +] + +[[package]] +name = "downcast-rs" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" + +[[package]] +name = "eframe" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7d765b71f13f3268244328e3cef6437415dede275859905a90464b319fbc149" +dependencies = [ + "egui", + "egui_glium", + "egui_web", + "epi", ] [[package]] name = "egui" -version = "0.3.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25fbba5bf27e7b755b2bceb82edafd9790f9af3a8f673f2638f37e937f8f1716" +checksum = "788148861d80b87d28d64440a3d31cae190e50ccc3ea585597466d38428365d7" dependencies = [ - "ahash", - "parking_lot", - "rusttype", + "epaint", + "ron", "serde", ] +[[package]] +name = "egui_glium" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26238d26c1a1e03854afe79b9f6b2f116a30e017cbf14a4503bc50b80b7707c" +dependencies = [ + "copypasta", + "directories-next", + "egui", + "epi", + "glium", + "ron", + "serde", + "webbrowser", +] + [[package]] name = "egui_web" -version = "0.3.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ab354cefec687ebc4e608cea7b75b6db96aebcca68ba063d0a0d44333bc86cb" +checksum = "9060de4015f23ec40fd373e34b91f5d6c6ccf3f4a2026ef12ea2195537db87c0" dependencies = [ "egui", + "epi", "js-sys", - "parking_lot", + "ron", "serde", - "serde_json", "wasm-bindgen", + "wasm-bindgen-futures", "web-sys", ] +[[package]] +name = "emath" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e73d6c8c70eadb71756fbbc3c303ab25e163b46b656886dd250de5636efea12" +dependencies = [ + "serde", +] + +[[package]] +name = "epaint" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80e2db640801230bdda80629bc3a063927a462f5eaf38a98da676954e78ccb99" +dependencies = [ + "ahash", + "atomic_refcell", + "emath", + "ordered-float", + "rusttype", + "serde", +] + +[[package]] +name = "epi" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59c4f6cbede1fc8f836384f85295a59199a4825940abcc3a8a29cfe2e3c37583" +dependencies = [ + "egui", + "ron", + "serde", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "fuchsia-zircon" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" +dependencies = [ + "bitflags", + "fuchsia-zircon-sys", +] + +[[package]] +name = "fuchsia-zircon-sys" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" + [[package]] name = "getrandom" -version = "0.1.15" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", + "js-sys", "libc", "wasi", "wasm-bindgen", ] [[package]] -name = "hobogo" -version = "0.2.0" +name = "gimli" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e4075386626662786ddb0ec9081e7c7eeb1ba31951f447ca780ef9f5d568189" + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glium" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a58e115545ab8ce2238630c06a60f30a835271e3aff861db08d81561643d7a9" +dependencies = [ + "backtrace", + "fnv", + "gl_generator", + "glutin", + "lazy_static", + "memoffset", + "smallvec", + "takeable-option", +] + +[[package]] +name = "glutin" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ae1cbb9176b9151c4ce03f012e3cd1c6c18c4be79edeaeb3d99f5d8085c5fa3" +dependencies = [ + "android_glue", + "cgl", + "cocoa 0.23.0", + "core-foundation 0.9.1", + "glutin_egl_sys", + "glutin_emscripten_sys", + "glutin_gles2_sys", + "glutin_glx_sys", + "glutin_wgl_sys", + "lazy_static", + "libloading 0.6.7", + "log", + "objc", + "osmesa-sys", + "parking_lot", + "wayland-client", + "wayland-egl", + "winapi 0.3.9", + "winit", +] + +[[package]] +name = "glutin_egl_sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2abb6aa55523480c4adc5a56bbaa249992e2dddb2fc63dc96e04a3355364c211" +dependencies = [ + "gl_generator", + "winapi 0.3.9", +] + +[[package]] +name = "glutin_emscripten_sys" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80de4146df76e8a6c32b03007bc764ff3249dcaeb4f675d68a06caf1bac363f1" + +[[package]] +name = "glutin_gles2_sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8094e708b730a7c8a1954f4f8a31880af00eb8a1c5b5bf85d28a0a3c6d69103" +dependencies = [ + "gl_generator", + "objc", +] + +[[package]] +name = "glutin_glx_sys" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e393c8fc02b807459410429150e9c4faffdb312d59b8c038566173c81991351" +dependencies = [ + "gl_generator", + "x11-dl", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3da5951a1569dbab865c6f2a863efafff193a93caf05538d193e9e3816d21696" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "hobogo" +version = "0.2.0" +dependencies = [ + "eframe", + "egui_web", + "getrandom", + "rand", + "serde", + "serde_json", + "wasm-bindgen", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "instant" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "iovec" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" +dependencies = [ + "libc", +] + +[[package]] +name = "itoa" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "js-sys" +version = "0.3.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[package]] +name = "lazy-bytes-cast" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10257499f089cd156ad82d0a9cd57d9501fa2c989068992a97eb3c27836f206b" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "libc" +version = "0.2.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "789da6d93f1b866ffe175afc5322a4d76c038605a1c3319bb57b06967ca98a36" + +[[package]] +name = "libloading" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "351a32417a12d5f7e82c368a66781e307834dae04c6ce0cd4456d52989229883" +dependencies = [ + "cfg-if 1.0.0", + "winapi 0.3.9", +] + +[[package]] +name = "libloading" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" +dependencies = [ + "cfg-if 1.0.0", + "winapi 0.3.9", +] + +[[package]] +name = "lock_api" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0382880606dff6d15c9476c416d18690b72742aa7b605bb6dd6ec9030fbf07eb" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if 1.0.0", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "maybe-uninit" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" + +[[package]] +name = "memchr" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" + +[[package]] +name = "memmap2" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b70ca2a6103ac8b665dc150b142ef0e4e89df640c9e6cf295d189c3caebe5a" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg", +] + +[[package]] +name = "mio" +version = "0.6.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" +dependencies = [ + "cfg-if 0.1.10", + "fuchsia-zircon", + "fuchsia-zircon-sys", + "iovec", + "kernel32-sys", + "libc", + "log", + "miow", + "net2", + "slab", + "winapi 0.2.8", +] + +[[package]] +name = "mio-extras" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19" +dependencies = [ + "lazycell", + "log", + "mio", + "slab", +] + +[[package]] +name = "miow" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" +dependencies = [ + "kernel32-sys", + "net2", + "winapi 0.2.8", + "ws2_32-sys", +] + +[[package]] +name = "ndk" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb167c1febed0a496639034d0c76b3b74263636045db5489eee52143c246e73" +dependencies = [ + "jni-sys", + "ndk-sys", + "num_enum", + "thiserror", +] + +[[package]] +name = "ndk-glue" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdf399b8b7a39c6fb153c4ec32c72fd5fe789df24a647f229c239aa7adb15241" +dependencies = [ + "lazy_static", + "libc", + "log", + "ndk", + "ndk-macro", + "ndk-sys", +] + +[[package]] +name = "ndk-macro" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05d1c6307dc424d0f65b9b06e94f88248e6305726b14729fd67a5e47b2dc481d" +dependencies = [ + "darling", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "ndk-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c44922cb3dbb1c70b5e5f443d63b64363a898564d739ba5198e3a9138442868d" + +[[package]] +name = "net2" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae" +dependencies = [ + "cfg-if 0.1.10", + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "nix" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83450fe6a6142ddd95fb064b746083fc4ef1705fe81f64a64e1d4b39f54a1055" +dependencies = [ + "bitflags", + "cc", + "cfg-if 0.1.10", + "libc", +] + +[[package]] +name = "nix" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa9b4819da1bc61c0ea48b63b7bc8604064dd43013e7cc325df098d49cd7c18a" +dependencies = [ + "bitflags", + "cc", + "cfg-if 1.0.0", + "libc", +] + +[[package]] +name = "nom" +version = "6.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7413f999671bd4745a7b624bd370a569fb6bc574b23c83a3c5ed2e453f3d5e2" +dependencies = [ + "memchr", + "version_check", +] + +[[package]] +name = "num-traits" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca565a7df06f3d4b485494f25ba05da1435950f4dc263440eda7a6fa9b8e36e4" +dependencies = [ + "derivative", + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffa5a33ddddfee04c0283a7653987d634e880347e96b5b2ed64de07efb59db9d" dependencies = [ - "egui", - "egui_web", - "rand", - "serde", - "serde_derive", - "serde_json", - "wasm-bindgen", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "instant" -version = "0.1.7" +name = "objc" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63312a18f7ea8760cdd0a7c5aac1a619752a246b833545e3e36d1f81f7cd9e66" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" dependencies = [ - "cfg-if", + "malloc_buf", ] [[package]] -name = "itoa" -version = "0.4.6" +name = "objc-foundation" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] [[package]] -name = "js-sys" -version = "0.3.45" +name = "objc_id" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca059e81d9486668f12d455a4ea6daa600bd408134cd17e3d3fb5a32d1f016f8" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" dependencies = [ - "wasm-bindgen", + "objc", ] [[package]] -name = "lazy_static" -version = "1.4.0" +name = "object" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "1a5b3dd1c072ee7963717671d1ca129f1048fda25edea6b752bfc71ac8854170" [[package]] -name = "libc" -version = "0.2.79" +name = "once_cell" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2448f6066e80e3bfc792e9c98bf705b4b0fc6e8ef5b43e5889aff0eaa9c58743" +checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3" [[package]] -name = "lock_api" -version = "0.4.1" +name = "ordered-float" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28247cc5a5be2f05fbcd76dd0cf2c7d3b5400cb978a28042abcd4fa0b3f8261c" +checksum = "809348965973b261c3e504c8d0434e465274f78c880e10039914f2c5dcf49461" dependencies = [ - "scopeguard", + "num-traits", + "rand", ] [[package]] -name = "log" -version = "0.4.11" +name = "osmesa-sys" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b" +checksum = "88cfece6e95d2e717e0872a7f53a8684712ad13822a7979bc760b9c77ec0013b" dependencies = [ - "cfg-if", + "shared_library", ] [[package]] @@ -156,9 +1053,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4893845fa2ca272e647da5d0e46660a314ead9c2fdd9a883aabc32e481a8733" +checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" dependencies = [ "instant", "lock_api", @@ -167,62 +1064,80 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.8.0" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c361aa727dd08437f2f1447be8b59a33b0edd15e0fcee698f935613d9efbca9b" +checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018" dependencies = [ - "cfg-if", - "cloudabi", + "cfg-if 1.0.0", "instant", "libc", "redox_syscall", "smallvec", - "winapi", + "winapi 0.3.9", ] +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "pkg-config" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" + [[package]] name = "ppv-lite86" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c36fa947111f5c62a733b652544dd0016a43ce89619538a8ef92724a6f501a20" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" + +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml", +] [[package]] name = "proc-macro2" -version = "1.0.24" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" +checksum = "f0d8caf72986c1a598726adc988bb5984792ef84f5ee5aa50209145ee8077038" dependencies = [ "unicode-xid", ] [[package]] name = "quote" -version = "1.0.7" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" dependencies = [ "proc-macro2", ] [[package]] name = "rand" -version = "0.7.3" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" dependencies = [ - "getrandom", "libc", "rand_chacha", "rand_core", "rand_hc", - "rand_pcg", ] [[package]] name = "rand_chacha" -version = "0.2.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" dependencies = [ "ppv-lite86", "rand_core", @@ -230,36 +1145,66 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.5.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" dependencies = [ "getrandom", ] [[package]] name = "rand_hc" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" dependencies = [ "rand_core", ] [[package]] -name = "rand_pcg" -version = "0.2.1" +name = "raw-window-handle" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +checksum = "0a441a7a6c80ad6473bd4b74ec1c9a4c951794285bf941c2126f607c72e48211" dependencies = [ - "rand_core", + "libc", ] [[package]] name = "redox_syscall" -version = "0.1.57" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "742739e41cd49414de871ea5e549afb7e2a3ac77b589bcbebe8c82fab37147fc" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" +dependencies = [ + "getrandom", + "redox_syscall", +] + +[[package]] +name = "ron" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "064ea8613fb712a19faf920022ec8ddf134984f100090764a4e1d768f3827f1f" +dependencies = [ + "base64", + "bitflags", + "serde", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" +checksum = "410f7acf3cb3a44527c5d9546bad4bf4e6c460915d5f9f2fc524498bfe8f70ce" [[package]] name = "rusttype" @@ -277,6 +1222,21 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" + [[package]] name = "scopeguard" version = "1.1.0" @@ -285,18 +1245,18 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "serde" -version = "1.0.116" +version = "1.0.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96fe57af81d28386a513cbc6858332abc6117cfdb5999647c6444b8f43a370a5" +checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.116" +version = "1.0.126" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f630a6370fd8e457873b4bd2ffdae75408bc291ba72be773772a4c2a065d9ae8" +checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" dependencies = [ "proc-macro2", "quote", @@ -305,32 +1265,118 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.58" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a230ea9107ca2220eea9d46de97eddcb04cd00e92d13dda78e478dd33fa82bd4" +checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" dependencies = [ "itoa", "ryu", "serde", ] +[[package]] +name = "shared_library" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a9e7e0f2bfae24d8a5b5a66c5b257a83c7412304311512a0c054cd5e619da11" +dependencies = [ + "lazy_static", + "libc", +] + +[[package]] +name = "slab" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" + [[package]] name = "smallvec" -version = "1.4.2" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" + +[[package]] +name = "smithay-client-toolkit" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4750c76fd5d3ac95fa3ed80fe667d6a3d8590a960e5b575b98eea93339a80b80" +dependencies = [ + "andrew", + "bitflags", + "calloop", + "dlib 0.4.2", + "lazy_static", + "log", + "memmap2", + "nix 0.18.0", + "wayland-client", + "wayland-cursor", + "wayland-protocols", +] + +[[package]] +name = "smithay-clipboard" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06384dfaf645908220d976ae24ed39f6cf92efecb0225ea0a948e403014de527" +dependencies = [ + "smithay-client-toolkit", + "wayland-client", +] + +[[package]] +name = "strsim" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbee7696b84bbf3d89a1c2eccff0850e3047ed46bfcd2e92c29a2d074d57e252" +checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" [[package]] name = "syn" -version = "1.0.43" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e2e59c50ed8f6b050b071aa7b6865293957a9af6b58b94f97c1c9434ad440ea" +checksum = "a1e8cdbefb79a9a5a65e0db8b47b723ee907b7c7f8496c76a1770b5c310bab82" dependencies = [ "proc-macro2", "quote", "unicode-xid", ] +[[package]] +name = "takeable-option" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36ae8932fcfea38b7d3883ae2ab357b0d57a02caaa18ebb4f5ece08beaec4aa0" + +[[package]] +name = "thiserror" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa6f76457f59514c7eeb4e59d891395fab0b2fd1d40723ae737d64153392e9c6" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a36768c0fbf1bb15eca10defa29526bda730a2376c2ab4393ccfa16fb1a318d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "toml" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +dependencies = [ + "serde", +] + [[package]] name = "ttf-parser" version = "0.6.2" @@ -339,31 +1385,48 @@ checksum = "3e5d7cd7ab3e47dda6e56542f4bbf3824c15234958c6e1bd6aaa347e93499fdc" [[package]] name = "unicode-xid" -version = "0.2.1" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "version_check" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" + +[[package]] +name = "walkdir" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" +checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" +dependencies = [ + "same-file", + "winapi 0.3.9", + "winapi-util", +] [[package]] name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" +version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] name = "wasm-bindgen" -version = "0.2.68" +version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ac64ead5ea5f05873d7c12b545865ca2b8d28adfc50a49b84770a3a97265d42" +checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" dependencies = [ - "cfg-if", + "cfg-if 1.0.0", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.68" +version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f22b422e2a757c35a73774860af8e112bff612ce6cb604224e8e47641a9e4f68" +checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" dependencies = [ "bumpalo", "lazy_static", @@ -374,11 +1437,23 @@ dependencies = [ "wasm-bindgen-shared", ] +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fba7978c679d53ce2d0ac80c8c175840feb849a161664365d1287b41f2e67f1" +dependencies = [ + "cfg-if 1.0.0", + "js-sys", + "wasm-bindgen", + "web-sys", +] + [[package]] name = "wasm-bindgen-macro" -version = "0.2.68" +version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b13312a745c08c469f0b292dd2fcd6411dba5f7160f593da6ef69b64e407038" +checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -386,9 +1461,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.68" +version = "0.2.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f249f06ef7ee334cc3b8ff031bfc11ec99d00f34d86da7498396dc1e3b1498fe" +checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" dependencies = [ "proc-macro2", "quote", @@ -399,20 +1474,126 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.68" +version = "0.2.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" + +[[package]] +name = "wayland-client" +version = "0.28.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ca44d86554b85cf449f1557edc6cc7da935cc748c8e4bf1c507cbd43bae02c" +dependencies = [ + "bitflags", + "downcast-rs", + "libc", + "nix 0.20.0", + "scoped-tls", + "wayland-commons", + "wayland-scanner", + "wayland-sys", +] + +[[package]] +name = "wayland-commons" +version = "0.28.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bd75ae380325dbcff2707f0cd9869827ea1d2d6d534cff076858d3f0460fd5a" +dependencies = [ + "nix 0.20.0", + "once_cell", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-cursor" +version = "0.28.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b37e5455ec72f5de555ec39b5c3704036ac07c2ecd50d0bffe02d5fe2d4e65ab" +dependencies = [ + "nix 0.20.0", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-egl" +version = "0.28.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9461a67930ec16da7a4fd8b50e9ffa23f4417240b43ec84008bd1b2c94421c94" +dependencies = [ + "wayland-client", + "wayland-sys", +] + +[[package]] +name = "wayland-protocols" +version = "0.28.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95df3317872bcf9eec096c864b69aa4769a1d5d6291a5b513f8ba0af0efbd52c" +dependencies = [ + "bitflags", + "wayland-client", + "wayland-commons", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.28.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389d680d7bd67512dc9c37f39560224327038deb0f0e8d33f870900441b68720" +dependencies = [ + "proc-macro2", + "quote", + "xml-rs", +] + +[[package]] +name = "wayland-sys" +version = "0.28.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d649a3145108d7d3fbcde896a468d1bd636791823c9921135218ad89be08307" +checksum = "2907bd297eef464a95ba9349ea771611771aa285b932526c633dc94d5400a8e2" +dependencies = [ + "dlib 0.5.0", + "lazy_static", + "pkg-config", +] [[package]] name = "web-sys" -version = "0.3.45" +version = "0.3.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bf6ef87ad7ae8008e15a355ce696bed26012b7caa21605188cfd8214ab51e2d" +checksum = "e828417b379f3df7111d3a2a9e5753706cae29c41f7c4029ee9fd77f3e09e582" dependencies = [ "js-sys", "wasm-bindgen", ] +[[package]] +name = "webbrowser" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecad156490d6b620308ed411cfee90d280b3cbd13e189ea0d3fada8acc89158a" +dependencies = [ + "web-sys", + "widestring", + "winapi 0.3.9", +] + +[[package]] +name = "widestring" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c168940144dd21fd8046987c16a46a33d5fc84eec29ef9dcddc2ac9e31526b7c" + +[[package]] +name = "winapi" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" + [[package]] name = "winapi" version = "0.3.9" @@ -423,14 +1604,122 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu", ] +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" + [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi 0.3.9", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "winit" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da4eda6fce0eb84bd0a33e3c8794eb902e1033d0a1d5a31bc4f19b1b4bbff597" +dependencies = [ + "bitflags", + "cocoa 0.24.0", + "core-foundation 0.9.1", + "core-graphics 0.22.2", + "core-video-sys", + "dispatch", + "instant", + "lazy_static", + "libc", + "log", + "mio", + "mio-extras", + "ndk", + "ndk-glue", + "ndk-sys", + "objc", + "parking_lot", + "percent-encoding", + "raw-window-handle", + "smithay-client-toolkit", + "wayland-client", + "winapi 0.3.9", + "x11-dl", +] + +[[package]] +name = "ws2_32-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + +[[package]] +name = "x11-clipboard" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b397ace6e980510de59a4fe3d4c758dffab231d6d747ce9fa1aba6b6035d5f32" +dependencies = [ + "xcb", +] + +[[package]] +name = "x11-dl" +version = "2.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf981e3a5b3301209754218f962052d4d9ee97e478f4d26d4a6eced34c1fef8" +dependencies = [ + "lazy_static", + "libc", + "maybe-uninit", + "pkg-config", +] + +[[package]] +name = "xcb" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62056f63138b39116f82a540c983cc11f1c90cd70b3d492a70c25eaa50bd22a6" +dependencies = [ + "libc", + "log", +] + +[[package]] +name = "xcursor" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a9a231574ae78801646617cefd13bfe94be907c0e4fa979cfd8b770aa3c5d08" +dependencies = [ + "nom", +] + +[[package]] +name = "xdg" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d089681aa106a86fade1b0128fb5daf07d5867a509ab036d99988dec80429a57" + +[[package]] +name = "xml-rs" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b07db065a5cf61a7e4ba64f29e67db906fb1787316516c4e6e5ff0fea1efcd8a" diff --git a/Cargo.toml b/Cargo.toml index 0b2bc95..40dcb7d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,16 +8,15 @@ edition = "2018" crate-type = ["cdylib", "rlib"] [dependencies] -rand = { version = "0.7", features = ['small_rng', 'wasm-bindgen'] } -serde = "1" -serde_derive = "1" +eframe = { version = "0.12.0", features = ["persistence"] } +getrandom = { version = "0.2.3", features = ["js"] } +rand = { version = "0.8.3", features = ['small_rng'] } +serde = { version = "1", features = ["derive"] } serde_json = "1" wasm-bindgen = "0.2" -egui = "0.3.0" -egui_web = "0.3.0" -# egui = { path = "../egui/egui" } -# egui_web = { path = "../egui/egui_web" } +[target.'cfg(target_arch = "wasm32")'.dependencies] +egui_web = "0.12.0" # Optimize for small code size: [profile.release] diff --git a/build.sh b/build.sh deleted file mode 100755 index f7f5fcf..0000000 --- a/build.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -set -eu - -# Pre-requisites: -rustup target add wasm32-unknown-unknown -if ! [[ $(wasm-bindgen --version) ]]; then - cargo clean - cargo install -f wasm-bindgen-cli - cargo update -fi - -# BUILD=debug -BUILD=release - -# Clear output from old stuff: -rm -rf docs/*.wasm - -echo "Build rust:" -cargo build --release --target wasm32-unknown-unknown - -echo "Generate JS bindings for wasm:" -FOLDER_NAME=${PWD##*/} -TARGET_NAME="${FOLDER_NAME}.wasm" -wasm-bindgen "target/wasm32-unknown-unknown/$BUILD/$TARGET_NAME" \ - --out-dir docs --no-modules --no-typescript diff --git a/build_and_run.sh b/build_and_run.sh deleted file mode 100755 index 42144f6..0000000 --- a/build_and_run.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -set -eu - -./build.sh - -open http://localhost:8889 diff --git a/build_web.sh b/build_web.sh new file mode 100755 index 0000000..156bb59 --- /dev/null +++ b/build_web.sh @@ -0,0 +1,42 @@ +#!/bin/bash +set -eu + +# ./setup_web.sh # <- call this first! + +FOLDER_NAME=${PWD##*/} +CRATE_NAME=$FOLDER_NAME # assume crate name is the same as the folder name +CRATE_NAME_SNAKE_CASE="${CRATE_NAME//-/_}" # for those who name crates with-kebab-case + +# This is required to enable the web_sys clipboard API which egui_web uses +# https://rustwasm.github.io/wasm-bindgen/api/web_sys/struct.Clipboard.html +# https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html +export RUSTFLAGS=--cfg=web_sys_unstable_apis + +# Clear output from old stuff: +rm -f docs/${CRATE_NAME_SNAKE_CASE}_bg.wasm + +echo "Building rust…" +BUILD=release +cargo build --release -p ${CRATE_NAME} --lib --target wasm32-unknown-unknown + +echo "Generating JS bindings for wasm…" +TARGET_NAME="${CRATE_NAME_SNAKE_CASE}.wasm" +wasm-bindgen "target/wasm32-unknown-unknown/${BUILD}/${TARGET_NAME}" \ + --out-dir docs --no-modules --no-typescript + +# to get wasm-opt: apt/brew/dnf install binaryen +# echo "Optimizing wasm…" +# wasm-opt docs/${CRATE_NAME_SNAKE_CASE}_bg.wasm -O2 --fast-math -o docs/${CRATE_NAME_SNAKE_CASE}_bg.wasm # add -g to get debug symbols + +echo "Finished: docs/${CRATE_NAME_SNAKE_CASE}.wasm" + +if [[ "$OSTYPE" == "linux-gnu"* ]]; then + # Linux, ex: Fedora + xdg-open http://localhost:8080/index.html +elif [[ "$OSTYPE" == "msys" ]]; then + # Windows + start http://localhost:8080/index.html +else + # Darwin/MacOS, or something else + open http://localhost:8080/index.html +fi diff --git a/check.sh b/check.sh new file mode 100755 index 0000000..29485f3 --- /dev/null +++ b/check.sh @@ -0,0 +1,10 @@ +#!/bin/bash +# This scripts runs various CI-like checks in a convenient way. +set -eux + +cargo check --workspace --all-targets +cargo check --workspace --all-features --lib --target wasm32-unknown-unknown +cargo fmt --all -- --check +cargo clippy --workspace --all-targets --all-features -- -D warnings -W clippy::all +cargo test --workspace --all-targets --all-features +cargo test --workspace --doc diff --git a/docs/hobogo.js b/docs/hobogo.js index 855e296..6a48e37 100644 --- a/docs/hobogo.js +++ b/docs/hobogo.js @@ -212,32 +212,51 @@ function makeMutClosure(arg0, arg1, dtor, f) { return real; } -function __wbg_adapter_24(arg0, arg1) { - wasm._dyn_core__ops__function__FnMut_____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__hc907d3e18a129a40(arg0, arg1); +function __wbg_adapter_28(arg0, arg1) { + wasm._dyn_core__ops__function__FnMut_____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h0657b20edc0a57cd(arg0, arg1); } -function __wbg_adapter_27(arg0, arg1, arg2) { - wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h03d678c883facafa(arg0, arg1, addHeapObject(arg2)); +function __wbg_adapter_31(arg0, arg1, arg2) { + wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h51b7e432932d399b(arg0, arg1, addHeapObject(arg2)); } -function __wbg_adapter_30(arg0, arg1, arg2) { - wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h03d678c883facafa(arg0, arg1, addHeapObject(arg2)); +function __wbg_adapter_34(arg0, arg1, arg2) { + wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h51b7e432932d399b(arg0, arg1, addHeapObject(arg2)); } -function __wbg_adapter_33(arg0, arg1, arg2) { - wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h03d678c883facafa(arg0, arg1, addHeapObject(arg2)); +function __wbg_adapter_37(arg0, arg1) { + wasm._dyn_core__ops__function__FnMut_____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h67e3e9f624bb884e(arg0, arg1); } -function __wbg_adapter_36(arg0, arg1) { - wasm._dyn_core__ops__function__FnMut_____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h461b6ac087c03a57(arg0, arg1); +function __wbg_adapter_40(arg0, arg1, arg2) { + wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h51b7e432932d399b(arg0, arg1, addHeapObject(arg2)); } -function __wbg_adapter_39(arg0, arg1, arg2) { - wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h03d678c883facafa(arg0, arg1, addHeapObject(arg2)); +function __wbg_adapter_43(arg0, arg1, arg2) { + wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h51b7e432932d399b(arg0, arg1, addHeapObject(arg2)); +} + +function __wbg_adapter_46(arg0, arg1, arg2) { + wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h51b7e432932d399b(arg0, arg1, addHeapObject(arg2)); +} + +function __wbg_adapter_49(arg0, arg1, arg2) { + wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h51b7e432932d399b(arg0, arg1, addHeapObject(arg2)); +} + +function __wbg_adapter_52(arg0, arg1, arg2) { + wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h51b7e432932d399b(arg0, arg1, addHeapObject(arg2)); +} + +function __wbg_adapter_55(arg0, arg1, arg2) { + wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h142aaf43c20c830c(arg0, arg1, addHeapObject(arg2)); } /** * This is the entry-point for all the web-assembly. +* This is called once from the HTML. +* It loads the app, installs some callbacks, then returns. +* You can add more callbacks like this if you want to call in to your code. * @param {string} canvas_id */ __exports.start = function(canvas_id) { @@ -246,24 +265,20 @@ __exports.start = function(canvas_id) { wasm.start(ptr0, len0); }; -function handleError(f) { - return function () { - try { - return f.apply(this, arguments); - - } catch (e) { - wasm.__wbindgen_exn_store(addHeapObject(e)); - } - }; -} - function getArrayU8FromWasm0(ptr, len) { return getUint8Memory0().subarray(ptr / 1, ptr / 1 + len); } +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_exn_store(addHeapObject(e)); + } +} + async function load(module, imports) { if (typeof Response === 'function' && module instanceof Response) { - if (typeof WebAssembly.instantiateStreaming === 'function') { try { return await WebAssembly.instantiateStreaming(module, imports); @@ -282,7 +297,6 @@ async function load(module, imports) { return await WebAssembly.instantiate(bytes, imports); } else { - const instance = await WebAssembly.instantiate(module, imports); if (instance instanceof WebAssembly.Instance) { @@ -309,418 +323,761 @@ async function init(input) { imports.wbg.__wbindgen_object_drop_ref = function(arg0) { takeObject(arg0); }; - imports.wbg.__wbg_getRandomValues_3ac1b33c90b52596 = function(arg0, arg1, arg2) { - getObject(arg0).getRandomValues(getArrayU8FromWasm0(arg1, arg2)); - }; - imports.wbg.__wbg_randomFillSync_6f956029658662ec = function(arg0, arg1, arg2) { - getObject(arg0).randomFillSync(getArrayU8FromWasm0(arg1, arg2)); + imports.wbg.__wbindgen_cb_drop = function(arg0) { + const obj = takeObject(arg0).original; + if (obj.cnt-- == 1) { + obj.a = 0; + return true; + } + var ret = false; + return ret; }; - imports.wbg.__wbg_self_1c83eb4471d9eb9b = handleError(function() { - var ret = self.self; - return addHeapObject(ret); - }); - imports.wbg.__wbg_static_accessor_MODULE_abf5ae284bffdf45 = function() { - var ret = module; + imports.wbg.__wbindgen_string_new = function(arg0, arg1) { + var ret = getStringFromWasm0(arg0, arg1); return addHeapObject(ret); }; - imports.wbg.__wbg_require_5b2b5b594d809d9f = function(arg0, arg1, arg2) { - var ret = getObject(arg0).require(getStringFromWasm0(arg1, arg2)); - return addHeapObject(ret); + imports.wbg.__wbg_instanceof_WebGl2RenderingContext_13e6354db7f49c18 = function(arg0) { + var ret = getObject(arg0) instanceof WebGL2RenderingContext; + return ret; }; - imports.wbg.__wbg_crypto_c12f14e810edcaa2 = function(arg0) { - var ret = getObject(arg0).crypto; - return addHeapObject(ret); + imports.wbg.__wbg_drawingBufferWidth_ef285db57df0f893 = function(arg0) { + var ret = getObject(arg0).drawingBufferWidth; + return ret; }; - imports.wbg.__wbg_msCrypto_679be765111ba775 = function(arg0) { - var ret = getObject(arg0).msCrypto; - return addHeapObject(ret); + imports.wbg.__wbg_drawingBufferHeight_a44c735d2f8ebc62 = function(arg0) { + var ret = getObject(arg0).drawingBufferHeight; + return ret; }; - imports.wbg.__wbindgen_is_undefined = function(arg0) { - var ret = getObject(arg0) === undefined; + imports.wbg.__wbg_bufferData_9129d14b1f0de925 = function(arg0, arg1, arg2, arg3) { + getObject(arg0).bufferData(arg1 >>> 0, getObject(arg2), arg3 >>> 0); + }; + imports.wbg.__wbg_texImage2D_c3b86a5e56a49764 = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) { + getObject(arg0).texImage2D(arg1 >>> 0, arg2, arg3, arg4, arg5, arg6, arg7 >>> 0, arg8 >>> 0, arg9 === 0 ? undefined : getArrayU8FromWasm0(arg9, arg10)); + }, arguments) }; + imports.wbg.__wbg_activeTexture_62fb1a120971f7d8 = function(arg0, arg1) { + getObject(arg0).activeTexture(arg1 >>> 0); + }; + imports.wbg.__wbg_attachShader_8a9eaf84fe954e03 = function(arg0, arg1, arg2) { + getObject(arg0).attachShader(getObject(arg1), getObject(arg2)); + }; + imports.wbg.__wbg_bindBuffer_a1ad7b194007470b = function(arg0, arg1, arg2) { + getObject(arg0).bindBuffer(arg1 >>> 0, getObject(arg2)); + }; + imports.wbg.__wbg_bindTexture_a25575c0badfe44b = function(arg0, arg1, arg2) { + getObject(arg0).bindTexture(arg1 >>> 0, getObject(arg2)); + }; + imports.wbg.__wbg_blendFunc_e1d63775ac2fdb5b = function(arg0, arg1, arg2) { + getObject(arg0).blendFunc(arg1 >>> 0, arg2 >>> 0); + }; + imports.wbg.__wbg_clear_7a7de3b0e9ae30c3 = function(arg0, arg1) { + getObject(arg0).clear(arg1 >>> 0); + }; + imports.wbg.__wbg_clearColor_9b9649257ee72f16 = function(arg0, arg1, arg2, arg3, arg4) { + getObject(arg0).clearColor(arg1, arg2, arg3, arg4); + }; + imports.wbg.__wbg_compileShader_69fd6c32a532c35a = function(arg0, arg1) { + getObject(arg0).compileShader(getObject(arg1)); + }; + imports.wbg.__wbg_createBuffer_f277512b66ff156c = function(arg0) { + var ret = getObject(arg0).createBuffer(); + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbg_createProgram_6b17e2185bcf1673 = function(arg0) { + var ret = getObject(arg0).createProgram(); + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbg_createShader_5d6f7b01da5682e3 = function(arg0, arg1) { + var ret = getObject(arg0).createShader(arg1 >>> 0); + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbg_createTexture_42e03addb914d25f = function(arg0) { + var ret = getObject(arg0).createTexture(); + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbg_disable_ea9b2fd524e20bea = function(arg0, arg1) { + getObject(arg0).disable(arg1 >>> 0); + }; + imports.wbg.__wbg_drawElements_fdc70c7e5299d334 = function(arg0, arg1, arg2, arg3, arg4) { + getObject(arg0).drawElements(arg1 >>> 0, arg2, arg3 >>> 0, arg4); + }; + imports.wbg.__wbg_enable_f39af773aafb63f0 = function(arg0, arg1) { + getObject(arg0).enable(arg1 >>> 0); + }; + imports.wbg.__wbg_enableVertexAttribArray_498ab84c1826a745 = function(arg0, arg1) { + getObject(arg0).enableVertexAttribArray(arg1 >>> 0); + }; + imports.wbg.__wbg_getAttribLocation_241dd0e4c29138d2 = function(arg0, arg1, arg2, arg3) { + var ret = getObject(arg0).getAttribLocation(getObject(arg1), getStringFromWasm0(arg2, arg3)); return ret; }; - imports.wbg.__wbg_getRandomValues_05a60bf171bfc2be = function(arg0) { - var ret = getObject(arg0).getRandomValues; + imports.wbg.__wbg_getProgramInfoLog_8d7bd18699310151 = function(arg0, arg1, arg2) { + var ret = getObject(arg1).getProgramInfoLog(getObject(arg2)); + var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len0 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len0; + getInt32Memory0()[arg0 / 4 + 0] = ptr0; + }; + imports.wbg.__wbg_getProgramParameter_3315a81c35911e56 = function(arg0, arg1, arg2) { + var ret = getObject(arg0).getProgramParameter(getObject(arg1), arg2 >>> 0); return addHeapObject(ret); }; - imports.wbg.__wbindgen_string_new = function(arg0, arg1) { - var ret = getStringFromWasm0(arg0, arg1); + imports.wbg.__wbg_getShaderInfoLog_c5dbc0816b0110fe = function(arg0, arg1, arg2) { + var ret = getObject(arg1).getShaderInfoLog(getObject(arg2)); + var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len0 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len0; + getInt32Memory0()[arg0 / 4 + 0] = ptr0; + }; + imports.wbg.__wbg_getShaderParameter_7d75b4fa2fdd22b7 = function(arg0, arg1, arg2) { + var ret = getObject(arg0).getShaderParameter(getObject(arg1), arg2 >>> 0); return addHeapObject(ret); }; - imports.wbg.__wbindgen_cb_drop = function(arg0) { - const obj = takeObject(arg0).original; - if (obj.cnt-- == 1) { - obj.a = 0; - return true; - } - var ret = false; - return ret; + imports.wbg.__wbg_getUniformLocation_736e12e23e8350b7 = function(arg0, arg1, arg2, arg3) { + var ret = getObject(arg0).getUniformLocation(getObject(arg1), getStringFromWasm0(arg2, arg3)); + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbg_linkProgram_b43539ddb67e7253 = function(arg0, arg1) { + getObject(arg0).linkProgram(getObject(arg1)); + }; + imports.wbg.__wbg_pixelStorei_707a2760a4bb063f = function(arg0, arg1, arg2) { + getObject(arg0).pixelStorei(arg1 >>> 0, arg2); + }; + imports.wbg.__wbg_scissor_ab029c7a9354d83d = function(arg0, arg1, arg2, arg3, arg4) { + getObject(arg0).scissor(arg1, arg2, arg3, arg4); + }; + imports.wbg.__wbg_shaderSource_bd5f73d004d97e08 = function(arg0, arg1, arg2, arg3) { + getObject(arg0).shaderSource(getObject(arg1), getStringFromWasm0(arg2, arg3)); + }; + imports.wbg.__wbg_texParameteri_e5284ef0c47b2a2e = function(arg0, arg1, arg2, arg3) { + getObject(arg0).texParameteri(arg1 >>> 0, arg2 >>> 0, arg3); + }; + imports.wbg.__wbg_uniform1i_0740fc72ca42db54 = function(arg0, arg1, arg2) { + getObject(arg0).uniform1i(getObject(arg1), arg2); + }; + imports.wbg.__wbg_uniform2f_95c32de4f3ada8ef = function(arg0, arg1, arg2, arg3) { + getObject(arg0).uniform2f(getObject(arg1), arg2, arg3); }; - imports.wbg.__wbg_instanceof_Window_adf3196bdc02b386 = function(arg0) { + imports.wbg.__wbg_useProgram_84fff09700844d7b = function(arg0, arg1) { + getObject(arg0).useProgram(getObject(arg1)); + }; + imports.wbg.__wbg_vertexAttribPointer_a4ee272ddd79df3b = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6) { + getObject(arg0).vertexAttribPointer(arg1 >>> 0, arg2, arg3 >>> 0, arg4 !== 0, arg5, arg6); + }; + imports.wbg.__wbg_viewport_3418ae7378baf8c5 = function(arg0, arg1, arg2, arg3, arg4) { + getObject(arg0).viewport(arg1, arg2, arg3, arg4); + }; + imports.wbg.__wbg_instanceof_Window_11e25482011fc506 = function(arg0) { var ret = getObject(arg0) instanceof Window; return ret; }; - imports.wbg.__wbg_document_6cc8d0b87c0a99b9 = function(arg0) { + imports.wbg.__wbg_document_5aff8cd83ef968f5 = function(arg0) { var ret = getObject(arg0).document; return isLikeNone(ret) ? 0 : addHeapObject(ret); }; - imports.wbg.__wbg_location_9b924f46d7090431 = function(arg0) { + imports.wbg.__wbg_location_05eee59b82ccc208 = function(arg0) { var ret = getObject(arg0).location; return addHeapObject(ret); }; - imports.wbg.__wbg_innerWidth_60241abd729ed26f = handleError(function(arg0) { + imports.wbg.__wbg_navigator_5c90643c2a2b6cda = function(arg0) { + var ret = getObject(arg0).navigator; + return addHeapObject(ret); + }; + imports.wbg.__wbg_innerWidth_8c5001da2fdd6a9e = function() { return handleError(function (arg0) { var ret = getObject(arg0).innerWidth; return addHeapObject(ret); - }); - imports.wbg.__wbg_innerHeight_2f860a67225f1fbd = handleError(function(arg0) { + }, arguments) }; + imports.wbg.__wbg_innerHeight_03d3f1d9eb5f7034 = function() { return handleError(function (arg0) { var ret = getObject(arg0).innerHeight; return addHeapObject(ret); - }); - imports.wbg.__wbg_devicePixelRatio_599d41a9267fa1ca = function(arg0) { + }, arguments) }; + imports.wbg.__wbg_devicePixelRatio_d92cc4c40f432496 = function(arg0) { var ret = getObject(arg0).devicePixelRatio; return ret; }; - imports.wbg.__wbg_performance_8594a974edffb1dc = function(arg0) { + imports.wbg.__wbg_performance_9d1ecf711183e1d5 = function(arg0) { var ret = getObject(arg0).performance; return isLikeNone(ret) ? 0 : addHeapObject(ret); }; - imports.wbg.__wbg_localStorage_47e8ad68b9e5dcb9 = handleError(function(arg0) { + imports.wbg.__wbg_localStorage_b787eb9a4418c2b1 = function() { return handleError(function (arg0) { var ret = getObject(arg0).localStorage; return isLikeNone(ret) ? 0 : addHeapObject(ret); - }); - imports.wbg.__wbg_open_7e3a4789bd559091 = handleError(function(arg0, arg1, arg2, arg3, arg4) { + }, arguments) }; + imports.wbg.__wbg_open_29812718979722ad = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) { var ret = getObject(arg0).open(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4)); return isLikeNone(ret) ? 0 : addHeapObject(ret); - }); - imports.wbg.__wbg_requestAnimationFrame_89935c9d6ac25d2f = handleError(function(arg0, arg1) { + }, arguments) }; + imports.wbg.__wbg_requestAnimationFrame_1fb079d39e1b8a26 = function() { return handleError(function (arg0, arg1) { var ret = getObject(arg0).requestAnimationFrame(getObject(arg1)); return ret; - }); - imports.wbg.__wbg_body_8c888fe47d81765f = function(arg0) { - var ret = getObject(arg0).body; - return isLikeNone(ret) ? 0 : addHeapObject(ret); - }; - imports.wbg.__wbg_getElementById_0cb6ad9511b1efc0 = function(arg0, arg1, arg2) { - var ret = getObject(arg0).getElementById(getStringFromWasm0(arg1, arg2)); - return isLikeNone(ret) ? 0 : addHeapObject(ret); - }; - imports.wbg.__wbg_touches_1cfb9ad18bd08588 = function(arg0) { - var ret = getObject(arg0).touches; - return addHeapObject(ret); - }; - imports.wbg.__wbg_get_814461b8584a55e7 = function(arg0, arg1) { - var ret = getObject(arg0)[arg1 >>> 0]; - return isLikeNone(ret) ? 0 : addHeapObject(ret); - }; - imports.wbg.__wbg_top_a6f8db7db6d2bf17 = function(arg0) { + }, arguments) }; + imports.wbg.__wbg_setInterval_d1fefc3dab46c6b6 = function() { return handleError(function (arg0, arg1, arg2) { + var ret = getObject(arg0).setInterval(getObject(arg1), arg2); + return ret; + }, arguments) }; + imports.wbg.__wbg_setTimeout_ce28a603906ebcbb = function() { return handleError(function (arg0, arg1, arg2) { + var ret = getObject(arg0).setTimeout(getObject(arg1), arg2); + return ret; + }, arguments) }; + imports.wbg.__wbg_top_22e7024d271b5677 = function(arg0) { var ret = getObject(arg0).top; return ret; }; - imports.wbg.__wbg_left_b19dce37a1320f04 = function(arg0) { + imports.wbg.__wbg_left_f2f24ba3851b8295 = function(arg0) { var ret = getObject(arg0).left; return ret; }; - imports.wbg.__wbg_hash_1e68d402e53cef74 = handleError(function(arg0, arg1) { - var ret = getObject(arg1).hash; + imports.wbg.__wbg_clipboard_a304e2b83d0400c6 = function(arg0) { + var ret = getObject(arg0).clipboard; + return addHeapObject(ret); + }; + imports.wbg.__wbg_userAgent_9c09d784d0828a93 = function() { return handleError(function (arg0, arg1) { + var ret = getObject(arg1).userAgent; var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); var len0 = WASM_VECTOR_LEN; getInt32Memory0()[arg0 / 4 + 1] = len0; getInt32Memory0()[arg0 / 4 + 0] = ptr0; - }); - imports.wbg.__wbg_setProperty_42eabadfcd7d6199 = handleError(function(arg0, arg1, arg2, arg3, arg4) { - getObject(arg0).setProperty(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4)); - }); - imports.wbg.__wbg_addEventListener_9e7b0c3f65ebc0d7 = handleError(function(arg0, arg1, arg2, arg3) { - getObject(arg0).addEventListener(getStringFromWasm0(arg1, arg2), getObject(arg3)); - }); - imports.wbg.__wbg_getItem_cb17cd47353971da = handleError(function(arg0, arg1, arg2, arg3) { + }, arguments) }; + imports.wbg.__wbg_appendChild_6ed236bb79c198df = function() { return handleError(function (arg0, arg1) { + var ret = getObject(arg0).appendChild(getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_getItem_1c87352132d0b415 = function() { return handleError(function (arg0, arg1, arg2, arg3) { var ret = getObject(arg1).getItem(getStringFromWasm0(arg2, arg3)); var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); var len0 = WASM_VECTOR_LEN; getInt32Memory0()[arg0 / 4 + 1] = len0; getInt32Memory0()[arg0 / 4 + 0] = ptr0; - }); - imports.wbg.__wbg_setItem_71df4161bb87d575 = handleError(function(arg0, arg1, arg2, arg3, arg4) { + }, arguments) }; + imports.wbg.__wbg_setItem_103b1e46491c9b0e = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) { getObject(arg0).setItem(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4)); - }); - imports.wbg.__wbg_deltaX_ee242e8414135d41 = function(arg0) { + }, arguments) }; + imports.wbg.__wbg_data_327df0625d734e68 = function(arg0, arg1) { + var ret = getObject(arg1).data; + var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len0 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len0; + getInt32Memory0()[arg0 / 4 + 0] = ptr0; + }; + imports.wbg.__wbg_getPropertyValue_937a708feb88202f = function() { return handleError(function (arg0, arg1, arg2, arg3) { + var ret = getObject(arg1).getPropertyValue(getStringFromWasm0(arg2, arg3)); + var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len0 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len0; + getInt32Memory0()[arg0 / 4 + 0] = ptr0; + }, arguments) }; + imports.wbg.__wbg_setProperty_dccccce3a52c26db = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) { + getObject(arg0).setProperty(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4)); + }, arguments) }; + imports.wbg.__wbg_hash_1496bf468ca4142a = function() { return handleError(function (arg0, arg1) { + var ret = getObject(arg1).hash; + var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len0 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len0; + getInt32Memory0()[arg0 / 4 + 0] = ptr0; + }, arguments) }; + imports.wbg.__wbg_clientX_5bbce6c078e1510e = function(arg0) { + var ret = getObject(arg0).clientX; + return ret; + }; + imports.wbg.__wbg_clientY_af6c4369507b54f0 = function(arg0) { + var ret = getObject(arg0).clientY; + return ret; + }; + imports.wbg.__wbg_ctrlKey_0b565cc670a6a49b = function(arg0) { + var ret = getObject(arg0).ctrlKey; + return ret; + }; + imports.wbg.__wbg_button_e27f6f9aa0a0c496 = function(arg0) { + var ret = getObject(arg0).button; + return ret; + }; + imports.wbg.__wbg_addEventListener_936431894dca4639 = function() { return handleError(function (arg0, arg1, arg2, arg3) { + getObject(arg0).addEventListener(getStringFromWasm0(arg1, arg2), getObject(arg3)); + }, arguments) }; + imports.wbg.__wbg_deltaX_d726e0224b540206 = function(arg0) { var ret = getObject(arg0).deltaX; return ret; }; - imports.wbg.__wbg_deltaY_35bf8632b9f25820 = function(arg0) { + imports.wbg.__wbg_deltaY_7374d71292d30408 = function(arg0) { var ret = getObject(arg0).deltaY; return ret; }; - imports.wbg.__wbg_getBoundingClientRect_c6d612c06726983e = function(arg0) { + imports.wbg.__wbg_deltaMode_01cad379615c05f4 = function(arg0) { + var ret = getObject(arg0).deltaMode; + return ret; + }; + imports.wbg.__wbindgen_object_clone_ref = function(arg0) { + var ret = getObject(arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbg_writeText_24e516a13acdea5a = function(arg0, arg1, arg2) { + var ret = getObject(arg0).writeText(getStringFromWasm0(arg1, arg2)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_now_44a034aa2e1d73dd = function(arg0) { + var ret = getObject(arg0).now(); + return ret; + }; + imports.wbg.__wbg_identifier_870445e138e72c62 = function(arg0) { + var ret = getObject(arg0).identifier; + return ret; + }; + imports.wbg.__wbg_pageX_902206703620e827 = function(arg0) { + var ret = getObject(arg0).pageX; + return ret; + }; + imports.wbg.__wbg_pageY_e4ea57875008005e = function(arg0) { + var ret = getObject(arg0).pageY; + return ret; + }; + imports.wbg.__wbg_force_f238c10135f8fdbc = function(arg0) { + var ret = getObject(arg0).force; + return ret; + }; + imports.wbg.__wbg_length_7cbe32a18202018e = function(arg0) { + var ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_item_d23780e616aa6e88 = function(arg0, arg1) { + var ret = getObject(arg0).item(arg1 >>> 0); + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbg_get_73dc28e00ffaad3c = function(arg0, arg1) { + var ret = getObject(arg0)[arg1 >>> 0]; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbg_body_525168d9e773c3f8 = function(arg0) { + var ret = getObject(arg0).body; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbg_createElement_ac65a6ce60c4812c = function() { return handleError(function (arg0, arg1, arg2) { + var ret = getObject(arg0).createElement(getStringFromWasm0(arg1, arg2)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_getElementById_b180ea4ada06a837 = function(arg0, arg1, arg2) { + var ret = getObject(arg0).getElementById(getStringFromWasm0(arg1, arg2)); + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbg_setid_cea8de140a58c4f1 = function(arg0, arg1, arg2) { + getObject(arg0).id = getStringFromWasm0(arg1, arg2); + }; + imports.wbg.__wbg_scrollLeft_12724e899fab9019 = function(arg0) { + var ret = getObject(arg0).scrollLeft; + return ret; + }; + imports.wbg.__wbg_getBoundingClientRect_dbd899b7c945c55d = function(arg0) { var ret = getObject(arg0).getBoundingClientRect(); return addHeapObject(ret); }; - imports.wbg.__wbg_instanceof_WebGlRenderingContext_a37cc8c6016098e4 = function(arg0) { + imports.wbg.__wbg_instanceof_WebGlRenderingContext_c86a7d34366b6a22 = function(arg0) { var ret = getObject(arg0) instanceof WebGLRenderingContext; return ret; }; - imports.wbg.__wbg_bufferData_0690087420a9f115 = function(arg0, arg1, arg2, arg3) { + imports.wbg.__wbg_drawingBufferWidth_251cf4c11b8fe3b7 = function(arg0) { + var ret = getObject(arg0).drawingBufferWidth; + return ret; + }; + imports.wbg.__wbg_drawingBufferHeight_b65221325b738d84 = function(arg0) { + var ret = getObject(arg0).drawingBufferHeight; + return ret; + }; + imports.wbg.__wbg_bufferData_fc1c7f6f7937aa2f = function(arg0, arg1, arg2, arg3) { getObject(arg0).bufferData(arg1 >>> 0, getObject(arg2), arg3 >>> 0); }; - imports.wbg.__wbg_texImage2D_8d677a54ab75452c = handleError(function(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) { + imports.wbg.__wbg_texImage2D_875a12810798bd91 = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10) { getObject(arg0).texImage2D(arg1 >>> 0, arg2, arg3, arg4, arg5, arg6, arg7 >>> 0, arg8 >>> 0, arg9 === 0 ? undefined : getArrayU8FromWasm0(arg9, arg10)); - }); - imports.wbg.__wbg_activeTexture_7246ae8c464868b4 = function(arg0, arg1) { + }, arguments) }; + imports.wbg.__wbg_activeTexture_e014ee7b74cc1fca = function(arg0, arg1) { getObject(arg0).activeTexture(arg1 >>> 0); }; - imports.wbg.__wbg_attachShader_d213e7ecd3432f4a = function(arg0, arg1, arg2) { + imports.wbg.__wbg_attachShader_6124f72095cdcf11 = function(arg0, arg1, arg2) { getObject(arg0).attachShader(getObject(arg1), getObject(arg2)); }; - imports.wbg.__wbg_bindBuffer_f0ba4bbfd5b08434 = function(arg0, arg1, arg2) { + imports.wbg.__wbg_bindBuffer_275d909129fba2de = function(arg0, arg1, arg2) { getObject(arg0).bindBuffer(arg1 >>> 0, getObject(arg2)); }; - imports.wbg.__wbg_bindTexture_c00656e6f0530ee7 = function(arg0, arg1, arg2) { + imports.wbg.__wbg_bindTexture_f00c4b7db89d6a11 = function(arg0, arg1, arg2) { getObject(arg0).bindTexture(arg1 >>> 0, getObject(arg2)); }; - imports.wbg.__wbg_blendFunc_c7c9cda2a0e4b97f = function(arg0, arg1, arg2) { + imports.wbg.__wbg_blendFunc_75a5af348aa4b099 = function(arg0, arg1, arg2) { getObject(arg0).blendFunc(arg1 >>> 0, arg2 >>> 0); }; - imports.wbg.__wbg_clear_c9cc14c37d12a838 = function(arg0, arg1) { + imports.wbg.__wbg_clear_65a182ed82b4f282 = function(arg0, arg1) { getObject(arg0).clear(arg1 >>> 0); }; - imports.wbg.__wbg_clearColor_73695d8d401f87e6 = function(arg0, arg1, arg2, arg3, arg4) { + imports.wbg.__wbg_clearColor_e0034d2b65202787 = function(arg0, arg1, arg2, arg3, arg4) { getObject(arg0).clearColor(arg1, arg2, arg3, arg4); }; - imports.wbg.__wbg_compileShader_961db910485f4a76 = function(arg0, arg1) { + imports.wbg.__wbg_compileShader_42fdaee532cdb8e4 = function(arg0, arg1) { getObject(arg0).compileShader(getObject(arg1)); }; - imports.wbg.__wbg_createBuffer_4deb008968921e7f = function(arg0) { + imports.wbg.__wbg_createBuffer_3691dcedc890b4e8 = function(arg0) { var ret = getObject(arg0).createBuffer(); return isLikeNone(ret) ? 0 : addHeapObject(ret); }; - imports.wbg.__wbg_createProgram_b502951c403f671a = function(arg0) { + imports.wbg.__wbg_createProgram_8edfd62e0586640d = function(arg0) { var ret = getObject(arg0).createProgram(); return isLikeNone(ret) ? 0 : addHeapObject(ret); }; - imports.wbg.__wbg_createShader_7bd4296ba9c32133 = function(arg0, arg1) { + imports.wbg.__wbg_createShader_7033c38612c5688d = function(arg0, arg1) { var ret = getObject(arg0).createShader(arg1 >>> 0); return isLikeNone(ret) ? 0 : addHeapObject(ret); }; - imports.wbg.__wbg_createTexture_e0437703d5b41f24 = function(arg0) { + imports.wbg.__wbg_createTexture_65cc306909332417 = function(arg0) { var ret = getObject(arg0).createTexture(); return isLikeNone(ret) ? 0 : addHeapObject(ret); }; - imports.wbg.__wbg_disable_6d4d32f05b00518e = function(arg0, arg1) { + imports.wbg.__wbg_disable_cb4b0073c4406d0d = function(arg0, arg1) { getObject(arg0).disable(arg1 >>> 0); }; - imports.wbg.__wbg_drawElements_b22db7173101346e = function(arg0, arg1, arg2, arg3, arg4) { + imports.wbg.__wbg_drawElements_4ec52596f5751396 = function(arg0, arg1, arg2, arg3, arg4) { getObject(arg0).drawElements(arg1 >>> 0, arg2, arg3 >>> 0, arg4); }; - imports.wbg.__wbg_enable_700dbd1724c67920 = function(arg0, arg1) { + imports.wbg.__wbg_enable_8f92d01df1a4c77c = function(arg0, arg1) { getObject(arg0).enable(arg1 >>> 0); }; - imports.wbg.__wbg_enableVertexAttribArray_4b6614b028d442ff = function(arg0, arg1) { + imports.wbg.__wbg_enableVertexAttribArray_4b127e0ecccd536c = function(arg0, arg1) { getObject(arg0).enableVertexAttribArray(arg1 >>> 0); }; - imports.wbg.__wbg_getAttribLocation_98ff7fc515cda07d = function(arg0, arg1, arg2, arg3) { + imports.wbg.__wbg_getAttribLocation_e3a341ce3579c6e6 = function(arg0, arg1, arg2, arg3) { var ret = getObject(arg0).getAttribLocation(getObject(arg1), getStringFromWasm0(arg2, arg3)); return ret; }; - imports.wbg.__wbg_getProgramInfoLog_a84afc629d343c75 = function(arg0, arg1, arg2) { + imports.wbg.__wbg_getProgramInfoLog_0b10742df7a2ebea = function(arg0, arg1, arg2) { var ret = getObject(arg1).getProgramInfoLog(getObject(arg2)); var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); var len0 = WASM_VECTOR_LEN; getInt32Memory0()[arg0 / 4 + 1] = len0; getInt32Memory0()[arg0 / 4 + 0] = ptr0; }; - imports.wbg.__wbg_getProgramParameter_327111ebb2bca7fb = function(arg0, arg1, arg2) { + imports.wbg.__wbg_getProgramParameter_bb277a1d000dd7a1 = function(arg0, arg1, arg2) { var ret = getObject(arg0).getProgramParameter(getObject(arg1), arg2 >>> 0); return addHeapObject(ret); }; - imports.wbg.__wbg_getShaderInfoLog_a9529ee3f2ebd3e0 = function(arg0, arg1, arg2) { + imports.wbg.__wbg_getShaderInfoLog_950ab0c3fc7afa37 = function(arg0, arg1, arg2) { var ret = getObject(arg1).getShaderInfoLog(getObject(arg2)); var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); var len0 = WASM_VECTOR_LEN; getInt32Memory0()[arg0 / 4 + 1] = len0; getInt32Memory0()[arg0 / 4 + 0] = ptr0; }; - imports.wbg.__wbg_getShaderParameter_d7853b2d4822ad9f = function(arg0, arg1, arg2) { + imports.wbg.__wbg_getShaderParameter_54891c5545a79869 = function(arg0, arg1, arg2) { var ret = getObject(arg0).getShaderParameter(getObject(arg1), arg2 >>> 0); return addHeapObject(ret); }; - imports.wbg.__wbg_getUniformLocation_55700686ebe625a9 = function(arg0, arg1, arg2, arg3) { + imports.wbg.__wbg_getUniformLocation_8b0d07c81923dc0a = function(arg0, arg1, arg2, arg3) { var ret = getObject(arg0).getUniformLocation(getObject(arg1), getStringFromWasm0(arg2, arg3)); return isLikeNone(ret) ? 0 : addHeapObject(ret); }; - imports.wbg.__wbg_linkProgram_7c29f15a5150d174 = function(arg0, arg1) { + imports.wbg.__wbg_linkProgram_0be4bd888f743eb0 = function(arg0, arg1) { getObject(arg0).linkProgram(getObject(arg1)); }; - imports.wbg.__wbg_scissor_5d19639b621ab86f = function(arg0, arg1, arg2, arg3, arg4) { + imports.wbg.__wbg_scissor_0a69745d4b30dc5a = function(arg0, arg1, arg2, arg3, arg4) { getObject(arg0).scissor(arg1, arg2, arg3, arg4); }; - imports.wbg.__wbg_shaderSource_bf6be2cc97a14fc1 = function(arg0, arg1, arg2, arg3) { + imports.wbg.__wbg_shaderSource_c666880b620c8f34 = function(arg0, arg1, arg2, arg3) { getObject(arg0).shaderSource(getObject(arg1), getStringFromWasm0(arg2, arg3)); }; - imports.wbg.__wbg_texParameteri_c9ce5bb9e350c6cd = function(arg0, arg1, arg2, arg3) { + imports.wbg.__wbg_texParameteri_dd58ff2ef56511b2 = function(arg0, arg1, arg2, arg3) { getObject(arg0).texParameteri(arg1 >>> 0, arg2 >>> 0, arg3); }; - imports.wbg.__wbg_uniform1i_bbbce4278738d73e = function(arg0, arg1, arg2) { + imports.wbg.__wbg_uniform1i_e39f64f3710aa2dc = function(arg0, arg1, arg2) { getObject(arg0).uniform1i(getObject(arg1), arg2); }; - imports.wbg.__wbg_uniform2f_aaa7fe970579cfd3 = function(arg0, arg1, arg2, arg3) { + imports.wbg.__wbg_uniform2f_82d8cb2acf928fdc = function(arg0, arg1, arg2, arg3) { getObject(arg0).uniform2f(getObject(arg1), arg2, arg3); }; - imports.wbg.__wbg_useProgram_51f7808f5955c03a = function(arg0, arg1) { + imports.wbg.__wbg_useProgram_fb4984fb080bcd61 = function(arg0, arg1) { getObject(arg0).useProgram(getObject(arg1)); }; - imports.wbg.__wbg_vertexAttribPointer_76ddec1ed8425967 = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6) { + imports.wbg.__wbg_vertexAttribPointer_d00262e9bf7a3742 = function(arg0, arg1, arg2, arg3, arg4, arg5, arg6) { getObject(arg0).vertexAttribPointer(arg1 >>> 0, arg2, arg3 >>> 0, arg4 !== 0, arg5, arg6); }; - imports.wbg.__wbg_viewport_dd0dedc488a8dba4 = function(arg0, arg1, arg2, arg3, arg4) { + imports.wbg.__wbg_viewport_39356c8cdec98b8b = function(arg0, arg1, arg2, arg3, arg4) { getObject(arg0).viewport(arg1, arg2, arg3, arg4); }; - imports.wbg.__wbg_log_3bafd82835c6de6d = function(arg0) { + imports.wbg.__wbg_error_d95afd6217cfd219 = function(arg0) { + console.error(getObject(arg0)); + }; + imports.wbg.__wbg_log_9a99fb1af846153b = function(arg0) { console.log(getObject(arg0)); }; - imports.wbg.__wbg_style_9a41d46c005f7596 = function(arg0) { - var ret = getObject(arg0).style; - return addHeapObject(ret); + imports.wbg.__wbg_warn_b39e749f1dc02058 = function(arg0) { + console.warn(getObject(arg0)); }; - imports.wbg.__wbg_clientX_c1a2c3a6a07188a2 = function(arg0) { - var ret = getObject(arg0).clientX; + imports.wbg.__wbg_scrollTop_48a9fc126383767d = function(arg0) { + var ret = getObject(arg0).scrollTop; return ret; }; - imports.wbg.__wbg_clientY_090f8ba07f76875d = function(arg0) { - var ret = getObject(arg0).clientY; + imports.wbg.__wbg_hidden_4ee4c56ccb618f43 = function(arg0) { + var ret = getObject(arg0).hidden; return ret; }; - imports.wbg.__wbg_now_49847177a6d1d57e = function(arg0) { - var ret = getObject(arg0).now(); - return ret; + imports.wbg.__wbg_sethidden_4e6127e185ecf2df = function(arg0, arg1) { + getObject(arg0).hidden = arg1 !== 0; }; - imports.wbg.__wbg_pageX_234547d8f89fd3d0 = function(arg0) { - var ret = getObject(arg0).pageX; + imports.wbg.__wbg_style_25309daade79abb3 = function(arg0) { + var ret = getObject(arg0).style; + return addHeapObject(ret); + }; + imports.wbg.__wbg_offsetTop_c8896829575199ae = function(arg0) { + var ret = getObject(arg0).offsetTop; return ret; }; - imports.wbg.__wbg_pageY_4f94b607e8f1a8a2 = function(arg0) { - var ret = getObject(arg0).pageY; + imports.wbg.__wbg_offsetLeft_d2ef32e9fc657e70 = function(arg0) { + var ret = getObject(arg0).offsetLeft; return ret; }; - imports.wbg.__wbg_keyCode_689d196ab65a93d7 = function(arg0) { - var ret = getObject(arg0).keyCode; + imports.wbg.__wbg_offsetWidth_7dd96a3df070d552 = function(arg0) { + var ret = getObject(arg0).offsetWidth; return ret; }; - imports.wbg.__wbg_isComposing_c0f97b8c3f5992b5 = function(arg0) { - var ret = getObject(arg0).isComposing; + imports.wbg.__wbg_blur_b336d41728268f5a = function() { return handleError(function (arg0) { + getObject(arg0).blur(); + }, arguments) }; + imports.wbg.__wbg_focus_2fac919cca20d33b = function() { return handleError(function (arg0) { + getObject(arg0).focus(); + }, arguments) }; + imports.wbg.__wbg_instanceof_HtmlInputElement_df6fbc606ba24e20 = function(arg0) { + var ret = getObject(arg0) instanceof HTMLInputElement; return ret; }; - imports.wbg.__wbg_key_590d4d2a765d1b58 = function(arg0, arg1) { - var ret = getObject(arg1).key; + imports.wbg.__wbg_setautofocus_700ebffe64c7c2a3 = function(arg0, arg1) { + getObject(arg0).autofocus = arg1 !== 0; + }; + imports.wbg.__wbg_setsize_b6692780c79d2467 = function(arg0, arg1) { + getObject(arg0).size = arg1 >>> 0; + }; + imports.wbg.__wbg_value_f4c762446c572119 = function(arg0, arg1) { + var ret = getObject(arg1).value; var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); var len0 = WASM_VECTOR_LEN; getInt32Memory0()[arg0 / 4 + 1] = len0; getInt32Memory0()[arg0 / 4 + 0] = ptr0; }; - imports.wbg.__wbg_preventDefault_93d06688748bfc14 = function(arg0) { - getObject(arg0).preventDefault(); - }; - imports.wbg.__wbg_stopPropagation_a47dd3b6ffe6b400 = function(arg0) { - getObject(arg0).stopPropagation(); + imports.wbg.__wbg_setvalue_65a652cfd99c8a4a = function(arg0, arg1, arg2) { + getObject(arg0).value = getStringFromWasm0(arg1, arg2); }; - imports.wbg.__wbg_instanceof_HtmlCanvasElement_4f5b5ec6cd53ccf3 = function(arg0) { + imports.wbg.__wbg_getData_dbec8064a4cc0e3e = function() { return handleError(function (arg0, arg1, arg2, arg3) { + var ret = getObject(arg1).getData(getStringFromWasm0(arg2, arg3)); + var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len0 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len0; + getInt32Memory0()[arg0 / 4 + 0] = ptr0; + }, arguments) }; + imports.wbg.__wbg_instanceof_HtmlCanvasElement_fd3cbbe3906d7792 = function(arg0) { var ret = getObject(arg0) instanceof HTMLCanvasElement; return ret; }; - imports.wbg.__wbg_width_a22f9855caa54b53 = function(arg0) { + imports.wbg.__wbg_width_9eb2c66ac9dde633 = function(arg0) { var ret = getObject(arg0).width; return ret; }; - imports.wbg.__wbg_setwidth_5f26a8ba9dbfa0d0 = function(arg0, arg1) { + imports.wbg.__wbg_setwidth_f3c88eb520ba8d47 = function(arg0, arg1) { getObject(arg0).width = arg1 >>> 0; }; - imports.wbg.__wbg_height_9a404a6b3c61c7ef = function(arg0) { + imports.wbg.__wbg_height_64e5d4222af3fb90 = function(arg0) { var ret = getObject(arg0).height; return ret; }; - imports.wbg.__wbg_setheight_70f62727aa9383c2 = function(arg0, arg1) { + imports.wbg.__wbg_setheight_5a1abba41e35c42a = function(arg0, arg1) { getObject(arg0).height = arg1 >>> 0; }; - imports.wbg.__wbg_getContext_37ca0870acb096d9 = handleError(function(arg0, arg1, arg2) { + imports.wbg.__wbg_getContext_813df131fcbd6e91 = function() { return handleError(function (arg0, arg1, arg2) { var ret = getObject(arg0).getContext(getStringFromWasm0(arg1, arg2)); return isLikeNone(ret) ? 0 : addHeapObject(ret); - }); - imports.wbg.__wbg_call_8e95613cc6524977 = handleError(function(arg0, arg1) { - var ret = getObject(arg0).call(getObject(arg1)); + }, arguments) }; + imports.wbg.__wbg_keyCode_218ac9c01e06b3d5 = function(arg0) { + var ret = getObject(arg0).keyCode; + return ret; + }; + imports.wbg.__wbg_altKey_5136125f8a64c2cf = function(arg0) { + var ret = getObject(arg0).altKey; + return ret; + }; + imports.wbg.__wbg_ctrlKey_8fa508d0b540bc8f = function(arg0) { + var ret = getObject(arg0).ctrlKey; + return ret; + }; + imports.wbg.__wbg_shiftKey_21477313df4f5291 = function(arg0) { + var ret = getObject(arg0).shiftKey; + return ret; + }; + imports.wbg.__wbg_metaKey_d60075e40f8f06d7 = function(arg0) { + var ret = getObject(arg0).metaKey; + return ret; + }; + imports.wbg.__wbg_isComposing_615e6dcf813b18db = function(arg0) { + var ret = getObject(arg0).isComposing; + return ret; + }; + imports.wbg.__wbg_key_6827d862c9cc3928 = function(arg0, arg1) { + var ret = getObject(arg1).key; + var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len0 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len0; + getInt32Memory0()[arg0 / 4 + 0] = ptr0; + }; + imports.wbg.__wbg_clipboardData_e06fb2e7b2005e57 = function(arg0) { + var ret = getObject(arg0).clipboardData; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbg_type_55a19f61b3198ce6 = function(arg0, arg1) { + var ret = getObject(arg1).type; + var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len0 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len0; + getInt32Memory0()[arg0 / 4 + 0] = ptr0; + }; + imports.wbg.__wbg_preventDefault_7c4d18eb2bb1a26a = function(arg0) { + getObject(arg0).preventDefault(); + }; + imports.wbg.__wbg_stopPropagation_11ccdc30c46ad19a = function(arg0) { + getObject(arg0).stopPropagation(); + }; + imports.wbg.__wbg_touches_976280ecfdead054 = function(arg0) { + var ret = getObject(arg0).touches; return addHeapObject(ret); - }); - imports.wbg.__wbindgen_object_clone_ref = function(arg0) { - var ret = getObject(arg0); + }; + imports.wbg.__wbg_changedTouches_a281259c12af3e85 = function(arg0) { + var ret = getObject(arg0).changedTouches; + return addHeapObject(ret); + }; + imports.wbg.__wbg_getRandomValues_98117e9a7e993920 = function() { return handleError(function (arg0, arg1) { + getObject(arg0).getRandomValues(getObject(arg1)); + }, arguments) }; + imports.wbg.__wbg_randomFillSync_64cc7d048f228ca8 = function() { return handleError(function (arg0, arg1, arg2) { + getObject(arg0).randomFillSync(getArrayU8FromWasm0(arg1, arg2)); + }, arguments) }; + imports.wbg.__wbg_process_2f24d6544ea7b200 = function(arg0) { + var ret = getObject(arg0).process; + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_object = function(arg0) { + const val = getObject(arg0); + var ret = typeof(val) === 'object' && val !== null; + return ret; + }; + imports.wbg.__wbg_versions_6164651e75405d4a = function(arg0) { + var ret = getObject(arg0).versions; + return addHeapObject(ret); + }; + imports.wbg.__wbg_node_4b517d861cbcb3bc = function(arg0) { + var ret = getObject(arg0).node; + return addHeapObject(ret); + }; + imports.wbg.__wbg_modulerequire_3440a4bcf44437db = function() { return handleError(function (arg0, arg1) { + var ret = module.require(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_crypto_98fc271021c7d2ad = function(arg0) { + var ret = getObject(arg0).crypto; + return addHeapObject(ret); + }; + imports.wbg.__wbg_msCrypto_a2cdb043d2bfe57f = function(arg0) { + var ret = getObject(arg0).msCrypto; return addHeapObject(ret); }; - imports.wbg.__wbg_newnoargs_f3b8a801d5d4b079 = function(arg0, arg1) { + imports.wbg.__wbg_call_ba36642bd901572b = function() { return handleError(function (arg0, arg1) { + var ret = getObject(arg0).call(getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_newnoargs_9fdd8f3961dd1bee = function(arg0, arg1) { var ret = new Function(getStringFromWasm0(arg0, arg1)); return addHeapObject(ret); }; - imports.wbg.__wbg_getHours_551ae9f419d47a3b = function(arg0) { + imports.wbg.__wbg_getHours_97dfe84bae4276f1 = function(arg0) { var ret = getObject(arg0).getHours(); return ret; }; - imports.wbg.__wbg_getMilliseconds_c188d73c551e97d1 = function(arg0) { + imports.wbg.__wbg_getMilliseconds_eab6600bacdff779 = function(arg0) { var ret = getObject(arg0).getMilliseconds(); return ret; }; - imports.wbg.__wbg_getMinutes_054a5442be4b9aa6 = function(arg0) { + imports.wbg.__wbg_getMinutes_f3d9099bcf4e42ab = function(arg0) { var ret = getObject(arg0).getMinutes(); return ret; }; - imports.wbg.__wbg_getSeconds_9cda850b6648721a = function(arg0) { + imports.wbg.__wbg_getSeconds_dd69f2cd151dbe65 = function(arg0) { var ret = getObject(arg0).getSeconds(); return ret; }; - imports.wbg.__wbg_new0_a3af66503e735141 = function() { + imports.wbg.__wbg_new0_85024d5e91a046e9 = function() { var ret = new Date(); return addHeapObject(ret); }; - imports.wbg.__wbg_self_07b2f89e82ceb76d = handleError(function() { + imports.wbg.__wbg_resolve_cae3d8f752f5db88 = function(arg0) { + var ret = Promise.resolve(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_then_c2361a9d5c9a4fcb = function(arg0, arg1) { + var ret = getObject(arg0).then(getObject(arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_then_6c9a4bf55755f9b8 = function(arg0, arg1, arg2) { + var ret = getObject(arg0).then(getObject(arg1), getObject(arg2)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_self_bb69a836a72ec6e9 = function() { return handleError(function () { var ret = self.self; return addHeapObject(ret); - }); - imports.wbg.__wbg_window_ba85d88572adc0dc = handleError(function() { + }, arguments) }; + imports.wbg.__wbg_window_3304fc4b414c9693 = function() { return handleError(function () { var ret = window.window; return addHeapObject(ret); - }); - imports.wbg.__wbg_globalThis_b9277fc37e201fe5 = handleError(function() { + }, arguments) }; + imports.wbg.__wbg_globalThis_e0d21cabc6630763 = function() { return handleError(function () { var ret = globalThis.globalThis; return addHeapObject(ret); - }); - imports.wbg.__wbg_global_e16303fe83e1d57f = handleError(function() { + }, arguments) }; + imports.wbg.__wbg_global_8463719227271676 = function() { return handleError(function () { var ret = global.global; return addHeapObject(ret); - }); - imports.wbg.__wbg_buffer_49131c283a06686f = function(arg0) { + }, arguments) }; + imports.wbg.__wbindgen_is_undefined = function(arg0) { + var ret = getObject(arg0) === undefined; + return ret; + }; + imports.wbg.__wbg_buffer_9e184d6f785de5ed = function(arg0) { var ret = getObject(arg0).buffer; return addHeapObject(ret); }; - imports.wbg.__wbg_new_20cc9c1e8e319ac2 = function(arg0) { + imports.wbg.__wbg_new_aca5aec908023ece = function(arg0) { var ret = new Int16Array(getObject(arg0)); return addHeapObject(ret); }; - imports.wbg.__wbg_new_9b295d24cf1d706f = function(arg0) { + imports.wbg.__wbg_new_e8101319e4cf95fc = function(arg0) { var ret = new Uint8Array(getObject(arg0)); return addHeapObject(ret); }; - imports.wbg.__wbg_new_79f4487112eba5a7 = function(arg0) { + imports.wbg.__wbg_set_e8ae7b27314e8b98 = function(arg0, arg1, arg2) { + getObject(arg0).set(getObject(arg1), arg2 >>> 0); + }; + imports.wbg.__wbg_length_2d56cb37075fcfb1 = function(arg0) { + var ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_new_d69bbe3db485d457 = function(arg0) { var ret = new Float32Array(getObject(arg0)); return addHeapObject(ret); }; - imports.wbg.__wbg_subarray_4cf58941ccdff8e8 = function(arg0, arg1, arg2) { + imports.wbg.__wbg_subarray_67cca750e048c2bf = function(arg0, arg1, arg2) { var ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); return addHeapObject(ret); }; - imports.wbg.__wbg_subarray_4eaeb3de00cf1955 = function(arg0, arg1, arg2) { + imports.wbg.__wbg_newwithlength_a8d1dbcbe703a5c6 = function(arg0) { + var ret = new Uint8Array(arg0 >>> 0); + return addHeapObject(ret); + }; + imports.wbg.__wbg_subarray_901ede8318da52a6 = function(arg0, arg1, arg2) { var ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); return addHeapObject(ret); }; - imports.wbg.__wbg_subarray_f5aa665f0873e6e8 = function(arg0, arg1, arg2) { + imports.wbg.__wbg_subarray_8a2a686b9381b60f = function(arg0, arg1, arg2) { var ret = getObject(arg0).subarray(arg1 >>> 0, arg2 >>> 0); return addHeapObject(ret); }; - imports.wbg.__wbg_instanceof_Memory_8d2ddec6afb83aaa = function(arg0) { + imports.wbg.__wbg_instanceof_Memory_04d3f55ecfcadb62 = function(arg0) { var ret = getObject(arg0) instanceof WebAssembly.Memory; return ret; }; @@ -730,6 +1087,10 @@ async function init(input) { getFloat64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? 0 : ret; getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret); }; + imports.wbg.__wbindgen_is_string = function(arg0) { + var ret = typeof(getObject(arg0)) === 'string'; + return ret; + }; imports.wbg.__wbindgen_boolean_get = function(arg0) { const v = getObject(arg0); var ret = typeof(v) === 'boolean' ? (v ? 1 : 0) : 2; @@ -752,28 +1113,44 @@ async function init(input) { var ret = wasm.memory; return addHeapObject(ret); }; - imports.wbg.__wbindgen_closure_wrapper494 = function(arg0, arg1, arg2) { - var ret = makeMutClosure(arg0, arg1, 103, __wbg_adapter_24); + imports.wbg.__wbindgen_closure_wrapper480 = function(arg0, arg1, arg2) { + var ret = makeMutClosure(arg0, arg1, 62, __wbg_adapter_28); return addHeapObject(ret); }; - imports.wbg.__wbindgen_closure_wrapper495 = function(arg0, arg1, arg2) { - var ret = makeMutClosure(arg0, arg1, 103, __wbg_adapter_27); + imports.wbg.__wbindgen_closure_wrapper481 = function(arg0, arg1, arg2) { + var ret = makeMutClosure(arg0, arg1, 62, __wbg_adapter_31); return addHeapObject(ret); }; - imports.wbg.__wbindgen_closure_wrapper497 = function(arg0, arg1, arg2) { - var ret = makeMutClosure(arg0, arg1, 103, __wbg_adapter_30); + imports.wbg.__wbindgen_closure_wrapper483 = function(arg0, arg1, arg2) { + var ret = makeMutClosure(arg0, arg1, 62, __wbg_adapter_34); return addHeapObject(ret); }; - imports.wbg.__wbindgen_closure_wrapper500 = function(arg0, arg1, arg2) { - var ret = makeMutClosure(arg0, arg1, 103, __wbg_adapter_33); + imports.wbg.__wbindgen_closure_wrapper485 = function(arg0, arg1, arg2) { + var ret = makeMutClosure(arg0, arg1, 62, __wbg_adapter_37); return addHeapObject(ret); }; - imports.wbg.__wbindgen_closure_wrapper502 = function(arg0, arg1, arg2) { - var ret = makeMutClosure(arg0, arg1, 103, __wbg_adapter_36); + imports.wbg.__wbindgen_closure_wrapper487 = function(arg0, arg1, arg2) { + var ret = makeMutClosure(arg0, arg1, 62, __wbg_adapter_40); return addHeapObject(ret); }; - imports.wbg.__wbindgen_closure_wrapper504 = function(arg0, arg1, arg2) { - var ret = makeMutClosure(arg0, arg1, 103, __wbg_adapter_39); + imports.wbg.__wbindgen_closure_wrapper489 = function(arg0, arg1, arg2) { + var ret = makeMutClosure(arg0, arg1, 62, __wbg_adapter_43); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_closure_wrapper491 = function(arg0, arg1, arg2) { + var ret = makeMutClosure(arg0, arg1, 62, __wbg_adapter_46); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_closure_wrapper493 = function(arg0, arg1, arg2) { + var ret = makeMutClosure(arg0, arg1, 62, __wbg_adapter_49); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_closure_wrapper496 = function(arg0, arg1, arg2) { + var ret = makeMutClosure(arg0, arg1, 62, __wbg_adapter_52); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_closure_wrapper889 = function(arg0, arg1, arg2) { + var ret = makeMutClosure(arg0, arg1, 211, __wbg_adapter_55); return addHeapObject(ret); }; @@ -781,6 +1158,8 @@ async function init(input) { input = fetch(input); } + + const { instance, module } = await load(await input, imports); wasm = instance.exports; diff --git a/docs/hobogo_bg.wasm b/docs/hobogo_bg.wasm index e412812..2cc8fd7 100644 Binary files a/docs/hobogo_bg.wasm and b/docs/hobogo_bg.wasm differ diff --git a/docs/index.html b/docs/index.html index dfa3896..0cafb6f 100644 --- a/docs/index.html +++ b/docs/index.html @@ -6,7 +6,7 @@ - Hobogo – a new board game + egui template - + - + + + \ No newline at end of file diff --git a/docs/main.js b/docs/main.js deleted file mode 100644 index f54e6f2..0000000 --- a/docs/main.js +++ /dev/null @@ -1,588 +0,0 @@ -// ---------------------------------------------------------------------------- -// Paint module: -function paintCommand(canvas, cmd) { - var ctx = canvas.getContext("2d"); - switch (cmd.kind) { - case "clear": - ctx.fillStyle = cmd.fillStyle; - ctx.clearRect(0, 0, canvas.width, canvas.height); - return; - case "line": - ctx.beginPath(); - ctx.lineWidth = cmd.lineWidth; - ctx.strokeStyle = cmd.strokeStyle; - ctx.moveTo(cmd.from[0], cmd.from[1]); - ctx.lineTo(cmd.to[0], cmd.to[1]); - ctx.stroke(); - return; - case "circle": - ctx.fillStyle = cmd.fillStyle; - ctx.beginPath(); - ctx.arc(cmd.center[0], cmd.center[1], cmd.radius, 0, 2 * Math.PI, false); - ctx.fill(); - return; - case "rounded_rect": - ctx.fillStyle = cmd.fillStyle; - var x = cmd.pos[0]; - var y = cmd.pos[1]; - var width = cmd.size[0]; - var height = cmd.size[1]; - var radius = cmd.radius; - ctx.beginPath(); - ctx.moveTo(x + radius, y); - ctx.lineTo(x + width - radius, y); - ctx.quadraticCurveTo(x + width, y, x + width, y + radius); - ctx.lineTo(x + width, y + height - radius); - ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); - ctx.lineTo(x + radius, y + height); - ctx.quadraticCurveTo(x, y + height, x, y + height - radius); - ctx.lineTo(x, y + radius); - ctx.quadraticCurveTo(x, y, x + radius, y); - ctx.closePath(); - ctx.fill(); - return; - case "text": - ctx.font = cmd.font; - ctx.fillStyle = cmd.fillStyle; - ctx.textAlign = cmd.textAlign; - ctx.fillText(cmd.text, cmd.pos[0], cmd.pos[1]); - return; - } -} -// we'll defer our execution until the wasm is ready to go -function wasm_loaded() { - console.log("wasm loaded"); - start_game(); -} -// here we tell bindgen the path to the wasm file so it can start -// initialization and return to us a promise when it's done -wasm_bindgen("./hobogo_bg.wasm") - .then(wasm_loaded)["catch"](console.error); -function player_to_wasm(player) { - return player === null ? -1 : player; -} -function board_to_wasm(board) { - var wasm_board = new Int8Array(board.length * board[0].length); - var i = 0; - for (var _i = 0, board_1 = board; _i < board_1.length; _i++) { - var row = board_1[_i]; - for (var _a = 0, row_1 = row; _a < row_1.length; _a++) { - var cell = row_1[_a]; - wasm_board[i++] = player_to_wasm(cell); - } - } - return wasm_board; -} -function ai_move(state) { - return wasm_bindgen.ai_move(board_to_wasm(state.board), player_to_wasm(state.next_player), num_players(state)); -} -function is_game_over(state) { - return wasm_bindgen.game_over(board_to_wasm(state.board), num_players(state)); -} -function volatile_cells(state) { - return wasm_bindgen.volatile_cells(board_to_wasm(state.board), num_players(state)); -} -// ---------------------------------------------------------------------------- -function player_name(state, player) { - var name; - if (player === 0) { - name = "blue"; - } - else if (player === 1) { - name = "red"; - } - else if (player === 2) { - name = "green"; - } - else if (player === 3) { - name = "yellow"; - } - else { - name = "p" + player; - } - if (player >= state.settings.num_humans) { - name += " (AI)"; - } - return name; -} -function player_color(player) { - if (player === null) { - return "#AAAAAA"; - } - if (player === 0) { - return "#5577FF"; - } - else if (player === 1) { - return "#FF0000"; - } - else if (player === 2) { - return "#00FF00"; - } - else { - return "#DDDD00"; - } -} -// blendColors from https://stackoverflow.com/a/13542669 -function blend_hex_colors(c0, c1, p) { - var f = parseInt(c0.slice(1), 16); - var t = parseInt(c1.slice(1), 16); - var R1 = f >> 16; - var G1 = (f >> 8) & 0x00ff; - var B1 = f & 0x0000ff; - var R2 = t >> 16; - var G2 = (t >> 8) & 0x00ff; - var B2 = t & 0x0000ff; - return ("#" + - (0x1000000 + - (Math.round((R2 - R1) * p) + R1) * 0x10000 + - (Math.round((G2 - G1) * p) + G1) * 0x100 + - (Math.round((B2 - B1) * p) + B1)) - .toString(16) - .slice(1)); -} -function cell_color(state, coord, is_volatile) { - var claimer = claimed_by(state, coord); - if (claimer !== null) { - var color = player_color(claimer); - if (!is_volatile && state.board[coord.y][coord.x] === null) { - color += "B0"; // Add alpha - // color = blend_hex_colors(color, "#ffffff", 0.35); - } - return color; - } - var is_human = state.next_player < state.settings.num_humans; - if (is_human && !is_valid_move(state, coord, state.next_player)) { - // The current human can´t move here. - return "#555555"; - } - return "#999999"; // Free (at least for some). -} -function calc_cell_size(board) { - return 440 / board.length; -} -function hovered_cell(board, mouse_pos) { - var cell_size = calc_cell_size(board); - for (var y = 0; y < board.length; ++y) { - for (var x = 0; x < board[y].length; ++x) { - var pad = 2; - var left = x * cell_size + pad; - var top_1 = y * cell_size + pad; - var right = (x + 1) * cell_size - pad; - var bottom = (y + 1) * cell_size - pad; - var is_hovering = left <= mouse_pos.x && - mouse_pos.x <= right && - top_1 <= mouse_pos.y && - mouse_pos.y <= bottom; - if (is_hovering) { - return { x: x, y: y }; - } - } - } - return null; -} -function column_name(x) { - return String.fromCharCode(x + 65); -} -function row_name(y) { - return "" + (y + 1); -} -// Chess name: -function coord_name(coord) { - return "" + column_name(coord.x) + row_name(coord.y); -} -function paint_board_commands(state) { - var board = state.board; - var commands = []; - commands.push({ - fillStyle: "#111111", - kind: "clear" - }); - var cell_size = calc_cell_size(board); - var PAINT_INFLUENCE_CONNECTIONS = false; - for (var y = 0; y < board.length; ++y) { - for (var x = 0; x < board[y].length; ++x) { - if (board[y][x] === null && PAINT_INFLUENCE_CONNECTIONS) { - for (var dy = -1; dy <= +1; ++dy) { - for (var dx = -1; dx <= +1; ++dx) { - if (dx === 0 && dy === 0) { - continue; - } - var neighbor_coord = { x: x + dx, y: y + dy }; - var neightbor_val = board_at(board, neighbor_coord); - if (neightbor_val !== null) { - var color = player_color(neightbor_val); - color += "80"; // Transparent - var f = 0.45 / Math.sqrt(dx * dx + dy * dy); - commands.push({ - from: [(x + 0.5) * cell_size, (y + 0.5) * cell_size], - kind: "line", - lineWidth: 4, - strokeStyle: color, - to: [ - (x + dx * f + 0.5) * cell_size, - (y + dy * f + 0.5) * cell_size, - ] - }); - } - } - } - } - } - } - var volatiles = volatile_cells(state); - for (var y = 0; y < board.length; ++y) { - for (var x = 0; x < board[y].length; ++x) { - var center_x = (x + 0.5) * cell_size; - var center_y = (y + 0.5) * cell_size; - var index = y * board[y].length + x; - var is_volatile = volatiles[index]; - var fillStyle = cell_color(state, { x: x, y: y }, is_volatile); - if (board_at(board, { x: x, y: y }) === null) { - var radius = 0.2 * cell_size; - commands.push({ - center: [center_x, center_y], - fillStyle: fillStyle, - kind: "circle", - radius: radius - }); - } - else { - var hw = 0.42 * cell_size; - var left = center_x - hw; - var top_2 = center_y - hw; - var right = center_x + hw; - var bottom = center_y + hw; - commands.push({ - fillStyle: fillStyle, - kind: "rounded_rect", - pos: [left, top_2], - radius: 0.45 * hw, - size: [2 * hw, 2 * hw] - }); - } - var PAINT_INFLUENCE_CIRCLES = false; - if (board[y][x] === null && PAINT_INFLUENCE_CIRCLES) { - for (var dy = -1; dy <= +1; ++dy) { - for (var dx = -1; dx <= +1; ++dx) { - if (dx === 0 && dy === 0) { - continue; - } - var neighbor_coord = { x: x + dx, y: y + dy }; - var neightbor_val = board_at(board, neighbor_coord); - if (neightbor_val !== null) { - var color = player_color(neightbor_val); - color += "80"; // Transparent - var f = 0.4 / Math.sqrt(dx * dx + dy * dy); - var cx = (x + dx * f + 0.5) * cell_size; - var cy = (y + dy * f + 0.5) * cell_size; - commands.push({ - center: [cx, cy], - fillStyle: color, - kind: "circle", - radius: 3 - }); - } - } - } - } - } - } - // Columns: A, B, C, D, ... - for (var x = 0; x < board[0].length; ++x) { - commands.push({ - fillStyle: "white", - font: "14px Palatino", - kind: "text", - pos: [(x + 0.5) * cell_size, board.length * cell_size + 16], - text: "" + column_name(x), - textAlign: "center" - }); - } - // Rows: 1, 2, 3, ... - for (var y = 0; y < board[0].length; ++y) { - commands.push({ - fillStyle: "white", - font: "14px Palatino", - kind: "text", - pos: [board[0].length * cell_size + 12, (y + 0.5) * cell_size + 8], - text: "" + row_name(y), - textAlign: "center" - }); - } - var text_cmd = { - fillStyle: "white", - font: "24px Palatino", - kind: "text", - pos: [12, board.length * cell_size + 64], - text: "", - textAlign: "start" - }; - var paint_text = function (fillStyle, text, x, y) { - commands.push({ - fillStyle: fillStyle, - font: "24px Palatino", - kind: "text", - pos: [x, y], - text: text, - textAlign: "start" - }); - }; - { - var LINES_SPACING = 32; - var y = board.length * cell_size + 64; - if (is_game_over(state)) { - paint_text("white", "GAME OVER", 12, y); - } - else { - paint_text(player_color(state.next_player), player_name(state, state.next_player) + " to play", 12, y); - } - y += 1.5 * LINES_SPACING; - paint_text("white", "Standings:", 12, y); - y += LINES_SPACING; - var score = get_score(state); - for (var pi = 0; pi < num_players(state); ++pi) { - commands.push({ - fillStyle: player_color(pi), - font: "24px Palatino", - kind: "text", - pos: [24, y], - text: "" + player_name(state, pi), - textAlign: "start" - }); - commands.push({ - fillStyle: player_color(pi), - font: "24px Palatino", - kind: "text", - pos: [200, y], - text: "" + score[pi], - textAlign: "end" - }); - y += LINES_SPACING; - } - } - return commands; -} -function paint_board(canvas, state, hovered) { - if (hovered !== null) { - state = make_move(state, hovered, state.next_player) || state; // PREVIEW! - } - var commands = paint_board_commands(state); - for (var _i = 0, commands_1 = commands; _i < commands_1.length; _i++) { - var cmd = commands_1[_i]; - paintCommand(canvas, cmd); - } -} -// ---------------------------------------------------------------------------- -function get_mouse_pos(canvas, evt) { - var rect = canvas.getBoundingClientRect(); - return { - x: evt.clientX - rect.left, - y: evt.clientY - rect.top - }; -} -function array(n, value_maker) { - var board = []; - for (var i = 0; i < n; ++i) { - board.push(value_maker(i)); - } - return board; -} -function make_board(n) { - return array(n, function (_) { return array(n, function (__) { return null; }); }); -} -function is_board_at(board, coord) { - if (coord.x < 0 || board[0].length <= coord.x) { - return false; - } - if (coord.y < 0 || board.length <= coord.y) { - return false; - } - return true; -} -function board_at(board, coord) { - return is_board_at(board, coord) ? board[coord.y][coord.x] : null; -} -function influences_at(state, coord) { - var influences = array(num_players(state), function (_) { return 0; }); - for (var dy = -1; dy <= +1; ++dy) { - for (var dx = -1; dx <= +1; ++dx) { - if (dx === 0 && dy === 0) { - continue; - } - var neighbor_coord = { x: coord.x + dx, y: coord.y + dy }; - var neightbor_val = board_at(state.board, neighbor_coord); - if (neightbor_val !== null) { - influences[neightbor_val] += 1; - } - } - } - return influences; -} -// This piece of ground is by majority influenced by... -function claimed_by(state, coord) { - var board = state.board; - if (board[coord.y][coord.x] !== null) { - return board[coord.y][coord.x]; - } - var influences = influences_at(state, coord); - for (var player = 0; player < num_players(state); ++player) { - var somebody_else_is_as_large = false; - for (var other = 0; other < num_players(state); ++other) { - if (player !== other && influences[other] >= influences[player]) { - somebody_else_is_as_large = true; - } - } - if (!somebody_else_is_as_large) { - return player; - } - } - return null; -} -function get_score(state) { - var score = array(num_players(state), function (_) { return 0; }); - var board = state.board; - for (var y = 0; y < board.length; ++y) { - for (var x = 0; x < board[y].length; ++x) { - var claimer = claimed_by(state, { x: x, y: y }); - if (claimer !== null) { - score[claimer] += 1; - } - } - } - return score; -} -function is_valid_move(state, coord, player) { - var board = state.board; - if (coord === null) { - return false; - } - if (coord.x < 0 || board[0].length <= coord.x) { - return false; - } - if (coord.y < 0 || board.length <= coord.y) { - return false; - } - if (board[coord.y][coord.x] !== null) { - return false; - } - var influences = influences_at(state, coord); - for (var i = 0; i < num_players(state); ++i) { - if (influences[i] > influences[player]) { - return false; - } - } - return true; -} -function clone(obj) { - return JSON.parse(JSON.stringify(obj)); -} -function make_move(state, coord, player) { - var is_pass = coord.x === -1 && coord.y === -1; - if (!is_pass && !is_valid_move(state, coord, player)) { - return null; - } - var new_state = clone(state); - if (!is_pass) { - new_state.board[coord.y][coord.x] = player; - } - new_state.next_player = (new_state.next_player + 1) % num_players(state); - return new_state; -} -function num_players(state) { - return state.settings.num_humans + state.settings.num_cpus; -} -// ---------------------------------------------------------------------------- -var g_canvas = document.getElementById("hobo_canvas"); -var g_state = { - board: make_board(7), - next_player: 0, - settings: { - board_size: 7, - num_cpus: 1, - num_humans: 1 - } -}; -var g_undo_stack = []; -function save_undo_point() { - g_undo_stack.push(g_state); - while (g_undo_stack.length > 100) { - g_undo_stack.shift(); - } -} -function set_new_state(state) { - g_state = state; - paint_board(g_canvas, g_state, null); - if (g_state.next_player >= g_state.settings.num_humans) { - setTimeout(make_ai_move, 100); - } -} -function start_game() { - g_canvas.addEventListener("mousemove", function (evt) { - var mouse_pos = get_mouse_pos(g_canvas, evt); - var hovered = hovered_cell(g_state.board, mouse_pos); - paint_board(g_canvas, g_state, hovered); - }, false); - g_canvas.addEventListener("mousedown", function (evt) { - var mouse_pos = get_mouse_pos(g_canvas, evt); - var hovered = hovered_cell(g_state.board, mouse_pos); - save_undo_point(); - try_make_move(hovered); - }, false); - paint_board(g_canvas, g_state, null); -} -function try_make_move(coord) { - var new_state = make_move(g_state, coord, g_state.next_player); - if (new_state) { - set_new_state(new_state); - } - else { - console.error("Cannot make move at " + coord_name(coord) + " for player " + player_name(g_state, g_state.next_player)); - } -} -function make_ai_move() { - var coord = ai_move(g_state); - console.info("AI " + player_name(g_state, g_state.next_player) + ": " + coord_name(coord)); - try_make_move(coord); - paint_board(g_canvas, g_state, null); -} -export function on_size_change(size) { - document.getElementById("size_label").innerHTML = "Size: " + size + "x" + size; - var new_settings = clone(g_state.settings); - new_settings.board_size = size; - new_game(new_settings); -} -export function on_humans_change(humans) { - document.getElementById("humans_label").innerHTML = "Humans: " + humans; - var new_settings = clone(g_state.settings); - new_settings.num_humans = humans; - new_game(new_settings); -} -export function on_cpus_change(cpus) { - document.getElementById("cpus_label").innerHTML = "Bots: " + cpus; - var new_settings = clone(g_state.settings); - new_settings.num_cpus = cpus; - new_game(new_settings); -} -export function new_game(settings) { - var board_size = settings.board_size; - var state = { - board: make_board(board_size), - next_player: 0, - settings: clone(settings) - }; - save_undo_point(); - set_new_state(state); -} -export function undo() { - if (g_undo_stack.length === 0) { - return; - } - g_state = g_undo_stack.pop(); - paint_board(g_canvas, g_state, null); -} -// Hacky way to export functions: -document.on_size_change = on_size_change; -document.on_humans_change = on_humans_change; -document.on_cpus_change = on_cpus_change; -document.new_game = function () { return new_game(g_state.settings); }; -document.undo = undo; diff --git a/rustfmt.toml b/rustfmt.toml new file mode 100644 index 0000000..c51666e --- /dev/null +++ b/rustfmt.toml @@ -0,0 +1 @@ +edition = "2018" \ No newline at end of file diff --git a/setup_web.sh b/setup_web.sh new file mode 100755 index 0000000..6a60478 --- /dev/null +++ b/setup_web.sh @@ -0,0 +1,10 @@ +#!/bin/bash +set -eu + +# Pre-requisites: +rustup target add wasm32-unknown-unknown +cargo install -f wasm-bindgen-cli +cargo update -p wasm-bindgen + +# For local tests with `./start_server`: +cargo install basic-http-server diff --git a/src/app.rs b/src/app.rs index 6780290..cc035db 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,17 +1,23 @@ -use std::collections::VecDeque; +use std::{ + collections::VecDeque, + fs::File, + io::{Read, Write}, + time::{Duration, Instant}, +}; use serde::{Deserialize, Serialize}; -use egui::{ - color::{srgba, Srgba}, - label, - math::*, - paint::TextStyle, - widgets::*, - Align, Painter, Ui, +use eframe::{ + egui::{self, color::Color32, math::*, paint::TextStyle, widgets::*, Align, Painter, Ui}, + epi, +}; + +use crate::{ + hobogo::{Board, Coord, Player}, + mcts, }; -use crate::hobogo::{Board, Coord, Player}; +const STORAGE_FILE_NAME: &str = "hobogo.json"; #[derive(Clone, Copy, Deserialize, PartialEq, Serialize)] pub struct Settings { @@ -19,6 +25,7 @@ pub struct Settings { num_humans: usize, num_bots: usize, humans_first: bool, + bot_think_time: f32, } impl Default for Settings { @@ -28,6 +35,7 @@ impl Default for Settings { num_humans: 1, num_bots: 1, humans_first: true, + bot_think_time: 1., } } } @@ -64,8 +72,16 @@ impl State { } pub fn from_local_storage() -> Option { + #[cfg(target_arch = "wasm32")] let state: Option = egui_web::local_storage_get("hobogo_state").map(|s| serde_json::from_str(&s).ok())?; + #[cfg(not(target_arch = "wasm32"))] + let state: Option = File::open(STORAGE_FILE_NAME).ok().and_then(|mut f| { + let mut buf = String::new(); + f.read_to_string(&mut buf).ok()?; + serde_json::from_str(&buf).ok() + }); + if let Some(state) = state { if state.is_valid() { return Some(state); @@ -75,9 +91,22 @@ impl State { } pub fn save_to_local_storage(&self) -> bool { - serde_json::to_string(&self) - .map(|s| egui_web::local_storage_set("hobogo_state", &s)) - .is_ok() + let json_string = serde_json::to_string(&self); + #[cfg(target_arch = "wasm32")] + { + json_string + .map(|s| egui_web::local_storage_set("hobogo_state", &s)) + .is_ok() + } + #[cfg(not(target_arch = "wasm32"))] + { + json_string + .map(|s| { + let mut f = File::create(STORAGE_FILE_NAME)?; + write!(&mut f, "{}", s) + }) + .is_ok() + } } pub fn new_or_restore() -> Self { @@ -96,6 +125,25 @@ pub struct App { ai_frame_delay: usize, } +impl epi::App for App { + fn update(&mut self, ctx: &eframe::egui::CtxRef, _frame: &mut eframe::epi::Frame<'_>) { + eframe::egui::CentralPanel::default().show(ctx, |ui| { + let width = (ui.max_rect().height() - 100.0) * 0.8; // This is a bit ugly + let width = width.min(ui.max_rect().width() - 22.0); + let x = ui.available_size().x / 2.0 - width / 2.0; + let mut ui = ui.child_ui( + Rect::from_min_size(pos2(x, 0.0), vec2(width, ui.available_size().y)), + *ui.layout(), + ); + self.show_gui(&mut ui); + }); + } + + fn name(&self) -> &str { + "hobogo" + } +} + impl App { pub fn restore_or_new() -> Self { App { @@ -106,26 +154,26 @@ impl App { } pub fn show_gui(&mut self, ui: &mut Ui) { - ui.with_layout(egui::Layout::vertical(Align::Center), |ui| { - ui.add(label!("HOBOGO").text_style(TextStyle::Heading)); + ui.with_layout(egui::Layout::top_down(Align::Center), |ui| { + ui.add(Label::new("HOBOGO").text_style(TextStyle::Heading)); }); self.show_settings(ui); - ui.with_layout(egui::Layout::vertical(Align::Center), |ui| { + ui.with_layout(egui::Layout::top_down(Align::Center), |ui| { self.state.show_whos_next(ui); }); self.show_board_and_interact(ui); ui.columns(2, |cols| { - if cols[0].add(Button::new("New Game")).clicked { + if cols[0].add(Button::new("New Game")).clicked() { if !self.state.board.is_empty() { self.undo_stack.push_back(self.state.clone()); } self.state = State::new(self.state.settings); self.state.save_to_local_storage(); } - if !self.undo_stack.is_empty() && cols[0].add(Button::new("Undo")).clicked { + if !self.undo_stack.is_empty() && cols[0].add(Button::new("Undo")).clicked() { self.state = self.undo_stack.pop_back().unwrap(); } self.state.show_score(&mut cols[1]); @@ -141,9 +189,11 @@ impl App { let mut settings = self.state.settings; ui.columns(2, |cols| { - cols[0].add(Slider::usize(&mut settings.num_humans, 0..=4).text("Humans")); - cols[0].add(Slider::usize(&mut settings.num_bots, 0..=4).text("Bots")); - cols[1].add(Slider::usize(&mut settings.board_size, 5..=17).text("Size")); + cols[0].add(Slider::new(&mut settings.num_humans, 0..=4).text("Humans")); + cols[0].add(Slider::new(&mut settings.num_bots, 0..=4).text("Bots")); + cols[0] + .add(Slider::new(&mut settings.bot_think_time, 0.01..=3.).text("Bot Think Time")); + cols[1].add(Slider::new(&mut settings.board_size, 5..=17).text("Size")); cols[1] .checkbox(&mut settings.humans_first, "Humans go first") .on_hover_text("Going first is a big advantage"); @@ -164,29 +214,28 @@ impl App { fn show_board_and_interact(&mut self, ui: &mut Ui) { // Add spacing before the board: - ui.advance_cursor(8.0); + ui.add_space(8.0); let size = ui.max_rect().width() - 32.0; // Leave space for row numbers - let rect = ui.allocate_space(vec2(size, size)); - let board_id = ui.make_position_id(); + let (board_id, rect) = ui.allocate_space(vec2(size, size)); let board_interact = ui.interact(rect, board_id, egui::Sense::click()); // HACK: Add some spacing for the column names - ui.advance_cursor(32.0); + ui.add_space(32.0); let state = &mut self.state; if !state.board.is_game_over(state.num_players()) { if state.next_player_is_human() { - if board_interact.hovered { - if let Some(mouse_pos) = ui.input().mouse.pos { + if board_interact.hovered() { + if let Some(mouse_pos) = ui.input().pointer.interact_pos() { if let Some(hovered_coord) = hovered_coord(&state.board, &rect, mouse_pos) { if state.board.is_valid_move( hovered_coord, state.next_player, state.num_players(), ) { - if board_interact.clicked { + if board_interact.clicked() { self.undo_stack.push_back(state.clone()); state.board[hovered_coord] = Some(state.next_player); state.next_player = @@ -202,7 +251,7 @@ impl App { } } } else { - if ui.ctx().is_using_mouse() { + if ui.ctx().is_using_pointer() { // Don't do anything slow while the user is e.g. dragging a slider } else { // This is slow. TODO: run in background thread... when wasm supports it. @@ -213,9 +262,7 @@ impl App { } else { self.ai_frame_delay = 0; - if let Some(coord) = - state.board.ai_move(state.next_player, state.num_players()) - { + if let Some(coord) = state.ai_move(state.next_player, state.num_players()) { state.board[coord] = Some(state.next_player); } state.next_player = (state.next_player + 1) % (state.num_players() as u8); @@ -232,14 +279,16 @@ impl App { impl State { pub fn show_whos_next(&mut self, ui: &mut Ui) { if self.board.is_game_over(self.num_players()) { - ui.add(label!("Game over!")); + ui.add(Label::new("Game over!")); } else { let player_color = player_color(self.next_player); let player_name = self.player_name(self.next_player); if self.next_player_is_human() { - ui.add(label!("{} to play", player_name).text_color(player_color)); + ui.add(Label::new(format!("{} to play", player_name)).text_color(player_color)); } else { - ui.add(label!("{} is thinking...", player_name).text_color(player_color)); + ui.add( + Label::new(format!("{} is thinking...", player_name)).text_color(player_color), + ); } } } @@ -250,8 +299,8 @@ impl State { for pi in 0..self.num_players() { let player_color = player_color(pi as Player); let player_name = self.player_name(pi as Player); - cols[0].add(label!("{}", player_name).text_color(player_color)); - cols[1].add(label!("{}", score[pi]).text_color(player_color)); + cols[0].add(Label::new(format!("{}", player_name)).text_color(player_color)); + cols[1].add(Label::new(format!("{}", score[pi])).text_color(player_color)); } }); @@ -339,13 +388,13 @@ impl State { } } - let text_color = srgba(100, 100, 100, 255); + let text_color = Color32::from_rgba_premultiplied(100, 100, 100, 255); // Name chess column names: for x in 0..board.width { painter.text( rect.min + vec2((x as f32 + 0.5) * spacing, rect.height() + 12.0), - (Align::Center, Align::Min), + Align2::LEFT_CENTER, &column_name(x), TextStyle::Body, text_color, @@ -356,7 +405,7 @@ impl State { for y in 0..board.height { painter.text( rect.min + vec2(rect.width() + 12.0, (y as f32 + 0.5) * spacing), - (Align::Min, Align::Center), + Align2::CENTER_BOTTOM, &row_name(y), TextStyle::Body, text_color, @@ -364,14 +413,19 @@ impl State { } } - fn cell_color(&self, c: Coord, is_volatile: bool) -> Srgba { + fn cell_color(&self, c: Coord, is_volatile: bool) -> Color32 { let influence = self.board.influence(c); if let Some(claimer) = influence.player() { let color = player_color(claimer); if is_volatile || influence.is_occupied() { color } else { - srgba(color.r() / 2, color.g() / 2, color.b() / 2, color.a()) // Darker + Color32::from_rgba_premultiplied( + color.r() / 2, + color.g() / 2, + color.b() / 2, + color.a(), + ) // Darker } } else if self.next_player_is_human() && !self @@ -379,24 +433,64 @@ impl State { .is_valid_move(c, self.next_player, self.num_players()) { // The currant human can't move here - srgba(90, 90, 100, 255) + Color32::from_rgba_premultiplied(90, 90, 100, 255) } else { // Free (at least for some) - srgba(150, 150, 160, 255) + Color32::from_rgba_premultiplied(150, 150, 160, 255) + } + } + + pub fn ai_move(&self, player: Player, num_players: usize) -> Option { + use rand::SeedableRng; + let mut rng = rand::rngs::SmallRng::from_entropy(); // Fast + + let state = mcts::GameState { + next_player: player, + num_players, + board: self.board.clone(), + }; + + let think_time = self.settings.bot_think_time; + let mut mcts = mcts::Mcts::new(state); + #[cfg(target_arch = "wasm32")] + let start = egui_web::now_sec(); + #[cfg(not(target_arch = "wasm32"))] + let start = Instant::now(); + while { + mcts.iterate(&mut rng); + #[cfg(target_arch = "wasm32")] + { + egui_web::now_sec() - start < think_time as f64 + } + #[cfg(not(target_arch = "wasm32"))] + { + Instant::now() - start < Duration::from_secs_f32(think_time) + } + } {} + + let action = mcts.best_action().cloned(); + + if let Some(action) = action { + match action { + mcts::Action::Pass => None, + mcts::Action::Move(coord) => Some(coord), + } + } else { + None } } } -fn player_color(player: Player) -> Srgba { +fn player_color(player: Player) -> Color32 { match player { - // 0 => srgba(85, 119, 255, 255), - // 1 => srgba(205, 0, 0, 255), - // 2 => srgba(0, 255, 0, 255), - // _ => srgba(221, 221, 0, 255), - 0 => srgba(239, 169, 0, 255), - 1 => srgba(242, 73, 117, 255), - 2 => srgba(31, 187, 171, 255), - _ => srgba(121, 68, 219, 255), + // 0 => Color32::from_rgba_premultiplied(85, 119, 255, 255), + // 1 => Color32::from_rgba_premultiplied(205, 0, 0, 255), + // 2 => Color32::from_rgba_premultiplied(0, 255, 0, 255), + // _ => Color32::from_rgba_premultiplied(221, 221, 0, 255), + 0 => Color32::from_rgba_premultiplied(239, 169, 0, 255), + 1 => Color32::from_rgba_premultiplied(242, 73, 117, 255), + 2 => Color32::from_rgba_premultiplied(31, 187, 171, 255), + _ => Color32::from_rgba_premultiplied(121, 68, 219, 255), } } diff --git a/src/hobogo.rs b/src/hobogo.rs index 0574ea9..8be9f98 100644 --- a/src/hobogo.rs +++ b/src/hobogo.rs @@ -2,17 +2,13 @@ use std::fmt; use serde::{Deserialize, Serialize}; -use egui_web::now_sec; - -use crate::mcts; - const MAX_PLAYERS: usize = 8; pub type Player = u8; pub type Cell = Option; -fn player_from_i8(x: i8) -> Cell { +fn _player_from_i8(x: i8) -> Cell { if x < 0 { None } else { @@ -361,7 +357,7 @@ impl Board { num_players_with_valid_moves > 1 } - fn everything_is_ruled_by_someone(&self) -> bool { + fn _everything_is_ruled_by_someone(&self) -> bool { self.coords() .map(|c| self.influence(c)) .all(|influence| match influence { @@ -372,7 +368,7 @@ impl Board { }) } - fn one_player_has_unbeatable_lead(&self) -> bool { + fn _one_player_has_unbeatable_lead(&self) -> bool { let mut guaranteed_points = [0; MAX_PLAYERS]; let mut contested = 0; for influence in self.coords().map(|c| self.influence(c)) { @@ -456,35 +452,3 @@ impl Board { // } // } } - -impl Board { - pub fn ai_move(&self, player: Player, num_players: usize) -> Option { - use rand::SeedableRng; - let mut rng = rand::rngs::SmallRng::from_entropy(); // Fast - - let state = mcts::GameState { - next_player: player, - num_players, - board: self.clone(), - }; - - let think_time = 1.0; - let mut mcts = mcts::Mcts::new(state); - let start = now_sec(); - while { - mcts.iterate(&mut rng); - now_sec() - start < think_time - } {} - - let action = mcts.best_action().cloned(); - - if let Some(action) = action { - match action { - mcts::Action::Pass => None, - mcts::Action::Move(coord) => Some(coord), - } - } else { - None - } - } -} diff --git a/src/lib.rs b/src/lib.rs index bfbd123..8431776 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,35 +1,20 @@ -#![deny(warnings)] -#![allow(dead_code)] // TODO - -mod app; -mod hobogo; -mod mcts; +pub mod app; +pub mod hobogo; +pub mod mcts; // ---------------------------------------------------------------------------- +// When compiling for web: -use wasm_bindgen::prelude::*; +#[cfg(target_arch = "wasm32")] +use eframe::wasm_bindgen::{self, prelude::*}; /// This is the entry-point for all the web-assembly. +/// This is called once from the HTML. +/// It loads the app, installs some callbacks, then returns. +/// You can add more callbacks like this if you want to call in to your code. +#[cfg(target_arch = "wasm32")] #[wasm_bindgen] -pub fn start(canvas_id: &str) -> Result<(), wasm_bindgen::JsValue> { - let backend = egui_web::WebBackend::new(canvas_id)?; - let app = Box::new(app::App::restore_or_new()); - let runner = egui_web::AppRunner::new(backend, app)?; - egui_web::start(runner)?; - Ok(()) -} - -impl egui_web::App for app::App { - fn ui( - &mut self, - ctx: &std::sync::Arc, - _integration_context: &mut egui::app::IntegrationContext<'_>, - ) { - egui::CentralPanel::default().show(ctx, |ui| { - let width = (ui.max_rect().height() - 200.0) * 0.8; // This is a bit ugly - let width = width.min(ui.max_rect().width() - 22.0); - let mut ui = ui.centered_column(width); - self.show_gui(&mut ui); - }); - } +pub fn start(canvas_id: &str) -> Result<(), eframe::wasm_bindgen::JsValue> { + let app = app::App::restore_or_new(); + eframe::start_web(canvas_id, Box::new(app)) } diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..e2ede97 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,13 @@ +#![forbid(unsafe_code)] +#![cfg_attr(not(debug_assertions), deny(warnings))] // Forbid warnings in release builds +#![warn(clippy::all, rust_2018_idioms)] + +use hobogo::app; + +// When compiling natively: +#[cfg(not(target_arch = "wasm32"))] +fn main() { + let app = app::App::restore_or_new(); + let native_options = eframe::NativeOptions::default(); + eframe::run_native(Box::new(app), native_options); +} diff --git a/start_server.sh b/start_server.sh index efcd6bf..b586103 100755 --- a/start_server.sh +++ b/start_server.sh @@ -1,6 +1,12 @@ #!/bin/bash set -eu -cd docs -echo "open http://localhost:8889" -python3 -m http.server 8889 --bind 127.0.0.1 +# Starts a local web-server that serves the contents of the `doc/` folder, +# which is the folder to where the web version is compiled. + +cargo install basic-http-server + +echo "open http://localhost:8080" + +(cd docs && basic-http-server --addr 127.0.0.1:8080 .) +# (cd docs && python3 -m http.server 8080 --bind 127.0.0.1)