diff --git a/Cargo.lock b/Cargo.lock index c37e26f..64a5179 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14,6 +14,51 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "cc" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cty" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading", +] + [[package]] name = "downcast-rs" version = "1.2.1" @@ -25,25 +70,254 @@ name = "editor" version = "0.1.0" dependencies = [ "anyhow", + "minifb_host", "player", "viperid", ] +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "fastrand" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984" + +[[package]] +name = "futures" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + [[package]] name = "indexmap-nostd" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e04e2fd2b8188ea827b32ef11de88377086d690286ab35747ef7f9bf3ccb590" +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.153" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" + +[[package]] +name = "libloading" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" +dependencies = [ + "cfg-if", + "windows-targets", +] + [[package]] name = "libm" version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +[[package]] +name = "libredox" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" +dependencies = [ + "bitflags 2.5.0", + "libc", + "redox_syscall", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "memchr" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "minifb" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05eddefadb505d3dcb66a89fa77dd0936e72ec84e891cc8fc36e3c05bfe61103" +dependencies = [ + "cc", + "dlib", + "futures", + "instant", + "js-sys", + "lazy_static", + "libc", + "orbclient", + "raw-window-handle", + "serde", + "serde_derive", + "tempfile", + "wasm-bindgen-futures", + "wayland-client", + "wayland-cursor", + "wayland-protocols", + "winapi", + "x11-dl", +] + [[package]] name = "minifb_host" version = "0.1.0" +dependencies = [ + "minifb", + "viperid", +] + +[[package]] +name = "nix" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset", +] [[package]] name = "num-traits" @@ -54,12 +328,48 @@ dependencies = [ "autocfg", ] +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "orbclient" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f0d54bde9774d3a51dcf281a5def240c71996bc6ca05d2c847ec8b2b216166" +dependencies = [ + "libc", + "libredox", + "sdl2", + "sdl2-sys", +] + [[package]] name = "paste" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + [[package]] name = "player" version = "0.1.0" @@ -69,6 +379,113 @@ dependencies = [ "wasmi", ] +[[package]] +name = "proc-macro2" +version = "1.0.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "raw-window-handle" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b800beb9b6e7d2df1fe337c9e3d04e3af22a124460fb4c30fcc22c9117cefb41" +dependencies = [ + "cty", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.5.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "sdl2" +version = "0.35.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7959277b623f1fb9e04aea73686c3ca52f01b2145f8ea16f4ff30d8b7623b1a" +dependencies = [ + "bitflags 1.3.2", + "lazy_static", + "libc", + "sdl2-sys", +] + +[[package]] +name = "sdl2-sys" +version = "0.35.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3586be2cf6c0a8099a79a12b4084357aa9b3e0b0d7980e3b67aaf7a9d55f9f0" +dependencies = [ + "cfg-if", + "libc", + "version-compare", +] + +[[package]] +name = "serde" +version = "1.0.198" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.198" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + [[package]] name = "smallvec" version = "1.13.2" @@ -81,6 +498,41 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +[[package]] +name = "syn" +version = "2.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand", + "rustix", + "windows-sys", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "version-compare" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" + [[package]] name = "viperid" version = "0.1.0" @@ -88,6 +540,72 @@ dependencies = [ "anyhow", ] +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + [[package]] name = "wasmi" version = "0.31.2" @@ -127,3 +645,204 @@ checksum = "d5a015fe95f3504a94bb1462c717aae75253e39b9dd6c3fb1062c934535c64aa" dependencies = [ "indexmap-nostd", ] + +[[package]] +name = "wayland-client" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715" +dependencies = [ + "bitflags 1.3.2", + "downcast-rs", + "libc", + "nix", + "scoped-tls", + "wayland-commons", + "wayland-scanner", + "wayland-sys", +] + +[[package]] +name = "wayland-commons" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8691f134d584a33a6606d9d717b95c4fa20065605f798a3f350d78dced02a902" +dependencies = [ + "nix", + "once_cell", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-cursor" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6865c6b66f13d6257bef1cd40cbfe8ef2f150fb8ebbdb1e8e873455931377661" +dependencies = [ + "nix", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" +dependencies = [ + "bitflags 1.3.2", + "wayland-client", + "wayland-commons", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" +dependencies = [ + "proc-macro2", + "quote", + "xml-rs", +] + +[[package]] +name = "wayland-sys" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4" +dependencies = [ + "dlib", + "lazy_static", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "xcursor" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a0ccd7b4a5345edfcd0c3535718a4e9ff7798ffc536bb5b5a0e26ff84732911" + +[[package]] +name = "xml-rs" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193" diff --git a/crates/editor/Cargo.toml b/crates/editor/Cargo.toml index c10c3ac..e0e5653 100644 --- a/crates/editor/Cargo.toml +++ b/crates/editor/Cargo.toml @@ -7,5 +7,6 @@ edition = "2021" [dependencies] anyhow = "1.0.82" +minifb_host = { path = "../minifb_host" } player = { path = "../player" } viperid = { path = "../.." } diff --git a/crates/editor/src/main.rs b/crates/editor/src/main.rs index 2b15cc4..c60d67e 100644 --- a/crates/editor/src/main.rs +++ b/crates/editor/src/main.rs @@ -1,6 +1,6 @@ use std::path::PathBuf; -use viperid::VResult; +use viperid::{Device, VResult}; use crate::go_builder::GoBuilder; @@ -10,14 +10,15 @@ fn main() -> VResult<()> { let builder = GoBuilder::new( &PathBuf::from("example_project"))?; let wasm = builder.build()?; - let mut executor = player::Executor::new(&wasm)?; + let device = Device::new(); - while executor.is_running() { - println!("update started"); + let mut executor = player::Executor::new(device.share(), &wasm)?; + + minifb_host::host(device, || { executor.update(); - println!("update completed"); executor.get_error()?; - } + Ok(()) + })?; Ok(()) } diff --git a/crates/minifb_host/Cargo.toml b/crates/minifb_host/Cargo.toml index b32a67f..003c166 100644 --- a/crates/minifb_host/Cargo.toml +++ b/crates/minifb_host/Cargo.toml @@ -6,3 +6,5 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +minifb = "0.25.0" +viperid = { path = "../.." } diff --git a/crates/minifb_host/src/lib.rs b/crates/minifb_host/src/lib.rs index e69de29..b015b72 100644 --- a/crates/minifb_host/src/lib.rs +++ b/crates/minifb_host/src/lib.rs @@ -0,0 +1,27 @@ +use minifb::{Window, WindowOptions}; +use viperid::{Device, VResult, SCREEN_H, SCREEN_W}; + +pub fn host( + device: Device, + mut update: impl FnMut() -> VResult<()> +) -> VResult<()> { + let mut window = Window::new( + "viperid", + SCREEN_W, + SCREEN_H, + WindowOptions::default() + )?; + + // limit to 60FPS + window.limit_update_rate(Some(std::time::Duration::from_micros(16600))); + + let mut buffer: Vec = vec![0; SCREEN_W * SCREEN_H]; + while window.is_open() { + update()?; + device.shared.screen.to_bitmap(&mut buffer); + + window.update_with_buffer(&buffer, SCREEN_W, SCREEN_H)?; + } + + Ok(()) +} \ No newline at end of file diff --git a/crates/player/src/engine_api.rs b/crates/player/src/engine_api.rs index a94ce95..3461fdc 100644 --- a/crates/player/src/engine_api.rs +++ b/crates/player/src/engine_api.rs @@ -1,16 +1,28 @@ use std::fmt::Display; use viperid::VResult; -use wasmi::{core::{HostError, Trap}, Caller, Linker}; +use wasmi::{core::{HostError, Trap}, Caller, Extern, Linker}; use crate::executor::ExecutorState; pub(crate) fn integrate(linker: &mut Linker) -> VResult<()> { + linker.func_wrap("viperid", "Pset", pset)?; + linker.func_wrap("viperid", "YieldFrame", yield_frame)?; Ok(()) } +fn pset(mut caller: Caller, x: i32, y: i32, color: i32) -> Result<(), Trap> { + let memory = match caller.get_export("memory") { + Some(Extern::Memory(m)) => m, + _ => return Err(wasmi::core::Trap::new(String::from("missing required memory export"))), + }; + let(_, ctx) = memory.data_and_store_mut(&mut caller); + ctx.device.shared.screen.pset(x, y, (color & 0xff) as u8); + Ok(()) +} + fn yield_frame(_caller: Caller) -> Result<(), Trap> { Err(Trap::from(YieldFrame {})) } diff --git a/crates/player/src/executor.rs b/crates/player/src/executor.rs index 9eb6b08..9e6a2c3 100644 --- a/crates/player/src/executor.rs +++ b/crates/player/src/executor.rs @@ -1,6 +1,6 @@ use std::mem; -use viperid::VResult; +use viperid::{Device, VResult}; use wasmi::{core::Trap, Engine, Linker, Module, Store, TypedFunc, TypedResumableCall, TypedResumableInvocation}; use crate::{engine_api::{self, YieldFrame}, wasi::{self, StockWasi}}; @@ -11,13 +11,15 @@ pub struct Executor { } pub(crate) struct ExecutorState { - wasi: wasi::StockWasi + wasi: wasi::StockWasi, + pub(crate) device: Device } impl ExecutorState { - fn new() -> Self { + fn new(device: Device) -> Self { ExecutorState { - wasi: StockWasi::new() + wasi: StockWasi::new(), + device } } @@ -25,12 +27,12 @@ impl ExecutorState { impl Executor { - pub fn new(wasm: &[u8]) -> VResult { + pub fn new(device: Device, wasm: &[u8]) -> VResult { let engine = Engine::default(); let module = Module::new(&engine, wasm)?; - let mut store = Store::new(&engine, ExecutorState::new()); + let mut store = Store::new(&engine, ExecutorState::new(device)); let mut linker = >::new(&engine); wasi::integrate(&mut linker, |hs| &mut hs.wasi)?; diff --git a/example_project/main.go b/example_project/main.go index a551b99..18ad9aa 100644 --- a/example_project/main.go +++ b/example_project/main.go @@ -1,21 +1,31 @@ package main -import ( - "fmt" -) - func main() { - count := 0 + t := 0 for { - fmt.Printf("Hello! %d", count) - count++ + for y := 0; y < 120; y++ { + for x := 0; x < 160; x++ { + Pset( + int32(x), + int32(y), + int32((x+y+t)%64), + ) + } + } + // fmt.Printf("Hello! %d", count) + // count++ /* debug.PrintStack() */ YieldFrame() + t += 1 } } +//go:wasmimport viperid Pset +//go:noescape +func Pset(x int32, y int32, color int32) + //go:wasmimport viperid YieldFrame //go:noescape func YieldFrame() diff --git a/slop/palette/index.mjs b/slop/palette/index.mjs index 2ff27a7..7d84ddf 100644 --- a/slop/palette/index.mjs +++ b/slop/palette/index.mjs @@ -182,14 +182,18 @@ function dump(fname, colors, width, height, scalar) { function dumpRust(fname, colors) { var paletteString = ""; - paletteString += "pub const PALETTE: [[u8; 3]; " + palette.length + "] = [\n" + paletteString += "pub const PALETTE: [u32; " + palette.length + "] = [\n" for (var i = 0; i < colors.length; i++) { var c = colors[i]; - paletteString += (" [" + - clamp(255 * c.srgb.r) + ", " + - clamp(255 * c.srgb.g) + ", " + - clamp(255 * c.srgb.b) + - "],\n"); + paletteString += ( + " " + + ( + clamp(255 * c.srgb.r) * 256 * 256 + + clamp(255 * c.srgb.g) * 256 + + clamp(255 * c.srgb.b) + ) + + ",\n" + ); } paletteString += "];\n" fs.writeFileSync(fname, paletteString); diff --git a/src/device.rs b/src/device.rs new file mode 100644 index 0000000..13bbb5a --- /dev/null +++ b/src/device.rs @@ -0,0 +1,35 @@ +use std::rc::Rc; + +use crate::screen::Screen; + +pub struct DeviceT { + pub screen: Screen +} + +impl DeviceT { + fn new() -> Self { + let screen = Screen::new(); + + DeviceT { + screen + } + } +} + +pub struct Device { + pub shared: Rc +} + +impl Device { + pub fn new() -> Self { + return Device { + shared: Rc::new(DeviceT::new()) + } + } + + pub fn share(&self) -> Self { + return Device { + shared: self.shared.clone() + } + } +} \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 37c23df..94ffd16 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,9 @@ +mod device; mod palette; +mod screen; +pub use device::Device; pub use palette::PALETTE; +pub use screen::{Screen, SCREEN_W, SCREEN_H}; + pub type VResult = Result; diff --git a/src/palette.rs b/src/palette.rs index 3824ef9..c5f17c8 100644 --- a/src/palette.rs +++ b/src/palette.rs @@ -1,66 +1,66 @@ -pub const PALETTE: [[u8; 3]; 64] = [ - [0, 0, 0], - [0, 0, 255], - [0, 255, 0], - [0, 255, 255], - [255, 0, 0], - [255, 0, 255], - [255, 255, 0], - [255, 255, 255], - [32, 45, 44], - [41, 60, 67], - [18, 22, 32], - [40, 34, 49], - [27, 17, 29], - [54, 42, 47], - [46, 33, 23], - [66, 60, 43], - [39, 92, 148], - [55, 83, 107], - [110, 45, 90], - [79, 50, 74], - [130, 103, 52], - [100, 85, 68], - [80, 133, 85], - [88, 106, 80], - [59, 115, 206], - [76, 108, 153], - [165, 53, 114], - [124, 70, 99], - [188, 157, 22], - [154, 137, 89], - [57, 194, 137], - [109, 161, 129], - [39, 187, 255], - [123, 67, 240], - [186, 66, 177], - [239, 60, 80], - [255, 170, 48], - [186, 255, 0], - [69, 255, 115], - [2, 241, 228], - [150, 190, 255], - [185, 113, 226], - [220, 118, 175], - [249, 134, 85], - [242, 204, 114], - [194, 255, 116], - [100, 255, 173], - [105, 242, 252], - [201, 169, 248], - [221, 193, 228], - [250, 156, 143], - [240, 197, 180], - [230, 237, 137], - [233, 243, 193], - [116, 253, 234], - [182, 247, 242], - [243, 222, 238], - [237, 228, 236], - [254, 235, 224], - [245, 241, 240], - [245, 254, 225], - [250, 253, 246], - [211, 250, 250], - [230, 247, 244], +pub const PALETTE: [u32; 64] = [ + 0, + 255, + 65280, + 65535, + 16711680, + 16711935, + 16776960, + 16777215, + 2108716, + 2702403, + 1185312, + 2630193, + 1773853, + 3549743, + 3023127, + 4340779, + 2579604, + 3625835, + 7220570, + 5190218, + 8546100, + 6575428, + 5277013, + 5794384, + 3896270, + 5008537, + 10827122, + 8144483, + 12360982, + 10127705, + 3785353, + 7184769, + 2604031, + 8078320, + 12206769, + 15678544, + 16755248, + 12254976, + 4587379, + 192996, + 9879295, + 12153314, + 14448303, + 16352853, + 15912050, + 12779380, + 6619053, + 6943484, + 13216248, + 14533092, + 16424079, + 15779252, + 15134089, + 15332289, + 7667178, + 11991026, + 15982318, + 15590636, + 16706528, + 16118256, + 16121569, + 16449014, + 13892346, + 15136756, ]; diff --git a/src/screen.rs b/src/screen.rs new file mode 100644 index 0000000..25f1282 --- /dev/null +++ b/src/screen.rs @@ -0,0 +1,50 @@ +use std::cell::RefCell; + +use crate::PALETTE; + +pub const SCREEN_W: usize = 640; +pub const SCREEN_H: usize = 480; + +const PIXEL_SCALAR: usize = 4; +// const CURSES_SNAP: usize = 8; + +pub struct Screen { + // NOTE: There are better data structures we could use than this + pixels: RefCell> +} + +impl Screen { + pub fn new() -> Screen { + Screen { + pixels: RefCell::new(vec![0; SCREEN_W * SCREEN_H]) + } + } + + pub fn to_bitmap(&self, bitmap: &mut Vec) { + bitmap.resize(SCREEN_W * SCREEN_H, 0); + + let pxl = self.pixels.borrow(); + for i in 0..pxl.len() { + bitmap[i] = PALETTE[pxl[i] as usize]; + } + } + + pub fn pset(&self, x: i32, y: i32, color: u8) { + let px0 = x * PIXEL_SCALAR as i32; + let py0 = y * PIXEL_SCALAR as i32; + + if px0 < 0 || py0 < 0 || px0 >= SCREEN_W as i32 || py0 >= SCREEN_H as i32 { + return; + } + + let px0 = px0 as usize; + let py0 = py0 as usize; + + let mut pxl = self.pixels.borrow_mut(); + for py in py0..py0 + PIXEL_SCALAR { + for px in px0..px0 + PIXEL_SCALAR { + pxl[py * SCREEN_W + px] = color; + } + } + } +} \ No newline at end of file