From b29a35c2d6b2e7deca32ac8a3f3a3fb86061da99 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Mon, 13 Feb 2023 17:49:38 +0900 Subject: [PATCH 01/29] Work on porting away from quicksilver --- Cargo.lock | 2536 +-------------------------------------- Cargo.toml | 2 +- src/faux_quicksilver.rs | 264 ++++ src/main.rs | 260 ++-- 4 files changed, 419 insertions(+), 2643 deletions(-) create mode 100644 src/faux_quicksilver.rs diff --git a/Cargo.lock b/Cargo.lock index e47c8da..a9ffcd4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,1059 +2,29 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "RustyXML" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9222d58bccd9e6e3b82098a2ec142ad34e5d433de986d46cec03ad3a2b5fd529" - -[[package]] -name = "addr2line" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "adler32" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" - -[[package]] -name = "aho-corasick" -version = "0.7.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" -dependencies = [ - "memchr", -] - -[[package]] -name = "alga" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f823d037a7ec6ea2197046bafd4ae150e6bc36f9ca347404f46a46823fa84f2" -dependencies = [ - "approx", - "num-complex", - "num-traits", -] - -[[package]] -name = "alsa-sys" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0edcbbf9ef68f15ae1b620f722180b82a98b6f0628d30baa6b8d2a5abc87d58" -dependencies = [ - "libc", - "pkg-config", -] - -[[package]] -name = "andrew" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b7f09f89872c2b6b29e319377b1fbe91c6f5947df19a25596e121cf19a7b35e" -dependencies = [ - "bitflags", - "line_drawing", - "rusttype 0.7.9", - "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 = "ansi_term" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -dependencies = [ - "winapi 0.3.9", -] - -[[package]] -name = "approx" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0e60b75072ecd4168020818c0107f2857bb6c4e64252d8d3983f6263b40a5c3" -dependencies = [ - "num-traits", -] - -[[package]] -name = "ascii-canvas" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b385d69402821a1c254533a011a312531cbcc0e3e24f19bbb4747a5a2daf37e2" -dependencies = [ - "term", -] - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi", - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "autocfg" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78" -dependencies = [ - "autocfg 1.1.0", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "backtrace" -version = "0.3.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11a17d453482a265fd5f8479f2a3f405566e6ca627837aaddb85af8b1ab8ef61" -dependencies = [ - "addr2line", - "cc", - "cfg-if 1.0.0", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base-x" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc19a4937b4fbd3fe3379793130e42060d10627a360f2127802b10b87e7baf74" - -[[package]] -name = "base64" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" -dependencies = [ - "byteorder", -] - -[[package]] -name = "bindgen" -version = "0.59.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bd2a9a458e8f4304c52c43ebb0cfbd520289f8379a52e329a38afda99bf8eb8" -dependencies = [ - "bitflags", - "cexpr", - "clang-sys", - "lazy_static 1.4.0", - "lazycell", - "peeking_take_while", - "proc-macro2 1.0.39", - "quote 1.0.18", - "regex", - "rustc-hash", - "shlex", -] - -[[package]] -name = "bit-set" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de" -dependencies = [ - "bit-vec", -] - -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "block" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" - -[[package]] -name = "block-buffer" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" -dependencies = [ - "block-padding", - "byte-tools", - "byteorder", - "generic-array", -] - -[[package]] -name = "block-padding" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" -dependencies = [ - "byte-tools", -] - -[[package]] -name = "bumpalo" -version = "3.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" - -[[package]] -name = "byte-tools" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" - -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "cc" -version = "1.0.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "cgl" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55e7ec0b74fe5897894cbc207092c577e87c52f8a59e8ca8d97ef37551f60a49" -dependencies = [ - "gleam", - "libc", -] - -[[package]] -name = "clang-sys" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a050e2153c5be08febd6734e29298e844fdb0fa21aeddd63b4eb7baa106c69b" -dependencies = [ - "glob", - "libc", - "libloading 0.7.3", -] - -[[package]] -name = "clap" -version = "2.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" -dependencies = [ - "ansi_term", - "atty", - "bitflags", - "strsim 0.8.0", - "textwrap", - "unicode-width", - "vec_map", -] - -[[package]] -name = "claxon" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bfbf56724aa9eca8afa4fcfadeb479e722935bb2a0900c2d37e0cc477af0688" - -[[package]] -name = "cloudabi" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -dependencies = [ - "bitflags", -] - -[[package]] -name = "cocoa" -version = "0.18.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1706996401131526e36b3b49f0c4d912639ce110996f3ca144d78946727bce54" -dependencies = [ - "bitflags", - "block", - "core-foundation", - "core-graphics", - "foreign-types", - "libc", - "objc", -] - -[[package]] -name = "color_quant" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" - -[[package]] -name = "core-foundation" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25b9e03f145fd4f2bf705e07b900cd41fc636598fe5dc452fd0db1441c3f496d" -dependencies = [ - "core-foundation-sys 0.6.2", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "716c271e8613ace48344f723b60b900a93150271e5be206212d052bbc0883efa" -dependencies = [ - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b" - -[[package]] -name = "core-graphics" -version = "0.17.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56790968ab1c8a1202a102e6de05fc6e1ec87da99e4e93e9a7d13efbfc1e95a9" -dependencies = [ - "bitflags", - "core-foundation", - "foreign-types", - "libc", -] - -[[package]] -name = "coreaudio-rs" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f229761965dad3e9b11081668a6ea00f1def7aa46062321b5ec245b834f6e491" -dependencies = [ - "bitflags", - "coreaudio-sys", -] - -[[package]] -name = "coreaudio-sys" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dff444d80630d7073077d38d40b4501fd518bd2b922c2a55edcc8b0f7be57e6" -dependencies = [ - "bindgen", -] - -[[package]] -name = "cpal" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d58ae1ed6536b1b233f5e3aeb6997a046ddb4d05e3f61701b58a92eb254a829e" -dependencies = [ - "alsa-sys", - "core-foundation-sys 0.5.1", - "coreaudio-rs", - "lazy_static 1.4.0", - "libc", - "stdweb 0.1.3", - "winapi 0.3.9", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aaa7bd5fb665c6864b5f963dd9097905c54125909c7aa94c9e18507cdbe6c53" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1145cf131a2c6ba0615079ab6a638f7e1973ac9c2634fcbeaaad6114246efe8c" -dependencies = [ - "autocfg 1.1.0", - "cfg-if 1.0.0", - "crossbeam-utils", - "lazy_static 1.4.0", - "memoffset", - "scopeguard", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" -dependencies = [ - "cfg-if 1.0.0", - "lazy_static 1.4.0", -] - -[[package]] -name = "cty" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" - -[[package]] -name = "debug_unreachable" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a032eac705ca39214d169f83e3d3da290af06d8d1d344d1baad2fd002dca4b3" -dependencies = [ - "unreachable", -] - -[[package]] -name = "deflate" -version = "0.7.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707b6a7b384888a70c8d2e8650b3e60170dfc6a67bb4aa67b6dfca57af4bedb4" -dependencies = [ - "adler32", - "byteorder", -] - -[[package]] -name = "diff" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499" - -[[package]] -name = "digest" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -dependencies = [ - "generic-array", -] - -[[package]] -name = "dirs" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3" -dependencies = [ - "cfg-if 0.1.10", - "dirs-sys", -] - -[[package]] -name = "dirs" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" -dependencies = [ - "libc", - "redox_users", - "winapi 0.3.9", -] - -[[package]] -name = "discard" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" - -[[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 = "docopt" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f3f119846c823f9eafcf953a8f6ffb6ed69bf6240883261a7f13b634579a51f" -dependencies = [ - "lazy_static 1.4.0", - "regex", - "serde 1.0.137", - "strsim 0.10.0", -] - -[[package]] -name = "downcast-rs" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" - -[[package]] -name = "either" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" - -[[package]] -name = "ena" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f56c93cc076508c549d9bb747f79aa9b4eb098be7b8cad8830c3137ef52d1e00" -dependencies = [ - "log", -] - -[[package]] -name = "encoding" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" -dependencies = [ - "encoding-index-japanese", - "encoding-index-korean", - "encoding-index-simpchinese", - "encoding-index-singlebyte", - "encoding-index-tradchinese", -] - -[[package]] -name = "encoding-index-japanese" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-korean" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-simpchinese" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-singlebyte" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-tradchinese" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding_index_tests" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" - -[[package]] -name = "fake-simd" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" - -[[package]] -name = "fixedbitset" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86d4de0081402f5e88cdac65c8dcdcc73118c1a7a465e2a05f0da05843a8ea33" - -[[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-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" - -[[package]] -name = "futf" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" -dependencies = [ - "mac", - "new_debug_unreachable", -] - -[[package]] -name = "futures" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" - -[[package]] -name = "generic-array" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" -dependencies = [ - "typenum", -] - [[package]] name = "getrandom" version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", - "stdweb 0.4.20", - "wasi 0.9.0+wasi-snapshot-preview1", + "wasi", ] -[[package]] -name = "getrandom" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "wasi 0.10.2+wasi-snapshot-preview1", -] - -[[package]] -name = "gif" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "471d90201b3b223f3451cd4ad53e34295f16a1df17b1edf3736d47761c3981af" -dependencies = [ - "color_quant", - "lzw", -] - -[[package]] -name = "gimli" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" - -[[package]] -name = "gl" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b411c7e0bfc599e3606412c190e786b5bb48cf00073e1635f9bb6f88fe7d84a" -dependencies = [ - "gl_generator 0.13.1", -] - -[[package]] -name = "gl_generator" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca98bbde17256e02d17336a6bdb5a50f7d0ccacee502e191d3e3d0ec2f96f84a" -dependencies = [ - "khronos_api", - "log", - "xml-rs", -] - -[[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 = "gleam" -version = "0.6.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cae10d7c99d0e77b4766e850a60898a17c1abaf01075531f1066f03dc7dc5fc5" -dependencies = [ - "gl_generator 0.13.1", -] - -[[package]] -name = "glob" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" - -[[package]] -name = "glutin" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5371b35b309dace06be1b81b5f6adb1c9de578b7dbe1e74bf7e4ef762cf6febd" -dependencies = [ - "android_glue", - "cgl", - "cocoa", - "core-foundation", - "core-graphics", - "glutin_egl_sys", - "glutin_emscripten_sys", - "glutin_gles2_sys", - "glutin_glx_sys", - "glutin_wgl_sys", - "lazy_static 1.4.0", - "libloading 0.5.2", - "objc", - "osmesa-sys", - "parking_lot", - "wayland-client", - "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 0.14.0", - "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 0.14.0", - "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 0.14.0", - "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 0.14.0", -] - -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "hound" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a164bb2ceaeff4f42542bdb847c41517c78a60f5649671b2a07312b6e117549" - -[[package]] -name = "html2runes" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c63600dd0709cc75da234e89e48f096c249f8197276f0a7ad6437ff49297559" -dependencies = [ - "clap", - "html5ever", - "html5ever-atoms", - "tendril", -] - -[[package]] -name = "html5ever" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d60508177ec4e5774a112efcf4d4d5f123cb00a43476fa5940b7da568371a165" -dependencies = [ - "html5ever-atoms", - "log", - "mac", - "phf", - "phf_codegen", - "quote 0.3.15", - "rustc-serialize", - "syn 0.11.11", - "tendril", -] - -[[package]] -name = "html5ever-atoms" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c626dc6733babf7110d3a5078b1529e9d0eaaacf6c488ef6a7437b7d515844bb" -dependencies = [ - "string_cache 0.4.0", - "string_cache_codegen 0.3.1", -] - -[[package]] -name = "image" -version = "0.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35371e467cd7b0b3d1d6013d619203658467df12d61b0ca43cd67b743b1965eb" -dependencies = [ - "byteorder", - "gif", - "jpeg-decoder", - "lzw", - "num-iter", - "num-rational", - "num-traits", - "png", - "scoped_threadpool", - "tiff", -] - -[[package]] -name = "inflate" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cdb29978cc5797bd8dcc8e5bf7de604891df2a8dc576973d71a281e916db2ff" -dependencies = [ - "adler32", -] - -[[package]] -name = "itertools" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" - -[[package]] -name = "jpeg-decoder" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2" -dependencies = [ - "rayon", -] - -[[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 = "lalrpop" -version = "0.16.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e2e80bee40b22bca46665b4ef1f3cd88ed0fb043c971407eac17a0712c02572" -dependencies = [ - "ascii-canvas", - "atty", - "bit-set", - "diff", - "docopt", - "ena", - "itertools", - "lalrpop-util", - "petgraph", - "regex", - "regex-syntax", - "serde 1.0.137", - "serde_derive", - "sha2", - "string_cache 0.7.5", - "term", - "unicode-xid 0.1.0", -] - -[[package]] -name = "lalrpop-util" -version = "0.16.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b27d8490dbe1f9704b0088d61e8d46edc10d5673a8829836c6ded26a9912c7" - -[[package]] -name = "lazy_static" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" - -[[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 = "ld45_one_and_all" version = "0.1.1" dependencies = [ - "quicksilver", - "rand 0.7.3", - "serde 1.0.137", -] - -[[package]] -name = "lewton" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d542c1a317036c45c2aa1cf10cc9d403ca91eb2d333ef1a4917e5cb10628bd0" -dependencies = [ - "byteorder", - "ogg", - "smallvec", + "rand", + "serde", ] [[package]] @@ -1063,480 +33,12 @@ version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" -[[package]] -name = "libloading" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" -dependencies = [ - "cc", - "winapi 0.3.9", -] - -[[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.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" -dependencies = [ - "cfg-if 1.0.0", - "winapi 0.3.9", -] - -[[package]] -name = "libm" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33a33a362ce288760ec6a508b94caaec573ae7d3bbbd91b87aa0bad4456839db" - -[[package]] -name = "line_drawing" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc7ad3d82c845bdb5dde34ffdcc7a5fb4d2996e1e1ee0f19c33bc80e15196b9" -dependencies = [ - "num-traits", -] - -[[package]] -name = "lock_api" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "lzw" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d947cbb889ed21c2a84be6ffbaebf5b4e0f4340638cba0444907e38b56be084" - -[[package]] -name = "mac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" - -[[package]] -name = "mach" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" -dependencies = [ - "libc", -] - -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", -] - -[[package]] -name = "matches" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" - -[[package]] -name = "matrixmultiply" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "916806ba0031cd542105d916a97c8572e1fa6dd79c9c51e7eb43a09ec2dd84c1" -dependencies = [ - "rawpointer", -] - -[[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.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" - -[[package]] -name = "memmap" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" -dependencies = [ - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "memoffset" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" -dependencies = [ - "autocfg 1.1.0", -] - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "minimp3" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce0cff6a0bfd3f8b6b2350819bbddd63bc65cc45e53888bdd0ff49dde16d2d5" -dependencies = [ - "minimp3-sys", - "slice-deque", -] - -[[package]] -name = "minimp3-sys" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e21c73734c69dc95696c9ed8926a2b393171d98b3f5f5935686a26a487ab9b90" -dependencies = [ - "cc", -] - -[[package]] -name = "miniz_oxide" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f5c75688da582b8ffc1f1799e9db273f32133c49e048f614d22ec3256773ccc" -dependencies = [ - "adler", -] - -[[package]] -name = "nalgebra" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaa9fddbc34c8c35dd2108515587b8ce0cab396f17977b8c738568e4edb521a2" -dependencies = [ - "alga", - "approx", - "generic-array", - "matrixmultiply", - "num-complex", - "num-rational", - "num-traits", - "rand 0.6.5", - "typenum", -] - -[[package]] -name = "new_debug_unreachable" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" - -[[package]] -name = "nix" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c722bee1037d430d0f8e687bbdbf222f27cc6e4e68d5caf630857bb2b6dbdce" -dependencies = [ - "bitflags", - "cc", - "cfg-if 0.1.10", - "libc", - "void", -] - -[[package]] -name = "nom" -version = "7.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "num-complex" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" -dependencies = [ - "autocfg 1.1.0", - "num-traits", -] - -[[package]] -name = "num-derive" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eafd0b45c5537c3ba526f79d3e75120036502bebacbb3f3220914067ce39dbf2" -dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.13", - "syn 0.15.44", -] - -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg 1.1.0", - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" -dependencies = [ - "autocfg 1.1.0", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" -dependencies = [ - "autocfg 1.1.0", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" -dependencies = [ - "autocfg 1.1.0", - "libm", -] - -[[package]] -name = "num_cpus" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", -] - -[[package]] -name = "object" -version = "0.28.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e42c982f2d955fac81dd7e1d0e1426a7d702acd9c98d19ab01083a6a0328c424" -dependencies = [ - "memchr", -] - -[[package]] -name = "ogg" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e571c3517af9e1729d4c63571a27edd660ade0667973bfc74a67c660c2b651" -dependencies = [ - "byteorder", -] - -[[package]] -name = "opaque-debug" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" - -[[package]] -name = "ordered-float" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3305af35278dd29f46fcdd139e0b1fbfae2153f0e5928b39b035542dd31e37b7" -dependencies = [ - "num-traits", -] - -[[package]] -name = "ordermap" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a86ed3f5f244b372d6b1a00b72ef7f8876d0bc6a78a4c9985c53614041512063" - -[[package]] -name = "osmesa-sys" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88cfece6e95d2e717e0872a7f53a8684712ad13822a7979bc760b9c77ec0013b" -dependencies = [ - "shared_library", -] - -[[package]] -name = "parking_lot" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" -dependencies = [ - "lock_api", - "parking_lot_core", - "rustc_version", -] - -[[package]] -name = "parking_lot_core" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" -dependencies = [ - "cfg-if 0.1.10", - "cloudabi", - "libc", - "redox_syscall 0.1.57", - "rustc_version", - "smallvec", - "winapi 0.3.9", -] - -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - -[[package]] -name = "percent-encoding" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" - -[[package]] -name = "petgraph" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3659d1ee90221741f65dd128d9998311b0e40c5d3c23a62445938214abce4f" -dependencies = [ - "fixedbitset", - "ordermap", -] - -[[package]] -name = "phf" -version = "0.7.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3da44b85f8e8dfaec21adae67f95d93244b2ecf6ad2a692320598dcc8e6dd18" -dependencies = [ - "phf_shared", -] - -[[package]] -name = "phf_codegen" -version = "0.7.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b03e85129e324ad4166b06b2c7491ae27fe3ec353af72e72cd1654c7225d517e" -dependencies = [ - "phf_generator", - "phf_shared", -] - -[[package]] -name = "phf_generator" -version = "0.7.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09364cc93c159b8b06b1f4dd8a4398984503483891b0c26b867cf431fb132662" -dependencies = [ - "phf_shared", - "rand 0.6.5", -] - -[[package]] -name = "phf_shared" -version = "0.7.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234f71a15de2288bcb7e3b6515828d22af7ec8598ee6d24c3b526fa0a80b67a0" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pkg-config" -version = "0.3.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" - -[[package]] -name = "png" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63daf481fdd0defa2d1d2be15c674fbfa1b0fd71882c303a91f9a79b3252c359" -dependencies = [ - "bitflags", - "deflate", - "inflate", - "num-iter", -] - [[package]] name = "ppv-lite86" version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" -[[package]] -name = "precomputed-hash" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" - -[[package]] -name = "proc-macro2" -version = "0.4.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" -dependencies = [ - "unicode-xid 0.1.0", -] - [[package]] name = "proc-macro2" version = "1.0.39" @@ -1546,70 +48,13 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "quicksilver" -version = "0.3.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7496c53e5d2c09e2eb55e133dc2a022ccd3958adab84ac07f1adab9d54c6a7f" -dependencies = [ - "base64", - "dirs 2.0.2", - "futures", - "gl", - "glutin", - "image", - "rand 0.7.3", - "rodio", - "rusttype 0.7.9", - "serde 1.0.137", - "serde_derive", - "serde_json", - "stdweb 0.4.20", - "webgl_stdweb", - "winit", -] - -[[package]] -name = "quote" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" - -[[package]] -name = "quote" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" -dependencies = [ - "proc-macro2 0.4.30", -] - [[package]] name = "quote" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1" dependencies = [ - "proc-macro2 1.0.39", -] - -[[package]] -name = "rand" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" -dependencies = [ - "autocfg 0.1.8", - "libc", - "rand_chacha 0.1.1", - "rand_core 0.4.2", - "rand_hc 0.1.0", - "rand_isaac", - "rand_jitter", - "rand_os", - "rand_pcg", - "rand_xorshift", - "winapi 0.3.9", + "proc-macro2", ] [[package]] @@ -1618,21 +63,11 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom 0.1.16", + "getrandom", "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc 0.2.0", -] - -[[package]] -name = "rand_chacha" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" -dependencies = [ - "autocfg 0.1.8", - "rand_core 0.3.1", + "rand_chacha", + "rand_core", + "rand_hc", ] [[package]] @@ -1642,40 +77,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core 0.5.1", + "rand_core", ] -[[package]] -name = "rand_core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -dependencies = [ - "rand_core 0.4.2", -] - -[[package]] -name = "rand_core" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" - [[package]] name = "rand_core" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom 0.1.16", -] - -[[package]] -name = "rand_hc" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" -dependencies = [ - "rand_core 0.3.1", + "getrandom", ] [[package]] @@ -1684,273 +95,9 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core 0.5.1", + "rand_core", ] -[[package]] -name = "rand_isaac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rand_jitter" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" -dependencies = [ - "libc", - "rand_core 0.4.2", - "winapi 0.3.9", -] - -[[package]] -name = "rand_os" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" -dependencies = [ - "cloudabi", - "fuchsia-cprng", - "libc", - "rand_core 0.4.2", - "rdrand", - "winapi 0.3.9", -] - -[[package]] -name = "rand_pcg" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" -dependencies = [ - "autocfg 0.1.8", - "rand_core 0.4.2", -] - -[[package]] -name = "rand_xorshift" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "raw-window-handle" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28f55143d0548dad60bb4fbdc835a3d7ac6acc3324506450c5fdd6e42903a76" -dependencies = [ - "libc", - "raw-window-handle 0.4.3", -] - -[[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 = "rawpointer" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" - -[[package]] -name = "rayon" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" -dependencies = [ - "autocfg 1.1.0", - "crossbeam-deque", - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-utils", - "num_cpus", -] - -[[package]] -name = "rdrand" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "redox_syscall" -version = "0.1.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" - -[[package]] -name = "redox_syscall" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" -dependencies = [ - "bitflags", -] - -[[package]] -name = "redox_users" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" -dependencies = [ - "getrandom 0.2.6", - "redox_syscall 0.2.13", - "thiserror", -] - -[[package]] -name = "regex" -version = "1.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.6.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64" - -[[package]] -name = "rodio" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0f961b254e66d147a7b550c78b01308934c97d807a34b417fd0f5a0a0f3a2d" -dependencies = [ - "claxon", - "cpal", - "hound", - "lazy_static 1.4.0", - "lewton", - "minimp3", - "nalgebra", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc-serialize" -version = "0.3.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" - -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver", -] - -[[package]] -name = "rusttype" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "310942406a39981bed7e12b09182a221a29e0990f3e7e0c971f131922ed135d5" -dependencies = [ - "rusttype 0.8.3", -] - -[[package]] -name = "rusttype" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f61411055101f7b60ecf1041d87fb74205fb20b0c7a723f07ef39174cf6b4c0" -dependencies = [ - "approx", - "ordered-float", - "stb_truetype", -] - -[[package]] -name = "ryu" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695" - -[[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_threadpool" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d51f5df5af43ab3f1360b429fa5e0152ac5ce8c0bd6485cae490332e96846a8" - -[[package]] -name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - -[[package]] -name = "serde" -version = "0.9.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34b623917345a631dc9608d5194cc206b3fe6c3554cd1c75b937e55e285254af" - [[package]] name = "serde" version = "1.0.137" @@ -1966,264 +113,9 @@ version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" dependencies = [ - "proc-macro2 1.0.39", - "quote 1.0.18", - "syn 1.0.96", -] - -[[package]] -name = "serde_json" -version = "1.0.81" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" -dependencies = [ - "itoa", - "ryu", - "serde 1.0.137", -] - -[[package]] -name = "sha1" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da05c97445caa12d05e848c4a4fcbbea29e748ac28f7e80e9b010392063770" -dependencies = [ - "sha1_smol", -] - -[[package]] -name = "sha1_smol" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012" - -[[package]] -name = "sha2" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" -dependencies = [ - "block-buffer", - "digest", - "fake-simd", - "opaque-debug", -] - -[[package]] -name = "shared_library" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a9e7e0f2bfae24d8a5b5a66c5b257a83c7412304311512a0c054cd5e619da11" -dependencies = [ - "lazy_static 1.4.0", - "libc", -] - -[[package]] -name = "shlex" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" - -[[package]] -name = "siphasher" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" - -[[package]] -name = "slice-deque" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31ef6ee280cdefba6d2d0b4b78a84a1c1a3f3a4cec98c2d4231c8bc225de0f25" -dependencies = [ - "libc", - "mach", - "winapi 0.3.9", -] - -[[package]] -name = "smallvec" -version = "0.6.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97fcaeba89edba30f044a10c6a3cc39df9c3f17d7cd829dd1446cab35f890e0" -dependencies = [ - "maybe-uninit", -] - -[[package]] -name = "smithay-client-toolkit" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ccb8c57049b2a34d2cc2b203fa785020ba0129d31920ef0d317430adaf748fa" -dependencies = [ - "andrew", - "bitflags", - "dlib", - "lazy_static 1.4.0", - "memmap", - "nix", - "wayland-client", - "wayland-commons", - "wayland-protocols", -] - -[[package]] -name = "stb_truetype" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f77b6b07e862c66a9f3e62a07588fee67cd90a9135a2b942409f195507b4fb51" -dependencies = [ - "byteorder", -] - -[[package]] -name = "stdweb" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef5430c8e36b713e13b48a9f709cc21e046723fe44ce34587b73a830203b533e" - -[[package]] -name = "stdweb" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" -dependencies = [ - "discard", - "rustc_version", - "serde 1.0.137", - "serde_json", - "stdweb-derive", - "stdweb-internal-macros", - "stdweb-internal-runtime", - "wasm-bindgen", -] - -[[package]] -name = "stdweb-derive" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" -dependencies = [ - "proc-macro2 1.0.39", - "quote 1.0.18", - "serde 1.0.137", - "serde_derive", - "syn 1.0.96", -] - -[[package]] -name = "stdweb-internal-macros" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" -dependencies = [ - "base-x", - "proc-macro2 1.0.39", - "quote 1.0.18", - "serde 1.0.137", - "serde_derive", - "serde_json", - "sha1", - "syn 1.0.96", -] - -[[package]] -name = "stdweb-internal-runtime" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" - -[[package]] -name = "string_cache" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c19dbe4d2552673a8c4ec0e91523670ee2b73ba3560d935703ce5d64a40f864c" -dependencies = [ - "debug_unreachable", - "lazy_static 0.2.11", - "phf_shared", - "serde 0.9.15", - "string_cache_codegen 0.3.1", - "string_cache_shared", -] - -[[package]] -name = "string_cache" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89c058a82f9fd69b1becf8c274f412281038877c553182f1d02eb027045a2d67" -dependencies = [ - "lazy_static 1.4.0", - "new_debug_unreachable", - "phf_shared", - "precomputed-hash", - "serde 1.0.137", - "string_cache_codegen 0.4.4", - "string_cache_shared", -] - -[[package]] -name = "string_cache_codegen" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c9dfe1a7c8bba1ecb90730d269fdc08afe93d23c28dd6c4aa5cabd79a05a05e" -dependencies = [ - "phf_generator", - "string_cache_shared", -] - -[[package]] -name = "string_cache_codegen" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f45ed1b65bf9a4bf2f7b7dc59212d1926e9eaf00fa998988e420fd124467c6" -dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro2 1.0.39", - "quote 1.0.18", - "string_cache_shared", -] - -[[package]] -name = "string_cache_shared" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1884d1bc09741d466d9b14e6d37ac89d6909cbcac41dd9ae982d4d063bbedfc" - -[[package]] -name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "syn" -version = "0.11.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" -dependencies = [ - "quote 0.3.15", - "synom", - "unicode-xid 0.0.4", -] - -[[package]] -name = "syn" -version = "0.15.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" -dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.13", - "unicode-xid 0.1.0", + "proc-macro2", + "quote", + "syn", ] [[package]] @@ -2232,413 +124,19 @@ version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0748dd251e24453cb8717f0354206b91557e4ec8703673a4b30208f2abaf1ebf" dependencies = [ - "proc-macro2 1.0.39", - "quote 1.0.18", + "proc-macro2", + "quote", "unicode-ident", ] -[[package]] -name = "synom" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" -dependencies = [ - "unicode-xid 0.0.4", -] - -[[package]] -name = "tendril" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ce04c250d202db8004921e3d3bc95eaa4f2126c6937a428ae39d12d0e38df62" -dependencies = [ - "encoding", - "futf", - "mac", - "utf-8", -] - -[[package]] -name = "term" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa63644f74ce96fbeb9b794f66aff2a52d601cbd5e80f4b97123e3899f4570f1" -dependencies = [ - "kernel32-sys", - "winapi 0.2.8", -] - -[[package]] -name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "thiserror" -version = "1.0.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a" -dependencies = [ - "proc-macro2 1.0.39", - "quote 1.0.18", - "syn 1.0.96", -] - -[[package]] -name = "tiff" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e4834f28a0330cb9f3f2c87d2649dca723cb33802e2bdcf18da32759fbec7ce" -dependencies = [ - "byteorder", - "lzw", - "num-derive", - "num-traits", -] - -[[package]] -name = "typenum" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" - [[package]] name = "unicode-ident" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee" -[[package]] -name = "unicode-segmentation" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99" - -[[package]] -name = "unicode-width" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" - -[[package]] -name = "unicode-xid" -version = "0.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" - -[[package]] -name = "unicode-xid" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" - -[[package]] -name = "unreachable" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f2ae5ddb18e1c92664717616dd9549dde73f539f01bd7b77c2edb2446bdff91" -dependencies = [ - "void", -] - -[[package]] -name = "utf-8" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aee9ba280438b56d1ebc5329f2094f0ff457f811eeeff0b278d75aa99db400" -dependencies = [ - "matches", -] - -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - -[[package]] -name = "void" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" - -[[package]] -name = "walkdir" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" -dependencies = [ - "same-file", - "winapi 0.3.9", - "winapi-util", -] - [[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "wasi" -version = "0.10.2+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" - -[[package]] -name = "wasm-bindgen" -version = "0.2.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad" -dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4" -dependencies = [ - "bumpalo", - "lazy_static 1.4.0", - "log", - "proc-macro2 1.0.39", - "quote 1.0.18", - "syn 1.0.96", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5" -dependencies = [ - "quote 1.0.18", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b" -dependencies = [ - "proc-macro2 1.0.39", - "quote 1.0.18", - "syn 1.0.96", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744" - -[[package]] -name = "wayland-client" -version = "0.21.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49963e5f9eeaf637bfcd1b9f0701c99fd5cd05225eb51035550d4272806f2713" -dependencies = [ - "bitflags", - "downcast-rs", - "libc", - "nix", - "wayland-commons", - "wayland-scanner", - "wayland-sys", -] - -[[package]] -name = "wayland-commons" -version = "0.21.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40c08896768b667e1df195d88a62a53a2d1351a1ed96188be79c196b35bb32ec" -dependencies = [ - "nix", - "wayland-sys", -] - -[[package]] -name = "wayland-protocols" -version = "0.21.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4afde2ea2a428eee6d7d2c8584fdbe8b82eee8b6c353e129a434cd6e07f42145" -dependencies = [ - "bitflags", - "wayland-client", - "wayland-commons", - "wayland-scanner", - "wayland-sys", -] - -[[package]] -name = "wayland-scanner" -version = "0.21.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf3828c568714507315ee425a9529edc4a4aa9901409e373e9e0027e7622b79e" -dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.13", - "xml-rs", -] - -[[package]] -name = "wayland-sys" -version = "0.21.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "520ab0fd578017a0ee2206623ba9ef4afe5e8f23ca7b42f6acfba2f4e66b1628" -dependencies = [ - "dlib", - "lazy_static 1.4.0", -] - -[[package]] -name = "webgl_generator" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d749d56274af7e25dfe9f7ed92d4f1e7452b2de3ea6208529f31048032b5895" -dependencies = [ - "RustyXML", - "heck", - "html2runes", - "khronos_api", - "regex", - "webidl", -] - -[[package]] -name = "webgl_stdweb" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04ce7301ae86629fd8d450c2c558a8faf3774d5500db4675bebbf97c5fbd2e30" -dependencies = [ - "serde 1.0.137", - "serde_derive", - "stdweb 0.4.20", - "stdweb-derive", - "webgl_generator", -] - -[[package]] -name = "webidl" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f807f7488d680893f7188aa09d7672a3a0a8461975a098a2edf0a52e3fee29" -dependencies = [ - "lalrpop", - "lalrpop-util", -] - -[[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" -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-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.19.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e96eb4bb472fa43e718e8fa4aef82f86cd9deac9483a1e1529230babdb394a8" -dependencies = [ - "android_glue", - "backtrace", - "bitflags", - "cocoa", - "core-foundation", - "core-graphics", - "image", - "lazy_static 1.4.0", - "libc", - "log", - "objc", - "parking_lot", - "percent-encoding", - "raw-window-handle 0.3.4", - "smithay-client-toolkit", - "wayland-client", - "winapi 0.3.9", - "x11-dl", -] - -[[package]] -name = "x11-dl" -version = "2.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea26926b4ce81a6f5d9d0f3a0bc401e5a37c6ae14a1bfaa8ff6099ca80038c59" -dependencies = [ - "lazy_static 1.4.0", - "libc", - "pkg-config", -] - -[[package]] -name = "xdg" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4583db5cbd4c4c0303df2d15af80f0539db703fa1c68802d4cbbd2dd0f88f6" -dependencies = [ - "dirs 4.0.0", -] - -[[package]] -name = "xml-rs" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" diff --git a/Cargo.toml b/Cargo.toml index 4f70c77..876284b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,6 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -quicksilver = { version = "0.3.19", default-features = false, features = [ "fonts", "saving", "sounds" ] } +#quicksilver = { version = "0.3.19", default-features = false, features = [ "fonts", "saving", "sounds" ] } rand = "0.7.2" serde = { version = "1.0.101", features = ["derive"] } diff --git a/src/faux_quicksilver.rs b/src/faux_quicksilver.rs new file mode 100644 index 0000000..b11d4a5 --- /dev/null +++ b/src/faux_quicksilver.rs @@ -0,0 +1,264 @@ +use std::ops::{Mul, Add, AddAssign, Sub}; + +use serde::{Deserialize, Serialize}; + +#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] +pub struct Color { + pub r: u8, + pub g: u8, + pub b: u8, + pub a: u8, +} + +impl Color { + pub const WHITE: Self = Self { + r: 255, + g: 255, + b: 255, + a: 255, + }; + + pub const BLACK: Self = Self { + r: 0, + g: 0, + b: 0, + a: 255, + }; + + pub const GREEN: Self = Self { + r: 0, + g: 255, + b: 0, + a: 255, + }; + + pub fn from_rgba(r: u8, g: u8, b: u8, a: u8) -> Self { + Self { + r, + g, + b, + a, + } + } +} + +#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct Rectangle { + pub x: f32, + pub y: f32, + pub w: f32, + pub h: f32, +} + +impl Rectangle { + pub fn new(x: f32, y: f32, w: f32, h: f32) -> Self { + Self { + x, + y, + w, + h, + } + } + + pub fn pos_add_vec(&mut self, v: Vector) { + self.x += v.x; + self.y += v.y; + } +} + +impl Default for Rectangle { + fn default() -> Self { + Self { + x: 0.0, + y: 0.0, + w: 1.0, + h: 1.0, + } + } +} + +#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct Circle { + pub x: f32, + pub y: f32, + pub r: f32, +} + +impl Circle { + pub fn new(x: f32, y: f32, r: f32) -> Self { + Self { + x, + y, + r, + } + } + + pub fn pos_add_vec(&mut self, v: Vector) { + self.x += v.x; + self.y += v.y; + } +} + +#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct Vector { + pub x: f32, + pub y: f32, +} + +impl Add for Vector { + type Output = Vector; + + fn add(self, rhs: Vector) -> Self::Output { + Vector { + x: self.x + rhs.x, + y: self.y + rhs.y, + } + } +} + +impl Sub for Vector { + type Output = Vector; + + fn sub(self, rhs: Vector) -> Self::Output { + Vector { + x: self.x - rhs.x, + y: self.y - rhs.y, + } + } +} + +impl AddAssign for Vector { + fn add_assign(&mut self, rhs: Vector) { + self.x += rhs.x; + self.y += rhs.y; + } +} + +impl Mul for Vector { + type Output = Vector; + + fn mul(self, rhs: f32) -> Self::Output { + Vector { + x: self.x * rhs, + y: self.y * rhs, + } + } +} + +impl Vector { + pub fn new(x: f32, y: f32) -> Self { + Self { + x, + y, + } + } +} + +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct Transform { + pub mat: [f32; 9], +} + +impl Default for Transform { + fn default() -> Self { + Self { + mat: [ + 1.0, 0.0, 0.0, + 0.0, 1.0, 0.0, + 0.0, 0.0, 1.0, + ], + } + } +} + +impl Mul for Transform { + type Output = Vector; + + fn mul(self, rhs: Vector) -> Self::Output { + Vector { + x: rhs.x * self.mat[0] + rhs.y * self.mat[1] + self.mat[2], + y: rhs.x * self.mat[3] + rhs.y * self.mat[4] + self.mat[5], + } + } +} + +impl Mul for Transform { + type Output = Transform; + + fn mul(self, rhs: Transform) -> Self::Output { + Self { + mat: [ + self.mat[0] * rhs.mat[0] + self.mat[1] * rhs.mat[3] + self.mat[2] * rhs.mat[6], + self.mat[0] * rhs.mat[1] + self.mat[1] * rhs.mat[4] + self.mat[2] * rhs.mat[7], + self.mat[0] * rhs.mat[2] + self.mat[1] * rhs.mat[5] + self.mat[2] * rhs.mat[8], + self.mat[3] * rhs.mat[0] + self.mat[4] * rhs.mat[3] + self.mat[5] * rhs.mat[6], + self.mat[3] * rhs.mat[1] + self.mat[4] * rhs.mat[4] + self.mat[5] * rhs.mat[7], + self.mat[3] * rhs.mat[2] + self.mat[4] * rhs.mat[5] + self.mat[5] * rhs.mat[8], + self.mat[6] * rhs.mat[0] + self.mat[7] * rhs.mat[3] + self.mat[8] * rhs.mat[6], + self.mat[6] * rhs.mat[1] + self.mat[7] * rhs.mat[4] + self.mat[8] * rhs.mat[7], + self.mat[6] * rhs.mat[2] + self.mat[7] * rhs.mat[5] + self.mat[8] * rhs.mat[8], + ] + } + } +} + +impl Transform { + pub const IDENTITY: Self = Self::default(); + + pub fn rotate(rot: f32) -> Self { + Self { + mat: [ + rot.cos(), rot.sin(), 0.0, + -rot.sin(), rot.cos(), 0.0, + 0.0, 0.0, 1.0, + ] + } + } + + pub fn translate(x: f32, y: f32) -> Self { + Self { + mat: [ + 1.0, 0.0, x, + 0.0, 1.0, y, + 0.0, 0.0, 1.0, + ] + } + } +} + +pub struct View { +} + +pub struct Window { +} + +pub struct Key { +} + +pub struct Event { +} + +pub struct Sound { +} + +pub struct Font { +} + +pub struct FontStyle { +} + +pub struct Image { + image_w: usize, + image_h: usize, +} + +impl Image { + pub fn area_rect(&self) -> Rectangle { + Rectangle { + x: 0.0, + y: 0.0, + w: self.image_w as f32, + h: self.image_h as f32, + } + } +} diff --git a/src/main.rs b/src/main.rs index 7be6cad..b7aec24 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,18 +1,21 @@ -use quicksilver::{ - geom::{Circle, Rectangle, Transform, Vector}, - graphics::{ - Background::{Blended, Col, Img}, - Color, Font, FontStyle, Image, View, - }, - input::{ButtonState, Key}, - lifecycle::{run, Asset, Event, Settings, State, Window}, - saving::{load, save}, - sound::Sound, - Result, -}; +//use quicksilver::{ +// geom::{Circle, Rectangle, Transform, Vector}, +// graphics::{ +// Background::{Blended, Col, Img}, +// Color, Font, FontStyle, Image, View, +// }, +// input::{ButtonState, Key}, +// lifecycle::{run, Asset, Event, Settings, State, Window}, +// saving::{load, save}, +// sound::Sound, +// Result, +//}; use rand::prelude::*; use serde::{Deserialize, Serialize}; +mod faux_quicksilver; +use faux_quicksilver::{Color, Image, Rectangle, Circle, Vector, Transform, Window, Sound, Font, FontStyle, Event, Key, View}; + const WIDTH_F: f32 = 800.0; const HEIGHT_F: f32 = 600.0; const MUSIC2_LENGTH: f64 = 2.0 * 60.0 * 1000.0; @@ -136,8 +139,8 @@ impl Menu { text: "Start the Game", text_image: None, text_c: Color::WHITE, - h_c: Color::from_rgba(0x66, 0xFF, 0xFF, 1.0), - c: Color::from_rgba(0x33, 0xDD, 0xDD, 1.0), + h_c: Color::from_rgba(0x66, 0xFF, 0xFF, 255), + c: Color::from_rgba(0x33, 0xDD, 0xDD, 255), }, is_hover: false, is_focus: false, @@ -291,7 +294,7 @@ impl Menu { "Hope", Color::WHITE, Color::BLACK, - Color::from_rgba(0x33, 0x33, 0x33, 1.0), + Color::from_rgba(0x33, 0x33, 0x33, 255), false, ), Menu::button( @@ -302,7 +305,7 @@ impl Menu { "Miracles", Color::WHITE, Color::BLACK, - Color::from_rgba(0x33, 0x33, 0x33, 1.0), + Color::from_rgba(0x33, 0x33, 0x33, 255), false, ), Menu::button( @@ -313,7 +316,7 @@ impl Menu { "Kindness", Color::WHITE, Color::BLACK, - Color::from_rgba(0x33, 0x33, 0x33, 1.0), + Color::from_rgba(0x33, 0x33, 0x33, 255), false, ), Menu::button( @@ -324,7 +327,7 @@ impl Menu { "Determination", Color::WHITE, Color::BLACK, - Color::from_rgba(0x33, 0x33, 0x33, 1.0), + Color::from_rgba(0x33, 0x33, 0x33, 255), false, ), ], @@ -607,12 +610,12 @@ impl ParticleSystem { self.particles.swap_remove(i); } else { if self.is_rect { - self.particles[i].rect.pos.x += self.particles[i].velx * dt as f32; - self.particles[i].rect.pos.y += self.particles[i].vely * dt as f32; + self.particles[i].rect.x += self.particles[i].velx * dt as f32; + self.particles[i].rect.y += self.particles[i].vely * dt as f32; self.particles[i].r += self.particles[i].velr * dt as f32; } else { - self.particles[i].circle.pos.x += self.particles[i].velx * dt as f32; - self.particles[i].circle.pos.y += self.particles[i].vely * dt as f32; + self.particles[i].circle.x += self.particles[i].velx * dt as f32; + self.particles[i].circle.y += self.particles[i].vely * dt as f32; } } } @@ -649,12 +652,12 @@ impl ParticleSystem { return; } for particle in &mut self.particles { - self.color.a = (1.0 - (particle.life_timer / particle.lifetime) as f32) * self.opacity; + self.color.a = ((1.0 - (particle.life_timer / particle.lifetime) as f32) * self.opacity * 255.0) as u8; if particle.is_rect { - let pre_transform = Transform::translate(( - -particle.rect.size.x / 2.0, - -particle.rect.size.y / 2.0, - )) * Transform::rotate(particle.r); + let pre_transform = Transform::translate( + -particle.rect.x / 2.0, + -particle.rect.y / 2.0, + ) * Transform::rotate(particle.r); window.draw_ex( &particle.rect, Col(self.color), @@ -738,14 +741,14 @@ impl RotatingParticleSystem { fn update(&mut self, dt: f64) { if self.particle_system.is_rect { let saved_rect = self.particle_system.host_rect; - self.particle_system.host_rect.pos += - Transform::rotate(self.r) * Vector::new(self.offset, 0.0); + self.particle_system.host_rect.pos_add_vec( + Transform::rotate(self.r) * Vector::new(self.offset, 0.0)); self.particle_system.update(dt); self.particle_system.host_rect = saved_rect; } else { let saved_cir = self.particle_system.host_circle; - self.particle_system.host_circle.pos += - Transform::rotate(self.r) * Vector::new(self.offset, 0.0); + self.particle_system.host_circle.pos_add_vec( + Transform::rotate(self.r) * Vector::new(self.offset, 0.0)); self.particle_system.update(dt); self.particle_system.host_circle = saved_cir; } @@ -761,22 +764,22 @@ impl RotatingParticleSystem { self.particle_system.draw(window, transform); if self.particle_system.is_rect { let mut moved_rect = self.particle_system.host_rect; - moved_rect.pos += Transform::rotate(self.r) * Vector::new(self.offset, 0.0); + moved_rect.pos_add_vec(Transform::rotate(self.r) * Vector::new(self.offset, 0.0)); let mut solid_color = self.particle_system.color; - solid_color.a = self.particle_system.opacity; + solid_color.a = (self.particle_system.opacity * 255.0) as u8; window.draw_ex( &moved_rect, Col(solid_color), transform - * Transform::translate((-moved_rect.size.x / 2.0, -moved_rect.size.y / 2.0)) + * Transform::translate(-moved_rect.x / 2.0, -moved_rect.y / 2.0) * Transform::rotate(self.r * 1.3), 1, ); } else { let mut moved_cir = self.particle_system.host_circle; - moved_cir.pos += Transform::rotate(self.r) * Vector::new(self.offset, 0.0); + moved_cir.pos_add_vec(Transform::rotate(self.r) * Vector::new(self.offset, 0.0)); let mut solid_color = self.particle_system.color; - solid_color.a = self.particle_system.opacity; + solid_color.a = (self.particle_system.opacity * 255.0) as u8; window.draw_ex(&moved_cir, Col(solid_color), transform, 1); } } @@ -837,14 +840,16 @@ impl ExplConvParticleSystem { for particle in &mut self.particles { let dir = Transform::rotate(particle.r) * Vector::new(particle.offset * amount, 0.0); - particle.circle.pos = dir + self.host_circle.pos; + particle.circle.x = dir.x + self.host_circle.x; + particle.circle.y = dir.y + self.host_circle.y; } } else { let amount = 1.0 - interp_sq(((self.life_timer / self.lifetime) as f32 - 0.5) * 2.0); for particle in &mut self.particles { let dir = Transform::rotate(particle.r) * Vector::new(particle.offset * amount, 0.0); - particle.circle.pos = dir + self.host_circle.pos; + particle.circle.x = dir.x + self.host_circle.x; + particle.circle.y = dir.y + self.host_circle.y; } } return false; @@ -855,7 +860,7 @@ impl ExplConvParticleSystem { return; } for particle in &mut self.particles { - self.color.a = ((self.life_timer / self.lifetime) as f32 / 2.0 + 0.5) * self.opacity; + self.color.a = (((self.life_timer / self.lifetime) as f32 / 2.0 + 0.5) * self.opacity * 255.0) as u8; window.draw_ex(&particle.circle, Col(self.color), transform, 1); } } @@ -872,14 +877,14 @@ struct Planet { impl Planet { fn new(circle: Circle, color: Color) -> Self { let mut smaller_circle = circle; - smaller_circle.radius /= 4.0; + smaller_circle.r /= 4.0; let mut planet = Planet { circle, color, particle_system: ParticleSystem::new( rand::thread_rng().gen_range(2000.0, 3800.0), 900.0, - Rectangle::new((0.0, 0.0), (1.0, 1.0)), + Rectangle::new(0.0, 0.0,1.0, 1.0), circle, false, Vector::new(0.0, 0.0), @@ -896,7 +901,7 @@ impl Planet { planet.moons.push(RotatingParticleSystem::new( rand::thread_rng().gen_range(1000.0, 2600.0), 600.0, - Rectangle::new((0.0, 0.0), (1.0, 1.0)), + Rectangle::new(0.0, 0.0, 1.0, 1.0), smaller_circle, false, Vector::new(0.0, 0.0), @@ -917,10 +922,12 @@ impl Planet { } fn update(&mut self, dt: f64) { - self.particle_system.host_circle.pos = self.circle.pos; + self.particle_system.host_circle.x = self.circle.x; + self.particle_system.host_circle.y = self.circle.y; self.particle_system.update(dt); for moon in &mut self.moons { - moon.particle_system.host_circle.pos = self.circle.pos; + moon.particle_system.host_circle.x = self.circle.x; + moon.particle_system.host_circle.y = self.circle.y; moon.update(dt); } } @@ -949,7 +956,7 @@ impl Star { particle_system: ParticleSystem::new( rand::thread_rng().gen_range(80.0, 200.0), 850.0, - Rectangle::new((0.0, 0.0), (1.0, 1.0)), + Rectangle::new(0.0, 0.0, 1.0, 1.0), circle, false, Vector::new(0.0, 0.0), @@ -961,14 +968,14 @@ impl Star { r, }; - if star.color.r < 0.75 { - star.color.r = 0.75; + if star.color.r < (0.75 * 255.0) as u8 { + star.color.r = (0.75 * 255.0) as u8; } - if star.color.g < 0.75 { - star.color.g = 0.75; + if star.color.g < (0.75 * 255.0) as u8 { + star.color.g = (0.75 * 255.0) as u8; } - if star.color.b < 0.75 { - star.color.b = 0.75; + if star.color.b < (0.75 * 255.0) as u8 { + star.color.b = (0.75 * 255.0) as u8; } star.particle_system .force_spawn(rand::thread_rng().gen_range(20, 45)); @@ -983,8 +990,9 @@ impl Star { fn draw(&mut self, image: &mut Image, window: &mut Window, transform: Transform) { self.particle_system.draw(window, transform); - let mut image_rect = image.area(); - image_rect.pos = self.particle_system.host_circle.pos - image_rect.size / 2.0; + let mut image_rect = image.area_rect(); + image_rect.x = self.particle_system.host_circle.x - image_rect.w / 2.0; + image_rect.y = self.particle_system.host_circle.y - image_rect.h / 2.0; window.draw_ex( &image_rect, Blended(image, self.color), @@ -1075,8 +1083,9 @@ impl Fish { transform: Transform, ) { let anim_angle = ((self.anim_timer / self.anim_time) * std::f64::consts::PI * 2.0).sin(); - let mut body_rect = fish_body.area(); - body_rect.pos = self.pos - body_rect.size / 2.0; + let mut body_rect = fish_body.area_rect(); + body_rect.x = self.pos.x - body_rect.w / 2.0; + body_rect.y = self.pos.y - body_rect.h / 2.0; let body_tr = Transform::rotate(anim_angle as f32 * 30.0) * Transform::rotate(self.r + 180.0); window.draw_ex( @@ -1085,16 +1094,17 @@ impl Fish { transform * body_tr, 1, ); - let mut tail_rect = fish_tail.area(); - tail_rect.pos = self.pos - tail_rect.size / 2.0; + let mut tail_rect = fish_tail.area_rect(); + tail_rect.x = self.pos.x - tail_rect.w / 2.0; + tail_rect.y = self.pos.y - tail_rect.h / 2.0; let anim_angle = ((self.anim_timer / self.anim_time) * std::f64::consts::PI * 2.0 - std::f64::consts::PI / 3.0) .sin(); let tail_tr = body_tr - * Transform::translate((body_rect.size.x / 1.5, 0.0)) - * Transform::translate((-tail_rect.size.x / 2.0, 0.0)) + * Transform::translate(body_rect.x / 1.5, 0.0) + * Transform::translate(-tail_rect.x / 2.0, 0.0) * Transform::rotate(-anim_angle as f32 * 45.0) - * Transform::translate((tail_rect.size.x / 2.0, 0.0)); + * Transform::translate(tail_rect.x / 2.0, 0.0); window.draw_ex( &tail_rect, Blended(fish_tail, self.color), @@ -1119,17 +1129,17 @@ enum SaveLoadNotification { } struct GameState { - s_boom: Asset, - s_get: Asset, - s_power_up: Asset, - s_tap: Asset, - s_speak_m: Asset, - s_speak_f: Asset, - font: Asset, - music2: Asset, - i_star: Option>, + s_boom: Sound, + s_get: Sound, + s_power_up: Sound, + s_tap: Sound, + s_speak_m: Sound, + s_speak_f: Sound, + font: Font, + music2: Sound, + i_star: Option, i_star_actual: Option, - i_fish: Asset, + i_fish: Image, i_fish_body: Option, i_fish_tail: Option, music_on: bool, @@ -1159,20 +1169,20 @@ struct GameState { save_load_notification: Option, } -impl State for GameState { - fn new() -> Result { +impl GameState { + fn new() -> Result { Ok(Self { - s_boom: Asset::new(Sound::load("boom.mp3")), - s_get: Asset::new(Sound::load("get.mp3")), - s_power_up: Asset::new(Sound::load("power_up.mp3")), - s_tap: Asset::new(Sound::load("tap.mp3")), - s_speak_m: Asset::new(Sound::load("speak_m.mp3")), - s_speak_f: Asset::new(Sound::load("speak_f.mp3")), - font: Asset::new(Font::load("ClearSans-Regular.ttf")), - music2: Asset::new(Sound::load("music2.mp3")), - i_star: Some(Asset::new(Image::load("star.png"))), + s_boom: Sound::load("boom.mp3"), + s_get: Sound::load("get.mp3"), + s_power_up: Sound::load("power_up.mp3"), + s_tap: Sound::load("tap.mp3"), + s_speak_m: Sound::load("speak_m.mp3"), + s_speak_f: Sound::load("speak_f.mp3"), + font: Font::load("ClearSans-Regular.ttf"), + music2: Sound::load("music2.mp3"), + i_star: Some(Image::load("star.png")), i_star_actual: None, - i_fish: Asset::new(Image::load("fish.png")), + i_fish: Image::load("fish.png"), i_fish_body: None, i_fish_tail: None, music_on: false, @@ -1183,13 +1193,13 @@ impl State for GameState { selection_mode: true, current_item: None, current_finished: true, - player: Rectangle::new((400.0, 300.0), (32.0, 32.0)), + player: Rectangle::new(400.0, 300.0, 32.0, 32.0), player_r: 0.0, player_particles: ParticleSystem::new( PP_GEN_RATE, 1000.0, - Rectangle::new((400.0, 300.0), (32.0, 32.0)), - Circle::new((100.0, 100.0), 32.0), + Rectangle::new(400.0, 300.0, 32.0, 32.0), + Circle::new(100.0, 100.0, 32.0), true, Vector::new(0.0, 0.0), Color::WHITE, @@ -1199,8 +1209,8 @@ impl State for GameState { joining_particles: RotatingParticleSystem::new( PP_GEN_RATE, 1000.0, - Rectangle::new((400.0, 300.0), (16.0, 16.0)), - Circle::new((100.0, 100.0), 32.0), + Rectangle::new(400.0, 300.0, 16.0, 16.0), + Circle::new(100.0, 100.0, 32.0), true, Vector::new(0.0, 0.0), Color::GREEN, @@ -1220,13 +1230,13 @@ impl State for GameState { planets: Vec::new(), stars: Vec::new(), fishes: Vec::new(), - camera: Rectangle::new((0.0, 0.0), (WIDTH_F, HEIGHT_F)), + camera: Rectangle::new(0.0, 0.0, WIDTH_F, HEIGHT_F), move_to: Vector::new(400.0, 300.0), save_load_notification: None, }) } - fn event(&mut self, event: &Event, window: &mut Window) -> Result<()> { + fn event(&mut self, event: &Event, window: &mut Window) -> Result<(), String> { match event { Event::MouseMoved(v) => { self.mouse_pos = *v; @@ -1259,8 +1269,8 @@ impl State for GameState { if self.state == 8 { let mut expl_conv_system = ExplConvParticleSystem::new( 1500.0, - Circle::new(self.mouse_pos, 20.0), - Color::from_rgba(0x99, 0xFF, 0x99, 1.0), + Circle::new(self.mouse_pos.x, self.mouse_pos.y, 20.0), + Color::from_rgba(0x99, 0xFF, 0x99, 255), 1.0, ); expl_conv_system.activate(30, 200.0); @@ -1278,12 +1288,12 @@ impl State for GameState { // spawn planet let mut expl_conv_system = ExplConvParticleSystem::new( rng.gen_range(1200.0, 1600.0), - Circle::new(self.mouse_pos, rng.gen_range(15.0, 25.0)), + Circle::new(self.mouse_pos.x,self.mouse_pos.y, rng.gen_range(15.0, 25.0)), Color::from_rgba( rng.gen_range(0x44, 0xFF), rng.gen_range(0x44, 0xFF), rng.gen_range(0x44, 0xFF), - 1.0, + 255, ), 1.0, ); @@ -1296,12 +1306,12 @@ impl State for GameState { // spawn star let rot_clockwise = rng.gen_bool(0.5); self.stars.push(Star::new( - Circle::new(self.mouse_pos, rng.gen_range(3.0, 7.0)), + Circle::new(self.mouse_pos.x, self.mouse_pos.y, rng.gen_range(3.0, 7.0)), Color::from_rgba( rng.gen_range(0x58, 0xFF), rng.gen_range(0x58, 0xFF), rng.gen_range(0x58, 0xFF), - 1.0, + 255, ), if rot_clockwise { rng.gen_range(0.1, 0.3) @@ -1320,7 +1330,7 @@ impl State for GameState { rng.gen_range(0x44, 0xFF), rng.gen_range(0x44, 0xFF), rng.gen_range(0x44, 0xFF), - 1.0, + 255, ), )); } @@ -1347,25 +1357,25 @@ impl State for GameState { self.state = 3; self.state_dirty = true; self.joining_particles.particle_system.color = - Color::from_rgba(0xAA, 0xCC, 0xFF, 1.0); + Color::from_rgba(0xAA, 0xCC, 0xFF, 255); } else if idx == 6 { // miracles self.state = 4; self.state_dirty = true; self.joining_particles.particle_system.color = - Color::from_rgba(0xFF, 0xFF, 0xAA, 1.0); + Color::from_rgba(0xFF, 0xFF, 0xAA, 255); } else if idx == 7 { // kindness self.state = 5; self.state_dirty = true; self.joining_particles.particle_system.color = - Color::from_rgba(0xBB, 0xFF, 0xBB, 1.0); + Color::from_rgba(0xBB, 0xFF, 0xBB, 255); } else { // determination self.state = 6; self.state_dirty = true; self.joining_particles.particle_system.color = - Color::from_rgba(0xFF, 0xAA, 0xAA, 1.0); + Color::from_rgba(0xFF, 0xAA, 0xAA, 255); } self.s_get.execute(|s| { s.set_volume(0.7); @@ -1471,9 +1481,9 @@ impl State for GameState { self.player = save_data.player; self.joining_particles = save_data.joining_particles; self.expl_conv_p_systems.clear(); - self.move_to = self.player.pos; - self.camera.pos = - self.player.pos - Vector::new(WIDTH_F / 2.0, HEIGHT_F / 2.0); + self.move_to = Vector{ x: self.player.x, y: self.player.y}; + self.camera.x = self.player.x - WIDTH_F / 2.0; + self.camera.y = self.player.y - HEIGHT_F / 2.0; self.dbl_click_timeout = None; self.click_time = None; self.click_release_time = DOUBLE_CLICK_TIME; @@ -1501,7 +1511,7 @@ impl State for GameState { Ok(()) } - fn update(&mut self, window: &mut Window) -> Result<()> { + fn update(&mut self, window: &mut Window) -> Result<(), String> { let dt = window.update_rate(); self.click_release_time += dt; @@ -1519,12 +1529,14 @@ impl State for GameState { } } - self.player.pos += (self.move_to - self.player.pos) / 20.0; - self.player_particles.host_rect.pos = self.player.pos; - self.joining_particles.particle_system.host_rect.pos += - (self.player.pos - self.joining_particles.particle_system.host_rect.pos) / 30.0; - self.camera.pos += - (self.player.pos - Vector::new(WIDTH_F / 2.0, HEIGHT_F / 2.0) - self.camera.pos) / 40.0; + self.player.x += (self.move_to.x - self.player.x) / 20.0; + self.player.y += (self.move_to.y - self.player.y) / 20.0; + self.player_particles.host_rect.x = self.player.x; + self.player_particles.host_rect.y = self.player.y; + self.joining_particles.particle_system.host_rect.x += (self.player.x - self.joining_particles.particle_system.host_rect.x) / 30.0; + self.joining_particles.particle_system.host_rect.y += (self.player.y - self.joining_particles.particle_system.host_rect.y) / 30.0; + self.camera.x += (self.player.x - WIDTH_F / 2.0 - self.camera.x) / 40.0; + self.camera.y += (self.player.y - HEIGHT_F / 2.0 - self.camera.y) / 40.0; window.set_view(View::new(self.camera)); self.player_r += dt / 10.0; @@ -1609,9 +1621,11 @@ impl State for GameState { self.planets.clear(); self.stars.clear(); self.fishes.clear(); - self.player.pos = Vector::new(WIDTH_F / 2.0, HEIGHT_F / 2.0); + self.player.x = WIDTH_F / 2.0; + self.player.y = HEIGHT_F / 2.0; self.move_to = Vector::new(WIDTH_F / 2.0, HEIGHT_F / 2.0); - self.camera.pos = Vector::new(0.0, 0.0); + self.camera.x = 0.0; + self.camera.y = 0.0; self.click_time = None; } } @@ -1813,7 +1827,7 @@ impl State for GameState { if self.i_fish_body.is_none() { let mut body: Option = None; self.i_fish.execute(|i| { - body = Some(i.subimage(Rectangle::new((0.0, 0.0), (32.0, 16.0)))); + body = Some(i.subimage(Rectangle::new(0.0, 0.0, 32.0, 16.0))); Ok(()) })?; self.i_fish_body = body; @@ -1821,7 +1835,7 @@ impl State for GameState { if self.i_fish_tail.is_none() { let mut tail: Option = None; self.i_fish.execute(|i| { - tail = Some(i.subimage(Rectangle::new((32.0, 0.0), (16.0, 16.0)))); + tail = Some(i.subimage(Rectangle::new(32.0, 0.0, 16.0, 16.0))); Ok(()) })?; self.i_fish_tail = tail; @@ -1834,14 +1848,14 @@ impl State for GameState { Ok(()) } - fn draw(&mut self, window: &mut Window) -> Result<()> { + fn draw(&mut self, window: &mut Window) -> Result<(), String> { window.clear(Color::BLACK)?; let mut rect = Rectangle::default(); for mi in &mut self.menu.items { - rect.pos.x = mi.x; - rect.pos.y = mi.y; - rect.size.x = mi.w; - rect.size.y = mi.h; + rect.x = mi.x; + rect.y = mi.y; + rect.w = mi.w; + rect.h = mi.h; match &mut mi.item_type { MenuItemType::Button { text, @@ -1856,9 +1870,9 @@ impl State for GameState { window.draw(&rect, Col(*c)); } if let Some(i) = text_image { - let mut image_rect = i.area(); - image_rect.pos.x = mi.x + (mi.w - image_rect.size.x) / 2.0; - image_rect.pos.y = mi.y + (mi.h - image_rect.size.y) / 2.0; + let mut image_rect = i.area_rect(); + image_rect.x = mi.x + (mi.w - image_rect.w) / 2.0; + image_rect.y = mi.y + (mi.h - image_rect.h) / 2.0; window.draw(&image_rect, Img(i)); } } @@ -1902,7 +1916,7 @@ impl State for GameState { 0xFF, self.player_particles.opacity, )), - Transform::translate((-self.player.size.x / 2.0, -self.player.size.y / 2.0)) + Transform::translate(-self.player.size.x / 2.0, -self.player.size.y / 2.0) * Transform::rotate(self.player_r as f32), 1, ); From 1dcfbc2db9f906fed1a8d7cec51f928ee1174963 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Mon, 13 Feb 2023 18:53:04 +0900 Subject: [PATCH 02/29] More fixes, add agnostic_interface.rs --- src/agnostic_interface.rs | 22 ++++++++++++++++++++++ src/faux_quicksilver.rs | 11 +++++++++++ src/main.rs | 12 +++++++----- 3 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 src/agnostic_interface.rs diff --git a/src/agnostic_interface.rs b/src/agnostic_interface.rs new file mode 100644 index 0000000..99f2e61 --- /dev/null +++ b/src/agnostic_interface.rs @@ -0,0 +1,22 @@ +use crate::faux_quicksilver::Color; + +pub trait ImageInterface { + fn draw(&self, x: f32, y: f32) -> Result<(), String>; +} + +pub trait FontInterface { + fn draw(&self, s: &str) -> Result<(), String>; +} + +pub trait SoundInterface { + fn play(&self, vol: f32) -> Result<(), String>; +} + +pub trait WindowInterface { + fn get_dimensions(&self) -> Result<(f32, f32), String>; + fn get_key_pressed(&self, key: char) -> Result; + fn get_mouse_pressed(&self) -> Result, String>; + fn clear_window(&self, color: Color) -> Result<(), String>; + fn begin_drawing(&self) -> Result<(), String>; + fn end_drawing(&self) -> Result<(), String>; +} diff --git a/src/faux_quicksilver.rs b/src/faux_quicksilver.rs index b11d4a5..ef17277 100644 --- a/src/faux_quicksilver.rs +++ b/src/faux_quicksilver.rs @@ -2,6 +2,8 @@ use std::ops::{Mul, Add, AddAssign, Sub}; use serde::{Deserialize, Serialize}; +use crate::agnostic_interface::WindowInterface; + #[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct Color { pub r: u8, @@ -230,6 +232,15 @@ pub struct View { } pub struct Window { + interface: Box, +} + +impl Window { + pub fn new() -> Self { + Self { + interface: todo!(), + } + } } pub struct Key { diff --git a/src/main.rs b/src/main.rs index b7aec24..40687fe 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,6 +13,7 @@ use rand::prelude::*; use serde::{Deserialize, Serialize}; +mod agnostic_interface; mod faux_quicksilver; use faux_quicksilver::{Color, Image, Rectangle, Circle, Vector, Transform, Window, Sound, Font, FontStyle, Event, Key, View}; @@ -1914,9 +1915,9 @@ impl GameState { 0xFF, 0xFF, 0xFF, - self.player_particles.opacity, + (self.player_particles.opacity * 255.0) as u8, )), - Transform::translate(-self.player.size.x / 2.0, -self.player.size.y / 2.0) + Transform::translate(-self.player.x / 2.0, -self.player.y / 2.0) * Transform::rotate(self.player_r as f32), 1, ); @@ -1948,9 +1949,10 @@ impl GameState { | SaveLoadNotification::Load { text, timer } => { if let Some(i) = text { let mut c = Color::WHITE; - c.a = (*timer / SL_NOTIF_TIME) as f32; - let mut image_rect = i.area(); - image_rect.pos = self.camera.pos + Vector::new(20.0, 20.0); + c.a = ((*timer / SL_NOTIF_TIME) as f32 * 255.0) as u8; + let mut image_rect = i.area_rect(); + image_rect.x = self.camera.x + 20.0; + image_rect.y = self.camera.y + 20.0; window.draw(&image_rect, Blended(i, c)); } } From 996e568b50d41746e9b95eb129244aa9c83e0054 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Tue, 14 Feb 2023 18:55:36 +0900 Subject: [PATCH 03/29] Work on porting from quicksilver --- src/agnostic_interface.rs | 67 ++++++++++-- src/faux_quicksilver.rs | 215 +++++++++++++++++++++++++------------- src/main.rs | 196 ++++++++++++++++++---------------- 3 files changed, 306 insertions(+), 172 deletions(-) diff --git a/src/agnostic_interface.rs b/src/agnostic_interface.rs index 99f2e61..2e6e13a 100644 --- a/src/agnostic_interface.rs +++ b/src/agnostic_interface.rs @@ -1,22 +1,67 @@ -use crate::faux_quicksilver::Color; +use std::path::Path; + +use crate::faux_quicksilver::{Circle, Color, Rectangle, Transform, Vector}; pub trait ImageInterface { - fn draw(&self, x: f32, y: f32) -> Result<(), String>; + fn draw(&mut self, x: f32, y: f32) -> Result<(), String>; + fn get_w(&self) -> usize; + fn get_h(&self) -> usize; + fn get_wh_rect(&self) -> Rectangle; } pub trait FontInterface { - fn draw(&self, s: &str) -> Result<(), String>; + fn draw(&mut self, s: &str, size: u32) -> Result<(), String>; } pub trait SoundInterface { - fn play(&self, vol: f32) -> Result<(), String>; + fn play(&mut self, vol: f32) -> Result<(), String>; } -pub trait WindowInterface { - fn get_dimensions(&self) -> Result<(f32, f32), String>; - fn get_key_pressed(&self, key: char) -> Result; - fn get_mouse_pressed(&self) -> Result, String>; - fn clear_window(&self, color: Color) -> Result<(), String>; - fn begin_drawing(&self) -> Result<(), String>; - fn end_drawing(&self) -> Result<(), String>; +pub trait MusicInterface { + fn play(&mut self, vol: f32) -> Result<(), String>; + fn pause(&mut self) -> Result<(), String>; + fn stop(&mut self) -> Result<(), String>; +} + +pub trait GameInterface { + fn get_dimensions(&self) -> Result<(f32, f32), String>; + fn get_key_pressed(&mut self, key: char) -> Result; + fn get_mouse_pressed(&mut self) -> Result, String>; + fn clear_window(&mut self, color: Color) -> Result<(), String>; + fn begin_drawing(&mut self) -> Result<(), String>; + fn end_drawing(&mut self) -> Result<(), String>; + + fn draw_circle(&mut self, circle: Circle, color: Color) -> Result<(), String>; + fn draw_circle_ex( + &mut self, + circle: Circle, + color: Color, + origin: Vector, + rot: f32, + ) -> Result<(), String>; + fn draw_circle_transform( + &mut self, + circle: Circle, + color: Color, + transform: Transform, + ) -> Result<(), String>; + fn draw_rect(&mut self, rect: Rectangle, color: Color) -> Result<(), String>; + fn draw_rect_ex( + &mut self, + rect: Rectangle, + color: Color, + origin: Vector, + rot: f32, + ) -> Result<(), String>; + fn draw_rect_transform( + &mut self, + rect: Rectangle, + color: Color, + transform: Transform, + ) -> Result<(), String>; + + fn load_image(&mut self, path: &Path) -> Result, String>; + fn load_font(&mut self, path: &Path) -> Result, String>; + fn load_sound(&mut self, path: &Path) -> Result, String>; + fn load_music(&mut self, path: &Path) -> Result, String>; } diff --git a/src/faux_quicksilver.rs b/src/faux_quicksilver.rs index ef17277..06038fc 100644 --- a/src/faux_quicksilver.rs +++ b/src/faux_quicksilver.rs @@ -1,8 +1,12 @@ -use std::ops::{Mul, Add, AddAssign, Sub}; +use std::collections::HashMap; +use std::ops::{Add, AddAssign, Mul, Sub}; +use std::path::Path; use serde::{Deserialize, Serialize}; -use crate::agnostic_interface::WindowInterface; +use crate::agnostic_interface::{ + FontInterface, GameInterface, ImageInterface, MusicInterface, SoundInterface, +}; #[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct Color { @@ -35,12 +39,7 @@ impl Color { }; pub fn from_rgba(r: u8, g: u8, b: u8, a: u8) -> Self { - Self { - r, - g, - b, - a, - } + Self { r, g, b, a } } } @@ -54,12 +53,7 @@ pub struct Rectangle { impl Rectangle { pub fn new(x: f32, y: f32, w: f32, h: f32) -> Self { - Self { - x, - y, - w, - h, - } + Self { x, y, w, h } } pub fn pos_add_vec(&mut self, v: Vector) { @@ -88,11 +82,7 @@ pub struct Circle { impl Circle { pub fn new(x: f32, y: f32, r: f32) -> Self { - Self { - x, - y, - r, - } + Self { x, y, r } } pub fn pos_add_vec(&mut self, v: Vector) { @@ -149,26 +139,23 @@ impl Mul for Vector { impl Vector { pub fn new(x: f32, y: f32) -> Self { - Self { - x, - y, - } + Self { x, y } } } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct Transform { pub mat: [f32; 9], + translate: Vector, + rotate: f32, } impl Default for Transform { fn default() -> Self { Self { - mat: [ - 1.0, 0.0, 0.0, - 0.0, 1.0, 0.0, - 0.0, 0.0, 1.0, - ], + mat: [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0], + translate: Vector { x: 0.0, y: 0.0 }, + rotate: 0.0, } } } @@ -199,7 +186,9 @@ impl Mul for Transform { self.mat[6] * rhs.mat[0] + self.mat[7] * rhs.mat[3] + self.mat[8] * rhs.mat[6], self.mat[6] * rhs.mat[1] + self.mat[7] * rhs.mat[4] + self.mat[8] * rhs.mat[7], self.mat[6] * rhs.mat[2] + self.mat[7] * rhs.mat[5] + self.mat[8] * rhs.mat[8], - ] + ], + translate: self.translate + rhs.translate, + rotate: self.rotate + rhs.rotate, } } } @@ -210,66 +199,148 @@ impl Transform { pub fn rotate(rot: f32) -> Self { Self { mat: [ - rot.cos(), rot.sin(), 0.0, - -rot.sin(), rot.cos(), 0.0, - 0.0, 0.0, 1.0, - ] + rot.cos(), + rot.sin(), + 0.0, + -rot.sin(), + rot.cos(), + 0.0, + 0.0, + 0.0, + 1.0, + ], + rotate: rot, + ..Default::default() } } pub fn translate(x: f32, y: f32) -> Self { Self { - mat: [ - 1.0, 0.0, x, - 0.0, 1.0, y, - 0.0, 0.0, 1.0, - ] + mat: [1.0, 0.0, x, 0.0, 1.0, y, 0.0, 0.0, 1.0], + translate: Vector { x, y }, + ..Default::default() } } + + pub fn get_translate(&self) -> Vector { + self.translate + } + + pub fn get_rotation(&self) -> f32 { + self.rotate + } } -pub struct View { -} +pub struct View {} pub struct Window { - interface: Box, + gi: Box, + images: HashMap>, + fonts: HashMap>, + sounds: HashMap>, + music: HashMap>, } impl Window { - pub fn new() -> Self { + pub fn new(gi: Box) -> Self { Self { - interface: todo!(), + gi, + images: HashMap::new(), + fonts: HashMap::new(), + sounds: HashMap::new(), + music: HashMap::new(), } } + + pub fn get_gi(&self) -> &Box { + &self.gi + } + + pub fn get_gi_mut(&mut self) -> &mut Box { + &mut self.gi + } + + pub fn load_image(&mut self, path: &Path, name: String) -> Result<(), String> { + self.images.insert(name, self.gi.load_image(path)?); + + Ok(()) + } + + pub fn load_font(&mut self, path: &Path, name: String) -> Result<(), String> { + self.fonts.insert(name, self.gi.load_font(path)?); + + Ok(()) + } + + pub fn load_sound(&mut self, path: &Path, name: String) -> Result<(), String> { + self.sounds.insert(name, self.gi.load_sound(path)?); + + Ok(()) + } + + pub fn load_music(&mut self, path: &Path, name: String) -> Result<(), String> { + self.music.insert(name, self.gi.load_music(path)?); + + Ok(()) + } + + pub fn get_image(&self, name: &str) -> Result<&Box, String> { + Ok(self + .images + .get(name) + .ok_or_else(|| format!("Image \"{name}\" not found"))?) + } + + pub fn get_image_mut(&self, name: &str) -> Result<&mut Box, String> { + Ok(self + .images + .get_mut(name) + .ok_or_else(|| format!("Image \"{name}\" not found"))?) + } + + pub fn get_font(&self, name: &str) -> Result<&Box, String> { + Ok(self + .fonts + .get(name) + .ok_or_else(|| format!("Font \"{name}\" not found"))?) + } + + pub fn get_font_mut(&self, name: &str) -> Result<&mut Box, String> { + Ok(self + .fonts + .get_mut(name) + .ok_or_else(|| format!("Font \"{name}\" not found"))?) + } + + pub fn get_sound(&self, name: &str) -> Result<&Box, String> { + Ok(self + .sounds + .get(name) + .ok_or_else(|| format!("Sound \"{name}\" not found"))?) + } + + pub fn get_sound_mut(&self, name: &str) -> Result<&mut Box, String> { + Ok(self + .sounds + .get_mut(name) + .ok_or_else(|| format!("Sound \"{name}\" not found"))?) + } + + pub fn get_music(&self, name: &str) -> Result<&Box, String> { + Ok(self + .music + .get(name) + .ok_or_else(|| format!("Music \"{name}\" not found"))?) + } + + pub fn get_music_mut(&self, name: &str) -> Result<&mut Box, String> { + Ok(self + .music + .get_mut(name) + .ok_or_else(|| format!("Music \"{name}\" not found"))?) + } } -pub struct Key { -} +pub struct Key {} -pub struct Event { -} - -pub struct Sound { -} - -pub struct Font { -} - -pub struct FontStyle { -} - -pub struct Image { - image_w: usize, - image_h: usize, -} - -impl Image { - pub fn area_rect(&self) -> Rectangle { - Rectangle { - x: 0.0, - y: 0.0, - w: self.image_w as f32, - h: self.image_h as f32, - } - } -} +pub struct Event {} diff --git a/src/main.rs b/src/main.rs index 40687fe..a6e82c2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,7 +15,7 @@ use serde::{Deserialize, Serialize}; mod agnostic_interface; mod faux_quicksilver; -use faux_quicksilver::{Color, Image, Rectangle, Circle, Vector, Transform, Window, Sound, Font, FontStyle, Event, Key, View}; +use faux_quicksilver::{Circle, Color, Event, Key, Rectangle, Transform, Vector, View, Window}; const WIDTH_F: f32 = 800.0; const HEIGHT_F: f32 = 600.0; @@ -54,14 +54,14 @@ fn interp_sq(x: f32) -> f32 { enum MenuItemType { Button { text: &'static str, - text_image: Option, + text_image: Option, text_c: Color, h_c: Color, c: Color, }, AppearingText { text: &'static str, - text_image: Option, + text_image: Option, current_text: String, text_size: f32, text_c: Color, @@ -69,7 +69,7 @@ enum MenuItemType { }, InstantText { text: &'static str, - text_image: Option, + text_image: Option, text_size: f32, text_color: Color, }, @@ -653,20 +653,22 @@ impl ParticleSystem { return; } for particle in &mut self.particles { - self.color.a = ((1.0 - (particle.life_timer / particle.lifetime) as f32) * self.opacity * 255.0) as u8; + self.color.a = ((1.0 - (particle.life_timer / particle.lifetime) as f32) + * self.opacity + * 255.0) as u8; if particle.is_rect { - let pre_transform = Transform::translate( - -particle.rect.x / 2.0, - -particle.rect.y / 2.0, - ) * Transform::rotate(particle.r); - window.draw_ex( - &particle.rect, - Col(self.color), - transform * pre_transform, - 1, - ); + let pre_transform = + Transform::translate(-particle.rect.x / 2.0, -particle.rect.y / 2.0) + * Transform::rotate(particle.r); + window + .get_gi_mut() + .draw_rect_transform(particle.rect, self.color, transform * pre_transform) + .ok(); } else { - window.draw_ex(&particle.circle, Col(self.color), transform, 1); + window + .get_gi_mut() + .draw_circle_transform(particle.circle, self.color, transform) + .ok(); } } } @@ -742,14 +744,16 @@ impl RotatingParticleSystem { fn update(&mut self, dt: f64) { if self.particle_system.is_rect { let saved_rect = self.particle_system.host_rect; - self.particle_system.host_rect.pos_add_vec( - Transform::rotate(self.r) * Vector::new(self.offset, 0.0)); + self.particle_system + .host_rect + .pos_add_vec(Transform::rotate(self.r) * Vector::new(self.offset, 0.0)); self.particle_system.update(dt); self.particle_system.host_rect = saved_rect; } else { let saved_cir = self.particle_system.host_circle; - self.particle_system.host_circle.pos_add_vec( - Transform::rotate(self.r) * Vector::new(self.offset, 0.0)); + self.particle_system + .host_circle + .pos_add_vec(Transform::rotate(self.r) * Vector::new(self.offset, 0.0)); self.particle_system.update(dt); self.particle_system.host_circle = saved_cir; } @@ -768,20 +772,25 @@ impl RotatingParticleSystem { moved_rect.pos_add_vec(Transform::rotate(self.r) * Vector::new(self.offset, 0.0)); let mut solid_color = self.particle_system.color; solid_color.a = (self.particle_system.opacity * 255.0) as u8; - window.draw_ex( - &moved_rect, - Col(solid_color), - transform - * Transform::translate(-moved_rect.x / 2.0, -moved_rect.y / 2.0) - * Transform::rotate(self.r * 1.3), - 1, - ); + window + .get_gi_mut() + .draw_rect_transform( + moved_rect, + solid_color, + transform + * Transform::translate(-moved_rect.x / 2.0, -moved_rect.y / 2.0) + * Transform::rotate(self.r * 1.3), + ) + .ok(); } else { let mut moved_cir = self.particle_system.host_circle; moved_cir.pos_add_vec(Transform::rotate(self.r) * Vector::new(self.offset, 0.0)); let mut solid_color = self.particle_system.color; solid_color.a = (self.particle_system.opacity * 255.0) as u8; - window.draw_ex(&moved_cir, Col(solid_color), transform, 1); + window + .get_gi_mut() + .draw_circle_transform(moved_cir, solid_color, transform) + .ok(); } } } @@ -861,7 +870,9 @@ impl ExplConvParticleSystem { return; } for particle in &mut self.particles { - self.color.a = (((self.life_timer / self.lifetime) as f32 / 2.0 + 0.5) * self.opacity * 255.0) as u8; + self.color.a = (((self.life_timer / self.lifetime) as f32 / 2.0 + 0.5) + * self.opacity + * 255.0) as u8; window.draw_ex(&particle.circle, Col(self.color), transform, 1); } } @@ -885,7 +896,7 @@ impl Planet { particle_system: ParticleSystem::new( rand::thread_rng().gen_range(2000.0, 3800.0), 900.0, - Rectangle::new(0.0, 0.0,1.0, 1.0), + Rectangle::new(0.0, 0.0, 1.0, 1.0), circle, false, Vector::new(0.0, 0.0), @@ -989,7 +1000,7 @@ impl Star { self.r += self.velr * dt as f32; } - fn draw(&mut self, image: &mut Image, window: &mut Window, transform: Transform) { + fn draw(&mut self, image: &mut String, window: &mut Window, transform: Transform) { self.particle_system.draw(window, transform); let mut image_rect = image.area_rect(); image_rect.x = self.particle_system.host_circle.x - image_rect.w / 2.0; @@ -1078,8 +1089,8 @@ impl Fish { fn draw( &mut self, - fish_body: &Image, - fish_tail: &Image, + fish_body: &String, + fish_tail: &String, window: &mut Window, transform: Transform, ) { @@ -1125,8 +1136,8 @@ struct SaveData { } enum SaveLoadNotification { - Save { text: Option, timer: f64 }, - Load { text: Option, timer: f64 }, + Save { text: Option, timer: f64 }, + Load { text: Option, timer: f64 }, } struct GameState { @@ -1138,11 +1149,11 @@ struct GameState { s_speak_f: Sound, font: Font, music2: Sound, - i_star: Option, - i_star_actual: Option, - i_fish: Image, - i_fish_body: Option, - i_fish_tail: Option, + i_star: Option, + i_star_actual: Option, + i_fish: String, + i_fish_body: Option, + i_fish_tail: Option, music_on: bool, music_timer: f64, menu: Menu, @@ -1289,7 +1300,11 @@ impl GameState { // spawn planet let mut expl_conv_system = ExplConvParticleSystem::new( rng.gen_range(1200.0, 1600.0), - Circle::new(self.mouse_pos.x,self.mouse_pos.y, rng.gen_range(15.0, 25.0)), + Circle::new( + self.mouse_pos.x, + self.mouse_pos.y, + rng.gen_range(15.0, 25.0), + ), Color::from_rgba( rng.gen_range(0x44, 0xFF), rng.gen_range(0x44, 0xFF), @@ -1307,7 +1322,11 @@ impl GameState { // spawn star let rot_clockwise = rng.gen_bool(0.5); self.stars.push(Star::new( - Circle::new(self.mouse_pos.x, self.mouse_pos.y, rng.gen_range(3.0, 7.0)), + Circle::new( + self.mouse_pos.x, + self.mouse_pos.y, + rng.gen_range(3.0, 7.0), + ), Color::from_rgba( rng.gen_range(0x58, 0xFF), rng.gen_range(0x58, 0xFF), @@ -1482,7 +1501,10 @@ impl GameState { self.player = save_data.player; self.joining_particles = save_data.joining_particles; self.expl_conv_p_systems.clear(); - self.move_to = Vector{ x: self.player.x, y: self.player.y}; + self.move_to = Vector { + x: self.player.x, + y: self.player.y, + }; self.camera.x = self.player.x - WIDTH_F / 2.0; self.camera.y = self.player.y - HEIGHT_F / 2.0; self.dbl_click_timeout = None; @@ -1534,8 +1556,10 @@ impl GameState { self.player.y += (self.move_to.y - self.player.y) / 20.0; self.player_particles.host_rect.x = self.player.x; self.player_particles.host_rect.y = self.player.y; - self.joining_particles.particle_system.host_rect.x += (self.player.x - self.joining_particles.particle_system.host_rect.x) / 30.0; - self.joining_particles.particle_system.host_rect.y += (self.player.y - self.joining_particles.particle_system.host_rect.y) / 30.0; + self.joining_particles.particle_system.host_rect.x += + (self.player.x - self.joining_particles.particle_system.host_rect.x) / 30.0; + self.joining_particles.particle_system.host_rect.y += + (self.player.y - self.joining_particles.particle_system.host_rect.y) / 30.0; self.camera.x += (self.player.x - WIDTH_F / 2.0 - self.camera.x) / 40.0; self.camera.y += (self.player.y - HEIGHT_F / 2.0 - self.camera.y) / 40.0; window.set_view(View::new(self.camera)); @@ -1850,7 +1874,7 @@ impl GameState { } fn draw(&mut self, window: &mut Window) -> Result<(), String> { - window.clear(Color::BLACK)?; + window.get_gi_mut().clear_window(Color::BLACK)?; let mut rect = Rectangle::default(); for mi in &mut self.menu.items { rect.x = mi.x; @@ -1866,15 +1890,16 @@ impl GameState { c, } => { if mi.is_hover { - window.draw(&rect, Col(*h_c)); + window.get_gi_mut().draw_rect(rect, *h_c)?; } else { - window.draw(&rect, Col(*c)); + window.get_gi_mut().draw_rect(rect, *c)?; } if let Some(i) = text_image { - let mut image_rect = i.area_rect(); + let image = window.get_image_mut(&i)?; + let mut image_rect = image.get_wh_rect(); image_rect.x = mi.x + (mi.w - image_rect.w) / 2.0; image_rect.y = mi.y + (mi.h - image_rect.h) / 2.0; - window.draw(&image_rect, Img(i)); + image.draw(image_rect.x, image_rect.y)?; } } MenuItemType::AppearingText { @@ -1886,10 +1911,8 @@ impl GameState { timer, } => { if let Some(i) = text_image { - let mut image_rect = i.area(); - image_rect.pos.x = mi.x; - image_rect.pos.y = mi.y; - window.draw(&image_rect, Img(i)); + let image = window.get_image_mut(&i)?; + image.draw(mi.x, mi.y)?; } } MenuItemType::InstantText { @@ -1899,28 +1922,21 @@ impl GameState { text_color, } => { if let Some(i) = text_image { - let mut image_rect = i.area(); - image_rect.pos.x = mi.x; - image_rect.pos.y = mi.y; - window.draw(&image_rect, Img(i)); + let image = window.get_image_mut(&i)?; + let mut image_rect = image.get_wh_rect(); + image.draw(mi.x, mi.y)?; } } MenuItemType::Pause { timer, length } => (), } } self.player_particles.draw(window, Transform::IDENTITY); - window.draw_ex( - &self.player, - Col(Color::from_rgba( - 0xFF, - 0xFF, - 0xFF, - (self.player_particles.opacity * 255.0) as u8, - )), + window.get_gi_mut().draw_rect_transform( + self.player, + Color::from_rgba(255, 255, 255, (self.player_particles.opacity * 255.0) as u8), Transform::translate(-self.player.x / 2.0, -self.player.y / 2.0) * Transform::rotate(self.player_r as f32), - 1, - ); + )?; self.joining_particles.draw(window, Transform::IDENTITY); for expl_conv_ps in &mut self.expl_conv_p_systems { expl_conv_ps.draw(window, Transform::IDENTITY); @@ -1943,30 +1959,32 @@ impl GameState { } } - if let Some(sl) = &mut self.save_load_notification { - match sl { - SaveLoadNotification::Save { text, timer } - | SaveLoadNotification::Load { text, timer } => { - if let Some(i) = text { - let mut c = Color::WHITE; - c.a = ((*timer / SL_NOTIF_TIME) as f32 * 255.0) as u8; - let mut image_rect = i.area_rect(); - image_rect.x = self.camera.x + 20.0; - image_rect.y = self.camera.y + 20.0; - window.draw(&image_rect, Blended(i, c)); - } - } - } - } + // TODO + //if let Some(sl) = &mut self.save_load_notification { + // match sl { + // SaveLoadNotification::Save { text, timer } + // | SaveLoadNotification::Load { text, timer } => { + // if let Some(i) = text { + // let mut c = Color::WHITE; + // c.a = ((*timer / SL_NOTIF_TIME) as f32 * 255.0) as u8; + // let mut image_rect = i.area_rect(); + // image_rect.x = self.camera.x + 20.0; + // image_rect.y = self.camera.y + 20.0; + // window.draw(&image_rect, Blended(i, c)); + // } + // } + // } + //} Ok(()) } } fn main() { - run::( - "One And All - a Ludum Dare 45 compo entry", - Vector::new(800, 600), - Settings::default(), - ); + // TODO + //run::( + // "One And All - a Ludum Dare 45 compo entry", + // Vector::new(800, 600), + // Settings::default(), + //); } From 71fc3de042c2c1f63ae85101a63a4ced90a5a260 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Wed, 15 Feb 2023 15:52:25 +0900 Subject: [PATCH 04/29] Work on porting from quicksilver --- src/agnostic_interface.rs | 32 +++- src/faux_quicksilver.rs | 6 +- src/main.rs | 388 +++++++++++++++++++++----------------- 3 files changed, 247 insertions(+), 179 deletions(-) diff --git a/src/agnostic_interface.rs b/src/agnostic_interface.rs index 2e6e13a..cc75b8d 100644 --- a/src/agnostic_interface.rs +++ b/src/agnostic_interface.rs @@ -3,7 +3,24 @@ use std::path::Path; use crate::faux_quicksilver::{Circle, Color, Rectangle, Transform, Vector}; pub trait ImageInterface { - fn draw(&mut self, x: f32, y: f32) -> Result<(), String>; + fn draw(&mut self, x: f32, y: f32, color: Color) -> Result<(), String>; + fn draw_sub(&mut self, sub_rect: Rectangle, x: f32, y: f32, color: Color) + -> Result<(), String>; + fn draw_transform( + &mut self, + x: f32, + y: f32, + color: Color, + transform: Transform, + ) -> Result<(), String>; + fn draw_sub_transform( + &mut self, + sub_rect: Rectangle, + x: f32, + y: f32, + color: Color, + transform: Transform, + ) -> Result<(), String>; fn get_w(&self) -> usize; fn get_h(&self) -> usize; fn get_wh_rect(&self) -> Rectangle; @@ -21,12 +38,21 @@ pub trait MusicInterface { fn play(&mut self, vol: f32) -> Result<(), String>; fn pause(&mut self) -> Result<(), String>; fn stop(&mut self) -> Result<(), String>; + fn set_loop(&mut self, loop_enable: bool) -> Result<(), String>; +} + +pub trait CameraInterface { + fn get_view(&self) -> Result; + fn get_view_xy(&self) -> Result<(f32, f32), String>; + fn set_view(&mut self, rect: Rectangle) -> Result<(), String>; + fn set_view_xy(&mut self, x: f32, y: f32) -> Result<(), String>; } pub trait GameInterface { fn get_dimensions(&self) -> Result<(f32, f32), String>; fn get_key_pressed(&mut self, key: char) -> Result; fn get_mouse_pressed(&mut self) -> Result, String>; + fn get_delta_time(&self) -> f32; fn clear_window(&mut self, color: Color) -> Result<(), String>; fn begin_drawing(&mut self) -> Result<(), String>; fn end_drawing(&mut self) -> Result<(), String>; @@ -64,4 +90,8 @@ pub trait GameInterface { fn load_font(&mut self, path: &Path) -> Result, String>; fn load_sound(&mut self, path: &Path) -> Result, String>; fn load_music(&mut self, path: &Path) -> Result, String>; + + fn get_camera(&mut self) -> Result, String>; + fn get_default_camera(&mut self) -> Result, String>; + fn set_camera(&mut self, camera: &Box) -> Result<(), String>; } diff --git a/src/faux_quicksilver.rs b/src/faux_quicksilver.rs index 06038fc..55e47a6 100644 --- a/src/faux_quicksilver.rs +++ b/src/faux_quicksilver.rs @@ -200,9 +200,9 @@ impl Transform { Self { mat: [ rot.cos(), - rot.sin(), - 0.0, -rot.sin(), + 0.0, + rot.sin(), rot.cos(), 0.0, 0.0, @@ -231,8 +231,6 @@ impl Transform { } } -pub struct View {} - pub struct Window { gi: Box, images: HashMap>, diff --git a/src/main.rs b/src/main.rs index a6e82c2..5894080 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,6 @@ +use std::{path::PathBuf, str::FromStr}; + +use agnostic_interface::CameraInterface; //use quicksilver::{ // geom::{Circle, Rectangle, Transform, Vector}, // graphics::{ @@ -15,21 +18,21 @@ use serde::{Deserialize, Serialize}; mod agnostic_interface; mod faux_quicksilver; -use faux_quicksilver::{Circle, Color, Event, Key, Rectangle, Transform, Vector, View, Window}; +use faux_quicksilver::{Circle, Color, Event, Key, Rectangle, Transform, Vector, Window}; const WIDTH_F: f32 = 800.0; const HEIGHT_F: f32 = 600.0; -const MUSIC2_LENGTH: f64 = 2.0 * 60.0 * 1000.0; -const TEXT_RATE: f64 = 100.0; -const PP_GEN_RATE: f64 = 75.0; +const MUSIC2_LENGTH: f32 = 2.0 * 60.0 * 1000.0; +const TEXT_RATE: f32 = 100.0; +const PP_GEN_RATE: f32 = 75.0; const PARTICLE_RAND_VEL_RANGE: f32 = 0.2; const PARTICLE_RAND_VEL_DIST: f32 = 0.2828427; // dist where x and y = 0.2 const PARTICLE_RAND_ROT_RANGE: f32 = 0.5; const JOINING_OPACITY_RATE: f32 = 0.00013; const JOINING_FAR_DIST: f32 = 700.0; const JOINING_NEAR_DIST: f32 = 150.0; -const DOUBLE_CLICK_TIME: f64 = 350.0; -const SL_NOTIF_TIME: f64 = 5000.0; +const DOUBLE_CLICK_TIME: f32 = 350.0; +const SL_NOTIF_TIME: f32 = 5000.0; const MAX_MOONS: usize = 5; fn interp_sq_inv(x: f32) -> f32 { @@ -65,7 +68,7 @@ enum MenuItemType { current_text: String, text_size: f32, text_c: Color, - timer: f64, + timer: f32, }, InstantText { text: &'static str, @@ -74,8 +77,8 @@ enum MenuItemType { text_color: Color, }, Pause { - timer: f64, - length: f64, + timer: f32, + length: f32, }, } @@ -221,7 +224,7 @@ impl Menu { } } - fn pause(length: f64, first: bool) -> MenuItem { + fn pause(length: f32, first: bool) -> MenuItem { MenuItem { x: 0.0, y: 0.0, @@ -558,16 +561,16 @@ struct Particle { vely: f32, velr: f32, r: f32, - lifetime: f64, - life_timer: f64, + lifetime: f32, + life_timer: f32, } #[derive(Serialize, Deserialize, Clone)] struct ParticleSystem { particles: Vec, - spawn_timer: f64, - spawn_time: f64, - lifetime: f64, + spawn_timer: f32, + spawn_time: f32, + lifetime: f32, host_rect: Rectangle, host_circle: Circle, is_rect: bool, @@ -579,8 +582,8 @@ struct ParticleSystem { impl ParticleSystem { fn new( - spawn_time: f64, - lifetime: f64, + spawn_time: f32, + lifetime: f32, host_rect: Rectangle, host_circle: Circle, is_rect: bool, @@ -604,7 +607,7 @@ impl ParticleSystem { } } - fn update(&mut self, dt: f64) { + fn update(&mut self, dt: f32) { for i in (0..self.particles.len()).rev() { self.particles[i].life_timer += dt; if self.particles[i].life_timer > self.particles[i].lifetime { @@ -710,8 +713,8 @@ struct RotatingParticleSystem { impl RotatingParticleSystem { fn new( - spawn_time: f64, - lifetime: f64, + spawn_time: f32, + lifetime: f32, host_rect: Rectangle, host_circle: Circle, is_rect: bool, @@ -741,7 +744,7 @@ impl RotatingParticleSystem { } } - fn update(&mut self, dt: f64) { + fn update(&mut self, dt: f32) { if self.particle_system.is_rect { let saved_rect = self.particle_system.host_rect; self.particle_system @@ -803,15 +806,15 @@ struct ExplConvCircleParticle { struct ExplConvParticleSystem { particles: Vec, - lifetime: f64, + lifetime: f32, host_circle: Circle, color: Color, opacity: f32, - life_timer: f64, + life_timer: f32, } impl ExplConvParticleSystem { - fn new(lifetime: f64, host_circle: Circle, color: Color, opacity: f32) -> Self { + fn new(lifetime: f32, host_circle: Circle, color: Color, opacity: f32) -> Self { ExplConvParticleSystem { particles: Vec::new(), lifetime, @@ -834,7 +837,7 @@ impl ExplConvParticleSystem { } // returns true if finished - fn update(&mut self, dt: f64, planets: &mut Vec) -> bool { + fn update(&mut self, dt: f32, planets: &mut Vec) -> bool { self.life_timer += dt; if self.life_timer >= self.lifetime { if !self.particles.is_empty() { @@ -873,7 +876,10 @@ impl ExplConvParticleSystem { self.color.a = (((self.life_timer / self.lifetime) as f32 / 2.0 + 0.5) * self.opacity * 255.0) as u8; - window.draw_ex(&particle.circle, Col(self.color), transform, 1); + window + .get_gi_mut() + .draw_circle_transform(particle.circle, self.color, transform) + .ok(); } } } @@ -933,7 +939,7 @@ impl Planet { planet } - fn update(&mut self, dt: f64) { + fn update(&mut self, dt: f32) { self.particle_system.host_circle.x = self.circle.x; self.particle_system.host_circle.y = self.circle.y; self.particle_system.update(dt); @@ -946,7 +952,10 @@ impl Planet { fn draw(&mut self, window: &mut Window, transform: Transform) { self.particle_system.draw(window, transform); - window.draw_ex(&self.circle, Col(self.color), transform, 1); + window + .get_gi_mut() + .draw_circle_transform(self.circle, self.color, transform) + .ok(); for moon in &mut self.moons { moon.draw(window, transform); } @@ -995,22 +1004,25 @@ impl Star { star } - fn update(&mut self, dt: f64) { + fn update(&mut self, dt: f32) { self.particle_system.update(dt); self.r += self.velr * dt as f32; } - fn draw(&mut self, image: &mut String, window: &mut Window, transform: Transform) { + fn draw(&mut self, image: &str, window: &mut Window, transform: Transform) { self.particle_system.draw(window, transform); - let mut image_rect = image.area_rect(); + let image = window.get_image(image).expect("Should be loaded image"); + let mut image_rect = image.get_wh_rect(); image_rect.x = self.particle_system.host_circle.x - image_rect.w / 2.0; image_rect.y = self.particle_system.host_circle.y - image_rect.h / 2.0; - window.draw_ex( - &image_rect, - Blended(image, self.color), - transform * Transform::rotate(self.r), - 1, - ); + image + .draw_transform( + image_rect.x, + image_rect.y, + self.color, + transform * Transform::rotate(self.r), + ) + .ok(); } } @@ -1018,12 +1030,14 @@ impl Star { struct Fish { pos: Vector, r: f32, - swim_time: f64, - swim_timer: f64, + swim_time: f32, + swim_timer: f32, swim_v: f32, - anim_timer: f64, - anim_time: f64, + anim_timer: f32, + anim_time: f32, color: Color, + body_rect: Rectangle, + tail_rect: Rectangle, } enum FishState { @@ -1043,6 +1057,18 @@ impl Fish { anim_timer, anim_time: anim_timer, color, + body_rect: Rectangle { + x: 0.0, + y: 0.0, + w: 32.0, + h: 16.0, + }, + tail_rect: Rectangle { + x: 32.0, + y: 0.0, + w: 16.0, + h: 16.0, + }, } } @@ -1066,7 +1092,7 @@ impl Fish { } } - fn update(&mut self, dt: f64) { + fn update(&mut self, dt: f32) { self.swim_time -= dt; if self.swim_time < 220.0 { self.swim_v /= 1.1; @@ -1087,41 +1113,40 @@ impl Fish { self.pos += Transform::rotate(self.r) * Vector::new(self.swim_v, 0.0) * dt as f32; } - fn draw( - &mut self, - fish_body: &String, - fish_tail: &String, - window: &mut Window, - transform: Transform, - ) { - let anim_angle = ((self.anim_timer / self.anim_time) * std::f64::consts::PI * 2.0).sin(); - let mut body_rect = fish_body.area_rect(); + fn draw(&mut self, i_fish: &str, window: &mut Window, transform: Transform) { + let fish_img = window + .get_image(i_fish) + .expect("\"fish\" Image should be loaded"); + let anim_angle = ((self.anim_timer / self.anim_time) * std::f32::consts::PI * 2.0).sin(); + let mut body_rect = self.body_rect; body_rect.x = self.pos.x - body_rect.w / 2.0; body_rect.y = self.pos.y - body_rect.h / 2.0; let body_tr = Transform::rotate(anim_angle as f32 * 30.0) * Transform::rotate(self.r + 180.0); - window.draw_ex( - &body_rect, - Blended(fish_body, self.color), + fish_img.draw_sub_transform( + self.body_rect, + body_rect.x, + body_rect.y, + self.color, transform * body_tr, - 1, ); - let mut tail_rect = fish_tail.area_rect(); + let mut tail_rect = self.tail_rect; tail_rect.x = self.pos.x - tail_rect.w / 2.0; tail_rect.y = self.pos.y - tail_rect.h / 2.0; - let anim_angle = ((self.anim_timer / self.anim_time) * std::f64::consts::PI * 2.0 - - std::f64::consts::PI / 3.0) + let anim_angle = ((self.anim_timer / self.anim_time) * std::f32::consts::PI * 2.0 + - std::f32::consts::PI / 3.0) .sin(); let tail_tr = body_tr * Transform::translate(body_rect.x / 1.5, 0.0) * Transform::translate(-tail_rect.x / 2.0, 0.0) * Transform::rotate(-anim_angle as f32 * 45.0) * Transform::translate(tail_rect.x / 2.0, 0.0); - window.draw_ex( - &tail_rect, - Blended(fish_tail, self.color), + fish_img.draw_sub_transform( + self.tail_rect, + tail_rect.x, + tail_rect.y, + self.color, transform * tail_tr, - 1, ); } } @@ -1136,26 +1161,22 @@ struct SaveData { } enum SaveLoadNotification { - Save { text: Option, timer: f64 }, - Load { text: Option, timer: f64 }, + Save { text: Option, timer: f32 }, + Load { text: Option, timer: f32 }, } struct GameState { - s_boom: Sound, - s_get: Sound, - s_power_up: Sound, - s_tap: Sound, - s_speak_m: Sound, - s_speak_f: Sound, - font: Font, - music2: Sound, - i_star: Option, - i_star_actual: Option, + s_boom: String, + s_get: String, + s_power_up: String, + s_tap: String, + s_speak_m: String, + s_speak_f: String, + font: String, + music2: String, + i_star: String, i_fish: String, - i_fish_body: Option, - i_fish_tail: Option, music_on: bool, - music_timer: f64, menu: Menu, state: u32, state_dirty: bool, @@ -1163,42 +1184,110 @@ struct GameState { current_item: Option, current_finished: bool, player: Rectangle, - player_r: f64, + player_r: f32, player_particles: ParticleSystem, joining_particles: RotatingParticleSystem, is_create_mode: bool, - click_release_time: f64, - dbl_click_timeout: Option, - click_time: Option, + click_release_time: f32, + dbl_click_timeout: Option, + click_time: Option, click_pos: Vector, mouse_pos: Vector, expl_conv_p_systems: Vec, planets: Vec, stars: Vec, fishes: Vec, - camera: Rectangle, + camera: Box, move_to: Vector, save_load_notification: Option, } impl GameState { - fn new() -> Result { + fn new(window: &mut Window) -> Result { + let s_boom = String::from("boom.mp3"); + window.load_sound( + &PathBuf::from_str("static/boom.mp3") + .map_err(|_| String::from("Failed to load \"static/boom.mp3\""))?, + s_boom.clone(), + )?; + let s_get = String::from("get.mp3"); + window.load_sound( + &PathBuf::from_str("static/get.mp3") + .map_err(|_| String::from("Failed to load \"static/get.mp3\""))?, + s_get.clone(), + )?; + let s_power_up = String::from("power_up.mp3"); + window.load_sound( + &PathBuf::from_str("static/power_up.mp3") + .map_err(|_| String::from("Failed to load \"static/power_up.mp3\""))?, + s_power_up.clone(), + )?; + let s_tap = String::from("tap.mp3"); + window.load_sound( + &PathBuf::from_str("static/tap.mp3") + .map_err(|_| String::from("Failed to load \"static/tap.mp3\""))?, + s_tap.clone(), + )?; + let s_speak_m = String::from("speak_m.mp3"); + window.load_sound( + &PathBuf::from_str("static/speak_m.mp3") + .map_err(|_| String::from("Failed to load \"static/speak_m.mp3\""))?, + s_speak_m.clone(), + )?; + let s_speak_f = String::from("speak_f.mp3"); + window.load_sound( + &PathBuf::from_str("static/speak_f.mp3") + .map_err(|_| String::from("Failed to load \"static/speak_f.mp3\""))?, + s_speak_f.clone(), + )?; + + let font = String::from("ClearSans-Regular.ttf"); + window.load_font( + &PathBuf::from_str("static/ClearSans-Regular.ttf") + .map_err(|_| String::from("Failed to load \"static/ClearSans-Regular.ttf\""))?, + font.clone(), + )?; + + let music2 = String::from("music2.mp3"); + window.load_music( + &PathBuf::from_str("static/music2.mp3") + .map_err(|_| String::from("Failed to load \"static/music2.mp3\""))?, + music2.clone(), + )?; + + let i_star = String::from("star.png"); + window.load_image( + &PathBuf::from_str("static/star.png") + .map_err(|_| String::from("Failed to load \"static/star.png\""))?, + i_star.clone(), + )?; + + let i_fish = String::from("fish.png"); + window.load_image( + &PathBuf::from_str("static/fish.png") + .map_err(|_| String::from("Failed to load \"static/fish.png\""))?, + i_fish.clone(), + )?; + + let camera = window.get_gi_mut().get_default_camera()?; + camera.set_view(Rectangle { + x: 0.0, + y: 0.0, + w: WIDTH_F, + h: HEIGHT_F, + }); Ok(Self { - s_boom: Sound::load("boom.mp3"), - s_get: Sound::load("get.mp3"), - s_power_up: Sound::load("power_up.mp3"), - s_tap: Sound::load("tap.mp3"), - s_speak_m: Sound::load("speak_m.mp3"), - s_speak_f: Sound::load("speak_f.mp3"), - font: Font::load("ClearSans-Regular.ttf"), - music2: Sound::load("music2.mp3"), - i_star: Some(Image::load("star.png")), - i_star_actual: None, - i_fish: Image::load("fish.png"), - i_fish_body: None, - i_fish_tail: None, + s_boom, + s_get, + s_power_up, + s_tap, + s_speak_m, + s_speak_f, + font, + music2, + i_star, + i_fish, music_on: false, - music_timer: 0.0, menu: Menu::start(), state: 0, state_dirty: false, @@ -1242,7 +1331,7 @@ impl GameState { planets: Vec::new(), stars: Vec::new(), fishes: Vec::new(), - camera: Rectangle::new(0.0, 0.0, WIDTH_F, HEIGHT_F), + camera, move_to: Vector::new(400.0, 300.0), save_load_notification: None, }) @@ -1505,8 +1594,10 @@ impl GameState { x: self.player.x, y: self.player.y, }; - self.camera.x = self.player.x - WIDTH_F / 2.0; - self.camera.y = self.player.y - HEIGHT_F / 2.0; + self.camera.set_view_xy( + self.player.x - WIDTH_F / 2.0, + self.player.y - HEIGHT_F / 2.0, + ); self.dbl_click_timeout = None; self.click_time = None; self.click_release_time = DOUBLE_CLICK_TIME; @@ -1535,7 +1626,7 @@ impl GameState { } fn update(&mut self, window: &mut Window) -> Result<(), String> { - let dt = window.update_rate(); + let dt = window.get_gi().get_delta_time(); self.click_release_time += dt; if let Some(t) = &mut self.click_time { @@ -1560,25 +1651,22 @@ impl GameState { (self.player.x - self.joining_particles.particle_system.host_rect.x) / 30.0; self.joining_particles.particle_system.host_rect.y += (self.player.y - self.joining_particles.particle_system.host_rect.y) / 30.0; - self.camera.x += (self.player.x - WIDTH_F / 2.0 - self.camera.x) / 40.0; - self.camera.y += (self.player.y - HEIGHT_F / 2.0 - self.camera.y) / 40.0; - window.set_view(View::new(self.camera)); + let (cx, cy) = self.camera.get_view_xy()?; + self.camera.set_view_xy( + (self.player.x - WIDTH_F / 2.0 - cx) / 40.0, + (self.player.y - HEIGHT_F / 2.0 - cy) / 40.0, + )?; + window.get_gi_mut().set_camera(&self.camera); self.player_r += dt / 10.0; if self.state_dirty { self.state_dirty = false; if self.state > 1 && !self.music_on { - let mut music_on = false; - self.music2.execute(|m2| { - music_on = true; - m2.set_volume(0.6); - m2.play() - })?; - if music_on { - self.music_on = true; - self.music_timer = 0.0; - } + let music = window.get_music(&self.music2)?; + music.set_loop(true)?; + music.play(0.5)?; + self.music_on = true; } match self.state { 1 => { @@ -1649,8 +1737,7 @@ impl GameState { self.player.x = WIDTH_F / 2.0; self.player.y = HEIGHT_F / 2.0; self.move_to = Vector::new(WIDTH_F / 2.0, HEIGHT_F / 2.0); - self.camera.x = 0.0; - self.camera.y = 0.0; + self.camera.set_view_xy(0.0, 0.0); self.click_time = None; } } @@ -1674,22 +1761,12 @@ impl GameState { } if self.music_on { - self.music_timer += dt; - if self.music_timer > MUSIC2_LENGTH { - self.music_timer = 0.0; - self.music2.execute(|m2| m2.play())?; - } } else if self.state == 10 { let mut music_on = false; - self.music2.execute(|m2| { - music_on = true; - m2.set_volume(0.6); - m2.play() - })?; - if music_on { - self.music_on = true; - self.music_timer = 0.0; - } + let music = window.get_music(&self.music2)?; + music.set_loop(true)?; + music.play(0.5)?; + self.music_on = true; } for i in 0..self.menu.items.len() { @@ -1835,37 +1912,6 @@ impl GameState { } } - if self.i_star_actual.is_none() { - if let Some(i_s) = &mut self.i_star { - let mut star: Option = None; - i_s.execute(|i| { - star = Some(i.clone()); - Ok(()) - })?; - self.i_star_actual = star; - } - if self.i_star_actual.is_some() { - self.i_star = None; - } - } - - if self.i_fish_body.is_none() { - let mut body: Option = None; - self.i_fish.execute(|i| { - body = Some(i.subimage(Rectangle::new(0.0, 0.0, 32.0, 16.0))); - Ok(()) - })?; - self.i_fish_body = body; - } - if self.i_fish_tail.is_none() { - let mut tail: Option = None; - self.i_fish.execute(|i| { - tail = Some(i.subimage(Rectangle::new(32.0, 0.0, 16.0, 16.0))); - Ok(()) - })?; - self.i_fish_tail = tail; - } - for fish in &mut self.fishes { fish.update(dt); } @@ -1899,7 +1945,7 @@ impl GameState { let mut image_rect = image.get_wh_rect(); image_rect.x = mi.x + (mi.w - image_rect.w) / 2.0; image_rect.y = mi.y + (mi.h - image_rect.h) / 2.0; - image.draw(image_rect.x, image_rect.y)?; + image.draw(image_rect.x, image_rect.y, Color::WHITE)?; } } MenuItemType::AppearingText { @@ -1912,7 +1958,7 @@ impl GameState { } => { if let Some(i) = text_image { let image = window.get_image_mut(&i)?; - image.draw(mi.x, mi.y)?; + image.draw(mi.x, mi.y, Color::WHITE)?; } } MenuItemType::InstantText { @@ -1924,7 +1970,7 @@ impl GameState { if let Some(i) = text_image { let image = window.get_image_mut(&i)?; let mut image_rect = image.get_wh_rect(); - image.draw(mi.x, mi.y)?; + image.draw(mi.x, mi.y, Color::WHITE)?; } } MenuItemType::Pause { timer, length } => (), @@ -1945,18 +1991,12 @@ impl GameState { planet.draw(window, Transform::IDENTITY); } - if let Some(i) = &mut self.i_star_actual { - for star in &mut self.stars { - star.draw(i, window, Transform::IDENTITY); - } + for star in &mut self.stars { + star.draw(&self.i_star, window, Transform::IDENTITY); } - if let Some(body) = &self.i_fish_body { - if let Some(tail) = &self.i_fish_tail { - for fish in &mut self.fishes { - fish.draw(body, tail, window, Transform::IDENTITY); - } - } + for fish in &mut self.fishes { + fish.draw(&self.i_fish, window, Transform::IDENTITY); } // TODO From f14841e27e1b8479a784de5e4b3c787b77a83924 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Thu, 16 Feb 2023 17:01:40 +0900 Subject: [PATCH 05/29] Use &trait/&mut trait instead of Box variants --- src/faux_quicksilver.rs | 48 ++++++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/src/faux_quicksilver.rs b/src/faux_quicksilver.rs index 55e47a6..38bb617 100644 --- a/src/faux_quicksilver.rs +++ b/src/faux_quicksilver.rs @@ -250,12 +250,12 @@ impl Window { } } - pub fn get_gi(&self) -> &Box { - &self.gi + pub fn get_gi(&self) -> &dyn GameInterface { + self.gi.as_ref() } - pub fn get_gi_mut(&mut self) -> &mut Box { - &mut self.gi + pub fn get_gi_mut(&mut self) -> &mut dyn GameInterface { + self.gi.as_mut() } pub fn load_image(&mut self, path: &Path, name: String) -> Result<(), String> { @@ -282,60 +282,68 @@ impl Window { Ok(()) } - pub fn get_image(&self, name: &str) -> Result<&Box, String> { + pub fn get_image(&self, name: &str) -> Result<&dyn ImageInterface, String> { Ok(self .images .get(name) - .ok_or_else(|| format!("Image \"{name}\" not found"))?) + .ok_or_else(|| format!("Image \"{name}\" not found"))? + .as_ref()) } - pub fn get_image_mut(&self, name: &str) -> Result<&mut Box, String> { + pub fn get_image_mut(&self, name: &str) -> Result<&mut dyn ImageInterface, String> { Ok(self .images .get_mut(name) - .ok_or_else(|| format!("Image \"{name}\" not found"))?) + .ok_or_else(|| format!("Image \"{name}\" not found"))? + .as_mut()) } - pub fn get_font(&self, name: &str) -> Result<&Box, String> { + pub fn get_font(&self, name: &str) -> Result<&dyn FontInterface, String> { Ok(self .fonts .get(name) - .ok_or_else(|| format!("Font \"{name}\" not found"))?) + .ok_or_else(|| format!("Font \"{name}\" not found"))? + .as_ref()) } - pub fn get_font_mut(&self, name: &str) -> Result<&mut Box, String> { + pub fn get_font_mut(&self, name: &str) -> Result<&mut dyn FontInterface, String> { Ok(self .fonts .get_mut(name) - .ok_or_else(|| format!("Font \"{name}\" not found"))?) + .ok_or_else(|| format!("Font \"{name}\" not found"))? + .as_mut()) } - pub fn get_sound(&self, name: &str) -> Result<&Box, String> { + pub fn get_sound(&self, name: &str) -> Result<&dyn SoundInterface, String> { Ok(self .sounds .get(name) - .ok_or_else(|| format!("Sound \"{name}\" not found"))?) + .ok_or_else(|| format!("Sound \"{name}\" not found"))? + .as_ref()) } - pub fn get_sound_mut(&self, name: &str) -> Result<&mut Box, String> { + pub fn get_sound_mut(&self, name: &str) -> Result<&mut dyn SoundInterface, String> { Ok(self .sounds .get_mut(name) - .ok_or_else(|| format!("Sound \"{name}\" not found"))?) + .ok_or_else(|| format!("Sound \"{name}\" not found"))? + .as_mut()) } - pub fn get_music(&self, name: &str) -> Result<&Box, String> { + pub fn get_music(&self, name: &str) -> Result<&dyn MusicInterface, String> { Ok(self .music .get(name) - .ok_or_else(|| format!("Music \"{name}\" not found"))?) + .ok_or_else(|| format!("Music \"{name}\" not found"))? + .as_ref()) } - pub fn get_music_mut(&self, name: &str) -> Result<&mut Box, String> { + pub fn get_music_mut(&self, name: &str) -> Result<&mut dyn MusicInterface, String> { Ok(self .music .get_mut(name) - .ok_or_else(|| format!("Music \"{name}\" not found"))?) + .ok_or_else(|| format!("Music \"{name}\" not found"))? + .as_mut()) } } From 751ce637e078255a72c3585dbb0c391ea98b28b5 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Thu, 16 Feb 2023 17:53:03 +0900 Subject: [PATCH 06/29] Work on porting from quicksilver Can compile at this point, but does not run. --- src/agnostic_interface.rs | 5 +- src/faux_quicksilver.rs | 46 ++- src/main.rs | 666 ++++++++++++++++++-------------------- 3 files changed, 332 insertions(+), 385 deletions(-) diff --git a/src/agnostic_interface.rs b/src/agnostic_interface.rs index cc75b8d..daec330 100644 --- a/src/agnostic_interface.rs +++ b/src/agnostic_interface.rs @@ -27,7 +27,7 @@ pub trait ImageInterface { } pub trait FontInterface { - fn draw(&mut self, s: &str, size: u32) -> Result<(), String>; + fn draw(&mut self, s: &str, size: u32, x: f32, y: f32, color: Color) -> Result<(), String>; } pub trait SoundInterface { @@ -52,6 +52,9 @@ pub trait GameInterface { fn get_dimensions(&self) -> Result<(f32, f32), String>; fn get_key_pressed(&mut self, key: char) -> Result; fn get_mouse_pressed(&mut self) -> Result, String>; + fn get_mouse_down(&mut self) -> Result, String>; + fn get_mouse_xy(&self) -> Result<(f32, f32), String>; + fn get_mouse_xy_vec(&self) -> Result; fn get_delta_time(&self) -> f32; fn clear_window(&mut self, color: Color) -> Result<(), String>; fn begin_drawing(&mut self) -> Result<(), String>; diff --git a/src/faux_quicksilver.rs b/src/faux_quicksilver.rs index 38bb617..a78519a 100644 --- a/src/faux_quicksilver.rs +++ b/src/faux_quicksilver.rs @@ -143,19 +143,19 @@ impl Vector { } } -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +#[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct Transform { pub mat: [f32; 9], - translate: Vector, - rotate: f32, + //translate: Vector, + //rotate: f32, } impl Default for Transform { fn default() -> Self { Self { mat: [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0], - translate: Vector { x: 0.0, y: 0.0 }, - rotate: 0.0, + //translate: Vector { x: 0.0, y: 0.0 }, + //rotate: 0.0, } } } @@ -187,14 +187,16 @@ impl Mul for Transform { self.mat[6] * rhs.mat[1] + self.mat[7] * rhs.mat[4] + self.mat[8] * rhs.mat[7], self.mat[6] * rhs.mat[2] + self.mat[7] * rhs.mat[5] + self.mat[8] * rhs.mat[8], ], - translate: self.translate + rhs.translate, - rotate: self.rotate + rhs.rotate, + //translate: self.translate + rhs.translate, + //rotate: self.rotate + rhs.rotate, } } } impl Transform { - pub const IDENTITY: Self = Self::default(); + pub const IDENTITY: Self = Self { + mat: [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0], + }; pub fn rotate(rot: f32) -> Self { Self { @@ -209,7 +211,7 @@ impl Transform { 0.0, 1.0, ], - rotate: rot, + //rotate: rot, ..Default::default() } } @@ -217,18 +219,18 @@ impl Transform { pub fn translate(x: f32, y: f32) -> Self { Self { mat: [1.0, 0.0, x, 0.0, 1.0, y, 0.0, 0.0, 1.0], - translate: Vector { x, y }, + //translate: Vector { x, y }, ..Default::default() } } - pub fn get_translate(&self) -> Vector { - self.translate - } + //pub fn get_translate(&self) -> Vector { + // self.translate + //} - pub fn get_rotation(&self) -> f32 { - self.rotate - } + //pub fn get_rotation(&self) -> f32 { + // self.rotate + //} } pub struct Window { @@ -290,7 +292,7 @@ impl Window { .as_ref()) } - pub fn get_image_mut(&self, name: &str) -> Result<&mut dyn ImageInterface, String> { + pub fn get_image_mut(&mut self, name: &str) -> Result<&mut dyn ImageInterface, String> { Ok(self .images .get_mut(name) @@ -306,7 +308,7 @@ impl Window { .as_ref()) } - pub fn get_font_mut(&self, name: &str) -> Result<&mut dyn FontInterface, String> { + pub fn get_font_mut(&mut self, name: &str) -> Result<&mut dyn FontInterface, String> { Ok(self .fonts .get_mut(name) @@ -322,7 +324,7 @@ impl Window { .as_ref()) } - pub fn get_sound_mut(&self, name: &str) -> Result<&mut dyn SoundInterface, String> { + pub fn get_sound_mut(&mut self, name: &str) -> Result<&mut dyn SoundInterface, String> { Ok(self .sounds .get_mut(name) @@ -338,7 +340,7 @@ impl Window { .as_ref()) } - pub fn get_music_mut(&self, name: &str) -> Result<&mut dyn MusicInterface, String> { + pub fn get_music_mut(&mut self, name: &str) -> Result<&mut dyn MusicInterface, String> { Ok(self .music .get_mut(name) @@ -346,7 +348,3 @@ impl Window { .as_mut()) } } - -pub struct Key {} - -pub struct Event {} diff --git a/src/main.rs b/src/main.rs index 5894080..acf9a43 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,7 +18,7 @@ use serde::{Deserialize, Serialize}; mod agnostic_interface; mod faux_quicksilver; -use faux_quicksilver::{Circle, Color, Event, Key, Rectangle, Transform, Vector, Window}; +use faux_quicksilver::{Circle, Color, Rectangle, Transform, Vector, Window}; const WIDTH_F: f32 = 800.0; const HEIGHT_F: f32 = 600.0; @@ -57,14 +57,12 @@ fn interp_sq(x: f32) -> f32 { enum MenuItemType { Button { text: &'static str, - text_image: Option, text_c: Color, h_c: Color, c: Color, }, AppearingText { text: &'static str, - text_image: Option, current_text: String, text_size: f32, text_c: Color, @@ -72,7 +70,6 @@ enum MenuItemType { }, InstantText { text: &'static str, - text_image: Option, text_size: f32, text_color: Color, }, @@ -122,7 +119,6 @@ impl Menu { h, item_type: MenuItemType::Button { text: s, - text_image: None, text_c: t_color, h_c: boxh_color, c: box_color, @@ -141,7 +137,6 @@ impl Menu { h: 150.0, item_type: MenuItemType::Button { text: "Start the Game", - text_image: None, text_c: Color::WHITE, h_c: Color::from_rgba(0x66, 0xFF, 0xFF, 255), c: Color::from_rgba(0x33, 0xDD, 0xDD, 255), @@ -194,7 +189,6 @@ impl Menu { h: 0.0, item_type: MenuItemType::InstantText { text: s, - text_image: None, text_size, text_color: Color::WHITE, }, @@ -212,7 +206,6 @@ impl Menu { h: 0.0, item_type: MenuItemType::AppearingText { text: s, - text_image: None, text_size, current_text: String::new(), text_c: Color::WHITE, @@ -1011,7 +1004,7 @@ impl Star { fn draw(&mut self, image: &str, window: &mut Window, transform: Transform) { self.particle_system.draw(window, transform); - let image = window.get_image(image).expect("Should be loaded image"); + let image = window.get_image_mut(image).expect("Should be loaded image"); let mut image_rect = image.get_wh_rect(); image_rect.x = self.particle_system.host_circle.x - image_rect.w / 2.0; image_rect.y = self.particle_system.host_circle.y - image_rect.h / 2.0; @@ -1115,7 +1108,7 @@ impl Fish { fn draw(&mut self, i_fish: &str, window: &mut Window, transform: Transform) { let fish_img = window - .get_image(i_fish) + .get_image_mut(i_fish) .expect("\"fish\" Image should be loaded"); let anim_angle = ((self.anim_timer / self.anim_time) * std::f32::consts::PI * 2.0).sin(); let mut body_rect = self.body_rect; @@ -1269,7 +1262,7 @@ impl GameState { i_fish.clone(), )?; - let camera = window.get_gi_mut().get_default_camera()?; + let mut camera = window.get_gi_mut().get_default_camera()?; camera.set_view(Rectangle { x: 0.0, y: 0.0, @@ -1337,296 +1330,253 @@ impl GameState { }) } - fn event(&mut self, event: &Event, window: &mut Window) -> Result<(), String> { - match event { - Event::MouseMoved(v) => { - self.mouse_pos = *v; - let mut hovered = false; - for i in 0..self.menu.items.len() { - if self.menu.items[i].is_inside(v.x, v.y) { - self.menu.items[i].is_hover = true; - self.current_item = Some(i); - hovered = true; - } else { - self.menu.items[i].is_hover = false; - } - } - if !hovered { - self.current_item = None; - } - } - Event::MouseButton(button, state) => { - if let ButtonState::Released = state { - if self.dbl_click_timeout.is_none() { - self.click_release_time = 0.0; - } - } else if let ButtonState::Pressed = state { - if self.current_finished { - if self.is_create_mode { - if self.click_release_time < DOUBLE_CLICK_TIME { - self.click_release_time = DOUBLE_CLICK_TIME; - self.dbl_click_timeout = Some(0.0); - self.click_time = None; - if self.state == 8 { - let mut expl_conv_system = ExplConvParticleSystem::new( - 1500.0, - Circle::new(self.mouse_pos.x, self.mouse_pos.y, 20.0), - Color::from_rgba(0x99, 0xFF, 0x99, 255), - 1.0, - ); - expl_conv_system.activate(30, 200.0); - self.expl_conv_p_systems.push(expl_conv_system); - self.state = 9; - self.state_dirty = true; - self.s_boom.execute(|s| { - s.set_volume(0.8); - s.play() - })?; - } else if self.state == 10 { - let mut rng = rand::thread_rng(); - let rand_out = rng.gen_range(0.0, 1.0); - if rand_out < 0.6 { - // spawn planet - let mut expl_conv_system = ExplConvParticleSystem::new( - rng.gen_range(1200.0, 1600.0), - Circle::new( - self.mouse_pos.x, - self.mouse_pos.y, - rng.gen_range(15.0, 25.0), - ), - Color::from_rgba( - rng.gen_range(0x44, 0xFF), - rng.gen_range(0x44, 0xFF), - rng.gen_range(0x44, 0xFF), - 255, - ), - 1.0, - ); - expl_conv_system.activate( - rng.gen_range(13, 40), - rng.gen_range(150.0, 300.0), - ); - self.expl_conv_p_systems.push(expl_conv_system); - } else if rand_out < 0.85 { - // spawn star - let rot_clockwise = rng.gen_bool(0.5); - self.stars.push(Star::new( - Circle::new( - self.mouse_pos.x, - self.mouse_pos.y, - rng.gen_range(3.0, 7.0), - ), - Color::from_rgba( - rng.gen_range(0x58, 0xFF), - rng.gen_range(0x58, 0xFF), - rng.gen_range(0x58, 0xFF), - 255, - ), - if rot_clockwise { - rng.gen_range(0.1, 0.3) - } else { - rng.gen_range(-0.3, -0.1) - }, - rng.gen_range(0.0, 90.0), - )); - } else { - // spawn fish - for i in 0..rng.gen_range(1, 4) { - self.fishes.push(Fish::new( - self.mouse_pos, - rng.gen_range(0.0, 360.0), - Color::from_rgba( - rng.gen_range(0x44, 0xFF), - rng.gen_range(0x44, 0xFF), - rng.gen_range(0x44, 0xFF), - 255, - ), - )); - } - } - self.s_boom.execute(|s| { - s.set_volume(0.8); - s.play() - })?; - } - } else if self.state == 10 { - self.click_time = Some(0.0); - self.click_pos = self.mouse_pos; - } - } else if self.selection_mode { - if let Some(idx) = self.current_item { - match self.state { - 0 => { - self.state += 1; - self.state_dirty = true; - } - 2 => { - if idx == 5 { - // hope - self.state = 3; - self.state_dirty = true; - self.joining_particles.particle_system.color = - Color::from_rgba(0xAA, 0xCC, 0xFF, 255); - } else if idx == 6 { - // miracles - self.state = 4; - self.state_dirty = true; - self.joining_particles.particle_system.color = - Color::from_rgba(0xFF, 0xFF, 0xAA, 255); - } else if idx == 7 { - // kindness - self.state = 5; - self.state_dirty = true; - self.joining_particles.particle_system.color = - Color::from_rgba(0xBB, 0xFF, 0xBB, 255); - } else { - // determination - self.state = 6; - self.state_dirty = true; - self.joining_particles.particle_system.color = - Color::from_rgba(0xFF, 0xAA, 0xAA, 255); - } - self.s_get.execute(|s| { - s.set_volume(0.7); - s.play() - })?; - } - _ => { - self.state = 0; - self.state_dirty = true; - } - } - } - } else { - match self.state { - 0 | 1 => self.state += 1, - 3 | 4 | 5 | 6 => self.state = 7, - 7 => self.state = 8, - 9 => self.state = 10, - _ => self.state = 0, - } - self.state_dirty = true; - } - } else { - for mi in &mut self.menu.items { - match &mut mi.item_type { - MenuItemType::AppearingText { - text, - text_image, - current_text, - text_size, - text_c, - timer, - } => { - self.font.execute(|f| { - *current_text = text.to_string(); - let style = FontStyle::new(*text_size, *text_c); - *text_image = Some(f.render(text, &style)?); - Ok(()) - })?; - } - MenuItemType::Button { - text, - text_image, - text_c, - h_c, - c, - } => { - if text_image.is_none() { - self.font.execute(|font| { - let style = FontStyle::new(42.0, *text_c); - *text_image = Some(font.render(text, &style)?); - Ok(()) - })?; - } - } - MenuItemType::Pause { timer, length } => (), - MenuItemType::InstantText { - text, - text_image, - text_size, - text_color, - } => { - if text_image.is_none() { - self.font.execute(|f| { - let style = FontStyle::new(*text_size, *text_color); - *text_image = Some(f.render(text, &style)?); - Ok(()) - })?; - } - } - } - mi.is_loaded = true; - } - self.current_finished = true; - } - } - } - Event::Key(key, state) => { - if let ButtonState::Pressed = state { - match key { - Key::S => { - if self.state == 10 { - let save_data = SaveData { - planets: self.planets.clone(), - stars: self.stars.clone(), - fishes: self.fishes.clone(), - player: self.player.clone(), - joining_particles: self.joining_particles.clone(), - }; - save("OneAndAll_LD45", "slot0", &save_data)?; - self.save_load_notification = Some(SaveLoadNotification::Save { - text: None, - timer: SL_NOTIF_TIME, - }); - } - } - Key::L => { - let load_result = load::("OneAndAll_LD45", "slot0"); - if let Ok(save_data) = load_result { - self.planets = save_data.planets; - self.stars = save_data.stars; - self.fishes = save_data.fishes; - self.player = save_data.player; - self.joining_particles = save_data.joining_particles; - self.expl_conv_p_systems.clear(); - self.move_to = Vector { - x: self.player.x, - y: self.player.y, - }; - self.camera.set_view_xy( - self.player.x - WIDTH_F / 2.0, - self.player.y - HEIGHT_F / 2.0, - ); - self.dbl_click_timeout = None; - self.click_time = None; - self.click_release_time = DOUBLE_CLICK_TIME; + fn update(&mut self, window: &mut Window) -> Result<(), String> { + let dt = window.get_gi().get_delta_time(); - self.state = 10; - self.state_dirty = true; - self.save_load_notification = Some(SaveLoadNotification::Load { - text: None, - timer: SL_NOTIF_TIME, - }); + // check mouse pos + { + self.mouse_pos = window.get_gi().get_mouse_xy_vec()?; + let mut hovered = false; + for i in 0..self.menu.items.len() { + if self.menu.items[i].is_inside(self.mouse_pos.x, self.mouse_pos.y) { + self.menu.items[i].is_hover = true; + self.current_item = Some(i); + hovered = true; + } else { + self.menu.items[i].is_hover = false; + } + } + if !hovered { + self.current_item = None; + } + } + + // check mouse down + if window.get_gi_mut().get_mouse_down()?.is_none() { + if self.dbl_click_timeout.is_none() { + self.click_release_time = 0.0; + } + } else { + if self.current_finished { + if self.is_create_mode { + if self.click_release_time < DOUBLE_CLICK_TIME { + self.click_release_time = DOUBLE_CLICK_TIME; + self.dbl_click_timeout = Some(0.0); + self.click_time = None; + if self.state == 8 { + let mut expl_conv_system = ExplConvParticleSystem::new( + 1500.0, + Circle::new(self.mouse_pos.x, self.mouse_pos.y, 20.0), + Color::from_rgba(0x99, 0xFF, 0x99, 255), + 1.0, + ); + expl_conv_system.activate(30, 200.0); + self.expl_conv_p_systems.push(expl_conv_system); + self.state = 9; + self.state_dirty = true; + window.get_sound_mut(&self.s_boom)?.play(0.8)?; + } else if self.state == 10 { + let mut rng = rand::thread_rng(); + let rand_out = rng.gen_range(0.0, 1.0); + if rand_out < 0.6 { + // spawn planet + let mut expl_conv_system = ExplConvParticleSystem::new( + rng.gen_range(1200.0, 1600.0), + Circle::new( + self.mouse_pos.x, + self.mouse_pos.y, + rng.gen_range(15.0, 25.0), + ), + Color::from_rgba( + rng.gen_range(0x44, 0xFF), + rng.gen_range(0x44, 0xFF), + rng.gen_range(0x44, 0xFF), + 255, + ), + 1.0, + ); + expl_conv_system + .activate(rng.gen_range(13, 40), rng.gen_range(150.0, 300.0)); + self.expl_conv_p_systems.push(expl_conv_system); + } else if rand_out < 0.85 { + // spawn star + let rot_clockwise = rng.gen_bool(0.5); + self.stars.push(Star::new( + Circle::new( + self.mouse_pos.x, + self.mouse_pos.y, + rng.gen_range(3.0, 7.0), + ), + Color::from_rgba( + rng.gen_range(0x58, 0xFF), + rng.gen_range(0x58, 0xFF), + rng.gen_range(0x58, 0xFF), + 255, + ), + if rot_clockwise { + rng.gen_range(0.1, 0.3) + } else { + rng.gen_range(-0.3, -0.1) + }, + rng.gen_range(0.0, 90.0), + )); + } else { + // spawn fish + for i in 0..rng.gen_range(1, 4) { + self.fishes.push(Fish::new( + self.mouse_pos, + rng.gen_range(0.0, 360.0), + Color::from_rgba( + rng.gen_range(0x44, 0xFF), + rng.gen_range(0x44, 0xFF), + rng.gen_range(0x44, 0xFF), + 255, + ), + )); + } } + window.get_sound_mut(&self.s_boom)?.play(0.8)?; } - Key::R => { - if self.state == 10 { + } else if self.state == 10 { + self.click_time = Some(0.0); + self.click_pos = self.mouse_pos; + } + } else if self.selection_mode { + if let Some(idx) = self.current_item { + match self.state { + 0 => { + self.state += 1; + self.state_dirty = true; + } + 2 => { + if idx == 5 { + // hope + self.state = 3; + self.state_dirty = true; + self.joining_particles.particle_system.color = + Color::from_rgba(0xAA, 0xCC, 0xFF, 255); + } else if idx == 6 { + // miracles + self.state = 4; + self.state_dirty = true; + self.joining_particles.particle_system.color = + Color::from_rgba(0xFF, 0xFF, 0xAA, 255); + } else if idx == 7 { + // kindness + self.state = 5; + self.state_dirty = true; + self.joining_particles.particle_system.color = + Color::from_rgba(0xBB, 0xFF, 0xBB, 255); + } else { + // determination + self.state = 6; + self.state_dirty = true; + self.joining_particles.particle_system.color = + Color::from_rgba(0xFF, 0xAA, 0xAA, 255); + } + window.get_sound_mut(&self.s_get)?.play(0.7)?; + } + _ => { self.state = 0; self.state_dirty = true; } } - _ => (), } + } else { + match self.state { + 0 | 1 => self.state += 1, + 3 | 4 | 5 | 6 => self.state = 7, + 7 => self.state = 8, + 9 => self.state = 10, + _ => self.state = 0, + } + self.state_dirty = true; } + } else { + for mi in &mut self.menu.items { + match &mut mi.item_type { + MenuItemType::AppearingText { + text, + current_text, + text_size, + text_c, + timer, + } => { + *current_text = text.to_string(); + } + MenuItemType::Button { + text, + text_c, + h_c, + c, + } => { + //let style = FontStyle::new(42.0, *text_c); + } + MenuItemType::Pause { timer, length } => (), + MenuItemType::InstantText { + text, + text_size, + text_color, + } => {} + } + mi.is_loaded = true; + } + self.current_finished = true; } - _ => (), } - Ok(()) - } - fn update(&mut self, window: &mut Window) -> Result<(), String> { - let dt = window.get_gi().get_delta_time(); + // check pressed keys + if window.get_gi_mut().get_key_pressed('s')? { + if self.state == 10 { + let save_data = SaveData { + planets: self.planets.clone(), + stars: self.stars.clone(), + fishes: self.fishes.clone(), + player: self.player.clone(), + joining_particles: self.joining_particles.clone(), + }; + // TODO + //save("OneAndAll_LD45", "slot0", &save_data)?; + self.save_load_notification = Some(SaveLoadNotification::Save { + text: None, + timer: SL_NOTIF_TIME, + }); + } + } else if window.get_gi_mut().get_key_pressed('l')? { + // TODO + //let load_result = load::("OneAndAll_LD45", "slot0"); + //if let Ok(save_data) = load_result { + // self.planets = save_data.planets; + // self.stars = save_data.stars; + // self.fishes = save_data.fishes; + // self.player = save_data.player; + // self.joining_particles = save_data.joining_particles; + // self.expl_conv_p_systems.clear(); + // self.move_to = Vector { + // x: self.player.x, + // y: self.player.y, + // }; + // self.camera.set_view_xy( + // self.player.x - WIDTH_F / 2.0, + // self.player.y - HEIGHT_F / 2.0, + // ); + // self.dbl_click_timeout = None; + // self.click_time = None; + // self.click_release_time = DOUBLE_CLICK_TIME; + + // self.state = 10; + // self.state_dirty = true; + // self.save_load_notification = Some(SaveLoadNotification::Load { + // text: None, + // timer: SL_NOTIF_TIME, + // }); + //} + } else if window.get_gi_mut().get_key_pressed('r')? { + if self.state == 10 { + self.state = 0; + self.state_dirty = true; + } + } self.click_release_time += dt; if let Some(t) = &mut self.click_time { @@ -1663,7 +1613,7 @@ impl GameState { if self.state_dirty { self.state_dirty = false; if self.state > 1 && !self.music_on { - let music = window.get_music(&self.music2)?; + let music = window.get_music_mut(&self.music2)?; music.set_loop(true)?; music.play(0.5)?; self.music_on = true; @@ -1763,7 +1713,7 @@ impl GameState { if self.music_on { } else if self.state == 10 { let mut music_on = false; - let music = window.get_music(&self.music2)?; + let music = window.get_music_mut(&self.music2)?; music.set_loop(true)?; music.play(0.5)?; self.music_on = true; @@ -1775,28 +1725,26 @@ impl GameState { match &mut mi.item_type { MenuItemType::Button { text, - text_image, text_c, h_c, c, } => { - self.font.execute(|font| { - let style = FontStyle::new(42.0, *text_c); - *text_image = Some(font.render(text, &style)?); - Ok(()) - })?; - if text_image.is_some() { - mi.is_loaded = true; - if i + 1 < self.menu.items.len() { - self.menu.items[i + 1].is_loaded = false; - } else { - self.current_finished = true; - } + //self.font.execute(|font| { + // let style = FontStyle::new(42.0, *text_c); + // *text_image = Some(font.render(text, &style)?); + // Ok(()) + //})?; + //if text_image.is_some() { + mi.is_loaded = true; + if i + 1 < self.menu.items.len() { + self.menu.items[i + 1].is_loaded = false; + } else { + self.current_finished = true; } + //} } MenuItemType::AppearingText { text, - text_image, current_text, text_size, text_c, @@ -1808,10 +1756,7 @@ impl GameState { let next = text.chars().nth(current_text.len()); if let Some(next_t) = next { current_text.push(next_t); - self.s_tap.execute(|s| { - s.set_volume(0.2); - s.play() - })?; + window.get_sound_mut(&self.s_tap)?.play(0.2)?; } else { mi.is_loaded = true; if i + 1 < self.menu.items.len() { @@ -1821,11 +1766,11 @@ impl GameState { } continue; } - self.font.execute(|font| { - let style = FontStyle::new(*text_size, *text_c); - *text_image = Some(font.render(current_text, &style)?); - Ok(()) - })?; + //self.font.execute(|font| { + // let style = FontStyle::new(*text_size, *text_c); + // *text_image = Some(font.render(current_text, &style)?); + // Ok(()) + //})?; } } MenuItemType::Pause { timer, length } => { @@ -1841,25 +1786,24 @@ impl GameState { } MenuItemType::InstantText { text, - text_image, text_size, text_color, } => { - if text_image.is_none() { - self.font.execute(|f| { - let style = FontStyle::new(*text_size, *text_color); - *text_image = Some(f.render(text, &style)?); - Ok(()) - })?; - } - if text_image.is_some() { - mi.is_loaded = true; - if i + 1 < self.menu.items.len() { - self.menu.items[i + 1].is_loaded = false; - } else { - self.current_finished = true; - } + //if text_image.is_none() { + // self.font.execute(|f| { + // let style = FontStyle::new(*text_size, *text_color); + // *text_image = Some(f.render(text, &style)?); + // Ok(()) + // })?; + //} + //if text_image.is_some() { + mi.is_loaded = true; + if i + 1 < self.menu.items.len() { + self.menu.items[i + 1].is_loaded = false; + } else { + self.current_finished = true; } + //} } } } @@ -1888,12 +1832,12 @@ impl GameState { if *timer <= 0.0 { self.save_load_notification = None; } else if text.is_none() { - self.font.execute(|f| { - *text = Some( - f.render("Saved the Game", &FontStyle::new(45.0, Color::WHITE))?, - ); - Ok(()) - })?; + //self.font.execute(|f| { + // *text = Some( + // f.render("Saved the Game", &FontStyle::new(45.0, Color::WHITE))?, + // ); + // Ok(()) + //})?; } } SaveLoadNotification::Load { text, timer } => { @@ -1901,12 +1845,12 @@ impl GameState { if *timer <= 0.0 { self.save_load_notification = None; } else if text.is_none() { - self.font.execute(|f| { - *text = Some( - f.render("Loaded the Game", &FontStyle::new(45.0, Color::WHITE))?, - ); - Ok(()) - })?; + //self.font.execute(|f| { + // *text = Some( + // f.render("Loaded the Game", &FontStyle::new(45.0, Color::WHITE))?, + // ); + // Ok(()) + //})?; } } } @@ -1930,7 +1874,6 @@ impl GameState { match &mut mi.item_type { MenuItemType::Button { text, - text_image, text_c, h_c, c, @@ -1940,38 +1883,41 @@ impl GameState { } else { window.get_gi_mut().draw_rect(rect, *c)?; } - if let Some(i) = text_image { - let image = window.get_image_mut(&i)?; - let mut image_rect = image.get_wh_rect(); - image_rect.x = mi.x + (mi.w - image_rect.w) / 2.0; - image_rect.y = mi.y + (mi.h - image_rect.h) / 2.0; - image.draw(image_rect.x, image_rect.y, Color::WHITE)?; - } + window.get_font_mut(&self.font)?.draw( + text, + rect.h.round() as u32, + rect.x, + rect.y, + *text_c, + )?; } MenuItemType::AppearingText { text, - text_image, current_text, text_size, text_c, timer, } => { - if let Some(i) = text_image { - let image = window.get_image_mut(&i)?; - image.draw(mi.x, mi.y, Color::WHITE)?; - } + window.get_font_mut(&self.font)?.draw( + text, + text_size.round() as u32, + rect.x, + rect.y, + *text_c, + )?; } MenuItemType::InstantText { text, - text_image, text_size, text_color, } => { - if let Some(i) = text_image { - let image = window.get_image_mut(&i)?; - let mut image_rect = image.get_wh_rect(); - image.draw(mi.x, mi.y, Color::WHITE)?; - } + window.get_font_mut(&self.font)?.draw( + text, + text_size.round() as u32, + rect.x, + rect.y, + *text_color, + )?; } MenuItemType::Pause { timer, length } => (), } From f0e3dd5de0a0c9f8687fa708179e62a0fce1d786 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Thu, 16 Feb 2023 17:55:57 +0900 Subject: [PATCH 07/29] Minor fix --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index acf9a43..c8a4aa3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1899,7 +1899,7 @@ impl GameState { timer, } => { window.get_font_mut(&self.font)?.draw( - text, + current_text, text_size.round() as u32, rect.x, rect.y, From 47768972c9f5a32004bcdfa6af8a5a4fd790e2ac Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Thu, 16 Feb 2023 18:01:18 +0900 Subject: [PATCH 08/29] Refactor "AppearingText" updating/drawing --- src/main.rs | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/main.rs b/src/main.rs index c8a4aa3..7538549 100644 --- a/src/main.rs +++ b/src/main.rs @@ -63,7 +63,7 @@ enum MenuItemType { }, AppearingText { text: &'static str, - current_text: String, + text_idx: usize, text_size: f32, text_c: Color, timer: f32, @@ -207,9 +207,9 @@ impl Menu { item_type: MenuItemType::AppearingText { text: s, text_size, - current_text: String::new(), text_c: Color::WHITE, timer: 0.0, + text_idx: 0, }, is_hover: false, is_focus: false, @@ -1497,12 +1497,12 @@ impl GameState { match &mut mi.item_type { MenuItemType::AppearingText { text, - current_text, + text_idx, text_size, text_c, timer, } => { - *current_text = text.to_string(); + *text_idx = text.len(); } MenuItemType::Button { text, @@ -1745,7 +1745,7 @@ impl GameState { } MenuItemType::AppearingText { text, - current_text, + text_idx, text_size, text_c, timer, @@ -1753,11 +1753,8 @@ impl GameState { *timer += dt; if *timer > TEXT_RATE { *timer -= TEXT_RATE; - let next = text.chars().nth(current_text.len()); - if let Some(next_t) = next { - current_text.push(next_t); - window.get_sound_mut(&self.s_tap)?.play(0.2)?; - } else { + *text_idx += 1; + if *text_idx >= text.len() { mi.is_loaded = true; if i + 1 < self.menu.items.len() { self.menu.items[i + 1].is_loaded = false; @@ -1893,13 +1890,17 @@ impl GameState { } MenuItemType::AppearingText { text, - current_text, + text_idx, text_size, text_c, timer, } => { window.get_font_mut(&self.font)?.draw( - current_text, + if *text_idx < text.len() { + &text[0..*text_idx] + } else { + text + }, text_size.round() as u32, rect.x, rect.y, From 12419ffce66c406b01c0baa162a05fd78801bff2 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Thu, 16 Feb 2023 18:05:04 +0900 Subject: [PATCH 09/29] Try using font size 20 for "size-less" text draws --- src/main.rs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/main.rs b/src/main.rs index 7538549..28f708b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1880,13 +1880,9 @@ impl GameState { } else { window.get_gi_mut().draw_rect(rect, *c)?; } - window.get_font_mut(&self.font)?.draw( - text, - rect.h.round() as u32, - rect.x, - rect.y, - *text_c, - )?; + window + .get_font_mut(&self.font)? + .draw(text, 20, rect.x, rect.y, *text_c)?; } MenuItemType::AppearingText { text, @@ -1901,7 +1897,7 @@ impl GameState { } else { text }, - text_size.round() as u32, + 20, rect.x, rect.y, *text_c, From 98bbc98b6b07e17d1a30e4f5bcdee26d63223e3f Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Sun, 19 Feb 2023 15:25:27 +0900 Subject: [PATCH 10/29] Move "original_impl" to own module --- src/main.rs | 1963 +----------------------------------------- src/original_impl.rs | 1953 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1954 insertions(+), 1962 deletions(-) create mode 100644 src/original_impl.rs diff --git a/src/main.rs b/src/main.rs index 28f708b..dd8a4ef 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,1967 +1,6 @@ -use std::{path::PathBuf, str::FromStr}; - -use agnostic_interface::CameraInterface; -//use quicksilver::{ -// geom::{Circle, Rectangle, Transform, Vector}, -// graphics::{ -// Background::{Blended, Col, Img}, -// Color, Font, FontStyle, Image, View, -// }, -// input::{ButtonState, Key}, -// lifecycle::{run, Asset, Event, Settings, State, Window}, -// saving::{load, save}, -// sound::Sound, -// Result, -//}; -use rand::prelude::*; -use serde::{Deserialize, Serialize}; - mod agnostic_interface; mod faux_quicksilver; -use faux_quicksilver::{Circle, Color, Rectangle, Transform, Vector, Window}; - -const WIDTH_F: f32 = 800.0; -const HEIGHT_F: f32 = 600.0; -const MUSIC2_LENGTH: f32 = 2.0 * 60.0 * 1000.0; -const TEXT_RATE: f32 = 100.0; -const PP_GEN_RATE: f32 = 75.0; -const PARTICLE_RAND_VEL_RANGE: f32 = 0.2; -const PARTICLE_RAND_VEL_DIST: f32 = 0.2828427; // dist where x and y = 0.2 -const PARTICLE_RAND_ROT_RANGE: f32 = 0.5; -const JOINING_OPACITY_RATE: f32 = 0.00013; -const JOINING_FAR_DIST: f32 = 700.0; -const JOINING_NEAR_DIST: f32 = 150.0; -const DOUBLE_CLICK_TIME: f32 = 350.0; -const SL_NOTIF_TIME: f32 = 5000.0; -const MAX_MOONS: usize = 5; - -fn interp_sq_inv(x: f32) -> f32 { - if x < 0.0 { - return 0.0; - } else if x > 1.0 { - return 1.0; - } - let y = x - 1.0; - -y * y + 1.0 -} - -fn interp_sq(x: f32) -> f32 { - if x < 0.0 { - return 0.0; - } else if x > 1.0 { - return 1.0; - } - x * x -} - -enum MenuItemType { - Button { - text: &'static str, - text_c: Color, - h_c: Color, - c: Color, - }, - AppearingText { - text: &'static str, - text_idx: usize, - text_size: f32, - text_c: Color, - timer: f32, - }, - InstantText { - text: &'static str, - text_size: f32, - text_color: Color, - }, - Pause { - timer: f32, - length: f32, - }, -} - -struct MenuItem { - x: f32, - y: f32, - w: f32, - h: f32, - item_type: MenuItemType, - is_hover: bool, - is_focus: bool, - is_loaded: bool, -} - -impl MenuItem { - fn is_inside(&self, x: f32, y: f32) -> bool { - x >= self.x && x < self.x + self.w && y >= self.y && y < self.y + self.h - } -} - -struct Menu { - items: Vec, -} - -impl Menu { - fn button( - x: f32, - y: f32, - w: f32, - h: f32, - s: &'static str, - t_color: Color, - box_color: Color, - boxh_color: Color, - first: bool, - ) -> MenuItem { - MenuItem { - x, - y, - w, - h, - item_type: MenuItemType::Button { - text: s, - text_c: t_color, - h_c: boxh_color, - c: box_color, - }, - is_hover: false, - is_focus: false, - is_loaded: !first, - } - } - - fn start() -> Menu { - let item = MenuItem { - x: WIDTH_F / 2.0 - 120.0, - y: 150.0, - w: 240.0, - h: 150.0, - item_type: MenuItemType::Button { - text: "Start the Game", - text_c: Color::WHITE, - h_c: Color::from_rgba(0x66, 0xFF, 0xFF, 255), - c: Color::from_rgba(0x33, 0xDD, 0xDD, 255), - }, - is_hover: false, - is_focus: false, - is_loaded: false, - }; - - Menu { - items: vec![ - item, - Menu::instant_text( - 70.0, - 50.0, - 55.0, - true, - "One And All - A Ludum Dare 45 Entry", - ), - Menu::instant_text( - 25.0, - HEIGHT_F - 100.0, - 30.0, - true, - "Made with quicksilver which is licensed with either", - ), - Menu::instant_text( - 70.0, - HEIGHT_F - 80.0, - 30.0, - true, - "MIT License or Apache License Version 2.0", - ), - Menu::instant_text( - 25.0, - HEIGHT_F - 50.0, - 30.0, - true, - "Uses Clear-Sans which is licensed with Apache License Version 2.0", - ), - ], - } - } - - fn instant_text(x: f32, y: f32, text_size: f32, first: bool, s: &'static str) -> MenuItem { - MenuItem { - x, - y, - w: 0.0, - h: 0.0, - item_type: MenuItemType::InstantText { - text: s, - text_size, - text_color: Color::WHITE, - }, - is_hover: false, - is_focus: false, - is_loaded: !first, - } - } - - fn text(x: f32, y: f32, text_size: f32, first: bool, s: &'static str) -> MenuItem { - MenuItem { - x, - y, - w: 0.0, - h: 0.0, - item_type: MenuItemType::AppearingText { - text: s, - text_size, - text_c: Color::WHITE, - timer: 0.0, - text_idx: 0, - }, - is_hover: false, - is_focus: false, - is_loaded: !first, - } - } - - fn pause(length: f32, first: bool) -> MenuItem { - MenuItem { - x: 0.0, - y: 0.0, - w: 0.0, - h: 0.0, - item_type: MenuItemType::Pause { timer: 0.0, length }, - is_hover: false, - is_focus: false, - is_loaded: !first, - } - } - - fn s_01() -> Menu { - Menu { - items: vec![ - Menu::pause(500.0, true), - Menu::text(50.0, HEIGHT_F - 140.0, 40.0, false, "This is how it is."), - Menu::pause(500.0, false), - Menu::text( - 50.0, - HEIGHT_F - 100.0, - 40.0, - false, - "Nothing is, and everything is nothing.", - ), - Menu::pause(500.0, false), - Menu::text(50.0, HEIGHT_F - 60.0, 40.0, false, "...until you appeared."), - Menu::pause(100.0, false), - Menu::text( - 570.0, - HEIGHT_F - 50.0, - 30.0, - false, - "(Click to continue...)", - ), - ], - } - } - - fn s_02() -> Menu { - Menu { - items: vec![ - Menu::text( - 50.0, - HEIGHT_F - 150.0, - 40.0, - true, - "Just by being, you brought light into existence.", - ), - Menu::pause(500.0, false), - Menu::text( - 50.0, - HEIGHT_F - 110.0, - 40.0, - false, - "What brings you here? What drives you?", - ), - Menu::pause(500.0, false), - Menu::text( - 50.0, - HEIGHT_F - 70.0, - 40.0, - false, - "Please tell me, what fuels you?", - ), - Menu::button( - 100.0, - 30.0, - 200.0, - 85.0, - "Hope", - Color::WHITE, - Color::BLACK, - Color::from_rgba(0x33, 0x33, 0x33, 255), - false, - ), - Menu::button( - 500.0, - 30.0, - 200.0, - 85.0, - "Miracles", - Color::WHITE, - Color::BLACK, - Color::from_rgba(0x33, 0x33, 0x33, 255), - false, - ), - Menu::button( - 100.0, - 150.0, - 200.0, - 85.0, - "Kindness", - Color::WHITE, - Color::BLACK, - Color::from_rgba(0x33, 0x33, 0x33, 255), - false, - ), - Menu::button( - 500.0, - 150.0, - 200.0, - 85.0, - "Determination", - Color::WHITE, - Color::BLACK, - Color::from_rgba(0x33, 0x33, 0x33, 255), - false, - ), - ], - } - } - - // choose hope - fn s_03() -> Menu { - Menu { - items: vec![ - Menu::text( - 50.0, - HEIGHT_F - 170.0, - 40.0, - true, - "Hope... hope that your actions will inspire others..", - ), - Menu::pause(500.0, false), - Menu::text( - 50.0, - HEIGHT_F - 130.0, - 40.0, - false, - "Hope that a brighter future will come tomorrow...", - ), - Menu::pause(500.0, false), - Menu::text( - 50.0, - HEIGHT_F - 90.0, - 40.0, - false, - ".. With your appearance, perhaps it shall...", - ), - ], - } - } - - // choose miracles - fn s_04() -> Menu { - Menu { - items: vec![ - Menu::text( - 30.0, - HEIGHT_F - 170.0, - 40.0, - true, - "Miracles huh?.. I see, then your appearance is special.", - ), - Menu::pause(500.0, false), - Menu::text( - 30.0, - HEIGHT_F - 130.0, - 40.0, - false, - "With your appearance, things may change for the better..", - ), - Menu::pause(500.0, false), - Menu::text( - 30.0, - HEIGHT_F - 90.0, - 40.0, - false, - "Now I am certain that this meeting was not by chance.", - ), - ], - } - } - - // choose kindness - fn s_05() -> Menu { - Menu { - items: vec![ - Menu::text( - 50.0, - HEIGHT_F - 170.0, - 40.0, - true, - "Kindness?.. I am in your debt.", - ), - Menu::pause(250.0, false), - Menu::text( - 50.0, - HEIGHT_F - 130.0, - 40.0, - false, - "It has been a long time since I have encountered", - ), - Menu::text(50.0, HEIGHT_F - 90.0, 40.0, false, "another being..."), - Menu::pause(500.0, false), - Menu::text(270.0, HEIGHT_F - 90.0, 40.0, false, "... Thank you..."), - ], - } - } - - // choose determination - fn s_06() -> Menu { - Menu { - items: vec![ - Menu::text( - 50.0, - HEIGHT_F - 170.0, - 40.0, - true, - "Determination.. I see...", - ), - Menu::pause(500.0, false), - Menu::text( - 400.0, - HEIGHT_F - 170.0, - 40.0, - false, - "I do not doubt it, for it", - ), - Menu::text( - 50.0, - HEIGHT_F - 130.0, - 40.0, - false, - "must have been difficult to come here..", - ), - Menu::pause(500.0, false), - Menu::text( - 50.0, - HEIGHT_F - 90.0, - 40.0, - false, - "Your resolve is evident by your mere presence..", - ), - ], - } - } - - fn s_07() -> Menu { - Menu { - items: vec![ - Menu::text( - 50.0, - HEIGHT_F - 130.0, - 40.0, - true, - "Now that you are here, it must mean a new era of", - ), - Menu::text( - 50.0, - HEIGHT_F - 90.0, - 40.0, - false, - "creation for all that will be.", - ), - Menu::pause(200.0, false), - Menu::text( - 50.0, - HEIGHT_F - 50.0, - 40.0, - false, - "Try double-clicking the void to create something...", - ), - ], - } - } - - fn s_08() -> Menu { - Menu { - items: vec![Menu::instant_text( - 50.0, - HEIGHT_F - 90.0, - 35.0, - true, - "(Try double-clicking now...)", - )], - } - } - - fn s_09() -> Menu { - Menu { - items: vec![ - Menu::pause(400.0, true), - Menu::text( - 50.0, - HEIGHT_F - 140.0, - 40.0, - false, - "A new planet... It has most certainly been a while.", - ), - Menu::pause(500.0, false), - Menu::text( - 50.0, - HEIGHT_F - 100.0, - 40.0, - false, - "Please, go out and create the new universe, and again..", - ), - Menu::pause(300.0, false), - Menu::text(50.0, HEIGHT_F - 60.0, 40.0, false, "Thank you."), - ], - } - } - - fn s_10() -> Menu { - Menu { - items: vec![ - Menu::instant_text( - 20.0, - HEIGHT_F - 40.0, - 20.0, - true, - "Single click to move, Double-click to create something", - ), - Menu::instant_text( - 20.0, - HEIGHT_F - 20.0, - 20.0, - true, - "S - save; L - load (can load from the start); R - reset", - ), - ], - } - } -} - -#[derive(Serialize, Deserialize, Clone)] -struct Particle { - rect: Rectangle, - circle: Circle, - is_rect: bool, - velx: f32, - vely: f32, - velr: f32, - r: f32, - lifetime: f32, - life_timer: f32, -} - -#[derive(Serialize, Deserialize, Clone)] -struct ParticleSystem { - particles: Vec, - spawn_timer: f32, - spawn_time: f32, - lifetime: f32, - host_rect: Rectangle, - host_circle: Circle, - is_rect: bool, - direction: Vector, - color: Color, - opacity: f32, - vel_multiplier: f32, -} - -impl ParticleSystem { - fn new( - spawn_time: f32, - lifetime: f32, - host_rect: Rectangle, - host_circle: Circle, - is_rect: bool, - direction: Vector, - color: Color, - opacity: f32, - vel_multiplier: f32, - ) -> Self { - Self { - particles: Vec::new(), - spawn_timer: 0.0, - spawn_time, - lifetime, - host_rect, - host_circle, - is_rect, - direction, - color, - opacity, - vel_multiplier, - } - } - - fn update(&mut self, dt: f32) { - for i in (0..self.particles.len()).rev() { - self.particles[i].life_timer += dt; - if self.particles[i].life_timer > self.particles[i].lifetime { - self.particles.swap_remove(i); - } else { - if self.is_rect { - self.particles[i].rect.x += self.particles[i].velx * dt as f32; - self.particles[i].rect.y += self.particles[i].vely * dt as f32; - self.particles[i].r += self.particles[i].velr * dt as f32; - } else { - self.particles[i].circle.x += self.particles[i].velx * dt as f32; - self.particles[i].circle.y += self.particles[i].vely * dt as f32; - } - } - } - - self.spawn_timer += dt; - if self.spawn_timer > self.spawn_time { - self.spawn_timer -= self.spawn_time; - self.particles.push(Particle { - rect: self.host_rect, - circle: self.host_circle, - is_rect: self.is_rect, - velx: (rand::thread_rng() - .gen_range(-PARTICLE_RAND_VEL_RANGE, PARTICLE_RAND_VEL_RANGE) - + self.direction.x) - * self.vel_multiplier, - vely: (rand::thread_rng() - .gen_range(-PARTICLE_RAND_VEL_RANGE, PARTICLE_RAND_VEL_RANGE) - + self.direction.y) - * self.vel_multiplier, - // velx: self.direction.x, - // vely: self.direction.y, - velr: rand::thread_rng() - .gen_range(-PARTICLE_RAND_ROT_RANGE, PARTICLE_RAND_ROT_RANGE) - * self.vel_multiplier, - r: rand::thread_rng().gen_range(0.0, 90.0), - lifetime: self.lifetime, - life_timer: 0.0, - }); - } - } - - fn draw(&mut self, window: &mut Window, transform: Transform) { - if self.opacity == 0.0 { - return; - } - for particle in &mut self.particles { - self.color.a = ((1.0 - (particle.life_timer / particle.lifetime) as f32) - * self.opacity - * 255.0) as u8; - if particle.is_rect { - let pre_transform = - Transform::translate(-particle.rect.x / 2.0, -particle.rect.y / 2.0) - * Transform::rotate(particle.r); - window - .get_gi_mut() - .draw_rect_transform(particle.rect, self.color, transform * pre_transform) - .ok(); - } else { - window - .get_gi_mut() - .draw_circle_transform(particle.circle, self.color, transform) - .ok(); - } - } - } - - fn force_spawn(&mut self, count: usize) { - for i in 0..count { - self.particles.push(Particle { - rect: self.host_rect, - circle: self.host_circle, - is_rect: self.is_rect, - velx: (rand::thread_rng() - .gen_range(-PARTICLE_RAND_VEL_RANGE, PARTICLE_RAND_VEL_RANGE) - + self.direction.x) - * self.vel_multiplier, - vely: (rand::thread_rng() - .gen_range(-PARTICLE_RAND_VEL_RANGE, PARTICLE_RAND_VEL_RANGE) - + self.direction.y) - * self.vel_multiplier, - // velx: self.direction.x, - // vely: self.direction.y, - velr: rand::thread_rng() - .gen_range(-PARTICLE_RAND_ROT_RANGE, PARTICLE_RAND_ROT_RANGE) - * self.vel_multiplier, - r: rand::thread_rng().gen_range(0.0, 90.0), - lifetime: self.lifetime, - life_timer: 0.0, - }); - } - } -} - -#[derive(Serialize, Deserialize, Clone)] -struct RotatingParticleSystem { - particle_system: ParticleSystem, - r: f32, - velr: f32, - offset: f32, -} - -impl RotatingParticleSystem { - fn new( - spawn_time: f32, - lifetime: f32, - host_rect: Rectangle, - host_circle: Circle, - is_rect: bool, - direction: Vector, - color: Color, - opacity: f32, - rotation: f32, - velr: f32, - offset: f32, - vel_multiplier: f32, - ) -> Self { - RotatingParticleSystem { - particle_system: ParticleSystem::new( - spawn_time, - lifetime, - host_rect, - host_circle, - is_rect, - direction, - color, - opacity, - vel_multiplier, - ), - r: rotation, - velr, - offset, - } - } - - fn update(&mut self, dt: f32) { - if self.particle_system.is_rect { - let saved_rect = self.particle_system.host_rect; - self.particle_system - .host_rect - .pos_add_vec(Transform::rotate(self.r) * Vector::new(self.offset, 0.0)); - self.particle_system.update(dt); - self.particle_system.host_rect = saved_rect; - } else { - let saved_cir = self.particle_system.host_circle; - self.particle_system - .host_circle - .pos_add_vec(Transform::rotate(self.r) * Vector::new(self.offset, 0.0)); - self.particle_system.update(dt); - self.particle_system.host_circle = saved_cir; - } - self.r += self.velr * dt as f32; - } - - fn draw(&mut self, window: &mut Window, transform: Transform) { - if self.particle_system.opacity == 0.0 { - return; - } - self.particle_system.direction = - Transform::rotate(self.r) * Vector::new(0.0, -PARTICLE_RAND_VEL_DIST); - self.particle_system.draw(window, transform); - if self.particle_system.is_rect { - let mut moved_rect = self.particle_system.host_rect; - moved_rect.pos_add_vec(Transform::rotate(self.r) * Vector::new(self.offset, 0.0)); - let mut solid_color = self.particle_system.color; - solid_color.a = (self.particle_system.opacity * 255.0) as u8; - window - .get_gi_mut() - .draw_rect_transform( - moved_rect, - solid_color, - transform - * Transform::translate(-moved_rect.x / 2.0, -moved_rect.y / 2.0) - * Transform::rotate(self.r * 1.3), - ) - .ok(); - } else { - let mut moved_cir = self.particle_system.host_circle; - moved_cir.pos_add_vec(Transform::rotate(self.r) * Vector::new(self.offset, 0.0)); - let mut solid_color = self.particle_system.color; - solid_color.a = (self.particle_system.opacity * 255.0) as u8; - window - .get_gi_mut() - .draw_circle_transform(moved_cir, solid_color, transform) - .ok(); - } - } -} - -struct ExplConvCircleParticle { - circle: Circle, - offset: f32, - r: f32, -} - -struct ExplConvParticleSystem { - particles: Vec, - lifetime: f32, - host_circle: Circle, - color: Color, - opacity: f32, - life_timer: f32, -} - -impl ExplConvParticleSystem { - fn new(lifetime: f32, host_circle: Circle, color: Color, opacity: f32) -> Self { - ExplConvParticleSystem { - particles: Vec::new(), - lifetime, - host_circle, - color, - opacity, - life_timer: 0.0, - } - } - - fn activate(&mut self, count: usize, offset: f32) { - self.life_timer = 0.0; - for i in 0..count { - self.particles.push(ExplConvCircleParticle { - circle: self.host_circle, - offset, - r: rand::thread_rng().gen_range(0.0, 360.0), - }); - } - } - - // returns true if finished - fn update(&mut self, dt: f32, planets: &mut Vec) -> bool { - self.life_timer += dt; - if self.life_timer >= self.lifetime { - if !self.particles.is_empty() { - self.particles.clear(); - planets.push(Planet::new(self.host_circle, self.color)); - return true; - } - return false; - } - - if self.life_timer < self.lifetime / 2.0 { - let amount = interp_sq_inv((self.life_timer / self.lifetime) as f32 * 2.0); - for particle in &mut self.particles { - let dir = - Transform::rotate(particle.r) * Vector::new(particle.offset * amount, 0.0); - particle.circle.x = dir.x + self.host_circle.x; - particle.circle.y = dir.y + self.host_circle.y; - } - } else { - let amount = 1.0 - interp_sq(((self.life_timer / self.lifetime) as f32 - 0.5) * 2.0); - for particle in &mut self.particles { - let dir = - Transform::rotate(particle.r) * Vector::new(particle.offset * amount, 0.0); - particle.circle.x = dir.x + self.host_circle.x; - particle.circle.y = dir.y + self.host_circle.y; - } - } - return false; - } - - fn draw(&mut self, window: &mut Window, transform: Transform) { - if self.opacity == 0.0 { - return; - } - for particle in &mut self.particles { - self.color.a = (((self.life_timer / self.lifetime) as f32 / 2.0 + 0.5) - * self.opacity - * 255.0) as u8; - window - .get_gi_mut() - .draw_circle_transform(particle.circle, self.color, transform) - .ok(); - } - } -} - -#[derive(Serialize, Deserialize, Clone)] -struct Planet { - circle: Circle, - color: Color, - particle_system: ParticleSystem, - moons: Vec, -} - -impl Planet { - fn new(circle: Circle, color: Color) -> Self { - let mut smaller_circle = circle; - smaller_circle.r /= 4.0; - let mut planet = Planet { - circle, - color, - particle_system: ParticleSystem::new( - rand::thread_rng().gen_range(2000.0, 3800.0), - 900.0, - Rectangle::new(0.0, 0.0, 1.0, 1.0), - circle, - false, - Vector::new(0.0, 0.0), - color, - 1.0, - 0.3, - ), - moons: Vec::with_capacity(MAX_MOONS), - }; - - let r: f32 = rand::thread_rng().gen_range(0.0, 360.0); - let clockwise = rand::thread_rng().gen_bool(0.5); - for i in 0..rand::thread_rng().gen_range(0, MAX_MOONS) { - planet.moons.push(RotatingParticleSystem::new( - rand::thread_rng().gen_range(1000.0, 2600.0), - 600.0, - Rectangle::new(0.0, 0.0, 1.0, 1.0), - smaller_circle, - false, - Vector::new(0.0, 0.0), - color, - 1.0, - r, - if clockwise { - rand::thread_rng().gen_range(0.05, 0.15) - } else { - rand::thread_rng().gen_range(-0.15, -0.05) - }, - rand::thread_rng().gen_range(35.0, 200.0), - 0.2, - )); - } - - planet - } - - fn update(&mut self, dt: f32) { - self.particle_system.host_circle.x = self.circle.x; - self.particle_system.host_circle.y = self.circle.y; - self.particle_system.update(dt); - for moon in &mut self.moons { - moon.particle_system.host_circle.x = self.circle.x; - moon.particle_system.host_circle.y = self.circle.y; - moon.update(dt); - } - } - - fn draw(&mut self, window: &mut Window, transform: Transform) { - self.particle_system.draw(window, transform); - window - .get_gi_mut() - .draw_circle_transform(self.circle, self.color, transform) - .ok(); - for moon in &mut self.moons { - moon.draw(window, transform); - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -struct Star { - color: Color, - particle_system: ParticleSystem, - velr: f32, - r: f32, -} - -impl Star { - fn new(circle: Circle, color: Color, velr: f32, r: f32) -> Self { - let mut star = Star { - color, - particle_system: ParticleSystem::new( - rand::thread_rng().gen_range(80.0, 200.0), - 850.0, - Rectangle::new(0.0, 0.0, 1.0, 1.0), - circle, - false, - Vector::new(0.0, 0.0), - color, - 1.0, - 1.0, - ), - velr, - r, - }; - - if star.color.r < (0.75 * 255.0) as u8 { - star.color.r = (0.75 * 255.0) as u8; - } - if star.color.g < (0.75 * 255.0) as u8 { - star.color.g = (0.75 * 255.0) as u8; - } - if star.color.b < (0.75 * 255.0) as u8 { - star.color.b = (0.75 * 255.0) as u8; - } - star.particle_system - .force_spawn(rand::thread_rng().gen_range(20, 45)); - - star - } - - fn update(&mut self, dt: f32) { - self.particle_system.update(dt); - self.r += self.velr * dt as f32; - } - - fn draw(&mut self, image: &str, window: &mut Window, transform: Transform) { - self.particle_system.draw(window, transform); - let image = window.get_image_mut(image).expect("Should be loaded image"); - let mut image_rect = image.get_wh_rect(); - image_rect.x = self.particle_system.host_circle.x - image_rect.w / 2.0; - image_rect.y = self.particle_system.host_circle.y - image_rect.h / 2.0; - image - .draw_transform( - image_rect.x, - image_rect.y, - self.color, - transform * Transform::rotate(self.r), - ) - .ok(); - } -} - -#[derive(Clone, Serialize, Deserialize)] -struct Fish { - pos: Vector, - r: f32, - swim_time: f32, - swim_timer: f32, - swim_v: f32, - anim_timer: f32, - anim_time: f32, - color: Color, - body_rect: Rectangle, - tail_rect: Rectangle, -} - -enum FishState { - Idle, - Swim, -} - -impl Fish { - fn new(pos: Vector, r: f32, color: Color) -> Self { - let anim_timer = rand::thread_rng().gen_range(800.0, 1000.0); - Self { - pos, - r, - swim_time: 800.0, - swim_timer: 800.0, - swim_v: 0.2, - anim_timer, - anim_time: anim_timer, - color, - body_rect: Rectangle { - x: 0.0, - y: 0.0, - w: 32.0, - h: 16.0, - }, - tail_rect: Rectangle { - x: 32.0, - y: 0.0, - w: 16.0, - h: 16.0, - }, - } - } - - fn set_next(&mut self, state: FishState) { - match state { - FishState::Idle => { - self.swim_time = rand::thread_rng().gen_range(1100.0, 2400.0); - self.swim_timer = self.swim_time; - self.anim_timer = 1600.0; - self.anim_time = 1600.0; - self.swim_v = 0.0; - } - FishState::Swim => { - self.swim_time = rand::thread_rng().gen_range(1400.0, 2300.0); - self.swim_timer = self.swim_time; - self.r = rand::thread_rng().gen_range(0.0, 360.0); - self.anim_timer = rand::thread_rng().gen_range(600.0, 1000.0); - self.anim_time = self.anim_timer; - self.swim_v = (self.anim_timer / 8000.0) as f32; - } - } - } - - fn update(&mut self, dt: f32) { - self.swim_time -= dt; - if self.swim_time < 220.0 { - self.swim_v /= 1.1; - } - if self.swim_time <= 0.0 { - if rand::thread_rng().gen_bool(0.4) { - self.set_next(FishState::Idle); - } else { - self.set_next(FishState::Swim); - } - } - - self.anim_timer -= dt; - if self.anim_timer <= 0.0 { - self.anim_timer = self.anim_time; - } - - self.pos += Transform::rotate(self.r) * Vector::new(self.swim_v, 0.0) * dt as f32; - } - - fn draw(&mut self, i_fish: &str, window: &mut Window, transform: Transform) { - let fish_img = window - .get_image_mut(i_fish) - .expect("\"fish\" Image should be loaded"); - let anim_angle = ((self.anim_timer / self.anim_time) * std::f32::consts::PI * 2.0).sin(); - let mut body_rect = self.body_rect; - body_rect.x = self.pos.x - body_rect.w / 2.0; - body_rect.y = self.pos.y - body_rect.h / 2.0; - let body_tr = - Transform::rotate(anim_angle as f32 * 30.0) * Transform::rotate(self.r + 180.0); - fish_img.draw_sub_transform( - self.body_rect, - body_rect.x, - body_rect.y, - self.color, - transform * body_tr, - ); - let mut tail_rect = self.tail_rect; - tail_rect.x = self.pos.x - tail_rect.w / 2.0; - tail_rect.y = self.pos.y - tail_rect.h / 2.0; - let anim_angle = ((self.anim_timer / self.anim_time) * std::f32::consts::PI * 2.0 - - std::f32::consts::PI / 3.0) - .sin(); - let tail_tr = body_tr - * Transform::translate(body_rect.x / 1.5, 0.0) - * Transform::translate(-tail_rect.x / 2.0, 0.0) - * Transform::rotate(-anim_angle as f32 * 45.0) - * Transform::translate(tail_rect.x / 2.0, 0.0); - fish_img.draw_sub_transform( - self.tail_rect, - tail_rect.x, - tail_rect.y, - self.color, - transform * tail_tr, - ); - } -} - -#[derive(Serialize, Deserialize, Clone)] -struct SaveData { - planets: Vec, - stars: Vec, - fishes: Vec, - player: Rectangle, - joining_particles: RotatingParticleSystem, -} - -enum SaveLoadNotification { - Save { text: Option, timer: f32 }, - Load { text: Option, timer: f32 }, -} - -struct GameState { - s_boom: String, - s_get: String, - s_power_up: String, - s_tap: String, - s_speak_m: String, - s_speak_f: String, - font: String, - music2: String, - i_star: String, - i_fish: String, - music_on: bool, - menu: Menu, - state: u32, - state_dirty: bool, - selection_mode: bool, - current_item: Option, - current_finished: bool, - player: Rectangle, - player_r: f32, - player_particles: ParticleSystem, - joining_particles: RotatingParticleSystem, - is_create_mode: bool, - click_release_time: f32, - dbl_click_timeout: Option, - click_time: Option, - click_pos: Vector, - mouse_pos: Vector, - expl_conv_p_systems: Vec, - planets: Vec, - stars: Vec, - fishes: Vec, - camera: Box, - move_to: Vector, - save_load_notification: Option, -} - -impl GameState { - fn new(window: &mut Window) -> Result { - let s_boom = String::from("boom.mp3"); - window.load_sound( - &PathBuf::from_str("static/boom.mp3") - .map_err(|_| String::from("Failed to load \"static/boom.mp3\""))?, - s_boom.clone(), - )?; - let s_get = String::from("get.mp3"); - window.load_sound( - &PathBuf::from_str("static/get.mp3") - .map_err(|_| String::from("Failed to load \"static/get.mp3\""))?, - s_get.clone(), - )?; - let s_power_up = String::from("power_up.mp3"); - window.load_sound( - &PathBuf::from_str("static/power_up.mp3") - .map_err(|_| String::from("Failed to load \"static/power_up.mp3\""))?, - s_power_up.clone(), - )?; - let s_tap = String::from("tap.mp3"); - window.load_sound( - &PathBuf::from_str("static/tap.mp3") - .map_err(|_| String::from("Failed to load \"static/tap.mp3\""))?, - s_tap.clone(), - )?; - let s_speak_m = String::from("speak_m.mp3"); - window.load_sound( - &PathBuf::from_str("static/speak_m.mp3") - .map_err(|_| String::from("Failed to load \"static/speak_m.mp3\""))?, - s_speak_m.clone(), - )?; - let s_speak_f = String::from("speak_f.mp3"); - window.load_sound( - &PathBuf::from_str("static/speak_f.mp3") - .map_err(|_| String::from("Failed to load \"static/speak_f.mp3\""))?, - s_speak_f.clone(), - )?; - - let font = String::from("ClearSans-Regular.ttf"); - window.load_font( - &PathBuf::from_str("static/ClearSans-Regular.ttf") - .map_err(|_| String::from("Failed to load \"static/ClearSans-Regular.ttf\""))?, - font.clone(), - )?; - - let music2 = String::from("music2.mp3"); - window.load_music( - &PathBuf::from_str("static/music2.mp3") - .map_err(|_| String::from("Failed to load \"static/music2.mp3\""))?, - music2.clone(), - )?; - - let i_star = String::from("star.png"); - window.load_image( - &PathBuf::from_str("static/star.png") - .map_err(|_| String::from("Failed to load \"static/star.png\""))?, - i_star.clone(), - )?; - - let i_fish = String::from("fish.png"); - window.load_image( - &PathBuf::from_str("static/fish.png") - .map_err(|_| String::from("Failed to load \"static/fish.png\""))?, - i_fish.clone(), - )?; - - let mut camera = window.get_gi_mut().get_default_camera()?; - camera.set_view(Rectangle { - x: 0.0, - y: 0.0, - w: WIDTH_F, - h: HEIGHT_F, - }); - Ok(Self { - s_boom, - s_get, - s_power_up, - s_tap, - s_speak_m, - s_speak_f, - font, - music2, - i_star, - i_fish, - music_on: false, - menu: Menu::start(), - state: 0, - state_dirty: false, - selection_mode: true, - current_item: None, - current_finished: true, - player: Rectangle::new(400.0, 300.0, 32.0, 32.0), - player_r: 0.0, - player_particles: ParticleSystem::new( - PP_GEN_RATE, - 1000.0, - Rectangle::new(400.0, 300.0, 32.0, 32.0), - Circle::new(100.0, 100.0, 32.0), - true, - Vector::new(0.0, 0.0), - Color::WHITE, - 0.0, - 1.0, - ), - joining_particles: RotatingParticleSystem::new( - PP_GEN_RATE, - 1000.0, - Rectangle::new(400.0, 300.0, 16.0, 16.0), - Circle::new(100.0, 100.0, 32.0), - true, - Vector::new(0.0, 0.0), - Color::GREEN, - 0.0, - 0.0, - 0.1, - JOINING_FAR_DIST, - 1.0, - ), - is_create_mode: false, - click_release_time: 0.0, - dbl_click_timeout: None, - click_time: None, - click_pos: Vector::new(0.0, 0.0), - mouse_pos: Vector::new(0.0, 0.0), - expl_conv_p_systems: Vec::new(), - planets: Vec::new(), - stars: Vec::new(), - fishes: Vec::new(), - camera, - move_to: Vector::new(400.0, 300.0), - save_load_notification: None, - }) - } - - fn update(&mut self, window: &mut Window) -> Result<(), String> { - let dt = window.get_gi().get_delta_time(); - - // check mouse pos - { - self.mouse_pos = window.get_gi().get_mouse_xy_vec()?; - let mut hovered = false; - for i in 0..self.menu.items.len() { - if self.menu.items[i].is_inside(self.mouse_pos.x, self.mouse_pos.y) { - self.menu.items[i].is_hover = true; - self.current_item = Some(i); - hovered = true; - } else { - self.menu.items[i].is_hover = false; - } - } - if !hovered { - self.current_item = None; - } - } - - // check mouse down - if window.get_gi_mut().get_mouse_down()?.is_none() { - if self.dbl_click_timeout.is_none() { - self.click_release_time = 0.0; - } - } else { - if self.current_finished { - if self.is_create_mode { - if self.click_release_time < DOUBLE_CLICK_TIME { - self.click_release_time = DOUBLE_CLICK_TIME; - self.dbl_click_timeout = Some(0.0); - self.click_time = None; - if self.state == 8 { - let mut expl_conv_system = ExplConvParticleSystem::new( - 1500.0, - Circle::new(self.mouse_pos.x, self.mouse_pos.y, 20.0), - Color::from_rgba(0x99, 0xFF, 0x99, 255), - 1.0, - ); - expl_conv_system.activate(30, 200.0); - self.expl_conv_p_systems.push(expl_conv_system); - self.state = 9; - self.state_dirty = true; - window.get_sound_mut(&self.s_boom)?.play(0.8)?; - } else if self.state == 10 { - let mut rng = rand::thread_rng(); - let rand_out = rng.gen_range(0.0, 1.0); - if rand_out < 0.6 { - // spawn planet - let mut expl_conv_system = ExplConvParticleSystem::new( - rng.gen_range(1200.0, 1600.0), - Circle::new( - self.mouse_pos.x, - self.mouse_pos.y, - rng.gen_range(15.0, 25.0), - ), - Color::from_rgba( - rng.gen_range(0x44, 0xFF), - rng.gen_range(0x44, 0xFF), - rng.gen_range(0x44, 0xFF), - 255, - ), - 1.0, - ); - expl_conv_system - .activate(rng.gen_range(13, 40), rng.gen_range(150.0, 300.0)); - self.expl_conv_p_systems.push(expl_conv_system); - } else if rand_out < 0.85 { - // spawn star - let rot_clockwise = rng.gen_bool(0.5); - self.stars.push(Star::new( - Circle::new( - self.mouse_pos.x, - self.mouse_pos.y, - rng.gen_range(3.0, 7.0), - ), - Color::from_rgba( - rng.gen_range(0x58, 0xFF), - rng.gen_range(0x58, 0xFF), - rng.gen_range(0x58, 0xFF), - 255, - ), - if rot_clockwise { - rng.gen_range(0.1, 0.3) - } else { - rng.gen_range(-0.3, -0.1) - }, - rng.gen_range(0.0, 90.0), - )); - } else { - // spawn fish - for i in 0..rng.gen_range(1, 4) { - self.fishes.push(Fish::new( - self.mouse_pos, - rng.gen_range(0.0, 360.0), - Color::from_rgba( - rng.gen_range(0x44, 0xFF), - rng.gen_range(0x44, 0xFF), - rng.gen_range(0x44, 0xFF), - 255, - ), - )); - } - } - window.get_sound_mut(&self.s_boom)?.play(0.8)?; - } - } else if self.state == 10 { - self.click_time = Some(0.0); - self.click_pos = self.mouse_pos; - } - } else if self.selection_mode { - if let Some(idx) = self.current_item { - match self.state { - 0 => { - self.state += 1; - self.state_dirty = true; - } - 2 => { - if idx == 5 { - // hope - self.state = 3; - self.state_dirty = true; - self.joining_particles.particle_system.color = - Color::from_rgba(0xAA, 0xCC, 0xFF, 255); - } else if idx == 6 { - // miracles - self.state = 4; - self.state_dirty = true; - self.joining_particles.particle_system.color = - Color::from_rgba(0xFF, 0xFF, 0xAA, 255); - } else if idx == 7 { - // kindness - self.state = 5; - self.state_dirty = true; - self.joining_particles.particle_system.color = - Color::from_rgba(0xBB, 0xFF, 0xBB, 255); - } else { - // determination - self.state = 6; - self.state_dirty = true; - self.joining_particles.particle_system.color = - Color::from_rgba(0xFF, 0xAA, 0xAA, 255); - } - window.get_sound_mut(&self.s_get)?.play(0.7)?; - } - _ => { - self.state = 0; - self.state_dirty = true; - } - } - } - } else { - match self.state { - 0 | 1 => self.state += 1, - 3 | 4 | 5 | 6 => self.state = 7, - 7 => self.state = 8, - 9 => self.state = 10, - _ => self.state = 0, - } - self.state_dirty = true; - } - } else { - for mi in &mut self.menu.items { - match &mut mi.item_type { - MenuItemType::AppearingText { - text, - text_idx, - text_size, - text_c, - timer, - } => { - *text_idx = text.len(); - } - MenuItemType::Button { - text, - text_c, - h_c, - c, - } => { - //let style = FontStyle::new(42.0, *text_c); - } - MenuItemType::Pause { timer, length } => (), - MenuItemType::InstantText { - text, - text_size, - text_color, - } => {} - } - mi.is_loaded = true; - } - self.current_finished = true; - } - } - - // check pressed keys - if window.get_gi_mut().get_key_pressed('s')? { - if self.state == 10 { - let save_data = SaveData { - planets: self.planets.clone(), - stars: self.stars.clone(), - fishes: self.fishes.clone(), - player: self.player.clone(), - joining_particles: self.joining_particles.clone(), - }; - // TODO - //save("OneAndAll_LD45", "slot0", &save_data)?; - self.save_load_notification = Some(SaveLoadNotification::Save { - text: None, - timer: SL_NOTIF_TIME, - }); - } - } else if window.get_gi_mut().get_key_pressed('l')? { - // TODO - //let load_result = load::("OneAndAll_LD45", "slot0"); - //if let Ok(save_data) = load_result { - // self.planets = save_data.planets; - // self.stars = save_data.stars; - // self.fishes = save_data.fishes; - // self.player = save_data.player; - // self.joining_particles = save_data.joining_particles; - // self.expl_conv_p_systems.clear(); - // self.move_to = Vector { - // x: self.player.x, - // y: self.player.y, - // }; - // self.camera.set_view_xy( - // self.player.x - WIDTH_F / 2.0, - // self.player.y - HEIGHT_F / 2.0, - // ); - // self.dbl_click_timeout = None; - // self.click_time = None; - // self.click_release_time = DOUBLE_CLICK_TIME; - - // self.state = 10; - // self.state_dirty = true; - // self.save_load_notification = Some(SaveLoadNotification::Load { - // text: None, - // timer: SL_NOTIF_TIME, - // }); - //} - } else if window.get_gi_mut().get_key_pressed('r')? { - if self.state == 10 { - self.state = 0; - self.state_dirty = true; - } - } - - self.click_release_time += dt; - if let Some(t) = &mut self.click_time { - *t += dt; - if *t > DOUBLE_CLICK_TIME { - self.move_to = self.click_pos; // - Vector::new(WIDTH_F / 2.0, HEIGHT_F / 2.0); - } - } - - if let Some(t) = &mut self.dbl_click_timeout { - *t += dt; - if *t > 300.0 { - self.dbl_click_timeout = None; - } - } - - self.player.x += (self.move_to.x - self.player.x) / 20.0; - self.player.y += (self.move_to.y - self.player.y) / 20.0; - self.player_particles.host_rect.x = self.player.x; - self.player_particles.host_rect.y = self.player.y; - self.joining_particles.particle_system.host_rect.x += - (self.player.x - self.joining_particles.particle_system.host_rect.x) / 30.0; - self.joining_particles.particle_system.host_rect.y += - (self.player.y - self.joining_particles.particle_system.host_rect.y) / 30.0; - let (cx, cy) = self.camera.get_view_xy()?; - self.camera.set_view_xy( - (self.player.x - WIDTH_F / 2.0 - cx) / 40.0, - (self.player.y - HEIGHT_F / 2.0 - cy) / 40.0, - )?; - window.get_gi_mut().set_camera(&self.camera); - - self.player_r += dt / 10.0; - - if self.state_dirty { - self.state_dirty = false; - if self.state > 1 && !self.music_on { - let music = window.get_music_mut(&self.music2)?; - music.set_loop(true)?; - music.play(0.5)?; - self.music_on = true; - } - match self.state { - 1 => { - self.menu = Menu::s_01(); - self.current_finished = false; - self.selection_mode = false; - } - 2 => { - self.menu = Menu::s_02(); - self.current_finished = false; - self.selection_mode = true; - } - 3 => { - self.menu = Menu::s_03(); - self.current_finished = false; - self.selection_mode = false; - } - 4 => { - self.menu = Menu::s_04(); - self.current_finished = false; - self.selection_mode = false; - } - 5 => { - self.menu = Menu::s_05(); - self.current_finished = false; - self.selection_mode = false; - } - 6 => { - self.menu = Menu::s_06(); - self.current_finished = false; - self.selection_mode = false; - } - 7 => { - self.menu = Menu::s_07(); - self.current_finished = false; - self.selection_mode = false; - } - 8 => { - self.menu = Menu::s_08(); - self.current_finished = true; - self.selection_mode = false; - self.is_create_mode = true; - } - 9 => { - self.menu = Menu::s_09(); - self.current_finished = false; - self.selection_mode = false; - self.is_create_mode = false; - } - 10 => { - self.menu = Menu::s_10(); - self.current_finished = false; - self.selection_mode = false; - self.is_create_mode = true; - } - _ => { - self.menu = Menu::start(); - self.current_item = None; - self.selection_mode = true; - self.is_create_mode = false; - self.state = 0; - self.player_particles.opacity = 0.0; - self.joining_particles.particle_system.opacity = 0.0; - self.expl_conv_p_systems.clear(); - self.planets.clear(); - self.stars.clear(); - self.fishes.clear(); - self.player.x = WIDTH_F / 2.0; - self.player.y = HEIGHT_F / 2.0; - self.move_to = Vector::new(WIDTH_F / 2.0, HEIGHT_F / 2.0); - self.camera.set_view_xy(0.0, 0.0); - self.click_time = None; - } - } - } - - if self.joining_particles.particle_system.opacity < 1.0 && self.state > 2 { - self.joining_particles.particle_system.opacity += JOINING_OPACITY_RATE * dt as f32; - if self.joining_particles.particle_system.opacity > 1.0 { - self.joining_particles.particle_system.opacity = 1.0; - } - self.joining_particles.offset = - (1.0 - self.joining_particles.particle_system.opacity / 1.0) * JOINING_FAR_DIST - + self.joining_particles.particle_system.opacity / 1.0 * JOINING_NEAR_DIST; - } - - if self.player_particles.opacity < 1.0 && self.state > 1 { - self.player_particles.opacity += dt as f32 / 7000.0; - if self.player_particles.opacity > 1.0 { - self.player_particles.opacity = 1.0; - } - } - - if self.music_on { - } else if self.state == 10 { - let mut music_on = false; - let music = window.get_music_mut(&self.music2)?; - music.set_loop(true)?; - music.play(0.5)?; - self.music_on = true; - } - - for i in 0..self.menu.items.len() { - let mi: &mut MenuItem = &mut self.menu.items[i]; - if !mi.is_loaded { - match &mut mi.item_type { - MenuItemType::Button { - text, - text_c, - h_c, - c, - } => { - //self.font.execute(|font| { - // let style = FontStyle::new(42.0, *text_c); - // *text_image = Some(font.render(text, &style)?); - // Ok(()) - //})?; - //if text_image.is_some() { - mi.is_loaded = true; - if i + 1 < self.menu.items.len() { - self.menu.items[i + 1].is_loaded = false; - } else { - self.current_finished = true; - } - //} - } - MenuItemType::AppearingText { - text, - text_idx, - text_size, - text_c, - timer, - } => { - *timer += dt; - if *timer > TEXT_RATE { - *timer -= TEXT_RATE; - *text_idx += 1; - if *text_idx >= text.len() { - mi.is_loaded = true; - if i + 1 < self.menu.items.len() { - self.menu.items[i + 1].is_loaded = false; - } else { - self.current_finished = true; - } - continue; - } - //self.font.execute(|font| { - // let style = FontStyle::new(*text_size, *text_c); - // *text_image = Some(font.render(current_text, &style)?); - // Ok(()) - //})?; - } - } - MenuItemType::Pause { timer, length } => { - *timer += dt; - if timer > length { - mi.is_loaded = true; - if i + 1 < self.menu.items.len() { - self.menu.items[i + 1].is_loaded = false; - } else { - self.current_finished = true; - } - } - } - MenuItemType::InstantText { - text, - text_size, - text_color, - } => { - //if text_image.is_none() { - // self.font.execute(|f| { - // let style = FontStyle::new(*text_size, *text_color); - // *text_image = Some(f.render(text, &style)?); - // Ok(()) - // })?; - //} - //if text_image.is_some() { - mi.is_loaded = true; - if i + 1 < self.menu.items.len() { - self.menu.items[i + 1].is_loaded = false; - } else { - self.current_finished = true; - } - //} - } - } - } - } - - self.player_particles.host_rect = self.player; - self.player_particles.update(dt); - self.joining_particles.update(dt); - - for i in (0..self.expl_conv_p_systems.len()).rev() { - if self.expl_conv_p_systems[i].update(dt, &mut self.planets) { - self.expl_conv_p_systems.swap_remove(i); - } - } - for planet in &mut self.planets { - planet.update(dt); - } - for star in &mut self.stars { - star.update(dt); - } - - if let Some(sl) = &mut self.save_load_notification { - match sl { - SaveLoadNotification::Save { text, timer } => { - *timer -= dt; - if *timer <= 0.0 { - self.save_load_notification = None; - } else if text.is_none() { - //self.font.execute(|f| { - // *text = Some( - // f.render("Saved the Game", &FontStyle::new(45.0, Color::WHITE))?, - // ); - // Ok(()) - //})?; - } - } - SaveLoadNotification::Load { text, timer } => { - *timer -= dt; - if *timer <= 0.0 { - self.save_load_notification = None; - } else if text.is_none() { - //self.font.execute(|f| { - // *text = Some( - // f.render("Loaded the Game", &FontStyle::new(45.0, Color::WHITE))?, - // ); - // Ok(()) - //})?; - } - } - } - } - - for fish in &mut self.fishes { - fish.update(dt); - } - - Ok(()) - } - - fn draw(&mut self, window: &mut Window) -> Result<(), String> { - window.get_gi_mut().clear_window(Color::BLACK)?; - let mut rect = Rectangle::default(); - for mi in &mut self.menu.items { - rect.x = mi.x; - rect.y = mi.y; - rect.w = mi.w; - rect.h = mi.h; - match &mut mi.item_type { - MenuItemType::Button { - text, - text_c, - h_c, - c, - } => { - if mi.is_hover { - window.get_gi_mut().draw_rect(rect, *h_c)?; - } else { - window.get_gi_mut().draw_rect(rect, *c)?; - } - window - .get_font_mut(&self.font)? - .draw(text, 20, rect.x, rect.y, *text_c)?; - } - MenuItemType::AppearingText { - text, - text_idx, - text_size, - text_c, - timer, - } => { - window.get_font_mut(&self.font)?.draw( - if *text_idx < text.len() { - &text[0..*text_idx] - } else { - text - }, - 20, - rect.x, - rect.y, - *text_c, - )?; - } - MenuItemType::InstantText { - text, - text_size, - text_color, - } => { - window.get_font_mut(&self.font)?.draw( - text, - text_size.round() as u32, - rect.x, - rect.y, - *text_color, - )?; - } - MenuItemType::Pause { timer, length } => (), - } - } - self.player_particles.draw(window, Transform::IDENTITY); - window.get_gi_mut().draw_rect_transform( - self.player, - Color::from_rgba(255, 255, 255, (self.player_particles.opacity * 255.0) as u8), - Transform::translate(-self.player.x / 2.0, -self.player.y / 2.0) - * Transform::rotate(self.player_r as f32), - )?; - self.joining_particles.draw(window, Transform::IDENTITY); - for expl_conv_ps in &mut self.expl_conv_p_systems { - expl_conv_ps.draw(window, Transform::IDENTITY); - } - for planet in &mut self.planets { - planet.draw(window, Transform::IDENTITY); - } - - for star in &mut self.stars { - star.draw(&self.i_star, window, Transform::IDENTITY); - } - - for fish in &mut self.fishes { - fish.draw(&self.i_fish, window, Transform::IDENTITY); - } - - // TODO - //if let Some(sl) = &mut self.save_load_notification { - // match sl { - // SaveLoadNotification::Save { text, timer } - // | SaveLoadNotification::Load { text, timer } => { - // if let Some(i) = text { - // let mut c = Color::WHITE; - // c.a = ((*timer / SL_NOTIF_TIME) as f32 * 255.0) as u8; - // let mut image_rect = i.area_rect(); - // image_rect.x = self.camera.x + 20.0; - // image_rect.y = self.camera.y + 20.0; - // window.draw(&image_rect, Blended(i, c)); - // } - // } - // } - //} - - Ok(()) - } -} +mod original_impl; fn main() { // TODO diff --git a/src/original_impl.rs b/src/original_impl.rs new file mode 100644 index 0000000..d37c824 --- /dev/null +++ b/src/original_impl.rs @@ -0,0 +1,1953 @@ +use std::{path::PathBuf, str::FromStr}; + +use crate::agnostic_interface::CameraInterface; +use crate::faux_quicksilver::{Circle, Color, Rectangle, Transform, Vector, Window}; +use rand::prelude::*; +use serde::{Deserialize, Serialize}; + +const WIDTH_F: f32 = 800.0; +const HEIGHT_F: f32 = 600.0; +const MUSIC2_LENGTH: f32 = 2.0 * 60.0 * 1000.0; +const TEXT_RATE: f32 = 100.0; +const PP_GEN_RATE: f32 = 75.0; +const PARTICLE_RAND_VEL_RANGE: f32 = 0.2; +const PARTICLE_RAND_VEL_DIST: f32 = 0.2828427; // dist where x and y = 0.2 +const PARTICLE_RAND_ROT_RANGE: f32 = 0.5; +const JOINING_OPACITY_RATE: f32 = 0.00013; +const JOINING_FAR_DIST: f32 = 700.0; +const JOINING_NEAR_DIST: f32 = 150.0; +const DOUBLE_CLICK_TIME: f32 = 350.0; +const SL_NOTIF_TIME: f32 = 5000.0; +const MAX_MOONS: usize = 5; + +fn interp_sq_inv(x: f32) -> f32 { + if x < 0.0 { + return 0.0; + } else if x > 1.0 { + return 1.0; + } + let y = x - 1.0; + -y * y + 1.0 +} + +fn interp_sq(x: f32) -> f32 { + if x < 0.0 { + return 0.0; + } else if x > 1.0 { + return 1.0; + } + x * x +} + +enum MenuItemType { + Button { + text: &'static str, + text_c: Color, + h_c: Color, + c: Color, + }, + AppearingText { + text: &'static str, + text_idx: usize, + text_size: f32, + text_c: Color, + timer: f32, + }, + InstantText { + text: &'static str, + text_size: f32, + text_color: Color, + }, + Pause { + timer: f32, + length: f32, + }, +} + +struct MenuItem { + x: f32, + y: f32, + w: f32, + h: f32, + item_type: MenuItemType, + is_hover: bool, + is_focus: bool, + is_loaded: bool, +} + +impl MenuItem { + fn is_inside(&self, x: f32, y: f32) -> bool { + x >= self.x && x < self.x + self.w && y >= self.y && y < self.y + self.h + } +} + +struct Menu { + items: Vec, +} + +impl Menu { + fn button( + x: f32, + y: f32, + w: f32, + h: f32, + s: &'static str, + t_color: Color, + box_color: Color, + boxh_color: Color, + first: bool, + ) -> MenuItem { + MenuItem { + x, + y, + w, + h, + item_type: MenuItemType::Button { + text: s, + text_c: t_color, + h_c: boxh_color, + c: box_color, + }, + is_hover: false, + is_focus: false, + is_loaded: !first, + } + } + + fn start() -> Menu { + let item = MenuItem { + x: WIDTH_F / 2.0 - 120.0, + y: 150.0, + w: 240.0, + h: 150.0, + item_type: MenuItemType::Button { + text: "Start the Game", + text_c: Color::WHITE, + h_c: Color::from_rgba(0x66, 0xFF, 0xFF, 255), + c: Color::from_rgba(0x33, 0xDD, 0xDD, 255), + }, + is_hover: false, + is_focus: false, + is_loaded: false, + }; + + Menu { + items: vec![ + item, + Menu::instant_text( + 70.0, + 50.0, + 55.0, + true, + "One And All - A Ludum Dare 45 Entry", + ), + Menu::instant_text( + 25.0, + HEIGHT_F - 100.0, + 30.0, + true, + "Made with quicksilver which is licensed with either", + ), + Menu::instant_text( + 70.0, + HEIGHT_F - 80.0, + 30.0, + true, + "MIT License or Apache License Version 2.0", + ), + Menu::instant_text( + 25.0, + HEIGHT_F - 50.0, + 30.0, + true, + "Uses Clear-Sans which is licensed with Apache License Version 2.0", + ), + ], + } + } + + fn instant_text(x: f32, y: f32, text_size: f32, first: bool, s: &'static str) -> MenuItem { + MenuItem { + x, + y, + w: 0.0, + h: 0.0, + item_type: MenuItemType::InstantText { + text: s, + text_size, + text_color: Color::WHITE, + }, + is_hover: false, + is_focus: false, + is_loaded: !first, + } + } + + fn text(x: f32, y: f32, text_size: f32, first: bool, s: &'static str) -> MenuItem { + MenuItem { + x, + y, + w: 0.0, + h: 0.0, + item_type: MenuItemType::AppearingText { + text: s, + text_size, + text_c: Color::WHITE, + timer: 0.0, + text_idx: 0, + }, + is_hover: false, + is_focus: false, + is_loaded: !first, + } + } + + fn pause(length: f32, first: bool) -> MenuItem { + MenuItem { + x: 0.0, + y: 0.0, + w: 0.0, + h: 0.0, + item_type: MenuItemType::Pause { timer: 0.0, length }, + is_hover: false, + is_focus: false, + is_loaded: !first, + } + } + + fn s_01() -> Menu { + Menu { + items: vec![ + Menu::pause(500.0, true), + Menu::text(50.0, HEIGHT_F - 140.0, 40.0, false, "This is how it is."), + Menu::pause(500.0, false), + Menu::text( + 50.0, + HEIGHT_F - 100.0, + 40.0, + false, + "Nothing is, and everything is nothing.", + ), + Menu::pause(500.0, false), + Menu::text(50.0, HEIGHT_F - 60.0, 40.0, false, "...until you appeared."), + Menu::pause(100.0, false), + Menu::text( + 570.0, + HEIGHT_F - 50.0, + 30.0, + false, + "(Click to continue...)", + ), + ], + } + } + + fn s_02() -> Menu { + Menu { + items: vec![ + Menu::text( + 50.0, + HEIGHT_F - 150.0, + 40.0, + true, + "Just by being, you brought light into existence.", + ), + Menu::pause(500.0, false), + Menu::text( + 50.0, + HEIGHT_F - 110.0, + 40.0, + false, + "What brings you here? What drives you?", + ), + Menu::pause(500.0, false), + Menu::text( + 50.0, + HEIGHT_F - 70.0, + 40.0, + false, + "Please tell me, what fuels you?", + ), + Menu::button( + 100.0, + 30.0, + 200.0, + 85.0, + "Hope", + Color::WHITE, + Color::BLACK, + Color::from_rgba(0x33, 0x33, 0x33, 255), + false, + ), + Menu::button( + 500.0, + 30.0, + 200.0, + 85.0, + "Miracles", + Color::WHITE, + Color::BLACK, + Color::from_rgba(0x33, 0x33, 0x33, 255), + false, + ), + Menu::button( + 100.0, + 150.0, + 200.0, + 85.0, + "Kindness", + Color::WHITE, + Color::BLACK, + Color::from_rgba(0x33, 0x33, 0x33, 255), + false, + ), + Menu::button( + 500.0, + 150.0, + 200.0, + 85.0, + "Determination", + Color::WHITE, + Color::BLACK, + Color::from_rgba(0x33, 0x33, 0x33, 255), + false, + ), + ], + } + } + + // choose hope + fn s_03() -> Menu { + Menu { + items: vec![ + Menu::text( + 50.0, + HEIGHT_F - 170.0, + 40.0, + true, + "Hope... hope that your actions will inspire others..", + ), + Menu::pause(500.0, false), + Menu::text( + 50.0, + HEIGHT_F - 130.0, + 40.0, + false, + "Hope that a brighter future will come tomorrow...", + ), + Menu::pause(500.0, false), + Menu::text( + 50.0, + HEIGHT_F - 90.0, + 40.0, + false, + ".. With your appearance, perhaps it shall...", + ), + ], + } + } + + // choose miracles + fn s_04() -> Menu { + Menu { + items: vec![ + Menu::text( + 30.0, + HEIGHT_F - 170.0, + 40.0, + true, + "Miracles huh?.. I see, then your appearance is special.", + ), + Menu::pause(500.0, false), + Menu::text( + 30.0, + HEIGHT_F - 130.0, + 40.0, + false, + "With your appearance, things may change for the better..", + ), + Menu::pause(500.0, false), + Menu::text( + 30.0, + HEIGHT_F - 90.0, + 40.0, + false, + "Now I am certain that this meeting was not by chance.", + ), + ], + } + } + + // choose kindness + fn s_05() -> Menu { + Menu { + items: vec![ + Menu::text( + 50.0, + HEIGHT_F - 170.0, + 40.0, + true, + "Kindness?.. I am in your debt.", + ), + Menu::pause(250.0, false), + Menu::text( + 50.0, + HEIGHT_F - 130.0, + 40.0, + false, + "It has been a long time since I have encountered", + ), + Menu::text(50.0, HEIGHT_F - 90.0, 40.0, false, "another being..."), + Menu::pause(500.0, false), + Menu::text(270.0, HEIGHT_F - 90.0, 40.0, false, "... Thank you..."), + ], + } + } + + // choose determination + fn s_06() -> Menu { + Menu { + items: vec![ + Menu::text( + 50.0, + HEIGHT_F - 170.0, + 40.0, + true, + "Determination.. I see...", + ), + Menu::pause(500.0, false), + Menu::text( + 400.0, + HEIGHT_F - 170.0, + 40.0, + false, + "I do not doubt it, for it", + ), + Menu::text( + 50.0, + HEIGHT_F - 130.0, + 40.0, + false, + "must have been difficult to come here..", + ), + Menu::pause(500.0, false), + Menu::text( + 50.0, + HEIGHT_F - 90.0, + 40.0, + false, + "Your resolve is evident by your mere presence..", + ), + ], + } + } + + fn s_07() -> Menu { + Menu { + items: vec![ + Menu::text( + 50.0, + HEIGHT_F - 130.0, + 40.0, + true, + "Now that you are here, it must mean a new era of", + ), + Menu::text( + 50.0, + HEIGHT_F - 90.0, + 40.0, + false, + "creation for all that will be.", + ), + Menu::pause(200.0, false), + Menu::text( + 50.0, + HEIGHT_F - 50.0, + 40.0, + false, + "Try double-clicking the void to create something...", + ), + ], + } + } + + fn s_08() -> Menu { + Menu { + items: vec![Menu::instant_text( + 50.0, + HEIGHT_F - 90.0, + 35.0, + true, + "(Try double-clicking now...)", + )], + } + } + + fn s_09() -> Menu { + Menu { + items: vec![ + Menu::pause(400.0, true), + Menu::text( + 50.0, + HEIGHT_F - 140.0, + 40.0, + false, + "A new planet... It has most certainly been a while.", + ), + Menu::pause(500.0, false), + Menu::text( + 50.0, + HEIGHT_F - 100.0, + 40.0, + false, + "Please, go out and create the new universe, and again..", + ), + Menu::pause(300.0, false), + Menu::text(50.0, HEIGHT_F - 60.0, 40.0, false, "Thank you."), + ], + } + } + + fn s_10() -> Menu { + Menu { + items: vec![ + Menu::instant_text( + 20.0, + HEIGHT_F - 40.0, + 20.0, + true, + "Single click to move, Double-click to create something", + ), + Menu::instant_text( + 20.0, + HEIGHT_F - 20.0, + 20.0, + true, + "S - save; L - load (can load from the start); R - reset", + ), + ], + } + } +} + +#[derive(Serialize, Deserialize, Clone)] +struct Particle { + rect: Rectangle, + circle: Circle, + is_rect: bool, + velx: f32, + vely: f32, + velr: f32, + r: f32, + lifetime: f32, + life_timer: f32, +} + +#[derive(Serialize, Deserialize, Clone)] +struct ParticleSystem { + particles: Vec, + spawn_timer: f32, + spawn_time: f32, + lifetime: f32, + host_rect: Rectangle, + host_circle: Circle, + is_rect: bool, + direction: Vector, + color: Color, + opacity: f32, + vel_multiplier: f32, +} + +impl ParticleSystem { + fn new( + spawn_time: f32, + lifetime: f32, + host_rect: Rectangle, + host_circle: Circle, + is_rect: bool, + direction: Vector, + color: Color, + opacity: f32, + vel_multiplier: f32, + ) -> Self { + Self { + particles: Vec::new(), + spawn_timer: 0.0, + spawn_time, + lifetime, + host_rect, + host_circle, + is_rect, + direction, + color, + opacity, + vel_multiplier, + } + } + + fn update(&mut self, dt: f32) { + for i in (0..self.particles.len()).rev() { + self.particles[i].life_timer += dt; + if self.particles[i].life_timer > self.particles[i].lifetime { + self.particles.swap_remove(i); + } else { + if self.is_rect { + self.particles[i].rect.x += self.particles[i].velx * dt as f32; + self.particles[i].rect.y += self.particles[i].vely * dt as f32; + self.particles[i].r += self.particles[i].velr * dt as f32; + } else { + self.particles[i].circle.x += self.particles[i].velx * dt as f32; + self.particles[i].circle.y += self.particles[i].vely * dt as f32; + } + } + } + + self.spawn_timer += dt; + if self.spawn_timer > self.spawn_time { + self.spawn_timer -= self.spawn_time; + self.particles.push(Particle { + rect: self.host_rect, + circle: self.host_circle, + is_rect: self.is_rect, + velx: (rand::thread_rng() + .gen_range(-PARTICLE_RAND_VEL_RANGE, PARTICLE_RAND_VEL_RANGE) + + self.direction.x) + * self.vel_multiplier, + vely: (rand::thread_rng() + .gen_range(-PARTICLE_RAND_VEL_RANGE, PARTICLE_RAND_VEL_RANGE) + + self.direction.y) + * self.vel_multiplier, + // velx: self.direction.x, + // vely: self.direction.y, + velr: rand::thread_rng() + .gen_range(-PARTICLE_RAND_ROT_RANGE, PARTICLE_RAND_ROT_RANGE) + * self.vel_multiplier, + r: rand::thread_rng().gen_range(0.0, 90.0), + lifetime: self.lifetime, + life_timer: 0.0, + }); + } + } + + fn draw(&mut self, window: &mut Window, transform: Transform) { + if self.opacity == 0.0 { + return; + } + for particle in &mut self.particles { + self.color.a = ((1.0 - (particle.life_timer / particle.lifetime) as f32) + * self.opacity + * 255.0) as u8; + if particle.is_rect { + let pre_transform = + Transform::translate(-particle.rect.x / 2.0, -particle.rect.y / 2.0) + * Transform::rotate(particle.r); + window + .get_gi_mut() + .draw_rect_transform(particle.rect, self.color, transform * pre_transform) + .ok(); + } else { + window + .get_gi_mut() + .draw_circle_transform(particle.circle, self.color, transform) + .ok(); + } + } + } + + fn force_spawn(&mut self, count: usize) { + for i in 0..count { + self.particles.push(Particle { + rect: self.host_rect, + circle: self.host_circle, + is_rect: self.is_rect, + velx: (rand::thread_rng() + .gen_range(-PARTICLE_RAND_VEL_RANGE, PARTICLE_RAND_VEL_RANGE) + + self.direction.x) + * self.vel_multiplier, + vely: (rand::thread_rng() + .gen_range(-PARTICLE_RAND_VEL_RANGE, PARTICLE_RAND_VEL_RANGE) + + self.direction.y) + * self.vel_multiplier, + // velx: self.direction.x, + // vely: self.direction.y, + velr: rand::thread_rng() + .gen_range(-PARTICLE_RAND_ROT_RANGE, PARTICLE_RAND_ROT_RANGE) + * self.vel_multiplier, + r: rand::thread_rng().gen_range(0.0, 90.0), + lifetime: self.lifetime, + life_timer: 0.0, + }); + } + } +} + +#[derive(Serialize, Deserialize, Clone)] +struct RotatingParticleSystem { + particle_system: ParticleSystem, + r: f32, + velr: f32, + offset: f32, +} + +impl RotatingParticleSystem { + fn new( + spawn_time: f32, + lifetime: f32, + host_rect: Rectangle, + host_circle: Circle, + is_rect: bool, + direction: Vector, + color: Color, + opacity: f32, + rotation: f32, + velr: f32, + offset: f32, + vel_multiplier: f32, + ) -> Self { + RotatingParticleSystem { + particle_system: ParticleSystem::new( + spawn_time, + lifetime, + host_rect, + host_circle, + is_rect, + direction, + color, + opacity, + vel_multiplier, + ), + r: rotation, + velr, + offset, + } + } + + fn update(&mut self, dt: f32) { + if self.particle_system.is_rect { + let saved_rect = self.particle_system.host_rect; + self.particle_system + .host_rect + .pos_add_vec(Transform::rotate(self.r) * Vector::new(self.offset, 0.0)); + self.particle_system.update(dt); + self.particle_system.host_rect = saved_rect; + } else { + let saved_cir = self.particle_system.host_circle; + self.particle_system + .host_circle + .pos_add_vec(Transform::rotate(self.r) * Vector::new(self.offset, 0.0)); + self.particle_system.update(dt); + self.particle_system.host_circle = saved_cir; + } + self.r += self.velr * dt as f32; + } + + fn draw(&mut self, window: &mut Window, transform: Transform) { + if self.particle_system.opacity == 0.0 { + return; + } + self.particle_system.direction = + Transform::rotate(self.r) * Vector::new(0.0, -PARTICLE_RAND_VEL_DIST); + self.particle_system.draw(window, transform); + if self.particle_system.is_rect { + let mut moved_rect = self.particle_system.host_rect; + moved_rect.pos_add_vec(Transform::rotate(self.r) * Vector::new(self.offset, 0.0)); + let mut solid_color = self.particle_system.color; + solid_color.a = (self.particle_system.opacity * 255.0) as u8; + window + .get_gi_mut() + .draw_rect_transform( + moved_rect, + solid_color, + transform + * Transform::translate(-moved_rect.x / 2.0, -moved_rect.y / 2.0) + * Transform::rotate(self.r * 1.3), + ) + .ok(); + } else { + let mut moved_cir = self.particle_system.host_circle; + moved_cir.pos_add_vec(Transform::rotate(self.r) * Vector::new(self.offset, 0.0)); + let mut solid_color = self.particle_system.color; + solid_color.a = (self.particle_system.opacity * 255.0) as u8; + window + .get_gi_mut() + .draw_circle_transform(moved_cir, solid_color, transform) + .ok(); + } + } +} + +struct ExplConvCircleParticle { + circle: Circle, + offset: f32, + r: f32, +} + +struct ExplConvParticleSystem { + particles: Vec, + lifetime: f32, + host_circle: Circle, + color: Color, + opacity: f32, + life_timer: f32, +} + +impl ExplConvParticleSystem { + fn new(lifetime: f32, host_circle: Circle, color: Color, opacity: f32) -> Self { + ExplConvParticleSystem { + particles: Vec::new(), + lifetime, + host_circle, + color, + opacity, + life_timer: 0.0, + } + } + + fn activate(&mut self, count: usize, offset: f32) { + self.life_timer = 0.0; + for i in 0..count { + self.particles.push(ExplConvCircleParticle { + circle: self.host_circle, + offset, + r: rand::thread_rng().gen_range(0.0, 360.0), + }); + } + } + + // returns true if finished + fn update(&mut self, dt: f32, planets: &mut Vec) -> bool { + self.life_timer += dt; + if self.life_timer >= self.lifetime { + if !self.particles.is_empty() { + self.particles.clear(); + planets.push(Planet::new(self.host_circle, self.color)); + return true; + } + return false; + } + + if self.life_timer < self.lifetime / 2.0 { + let amount = interp_sq_inv((self.life_timer / self.lifetime) as f32 * 2.0); + for particle in &mut self.particles { + let dir = + Transform::rotate(particle.r) * Vector::new(particle.offset * amount, 0.0); + particle.circle.x = dir.x + self.host_circle.x; + particle.circle.y = dir.y + self.host_circle.y; + } + } else { + let amount = 1.0 - interp_sq(((self.life_timer / self.lifetime) as f32 - 0.5) * 2.0); + for particle in &mut self.particles { + let dir = + Transform::rotate(particle.r) * Vector::new(particle.offset * amount, 0.0); + particle.circle.x = dir.x + self.host_circle.x; + particle.circle.y = dir.y + self.host_circle.y; + } + } + return false; + } + + fn draw(&mut self, window: &mut Window, transform: Transform) { + if self.opacity == 0.0 { + return; + } + for particle in &mut self.particles { + self.color.a = (((self.life_timer / self.lifetime) as f32 / 2.0 + 0.5) + * self.opacity + * 255.0) as u8; + window + .get_gi_mut() + .draw_circle_transform(particle.circle, self.color, transform) + .ok(); + } + } +} + +#[derive(Serialize, Deserialize, Clone)] +struct Planet { + circle: Circle, + color: Color, + particle_system: ParticleSystem, + moons: Vec, +} + +impl Planet { + fn new(circle: Circle, color: Color) -> Self { + let mut smaller_circle = circle; + smaller_circle.r /= 4.0; + let mut planet = Planet { + circle, + color, + particle_system: ParticleSystem::new( + rand::thread_rng().gen_range(2000.0, 3800.0), + 900.0, + Rectangle::new(0.0, 0.0, 1.0, 1.0), + circle, + false, + Vector::new(0.0, 0.0), + color, + 1.0, + 0.3, + ), + moons: Vec::with_capacity(MAX_MOONS), + }; + + let r: f32 = rand::thread_rng().gen_range(0.0, 360.0); + let clockwise = rand::thread_rng().gen_bool(0.5); + for i in 0..rand::thread_rng().gen_range(0, MAX_MOONS) { + planet.moons.push(RotatingParticleSystem::new( + rand::thread_rng().gen_range(1000.0, 2600.0), + 600.0, + Rectangle::new(0.0, 0.0, 1.0, 1.0), + smaller_circle, + false, + Vector::new(0.0, 0.0), + color, + 1.0, + r, + if clockwise { + rand::thread_rng().gen_range(0.05, 0.15) + } else { + rand::thread_rng().gen_range(-0.15, -0.05) + }, + rand::thread_rng().gen_range(35.0, 200.0), + 0.2, + )); + } + + planet + } + + fn update(&mut self, dt: f32) { + self.particle_system.host_circle.x = self.circle.x; + self.particle_system.host_circle.y = self.circle.y; + self.particle_system.update(dt); + for moon in &mut self.moons { + moon.particle_system.host_circle.x = self.circle.x; + moon.particle_system.host_circle.y = self.circle.y; + moon.update(dt); + } + } + + fn draw(&mut self, window: &mut Window, transform: Transform) { + self.particle_system.draw(window, transform); + window + .get_gi_mut() + .draw_circle_transform(self.circle, self.color, transform) + .ok(); + for moon in &mut self.moons { + moon.draw(window, transform); + } + } +} + +#[derive(Clone, Serialize, Deserialize)] +struct Star { + color: Color, + particle_system: ParticleSystem, + velr: f32, + r: f32, +} + +impl Star { + fn new(circle: Circle, color: Color, velr: f32, r: f32) -> Self { + let mut star = Star { + color, + particle_system: ParticleSystem::new( + rand::thread_rng().gen_range(80.0, 200.0), + 850.0, + Rectangle::new(0.0, 0.0, 1.0, 1.0), + circle, + false, + Vector::new(0.0, 0.0), + color, + 1.0, + 1.0, + ), + velr, + r, + }; + + if star.color.r < (0.75 * 255.0) as u8 { + star.color.r = (0.75 * 255.0) as u8; + } + if star.color.g < (0.75 * 255.0) as u8 { + star.color.g = (0.75 * 255.0) as u8; + } + if star.color.b < (0.75 * 255.0) as u8 { + star.color.b = (0.75 * 255.0) as u8; + } + star.particle_system + .force_spawn(rand::thread_rng().gen_range(20, 45)); + + star + } + + fn update(&mut self, dt: f32) { + self.particle_system.update(dt); + self.r += self.velr * dt as f32; + } + + fn draw(&mut self, image: &str, window: &mut Window, transform: Transform) { + self.particle_system.draw(window, transform); + let image = window.get_image_mut(image).expect("Should be loaded image"); + let mut image_rect = image.get_wh_rect(); + image_rect.x = self.particle_system.host_circle.x - image_rect.w / 2.0; + image_rect.y = self.particle_system.host_circle.y - image_rect.h / 2.0; + image + .draw_transform( + image_rect.x, + image_rect.y, + self.color, + transform * Transform::rotate(self.r), + ) + .ok(); + } +} + +#[derive(Clone, Serialize, Deserialize)] +struct Fish { + pos: Vector, + r: f32, + swim_time: f32, + swim_timer: f32, + swim_v: f32, + anim_timer: f32, + anim_time: f32, + color: Color, + body_rect: Rectangle, + tail_rect: Rectangle, +} + +enum FishState { + Idle, + Swim, +} + +impl Fish { + fn new(pos: Vector, r: f32, color: Color) -> Self { + let anim_timer = rand::thread_rng().gen_range(800.0, 1000.0); + Self { + pos, + r, + swim_time: 800.0, + swim_timer: 800.0, + swim_v: 0.2, + anim_timer, + anim_time: anim_timer, + color, + body_rect: Rectangle { + x: 0.0, + y: 0.0, + w: 32.0, + h: 16.0, + }, + tail_rect: Rectangle { + x: 32.0, + y: 0.0, + w: 16.0, + h: 16.0, + }, + } + } + + fn set_next(&mut self, state: FishState) { + match state { + FishState::Idle => { + self.swim_time = rand::thread_rng().gen_range(1100.0, 2400.0); + self.swim_timer = self.swim_time; + self.anim_timer = 1600.0; + self.anim_time = 1600.0; + self.swim_v = 0.0; + } + FishState::Swim => { + self.swim_time = rand::thread_rng().gen_range(1400.0, 2300.0); + self.swim_timer = self.swim_time; + self.r = rand::thread_rng().gen_range(0.0, 360.0); + self.anim_timer = rand::thread_rng().gen_range(600.0, 1000.0); + self.anim_time = self.anim_timer; + self.swim_v = (self.anim_timer / 8000.0) as f32; + } + } + } + + fn update(&mut self, dt: f32) { + self.swim_time -= dt; + if self.swim_time < 220.0 { + self.swim_v /= 1.1; + } + if self.swim_time <= 0.0 { + if rand::thread_rng().gen_bool(0.4) { + self.set_next(FishState::Idle); + } else { + self.set_next(FishState::Swim); + } + } + + self.anim_timer -= dt; + if self.anim_timer <= 0.0 { + self.anim_timer = self.anim_time; + } + + self.pos += Transform::rotate(self.r) * Vector::new(self.swim_v, 0.0) * dt as f32; + } + + fn draw(&mut self, i_fish: &str, window: &mut Window, transform: Transform) { + let fish_img = window + .get_image_mut(i_fish) + .expect("\"fish\" Image should be loaded"); + let anim_angle = ((self.anim_timer / self.anim_time) * std::f32::consts::PI * 2.0).sin(); + let mut body_rect = self.body_rect; + body_rect.x = self.pos.x - body_rect.w / 2.0; + body_rect.y = self.pos.y - body_rect.h / 2.0; + let body_tr = + Transform::rotate(anim_angle as f32 * 30.0) * Transform::rotate(self.r + 180.0); + fish_img + .draw_sub_transform( + self.body_rect, + body_rect.x, + body_rect.y, + self.color, + transform * body_tr, + ) + .ok(); + let mut tail_rect = self.tail_rect; + tail_rect.x = self.pos.x - tail_rect.w / 2.0; + tail_rect.y = self.pos.y - tail_rect.h / 2.0; + let anim_angle = ((self.anim_timer / self.anim_time) * std::f32::consts::PI * 2.0 + - std::f32::consts::PI / 3.0) + .sin(); + let tail_tr = body_tr + * Transform::translate(body_rect.x / 1.5, 0.0) + * Transform::translate(-tail_rect.x / 2.0, 0.0) + * Transform::rotate(-anim_angle as f32 * 45.0) + * Transform::translate(tail_rect.x / 2.0, 0.0); + fish_img + .draw_sub_transform( + self.tail_rect, + tail_rect.x, + tail_rect.y, + self.color, + transform * tail_tr, + ) + .ok(); + } +} + +#[derive(Serialize, Deserialize, Clone)] +struct SaveData { + planets: Vec, + stars: Vec, + fishes: Vec, + player: Rectangle, + joining_particles: RotatingParticleSystem, +} + +enum SaveLoadNotification { + Save { text: Option, timer: f32 }, + Load { text: Option, timer: f32 }, +} + +struct GameState { + s_boom: String, + s_get: String, + s_power_up: String, + s_tap: String, + s_speak_m: String, + s_speak_f: String, + font: String, + music2: String, + i_star: String, + i_fish: String, + music_on: bool, + menu: Menu, + state: u32, + state_dirty: bool, + selection_mode: bool, + current_item: Option, + current_finished: bool, + player: Rectangle, + player_r: f32, + player_particles: ParticleSystem, + joining_particles: RotatingParticleSystem, + is_create_mode: bool, + click_release_time: f32, + dbl_click_timeout: Option, + click_time: Option, + click_pos: Vector, + mouse_pos: Vector, + expl_conv_p_systems: Vec, + planets: Vec, + stars: Vec, + fishes: Vec, + camera: Box, + move_to: Vector, + save_load_notification: Option, +} + +impl GameState { + fn new(window: &mut Window) -> Result { + let s_boom = String::from("boom.mp3"); + window.load_sound( + &PathBuf::from_str("static/boom.mp3") + .map_err(|_| String::from("Failed to load \"static/boom.mp3\""))?, + s_boom.clone(), + )?; + let s_get = String::from("get.mp3"); + window.load_sound( + &PathBuf::from_str("static/get.mp3") + .map_err(|_| String::from("Failed to load \"static/get.mp3\""))?, + s_get.clone(), + )?; + let s_power_up = String::from("power_up.mp3"); + window.load_sound( + &PathBuf::from_str("static/power_up.mp3") + .map_err(|_| String::from("Failed to load \"static/power_up.mp3\""))?, + s_power_up.clone(), + )?; + let s_tap = String::from("tap.mp3"); + window.load_sound( + &PathBuf::from_str("static/tap.mp3") + .map_err(|_| String::from("Failed to load \"static/tap.mp3\""))?, + s_tap.clone(), + )?; + let s_speak_m = String::from("speak_m.mp3"); + window.load_sound( + &PathBuf::from_str("static/speak_m.mp3") + .map_err(|_| String::from("Failed to load \"static/speak_m.mp3\""))?, + s_speak_m.clone(), + )?; + let s_speak_f = String::from("speak_f.mp3"); + window.load_sound( + &PathBuf::from_str("static/speak_f.mp3") + .map_err(|_| String::from("Failed to load \"static/speak_f.mp3\""))?, + s_speak_f.clone(), + )?; + + let font = String::from("ClearSans-Regular.ttf"); + window.load_font( + &PathBuf::from_str("static/ClearSans-Regular.ttf") + .map_err(|_| String::from("Failed to load \"static/ClearSans-Regular.ttf\""))?, + font.clone(), + )?; + + let music2 = String::from("music2.mp3"); + window.load_music( + &PathBuf::from_str("static/music2.mp3") + .map_err(|_| String::from("Failed to load \"static/music2.mp3\""))?, + music2.clone(), + )?; + + let i_star = String::from("star.png"); + window.load_image( + &PathBuf::from_str("static/star.png") + .map_err(|_| String::from("Failed to load \"static/star.png\""))?, + i_star.clone(), + )?; + + let i_fish = String::from("fish.png"); + window.load_image( + &PathBuf::from_str("static/fish.png") + .map_err(|_| String::from("Failed to load \"static/fish.png\""))?, + i_fish.clone(), + )?; + + let mut camera = window.get_gi_mut().get_default_camera()?; + camera.set_view(Rectangle { + x: 0.0, + y: 0.0, + w: WIDTH_F, + h: HEIGHT_F, + })?; + Ok(Self { + s_boom, + s_get, + s_power_up, + s_tap, + s_speak_m, + s_speak_f, + font, + music2, + i_star, + i_fish, + music_on: false, + menu: Menu::start(), + state: 0, + state_dirty: false, + selection_mode: true, + current_item: None, + current_finished: true, + player: Rectangle::new(400.0, 300.0, 32.0, 32.0), + player_r: 0.0, + player_particles: ParticleSystem::new( + PP_GEN_RATE, + 1000.0, + Rectangle::new(400.0, 300.0, 32.0, 32.0), + Circle::new(100.0, 100.0, 32.0), + true, + Vector::new(0.0, 0.0), + Color::WHITE, + 0.0, + 1.0, + ), + joining_particles: RotatingParticleSystem::new( + PP_GEN_RATE, + 1000.0, + Rectangle::new(400.0, 300.0, 16.0, 16.0), + Circle::new(100.0, 100.0, 32.0), + true, + Vector::new(0.0, 0.0), + Color::GREEN, + 0.0, + 0.0, + 0.1, + JOINING_FAR_DIST, + 1.0, + ), + is_create_mode: false, + click_release_time: 0.0, + dbl_click_timeout: None, + click_time: None, + click_pos: Vector::new(0.0, 0.0), + mouse_pos: Vector::new(0.0, 0.0), + expl_conv_p_systems: Vec::new(), + planets: Vec::new(), + stars: Vec::new(), + fishes: Vec::new(), + camera, + move_to: Vector::new(400.0, 300.0), + save_load_notification: None, + }) + } + + fn update(&mut self, window: &mut Window) -> Result<(), String> { + let dt = window.get_gi().get_delta_time(); + + // check mouse pos + { + self.mouse_pos = window.get_gi().get_mouse_xy_vec()?; + let mut hovered = false; + for i in 0..self.menu.items.len() { + if self.menu.items[i].is_inside(self.mouse_pos.x, self.mouse_pos.y) { + self.menu.items[i].is_hover = true; + self.current_item = Some(i); + hovered = true; + } else { + self.menu.items[i].is_hover = false; + } + } + if !hovered { + self.current_item = None; + } + } + + // check mouse down + if window.get_gi_mut().get_mouse_down()?.is_none() { + if self.dbl_click_timeout.is_none() { + self.click_release_time = 0.0; + } + } else { + if self.current_finished { + if self.is_create_mode { + if self.click_release_time < DOUBLE_CLICK_TIME { + self.click_release_time = DOUBLE_CLICK_TIME; + self.dbl_click_timeout = Some(0.0); + self.click_time = None; + if self.state == 8 { + let mut expl_conv_system = ExplConvParticleSystem::new( + 1500.0, + Circle::new(self.mouse_pos.x, self.mouse_pos.y, 20.0), + Color::from_rgba(0x99, 0xFF, 0x99, 255), + 1.0, + ); + expl_conv_system.activate(30, 200.0); + self.expl_conv_p_systems.push(expl_conv_system); + self.state = 9; + self.state_dirty = true; + window.get_sound_mut(&self.s_boom)?.play(0.8)?; + } else if self.state == 10 { + let mut rng = rand::thread_rng(); + let rand_out = rng.gen_range(0.0, 1.0); + if rand_out < 0.6 { + // spawn planet + let mut expl_conv_system = ExplConvParticleSystem::new( + rng.gen_range(1200.0, 1600.0), + Circle::new( + self.mouse_pos.x, + self.mouse_pos.y, + rng.gen_range(15.0, 25.0), + ), + Color::from_rgba( + rng.gen_range(0x44, 0xFF), + rng.gen_range(0x44, 0xFF), + rng.gen_range(0x44, 0xFF), + 255, + ), + 1.0, + ); + expl_conv_system + .activate(rng.gen_range(13, 40), rng.gen_range(150.0, 300.0)); + self.expl_conv_p_systems.push(expl_conv_system); + } else if rand_out < 0.85 { + // spawn star + let rot_clockwise = rng.gen_bool(0.5); + self.stars.push(Star::new( + Circle::new( + self.mouse_pos.x, + self.mouse_pos.y, + rng.gen_range(3.0, 7.0), + ), + Color::from_rgba( + rng.gen_range(0x58, 0xFF), + rng.gen_range(0x58, 0xFF), + rng.gen_range(0x58, 0xFF), + 255, + ), + if rot_clockwise { + rng.gen_range(0.1, 0.3) + } else { + rng.gen_range(-0.3, -0.1) + }, + rng.gen_range(0.0, 90.0), + )); + } else { + // spawn fish + for i in 0..rng.gen_range(1, 4) { + self.fishes.push(Fish::new( + self.mouse_pos, + rng.gen_range(0.0, 360.0), + Color::from_rgba( + rng.gen_range(0x44, 0xFF), + rng.gen_range(0x44, 0xFF), + rng.gen_range(0x44, 0xFF), + 255, + ), + )); + } + } + window.get_sound_mut(&self.s_boom)?.play(0.8)?; + } + } else if self.state == 10 { + self.click_time = Some(0.0); + self.click_pos = self.mouse_pos; + } + } else if self.selection_mode { + if let Some(idx) = self.current_item { + match self.state { + 0 => { + self.state += 1; + self.state_dirty = true; + } + 2 => { + if idx == 5 { + // hope + self.state = 3; + self.state_dirty = true; + self.joining_particles.particle_system.color = + Color::from_rgba(0xAA, 0xCC, 0xFF, 255); + } else if idx == 6 { + // miracles + self.state = 4; + self.state_dirty = true; + self.joining_particles.particle_system.color = + Color::from_rgba(0xFF, 0xFF, 0xAA, 255); + } else if idx == 7 { + // kindness + self.state = 5; + self.state_dirty = true; + self.joining_particles.particle_system.color = + Color::from_rgba(0xBB, 0xFF, 0xBB, 255); + } else { + // determination + self.state = 6; + self.state_dirty = true; + self.joining_particles.particle_system.color = + Color::from_rgba(0xFF, 0xAA, 0xAA, 255); + } + window.get_sound_mut(&self.s_get)?.play(0.7)?; + } + _ => { + self.state = 0; + self.state_dirty = true; + } + } + } + } else { + match self.state { + 0 | 1 => self.state += 1, + 3 | 4 | 5 | 6 => self.state = 7, + 7 => self.state = 8, + 9 => self.state = 10, + _ => self.state = 0, + } + self.state_dirty = true; + } + } else { + for mi in &mut self.menu.items { + match &mut mi.item_type { + MenuItemType::AppearingText { + text, + text_idx, + text_size, + text_c, + timer, + } => { + *text_idx = text.len(); + } + MenuItemType::Button { + text, + text_c, + h_c, + c, + } => { + //let style = FontStyle::new(42.0, *text_c); + } + MenuItemType::Pause { timer, length } => (), + MenuItemType::InstantText { + text, + text_size, + text_color, + } => {} + } + mi.is_loaded = true; + } + self.current_finished = true; + } + } + + // check pressed keys + if window.get_gi_mut().get_key_pressed('s')? { + if self.state == 10 { + let save_data = SaveData { + planets: self.planets.clone(), + stars: self.stars.clone(), + fishes: self.fishes.clone(), + player: self.player.clone(), + joining_particles: self.joining_particles.clone(), + }; + // TODO + //save("OneAndAll_LD45", "slot0", &save_data)?; + self.save_load_notification = Some(SaveLoadNotification::Save { + text: None, + timer: SL_NOTIF_TIME, + }); + } + } else if window.get_gi_mut().get_key_pressed('l')? { + // TODO + //let load_result = load::("OneAndAll_LD45", "slot0"); + //if let Ok(save_data) = load_result { + // self.planets = save_data.planets; + // self.stars = save_data.stars; + // self.fishes = save_data.fishes; + // self.player = save_data.player; + // self.joining_particles = save_data.joining_particles; + // self.expl_conv_p_systems.clear(); + // self.move_to = Vector { + // x: self.player.x, + // y: self.player.y, + // }; + // self.camera.set_view_xy( + // self.player.x - WIDTH_F / 2.0, + // self.player.y - HEIGHT_F / 2.0, + // ); + // self.dbl_click_timeout = None; + // self.click_time = None; + // self.click_release_time = DOUBLE_CLICK_TIME; + + // self.state = 10; + // self.state_dirty = true; + // self.save_load_notification = Some(SaveLoadNotification::Load { + // text: None, + // timer: SL_NOTIF_TIME, + // }); + //} + } else if window.get_gi_mut().get_key_pressed('r')? { + if self.state == 10 { + self.state = 0; + self.state_dirty = true; + } + } + + self.click_release_time += dt; + if let Some(t) = &mut self.click_time { + *t += dt; + if *t > DOUBLE_CLICK_TIME { + self.move_to = self.click_pos; // - Vector::new(WIDTH_F / 2.0, HEIGHT_F / 2.0); + } + } + + if let Some(t) = &mut self.dbl_click_timeout { + *t += dt; + if *t > 300.0 { + self.dbl_click_timeout = None; + } + } + + self.player.x += (self.move_to.x - self.player.x) / 20.0; + self.player.y += (self.move_to.y - self.player.y) / 20.0; + self.player_particles.host_rect.x = self.player.x; + self.player_particles.host_rect.y = self.player.y; + self.joining_particles.particle_system.host_rect.x += + (self.player.x - self.joining_particles.particle_system.host_rect.x) / 30.0; + self.joining_particles.particle_system.host_rect.y += + (self.player.y - self.joining_particles.particle_system.host_rect.y) / 30.0; + let (cx, cy) = self.camera.get_view_xy()?; + self.camera.set_view_xy( + (self.player.x - WIDTH_F / 2.0 - cx) / 40.0, + (self.player.y - HEIGHT_F / 2.0 - cy) / 40.0, + )?; + window.get_gi_mut().set_camera(&self.camera)?; + + self.player_r += dt / 10.0; + + if self.state_dirty { + self.state_dirty = false; + if self.state > 1 && !self.music_on { + let music = window.get_music_mut(&self.music2)?; + music.set_loop(true)?; + music.play(0.5)?; + self.music_on = true; + } + match self.state { + 1 => { + self.menu = Menu::s_01(); + self.current_finished = false; + self.selection_mode = false; + } + 2 => { + self.menu = Menu::s_02(); + self.current_finished = false; + self.selection_mode = true; + } + 3 => { + self.menu = Menu::s_03(); + self.current_finished = false; + self.selection_mode = false; + } + 4 => { + self.menu = Menu::s_04(); + self.current_finished = false; + self.selection_mode = false; + } + 5 => { + self.menu = Menu::s_05(); + self.current_finished = false; + self.selection_mode = false; + } + 6 => { + self.menu = Menu::s_06(); + self.current_finished = false; + self.selection_mode = false; + } + 7 => { + self.menu = Menu::s_07(); + self.current_finished = false; + self.selection_mode = false; + } + 8 => { + self.menu = Menu::s_08(); + self.current_finished = true; + self.selection_mode = false; + self.is_create_mode = true; + } + 9 => { + self.menu = Menu::s_09(); + self.current_finished = false; + self.selection_mode = false; + self.is_create_mode = false; + } + 10 => { + self.menu = Menu::s_10(); + self.current_finished = false; + self.selection_mode = false; + self.is_create_mode = true; + } + _ => { + self.menu = Menu::start(); + self.current_item = None; + self.selection_mode = true; + self.is_create_mode = false; + self.state = 0; + self.player_particles.opacity = 0.0; + self.joining_particles.particle_system.opacity = 0.0; + self.expl_conv_p_systems.clear(); + self.planets.clear(); + self.stars.clear(); + self.fishes.clear(); + self.player.x = WIDTH_F / 2.0; + self.player.y = HEIGHT_F / 2.0; + self.move_to = Vector::new(WIDTH_F / 2.0, HEIGHT_F / 2.0); + self.camera.set_view_xy(0.0, 0.0)?; + self.click_time = None; + } + } + } + + if self.joining_particles.particle_system.opacity < 1.0 && self.state > 2 { + self.joining_particles.particle_system.opacity += JOINING_OPACITY_RATE * dt as f32; + if self.joining_particles.particle_system.opacity > 1.0 { + self.joining_particles.particle_system.opacity = 1.0; + } + self.joining_particles.offset = + (1.0 - self.joining_particles.particle_system.opacity / 1.0) * JOINING_FAR_DIST + + self.joining_particles.particle_system.opacity / 1.0 * JOINING_NEAR_DIST; + } + + if self.player_particles.opacity < 1.0 && self.state > 1 { + self.player_particles.opacity += dt as f32 / 7000.0; + if self.player_particles.opacity > 1.0 { + self.player_particles.opacity = 1.0; + } + } + + if self.music_on { + } else if self.state == 10 { + let mut music_on = false; + let music = window.get_music_mut(&self.music2)?; + music.set_loop(true)?; + music.play(0.5)?; + self.music_on = true; + } + + for i in 0..self.menu.items.len() { + let mi: &mut MenuItem = &mut self.menu.items[i]; + if !mi.is_loaded { + match &mut mi.item_type { + MenuItemType::Button { + text, + text_c, + h_c, + c, + } => { + //self.font.execute(|font| { + // let style = FontStyle::new(42.0, *text_c); + // *text_image = Some(font.render(text, &style)?); + // Ok(()) + //})?; + //if text_image.is_some() { + mi.is_loaded = true; + if i + 1 < self.menu.items.len() { + self.menu.items[i + 1].is_loaded = false; + } else { + self.current_finished = true; + } + //} + } + MenuItemType::AppearingText { + text, + text_idx, + text_size, + text_c, + timer, + } => { + *timer += dt; + if *timer > TEXT_RATE { + *timer -= TEXT_RATE; + *text_idx += 1; + if *text_idx >= text.len() { + mi.is_loaded = true; + if i + 1 < self.menu.items.len() { + self.menu.items[i + 1].is_loaded = false; + } else { + self.current_finished = true; + } + continue; + } + //self.font.execute(|font| { + // let style = FontStyle::new(*text_size, *text_c); + // *text_image = Some(font.render(current_text, &style)?); + // Ok(()) + //})?; + } + } + MenuItemType::Pause { timer, length } => { + *timer += dt; + if timer > length { + mi.is_loaded = true; + if i + 1 < self.menu.items.len() { + self.menu.items[i + 1].is_loaded = false; + } else { + self.current_finished = true; + } + } + } + MenuItemType::InstantText { + text, + text_size, + text_color, + } => { + //if text_image.is_none() { + // self.font.execute(|f| { + // let style = FontStyle::new(*text_size, *text_color); + // *text_image = Some(f.render(text, &style)?); + // Ok(()) + // })?; + //} + //if text_image.is_some() { + mi.is_loaded = true; + if i + 1 < self.menu.items.len() { + self.menu.items[i + 1].is_loaded = false; + } else { + self.current_finished = true; + } + //} + } + } + } + } + + self.player_particles.host_rect = self.player; + self.player_particles.update(dt); + self.joining_particles.update(dt); + + for i in (0..self.expl_conv_p_systems.len()).rev() { + if self.expl_conv_p_systems[i].update(dt, &mut self.planets) { + self.expl_conv_p_systems.swap_remove(i); + } + } + for planet in &mut self.planets { + planet.update(dt); + } + for star in &mut self.stars { + star.update(dt); + } + + if let Some(sl) = &mut self.save_load_notification { + match sl { + SaveLoadNotification::Save { text, timer } => { + *timer -= dt; + if *timer <= 0.0 { + self.save_load_notification = None; + } else if text.is_none() { + //self.font.execute(|f| { + // *text = Some( + // f.render("Saved the Game", &FontStyle::new(45.0, Color::WHITE))?, + // ); + // Ok(()) + //})?; + } + } + SaveLoadNotification::Load { text, timer } => { + *timer -= dt; + if *timer <= 0.0 { + self.save_load_notification = None; + } else if text.is_none() { + //self.font.execute(|f| { + // *text = Some( + // f.render("Loaded the Game", &FontStyle::new(45.0, Color::WHITE))?, + // ); + // Ok(()) + //})?; + } + } + } + } + + for fish in &mut self.fishes { + fish.update(dt); + } + + Ok(()) + } + + fn draw(&mut self, window: &mut Window) -> Result<(), String> { + window.get_gi_mut().clear_window(Color::BLACK)?; + let mut rect = Rectangle::default(); + for mi in &mut self.menu.items { + rect.x = mi.x; + rect.y = mi.y; + rect.w = mi.w; + rect.h = mi.h; + match &mut mi.item_type { + MenuItemType::Button { + text, + text_c, + h_c, + c, + } => { + if mi.is_hover { + window.get_gi_mut().draw_rect(rect, *h_c)?; + } else { + window.get_gi_mut().draw_rect(rect, *c)?; + } + window + .get_font_mut(&self.font)? + .draw(text, 20, rect.x, rect.y, *text_c)?; + } + MenuItemType::AppearingText { + text, + text_idx, + text_size, + text_c, + timer, + } => { + window.get_font_mut(&self.font)?.draw( + if *text_idx < text.len() { + &text[0..*text_idx] + } else { + text + }, + 20, + rect.x, + rect.y, + *text_c, + )?; + } + MenuItemType::InstantText { + text, + text_size, + text_color, + } => { + window.get_font_mut(&self.font)?.draw( + text, + text_size.round() as u32, + rect.x, + rect.y, + *text_color, + )?; + } + MenuItemType::Pause { timer, length } => (), + } + } + self.player_particles.draw(window, Transform::IDENTITY); + window.get_gi_mut().draw_rect_transform( + self.player, + Color::from_rgba(255, 255, 255, (self.player_particles.opacity * 255.0) as u8), + Transform::translate(-self.player.x / 2.0, -self.player.y / 2.0) + * Transform::rotate(self.player_r as f32), + )?; + self.joining_particles.draw(window, Transform::IDENTITY); + for expl_conv_ps in &mut self.expl_conv_p_systems { + expl_conv_ps.draw(window, Transform::IDENTITY); + } + for planet in &mut self.planets { + planet.draw(window, Transform::IDENTITY); + } + + for star in &mut self.stars { + star.draw(&self.i_star, window, Transform::IDENTITY); + } + + for fish in &mut self.fishes { + fish.draw(&self.i_fish, window, Transform::IDENTITY); + } + + // TODO + //if let Some(sl) = &mut self.save_load_notification { + // match sl { + // SaveLoadNotification::Save { text, timer } + // | SaveLoadNotification::Load { text, timer } => { + // if let Some(i) = text { + // let mut c = Color::WHITE; + // c.a = ((*timer / SL_NOTIF_TIME) as f32 * 255.0) as u8; + // let mut image_rect = i.area_rect(); + // image_rect.x = self.camera.x + 20.0; + // image_rect.y = self.camera.y + 20.0; + // window.draw(&image_rect, Blended(i, c)); + // } + // } + // } + //} + + Ok(()) + } +} From c9bd639732a424164a03536dbcd1dc78fa5be358 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Sun, 19 Feb 2023 15:51:37 +0900 Subject: [PATCH 11/29] Begin work on Raylib impl of agnostic_interface --- Cargo.lock | 196 +++- Cargo.toml | 7 + build.rs | 29 + raylib/raylib.h | 1568 +++++++++++++++++++++++++ src/agnostic_interface.rs | 2 + src/agnostic_interface/raylib_impl.rs | 140 +++ 6 files changed, 1937 insertions(+), 5 deletions(-) create mode 100644 build.rs create mode 100644 raylib/raylib.h create mode 100644 src/agnostic_interface/raylib_impl.rs diff --git a/Cargo.lock b/Cargo.lock index a9ffcd4..91bff41 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,12 +2,66 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "bindgen" +version = "0.64.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4243e6031260db77ede97ad86c27e501d646a27ab57b59a574f725d98ab1fb4" +dependencies = [ + "bitflags", + "cexpr", + "clang-sys", + "lazy_static", + "lazycell", + "log", + "peeking_take_while", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn", + "which", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "clang-sys" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ed9a53e5d4d9c573ae844bfac6872b159cb1d1585a83b29e7a64b7eef7332a" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "either" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" + [[package]] name = "getrandom" version = "0.1.16" @@ -19,10 +73,29 @@ dependencies = [ "wasi", ] +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[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 = "ld45_one_and_all" version = "0.1.1" dependencies = [ + "bindgen", "rand", "serde", ] @@ -33,6 +106,59 @@ version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "once_cell" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" + +[[package]] +name = "peeking_take_while" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" + [[package]] name = "ppv-lite86" version = "0.2.16" @@ -41,9 +167,9 @@ checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" [[package]] name = "proc-macro2" -version = "1.0.39" +version = "1.0.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f" +checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" dependencies = [ "unicode-ident", ] @@ -98,6 +224,27 @@ dependencies = [ "rand_core", ] +[[package]] +name = "regex" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" +dependencies = [ + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "serde" version = "1.0.137" @@ -119,10 +266,16 @@ dependencies = [ ] [[package]] -name = "syn" -version = "1.0.96" +name = "shlex" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0748dd251e24453cb8717f0354206b91557e4ec8703673a4b30208f2abaf1ebf" +checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" + +[[package]] +name = "syn" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" dependencies = [ "proc-macro2", "quote", @@ -140,3 +293,36 @@ name = "wasi" version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "which" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" +dependencies = [ + "either", + "libc", + "once_cell", +] + +[[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" diff --git a/Cargo.toml b/Cargo.toml index 876284b..9842d9f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,3 +10,10 @@ edition = "2018" #quicksilver = { version = "0.3.19", default-features = false, features = [ "fonts", "saving", "sounds" ] } rand = "0.7.2" serde = { version = "1.0.101", features = ["derive"] } + +[build-dependencies] +bindgen = "0.64" + +[features] +default = [] +no_link_raylib = [] diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..989e72a --- /dev/null +++ b/build.rs @@ -0,0 +1,29 @@ +extern crate bindgen; + +use std::env; +use std::path::PathBuf; + +#[cfg(not(feature = "no_link_raylib"))] +fn linking_raylib() { + println!("cargo:rustc-link-lib=raylib"); +} + +#[cfg(feature = "no_link_raylib")] +fn linking_raylib() { +} + +fn main() { + linking_raylib(); + println!("cargo:rerun-if-changed=raylib/raylib.h"); + + let bindings = bindgen::Builder::default() + .header("raylib/raylib.h") + .parse_callbacks(Box::new(bindgen::CargoCallbacks)) + .generate() + .expect("Unable to generate bindings"); + + let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); + bindings + .write_to_file(out_path.join("raylib_bindings.rs")) + .expect("Couldn't write bindings!"); +} diff --git a/raylib/raylib.h b/raylib/raylib.h new file mode 100644 index 0000000..8a5d50c --- /dev/null +++ b/raylib/raylib.h @@ -0,0 +1,1568 @@ +/********************************************************************************************** +* +* raylib v4.2 - A simple and easy-to-use library to enjoy videogames programming (www.raylib.com) +* +* FEATURES: +* - NO external dependencies, all required libraries included with raylib +* - Multiplatform: Windows, Linux, FreeBSD, OpenBSD, NetBSD, DragonFly, +* MacOS, Haiku, Android, Raspberry Pi, DRM native, HTML5. +* - Written in plain C code (C99) in PascalCase/camelCase notation +* - Hardware accelerated with OpenGL (1.1, 2.1, 3.3, 4.3 or ES2 - choose at compile) +* - Unique OpenGL abstraction layer (usable as standalone module): [rlgl] +* - Multiple Fonts formats supported (TTF, XNA fonts, AngelCode fonts) +* - Outstanding texture formats support, including compressed formats (DXT, ETC, ASTC) +* - Full 3d support for 3d Shapes, Models, Billboards, Heightmaps and more! +* - Flexible Materials system, supporting classic maps and PBR maps +* - Animated 3D models supported (skeletal bones animation) (IQM) +* - Shaders support, including Model shaders and Postprocessing shaders +* - Powerful math module for Vector, Matrix and Quaternion operations: [raymath] +* - Audio loading and playing with streaming support (WAV, OGG, MP3, FLAC, XM, MOD) +* - VR stereo rendering with configurable HMD device parameters +* - Bindings to multiple programming languages available! +* +* NOTES: +* - One default Font is loaded on InitWindow()->LoadFontDefault() [core, text] +* - One default Texture2D is loaded on rlglInit(), 1x1 white pixel R8G8B8A8 [rlgl] (OpenGL 3.3 or ES2) +* - One default Shader is loaded on rlglInit()->rlLoadShaderDefault() [rlgl] (OpenGL 3.3 or ES2) +* - One default RenderBatch is loaded on rlglInit()->rlLoadRenderBatch() [rlgl] (OpenGL 3.3 or ES2) +* +* DEPENDENCIES (included): +* [rcore] rglfw (Camilla Löwy - github.com/glfw/glfw) for window/context management and input (PLATFORM_DESKTOP) +* [rlgl] glad (David Herberth - github.com/Dav1dde/glad) for OpenGL 3.3 extensions loading (PLATFORM_DESKTOP) +* [raudio] miniaudio (David Reid - github.com/mackron/miniaudio) for audio device/context management +* +* OPTIONAL DEPENDENCIES (included): +* [rcore] msf_gif (Miles Fogle) for GIF recording +* [rcore] sinfl (Micha Mettke) for DEFLATE decompression algorithm +* [rcore] sdefl (Micha Mettke) for DEFLATE compression algorithm +* [rtextures] stb_image (Sean Barret) for images loading (BMP, TGA, PNG, JPEG, HDR...) +* [rtextures] stb_image_write (Sean Barret) for image writing (BMP, TGA, PNG, JPG) +* [rtextures] stb_image_resize (Sean Barret) for image resizing algorithms +* [rtext] stb_truetype (Sean Barret) for ttf fonts loading +* [rtext] stb_rect_pack (Sean Barret) for rectangles packing +* [rmodels] par_shapes (Philip Rideout) for parametric 3d shapes generation +* [rmodels] tinyobj_loader_c (Syoyo Fujita) for models loading (OBJ, MTL) +* [rmodels] cgltf (Johannes Kuhlmann) for models loading (glTF) +* [raudio] dr_wav (David Reid) for WAV audio file loading +* [raudio] dr_flac (David Reid) for FLAC audio file loading +* [raudio] dr_mp3 (David Reid) for MP3 audio file loading +* [raudio] stb_vorbis (Sean Barret) for OGG audio loading +* [raudio] jar_xm (Joshua Reisenauer) for XM audio module loading +* [raudio] jar_mod (Joshua Reisenauer) for MOD audio module loading +* +* +* LICENSE: zlib/libpng +* +* raylib is licensed under an unmodified zlib/libpng license, which is an OSI-certified, +* BSD-like license that allows static linking with closed source software: +* +* Copyright (c) 2013-2022 Ramon Santamaria (@raysan5) +* +* This software is provided "as-is", without any express or implied warranty. In no event +* will the authors be held liable for any damages arising from the use of this software. +* +* Permission is granted to anyone to use this software for any purpose, including commercial +* applications, and to alter it and redistribute it freely, subject to the following restrictions: +* +* 1. The origin of this software must not be misrepresented; you must not claim that you +* wrote the original software. If you use this software in a product, an acknowledgment +* in the product documentation would be appreciated but is not required. +* +* 2. Altered source versions must be plainly marked as such, and must not be misrepresented +* as being the original software. +* +* 3. This notice may not be removed or altered from any source distribution. +* +**********************************************************************************************/ + +#ifndef RAYLIB_H +#define RAYLIB_H + +#include // Required for: va_list - Only used by TraceLogCallback + +#define RAYLIB_VERSION "4.2" + +// Function specifiers in case library is build/used as a shared library (Windows) +// NOTE: Microsoft specifiers to tell compiler that symbols are imported/exported from a .dll +#if defined(_WIN32) + #if defined(BUILD_LIBTYPE_SHARED) + #if defined(__TINYC__) + #define __declspec(x) __attribute__((x)) + #endif + #define RLAPI __declspec(dllexport) // We are building the library as a Win32 shared library (.dll) + #elif defined(USE_LIBTYPE_SHARED) + #define RLAPI __declspec(dllimport) // We are using the library as a Win32 shared library (.dll) + #endif +#endif + +#ifndef RLAPI + #define RLAPI // Functions defined as 'extern' by default (implicit specifiers) +#endif + +//---------------------------------------------------------------------------------- +// Some basic Defines +//---------------------------------------------------------------------------------- +#ifndef PI + #define PI 3.14159265358979323846f +#endif +#ifndef DEG2RAD + #define DEG2RAD (PI/180.0f) +#endif +#ifndef RAD2DEG + #define RAD2DEG (180.0f/PI) +#endif + +// Allow custom memory allocators +// NOTE: Require recompiling raylib sources +#ifndef RL_MALLOC + #define RL_MALLOC(sz) malloc(sz) +#endif +#ifndef RL_CALLOC + #define RL_CALLOC(n,sz) calloc(n,sz) +#endif +#ifndef RL_REALLOC + #define RL_REALLOC(ptr,sz) realloc(ptr,sz) +#endif +#ifndef RL_FREE + #define RL_FREE(ptr) free(ptr) +#endif + +// NOTE: MSVC C++ compiler does not support compound literals (C99 feature) +// Plain structures in C++ (without constructors) can be initialized with { } +#if defined(__cplusplus) + #define CLITERAL(type) type +#else + #define CLITERAL(type) (type) +#endif + +// NOTE: We set some defines with some data types declared by raylib +// Other modules (raymath, rlgl) also require some of those types, so, +// to be able to use those other modules as standalone (not depending on raylib) +// this defines are very useful for internal check and avoid type (re)definitions +#define RL_COLOR_TYPE +#define RL_RECTANGLE_TYPE +#define RL_VECTOR2_TYPE +#define RL_VECTOR3_TYPE +#define RL_VECTOR4_TYPE +#define RL_QUATERNION_TYPE +#define RL_MATRIX_TYPE + +// Some Basic Colors +// NOTE: Custom raylib color palette for amazing visuals on WHITE background +#define LIGHTGRAY CLITERAL(Color){ 200, 200, 200, 255 } // Light Gray +#define GRAY CLITERAL(Color){ 130, 130, 130, 255 } // Gray +#define DARKGRAY CLITERAL(Color){ 80, 80, 80, 255 } // Dark Gray +#define YELLOW CLITERAL(Color){ 253, 249, 0, 255 } // Yellow +#define GOLD CLITERAL(Color){ 255, 203, 0, 255 } // Gold +#define ORANGE CLITERAL(Color){ 255, 161, 0, 255 } // Orange +#define PINK CLITERAL(Color){ 255, 109, 194, 255 } // Pink +#define RED CLITERAL(Color){ 230, 41, 55, 255 } // Red +#define MAROON CLITERAL(Color){ 190, 33, 55, 255 } // Maroon +#define GREEN CLITERAL(Color){ 0, 228, 48, 255 } // Green +#define LIME CLITERAL(Color){ 0, 158, 47, 255 } // Lime +#define DARKGREEN CLITERAL(Color){ 0, 117, 44, 255 } // Dark Green +#define SKYBLUE CLITERAL(Color){ 102, 191, 255, 255 } // Sky Blue +#define BLUE CLITERAL(Color){ 0, 121, 241, 255 } // Blue +#define DARKBLUE CLITERAL(Color){ 0, 82, 172, 255 } // Dark Blue +#define PURPLE CLITERAL(Color){ 200, 122, 255, 255 } // Purple +#define VIOLET CLITERAL(Color){ 135, 60, 190, 255 } // Violet +#define DARKPURPLE CLITERAL(Color){ 112, 31, 126, 255 } // Dark Purple +#define BEIGE CLITERAL(Color){ 211, 176, 131, 255 } // Beige +#define BROWN CLITERAL(Color){ 127, 106, 79, 255 } // Brown +#define DARKBROWN CLITERAL(Color){ 76, 63, 47, 255 } // Dark Brown + +#define WHITE CLITERAL(Color){ 255, 255, 255, 255 } // White +#define BLACK CLITERAL(Color){ 0, 0, 0, 255 } // Black +#define BLANK CLITERAL(Color){ 0, 0, 0, 0 } // Blank (Transparent) +#define MAGENTA CLITERAL(Color){ 255, 0, 255, 255 } // Magenta +#define RAYWHITE CLITERAL(Color){ 245, 245, 245, 255 } // My own White (raylib logo) + +//---------------------------------------------------------------------------------- +// Structures Definition +//---------------------------------------------------------------------------------- +// Boolean type +#if (defined(__STDC__) && __STDC_VERSION__ >= 199901L) || (defined(_MSC_VER) && _MSC_VER >= 1800) + #include +#elif !defined(__cplusplus) && !defined(bool) + typedef enum bool { false = 0, true = !false } bool; + #define RL_BOOL_TYPE +#endif + +// Vector2, 2 components +typedef struct Vector2 { + float x; // Vector x component + float y; // Vector y component +} Vector2; + +// Vector3, 3 components +typedef struct Vector3 { + float x; // Vector x component + float y; // Vector y component + float z; // Vector z component +} Vector3; + +// Vector4, 4 components +typedef struct Vector4 { + float x; // Vector x component + float y; // Vector y component + float z; // Vector z component + float w; // Vector w component +} Vector4; + +// Quaternion, 4 components (Vector4 alias) +typedef Vector4 Quaternion; + +// Matrix, 4x4 components, column major, OpenGL style, right handed +typedef struct Matrix { + float m0, m4, m8, m12; // Matrix first row (4 components) + float m1, m5, m9, m13; // Matrix second row (4 components) + float m2, m6, m10, m14; // Matrix third row (4 components) + float m3, m7, m11, m15; // Matrix fourth row (4 components) +} Matrix; + +// Color, 4 components, R8G8B8A8 (32bit) +typedef struct Color { + unsigned char r; // Color red value + unsigned char g; // Color green value + unsigned char b; // Color blue value + unsigned char a; // Color alpha value +} Color; + +// Rectangle, 4 components +typedef struct Rectangle { + float x; // Rectangle top-left corner position x + float y; // Rectangle top-left corner position y + float width; // Rectangle width + float height; // Rectangle height +} Rectangle; + +// Image, pixel data stored in CPU memory (RAM) +typedef struct Image { + void *data; // Image raw data + int width; // Image base width + int height; // Image base height + int mipmaps; // Mipmap levels, 1 by default + int format; // Data format (PixelFormat type) +} Image; + +// Texture, tex data stored in GPU memory (VRAM) +typedef struct Texture { + unsigned int id; // OpenGL texture id + int width; // Texture base width + int height; // Texture base height + int mipmaps; // Mipmap levels, 1 by default + int format; // Data format (PixelFormat type) +} Texture; + +// Texture2D, same as Texture +typedef Texture Texture2D; + +// TextureCubemap, same as Texture +typedef Texture TextureCubemap; + +// RenderTexture, fbo for texture rendering +typedef struct RenderTexture { + unsigned int id; // OpenGL framebuffer object id + Texture texture; // Color buffer attachment texture + Texture depth; // Depth buffer attachment texture +} RenderTexture; + +// RenderTexture2D, same as RenderTexture +typedef RenderTexture RenderTexture2D; + +// NPatchInfo, n-patch layout info +typedef struct NPatchInfo { + Rectangle source; // Texture source rectangle + int left; // Left border offset + int top; // Top border offset + int right; // Right border offset + int bottom; // Bottom border offset + int layout; // Layout of the n-patch: 3x3, 1x3 or 3x1 +} NPatchInfo; + +// GlyphInfo, font characters glyphs info +typedef struct GlyphInfo { + int value; // Character value (Unicode) + int offsetX; // Character offset X when drawing + int offsetY; // Character offset Y when drawing + int advanceX; // Character advance position X + Image image; // Character image data +} GlyphInfo; + +// Font, font texture and GlyphInfo array data +typedef struct Font { + int baseSize; // Base size (default chars height) + int glyphCount; // Number of glyph characters + int glyphPadding; // Padding around the glyph characters + Texture2D texture; // Texture atlas containing the glyphs + Rectangle *recs; // Rectangles in texture for the glyphs + GlyphInfo *glyphs; // Glyphs info data +} Font; + +// Camera, defines position/orientation in 3d space +typedef struct Camera3D { + Vector3 position; // Camera position + Vector3 target; // Camera target it looks-at + Vector3 up; // Camera up vector (rotation over its axis) + float fovy; // Camera field-of-view apperture in Y (degrees) in perspective, used as near plane width in orthographic + int projection; // Camera projection: CAMERA_PERSPECTIVE or CAMERA_ORTHOGRAPHIC +} Camera3D; + +typedef Camera3D Camera; // Camera type fallback, defaults to Camera3D + +// Camera2D, defines position/orientation in 2d space +typedef struct Camera2D { + Vector2 offset; // Camera offset (displacement from target) + Vector2 target; // Camera target (rotation and zoom origin) + float rotation; // Camera rotation in degrees + float zoom; // Camera zoom (scaling), should be 1.0f by default +} Camera2D; + +// Mesh, vertex data and vao/vbo +typedef struct Mesh { + int vertexCount; // Number of vertices stored in arrays + int triangleCount; // Number of triangles stored (indexed or not) + + // Vertex attributes data + float *vertices; // Vertex position (XYZ - 3 components per vertex) (shader-location = 0) + float *texcoords; // Vertex texture coordinates (UV - 2 components per vertex) (shader-location = 1) + float *texcoords2; // Vertex texture second coordinates (UV - 2 components per vertex) (shader-location = 5) + float *normals; // Vertex normals (XYZ - 3 components per vertex) (shader-location = 2) + float *tangents; // Vertex tangents (XYZW - 4 components per vertex) (shader-location = 4) + unsigned char *colors; // Vertex colors (RGBA - 4 components per vertex) (shader-location = 3) + unsigned short *indices; // Vertex indices (in case vertex data comes indexed) + + // Animation vertex data + float *animVertices; // Animated vertex positions (after bones transformations) + float *animNormals; // Animated normals (after bones transformations) + unsigned char *boneIds; // Vertex bone ids, max 255 bone ids, up to 4 bones influence by vertex (skinning) + float *boneWeights; // Vertex bone weight, up to 4 bones influence by vertex (skinning) + + // OpenGL identifiers + unsigned int vaoId; // OpenGL Vertex Array Object id + unsigned int *vboId; // OpenGL Vertex Buffer Objects id (default vertex data) +} Mesh; + +// Shader +typedef struct Shader { + unsigned int id; // Shader program id + int *locs; // Shader locations array (RL_MAX_SHADER_LOCATIONS) +} Shader; + +// MaterialMap +typedef struct MaterialMap { + Texture2D texture; // Material map texture + Color color; // Material map color + float value; // Material map value +} MaterialMap; + +// Material, includes shader and maps +typedef struct Material { + Shader shader; // Material shader + MaterialMap *maps; // Material maps array (MAX_MATERIAL_MAPS) + float params[4]; // Material generic parameters (if required) +} Material; + +// Transform, vectex transformation data +typedef struct Transform { + Vector3 translation; // Translation + Quaternion rotation; // Rotation + Vector3 scale; // Scale +} Transform; + +// Bone, skeletal animation bone +typedef struct BoneInfo { + char name[32]; // Bone name + int parent; // Bone parent +} BoneInfo; + +// Model, meshes, materials and animation data +typedef struct Model { + Matrix transform; // Local transform matrix + + int meshCount; // Number of meshes + int materialCount; // Number of materials + Mesh *meshes; // Meshes array + Material *materials; // Materials array + int *meshMaterial; // Mesh material number + + // Animation data + int boneCount; // Number of bones + BoneInfo *bones; // Bones information (skeleton) + Transform *bindPose; // Bones base transformation (pose) +} Model; + +// ModelAnimation +typedef struct ModelAnimation { + int boneCount; // Number of bones + int frameCount; // Number of animation frames + BoneInfo *bones; // Bones information (skeleton) + Transform **framePoses; // Poses array by frame +} ModelAnimation; + +// Ray, ray for raycasting +typedef struct Ray { + Vector3 position; // Ray position (origin) + Vector3 direction; // Ray direction +} Ray; + +// RayCollision, ray hit information +typedef struct RayCollision { + bool hit; // Did the ray hit something? + float distance; // Distance to nearest hit + Vector3 point; // Point of nearest hit + Vector3 normal; // Surface normal of hit +} RayCollision; + +// BoundingBox +typedef struct BoundingBox { + Vector3 min; // Minimum vertex box-corner + Vector3 max; // Maximum vertex box-corner +} BoundingBox; + +// Wave, audio wave data +typedef struct Wave { + unsigned int frameCount; // Total number of frames (considering channels) + unsigned int sampleRate; // Frequency (samples per second) + unsigned int sampleSize; // Bit depth (bits per sample): 8, 16, 32 (24 not supported) + unsigned int channels; // Number of channels (1-mono, 2-stereo, ...) + void *data; // Buffer data pointer +} Wave; + +// Opaque structs declaration +// NOTE: Actual structs are defined internally in raudio module +typedef struct rAudioBuffer rAudioBuffer; +typedef struct rAudioProcessor rAudioProcessor; + +// AudioStream, custom audio stream +typedef struct AudioStream { + rAudioBuffer *buffer; // Pointer to internal data used by the audio system + rAudioProcessor *processor; // Pointer to internal data processor, useful for audio effects + + unsigned int sampleRate; // Frequency (samples per second) + unsigned int sampleSize; // Bit depth (bits per sample): 8, 16, 32 (24 not supported) + unsigned int channels; // Number of channels (1-mono, 2-stereo, ...) +} AudioStream; + +// Sound +typedef struct Sound { + AudioStream stream; // Audio stream + unsigned int frameCount; // Total number of frames (considering channels) +} Sound; + +// Music, audio stream, anything longer than ~10 seconds should be streamed +typedef struct Music { + AudioStream stream; // Audio stream + unsigned int frameCount; // Total number of frames (considering channels) + bool looping; // Music looping enable + + int ctxType; // Type of music context (audio filetype) + void *ctxData; // Audio context data, depends on type +} Music; + +// VrDeviceInfo, Head-Mounted-Display device parameters +typedef struct VrDeviceInfo { + int hResolution; // Horizontal resolution in pixels + int vResolution; // Vertical resolution in pixels + float hScreenSize; // Horizontal size in meters + float vScreenSize; // Vertical size in meters + float vScreenCenter; // Screen center in meters + float eyeToScreenDistance; // Distance between eye and display in meters + float lensSeparationDistance; // Lens separation distance in meters + float interpupillaryDistance; // IPD (distance between pupils) in meters + float lensDistortionValues[4]; // Lens distortion constant parameters + float chromaAbCorrection[4]; // Chromatic aberration correction parameters +} VrDeviceInfo; + +// VrStereoConfig, VR stereo rendering configuration for simulator +typedef struct VrStereoConfig { + Matrix projection[2]; // VR projection matrices (per eye) + Matrix viewOffset[2]; // VR view offset matrices (per eye) + float leftLensCenter[2]; // VR left lens center + float rightLensCenter[2]; // VR right lens center + float leftScreenCenter[2]; // VR left screen center + float rightScreenCenter[2]; // VR right screen center + float scale[2]; // VR distortion scale + float scaleIn[2]; // VR distortion scale in +} VrStereoConfig; + +// File path list +typedef struct FilePathList { + unsigned int capacity; // Filepaths max entries + unsigned int count; // Filepaths entries count + char **paths; // Filepaths entries +} FilePathList; + +//---------------------------------------------------------------------------------- +// Enumerators Definition +//---------------------------------------------------------------------------------- +// System/Window config flags +// NOTE: Every bit registers one state (use it with bit masks) +// By default all flags are set to 0 +typedef enum { + FLAG_VSYNC_HINT = 0x00000040, // Set to try enabling V-Sync on GPU + FLAG_FULLSCREEN_MODE = 0x00000002, // Set to run program in fullscreen + FLAG_WINDOW_RESIZABLE = 0x00000004, // Set to allow resizable window + FLAG_WINDOW_UNDECORATED = 0x00000008, // Set to disable window decoration (frame and buttons) + FLAG_WINDOW_HIDDEN = 0x00000080, // Set to hide window + FLAG_WINDOW_MINIMIZED = 0x00000200, // Set to minimize window (iconify) + FLAG_WINDOW_MAXIMIZED = 0x00000400, // Set to maximize window (expanded to monitor) + FLAG_WINDOW_UNFOCUSED = 0x00000800, // Set to window non focused + FLAG_WINDOW_TOPMOST = 0x00001000, // Set to window always on top + FLAG_WINDOW_ALWAYS_RUN = 0x00000100, // Set to allow windows running while minimized + FLAG_WINDOW_TRANSPARENT = 0x00000010, // Set to allow transparent framebuffer + FLAG_WINDOW_HIGHDPI = 0x00002000, // Set to support HighDPI + FLAG_WINDOW_MOUSE_PASSTHROUGH = 0x00004000, // Set to support mouse passthrough, only supported when FLAG_WINDOW_UNDECORATED + FLAG_MSAA_4X_HINT = 0x00000020, // Set to try enabling MSAA 4X + FLAG_INTERLACED_HINT = 0x00010000 // Set to try enabling interlaced video format (for V3D) +} ConfigFlags; + +// Trace log level +// NOTE: Organized by priority level +typedef enum { + LOG_ALL = 0, // Display all logs + LOG_TRACE, // Trace logging, intended for internal use only + LOG_DEBUG, // Debug logging, used for internal debugging, it should be disabled on release builds + LOG_INFO, // Info logging, used for program execution info + LOG_WARNING, // Warning logging, used on recoverable failures + LOG_ERROR, // Error logging, used on unrecoverable failures + LOG_FATAL, // Fatal logging, used to abort program: exit(EXIT_FAILURE) + LOG_NONE // Disable logging +} TraceLogLevel; + +// Keyboard keys (US keyboard layout) +// NOTE: Use GetKeyPressed() to allow redefining +// required keys for alternative layouts +typedef enum { + KEY_NULL = 0, // Key: NULL, used for no key pressed + // Alphanumeric keys + KEY_APOSTROPHE = 39, // Key: ' + KEY_COMMA = 44, // Key: , + KEY_MINUS = 45, // Key: - + KEY_PERIOD = 46, // Key: . + KEY_SLASH = 47, // Key: / + KEY_ZERO = 48, // Key: 0 + KEY_ONE = 49, // Key: 1 + KEY_TWO = 50, // Key: 2 + KEY_THREE = 51, // Key: 3 + KEY_FOUR = 52, // Key: 4 + KEY_FIVE = 53, // Key: 5 + KEY_SIX = 54, // Key: 6 + KEY_SEVEN = 55, // Key: 7 + KEY_EIGHT = 56, // Key: 8 + KEY_NINE = 57, // Key: 9 + KEY_SEMICOLON = 59, // Key: ; + KEY_EQUAL = 61, // Key: = + KEY_A = 65, // Key: A | a + KEY_B = 66, // Key: B | b + KEY_C = 67, // Key: C | c + KEY_D = 68, // Key: D | d + KEY_E = 69, // Key: E | e + KEY_F = 70, // Key: F | f + KEY_G = 71, // Key: G | g + KEY_H = 72, // Key: H | h + KEY_I = 73, // Key: I | i + KEY_J = 74, // Key: J | j + KEY_K = 75, // Key: K | k + KEY_L = 76, // Key: L | l + KEY_M = 77, // Key: M | m + KEY_N = 78, // Key: N | n + KEY_O = 79, // Key: O | o + KEY_P = 80, // Key: P | p + KEY_Q = 81, // Key: Q | q + KEY_R = 82, // Key: R | r + KEY_S = 83, // Key: S | s + KEY_T = 84, // Key: T | t + KEY_U = 85, // Key: U | u + KEY_V = 86, // Key: V | v + KEY_W = 87, // Key: W | w + KEY_X = 88, // Key: X | x + KEY_Y = 89, // Key: Y | y + KEY_Z = 90, // Key: Z | z + KEY_LEFT_BRACKET = 91, // Key: [ + KEY_BACKSLASH = 92, // Key: '\' + KEY_RIGHT_BRACKET = 93, // Key: ] + KEY_GRAVE = 96, // Key: ` + // Function keys + KEY_SPACE = 32, // Key: Space + KEY_ESCAPE = 256, // Key: Esc + KEY_ENTER = 257, // Key: Enter + KEY_TAB = 258, // Key: Tab + KEY_BACKSPACE = 259, // Key: Backspace + KEY_INSERT = 260, // Key: Ins + KEY_DELETE = 261, // Key: Del + KEY_RIGHT = 262, // Key: Cursor right + KEY_LEFT = 263, // Key: Cursor left + KEY_DOWN = 264, // Key: Cursor down + KEY_UP = 265, // Key: Cursor up + KEY_PAGE_UP = 266, // Key: Page up + KEY_PAGE_DOWN = 267, // Key: Page down + KEY_HOME = 268, // Key: Home + KEY_END = 269, // Key: End + KEY_CAPS_LOCK = 280, // Key: Caps lock + KEY_SCROLL_LOCK = 281, // Key: Scroll down + KEY_NUM_LOCK = 282, // Key: Num lock + KEY_PRINT_SCREEN = 283, // Key: Print screen + KEY_PAUSE = 284, // Key: Pause + KEY_F1 = 290, // Key: F1 + KEY_F2 = 291, // Key: F2 + KEY_F3 = 292, // Key: F3 + KEY_F4 = 293, // Key: F4 + KEY_F5 = 294, // Key: F5 + KEY_F6 = 295, // Key: F6 + KEY_F7 = 296, // Key: F7 + KEY_F8 = 297, // Key: F8 + KEY_F9 = 298, // Key: F9 + KEY_F10 = 299, // Key: F10 + KEY_F11 = 300, // Key: F11 + KEY_F12 = 301, // Key: F12 + KEY_LEFT_SHIFT = 340, // Key: Shift left + KEY_LEFT_CONTROL = 341, // Key: Control left + KEY_LEFT_ALT = 342, // Key: Alt left + KEY_LEFT_SUPER = 343, // Key: Super left + KEY_RIGHT_SHIFT = 344, // Key: Shift right + KEY_RIGHT_CONTROL = 345, // Key: Control right + KEY_RIGHT_ALT = 346, // Key: Alt right + KEY_RIGHT_SUPER = 347, // Key: Super right + KEY_KB_MENU = 348, // Key: KB menu + // Keypad keys + KEY_KP_0 = 320, // Key: Keypad 0 + KEY_KP_1 = 321, // Key: Keypad 1 + KEY_KP_2 = 322, // Key: Keypad 2 + KEY_KP_3 = 323, // Key: Keypad 3 + KEY_KP_4 = 324, // Key: Keypad 4 + KEY_KP_5 = 325, // Key: Keypad 5 + KEY_KP_6 = 326, // Key: Keypad 6 + KEY_KP_7 = 327, // Key: Keypad 7 + KEY_KP_8 = 328, // Key: Keypad 8 + KEY_KP_9 = 329, // Key: Keypad 9 + KEY_KP_DECIMAL = 330, // Key: Keypad . + KEY_KP_DIVIDE = 331, // Key: Keypad / + KEY_KP_MULTIPLY = 332, // Key: Keypad * + KEY_KP_SUBTRACT = 333, // Key: Keypad - + KEY_KP_ADD = 334, // Key: Keypad + + KEY_KP_ENTER = 335, // Key: Keypad Enter + KEY_KP_EQUAL = 336, // Key: Keypad = + // Android key buttons + KEY_BACK = 4, // Key: Android back button + KEY_MENU = 82, // Key: Android menu button + KEY_VOLUME_UP = 24, // Key: Android volume up button + KEY_VOLUME_DOWN = 25 // Key: Android volume down button +} KeyboardKey; + +// Add backwards compatibility support for deprecated names +#define MOUSE_LEFT_BUTTON MOUSE_BUTTON_LEFT +#define MOUSE_RIGHT_BUTTON MOUSE_BUTTON_RIGHT +#define MOUSE_MIDDLE_BUTTON MOUSE_BUTTON_MIDDLE + +// Mouse buttons +typedef enum { + MOUSE_BUTTON_LEFT = 0, // Mouse button left + MOUSE_BUTTON_RIGHT = 1, // Mouse button right + MOUSE_BUTTON_MIDDLE = 2, // Mouse button middle (pressed wheel) + MOUSE_BUTTON_SIDE = 3, // Mouse button side (advanced mouse device) + MOUSE_BUTTON_EXTRA = 4, // Mouse button extra (advanced mouse device) + MOUSE_BUTTON_FORWARD = 5, // Mouse button fordward (advanced mouse device) + MOUSE_BUTTON_BACK = 6, // Mouse button back (advanced mouse device) +} MouseButton; + +// Mouse cursor +typedef enum { + MOUSE_CURSOR_DEFAULT = 0, // Default pointer shape + MOUSE_CURSOR_ARROW = 1, // Arrow shape + MOUSE_CURSOR_IBEAM = 2, // Text writing cursor shape + MOUSE_CURSOR_CROSSHAIR = 3, // Cross shape + MOUSE_CURSOR_POINTING_HAND = 4, // Pointing hand cursor + MOUSE_CURSOR_RESIZE_EW = 5, // Horizontal resize/move arrow shape + MOUSE_CURSOR_RESIZE_NS = 6, // Vertical resize/move arrow shape + MOUSE_CURSOR_RESIZE_NWSE = 7, // Top-left to bottom-right diagonal resize/move arrow shape + MOUSE_CURSOR_RESIZE_NESW = 8, // The top-right to bottom-left diagonal resize/move arrow shape + MOUSE_CURSOR_RESIZE_ALL = 9, // The omni-directional resize/move cursor shape + MOUSE_CURSOR_NOT_ALLOWED = 10 // The operation-not-allowed shape +} MouseCursor; + +// Gamepad buttons +typedef enum { + GAMEPAD_BUTTON_UNKNOWN = 0, // Unknown button, just for error checking + GAMEPAD_BUTTON_LEFT_FACE_UP, // Gamepad left DPAD up button + GAMEPAD_BUTTON_LEFT_FACE_RIGHT, // Gamepad left DPAD right button + GAMEPAD_BUTTON_LEFT_FACE_DOWN, // Gamepad left DPAD down button + GAMEPAD_BUTTON_LEFT_FACE_LEFT, // Gamepad left DPAD left button + GAMEPAD_BUTTON_RIGHT_FACE_UP, // Gamepad right button up (i.e. PS3: Triangle, Xbox: Y) + GAMEPAD_BUTTON_RIGHT_FACE_RIGHT, // Gamepad right button right (i.e. PS3: Square, Xbox: X) + GAMEPAD_BUTTON_RIGHT_FACE_DOWN, // Gamepad right button down (i.e. PS3: Cross, Xbox: A) + GAMEPAD_BUTTON_RIGHT_FACE_LEFT, // Gamepad right button left (i.e. PS3: Circle, Xbox: B) + GAMEPAD_BUTTON_LEFT_TRIGGER_1, // Gamepad top/back trigger left (first), it could be a trailing button + GAMEPAD_BUTTON_LEFT_TRIGGER_2, // Gamepad top/back trigger left (second), it could be a trailing button + GAMEPAD_BUTTON_RIGHT_TRIGGER_1, // Gamepad top/back trigger right (one), it could be a trailing button + GAMEPAD_BUTTON_RIGHT_TRIGGER_2, // Gamepad top/back trigger right (second), it could be a trailing button + GAMEPAD_BUTTON_MIDDLE_LEFT, // Gamepad center buttons, left one (i.e. PS3: Select) + GAMEPAD_BUTTON_MIDDLE, // Gamepad center buttons, middle one (i.e. PS3: PS, Xbox: XBOX) + GAMEPAD_BUTTON_MIDDLE_RIGHT, // Gamepad center buttons, right one (i.e. PS3: Start) + GAMEPAD_BUTTON_LEFT_THUMB, // Gamepad joystick pressed button left + GAMEPAD_BUTTON_RIGHT_THUMB // Gamepad joystick pressed button right +} GamepadButton; + +// Gamepad axis +typedef enum { + GAMEPAD_AXIS_LEFT_X = 0, // Gamepad left stick X axis + GAMEPAD_AXIS_LEFT_Y = 1, // Gamepad left stick Y axis + GAMEPAD_AXIS_RIGHT_X = 2, // Gamepad right stick X axis + GAMEPAD_AXIS_RIGHT_Y = 3, // Gamepad right stick Y axis + GAMEPAD_AXIS_LEFT_TRIGGER = 4, // Gamepad back trigger left, pressure level: [1..-1] + GAMEPAD_AXIS_RIGHT_TRIGGER = 5 // Gamepad back trigger right, pressure level: [1..-1] +} GamepadAxis; + +// Material map index +typedef enum { + MATERIAL_MAP_ALBEDO = 0, // Albedo material (same as: MATERIAL_MAP_DIFFUSE) + MATERIAL_MAP_METALNESS, // Metalness material (same as: MATERIAL_MAP_SPECULAR) + MATERIAL_MAP_NORMAL, // Normal material + MATERIAL_MAP_ROUGHNESS, // Roughness material + MATERIAL_MAP_OCCLUSION, // Ambient occlusion material + MATERIAL_MAP_EMISSION, // Emission material + MATERIAL_MAP_HEIGHT, // Heightmap material + MATERIAL_MAP_CUBEMAP, // Cubemap material (NOTE: Uses GL_TEXTURE_CUBE_MAP) + MATERIAL_MAP_IRRADIANCE, // Irradiance material (NOTE: Uses GL_TEXTURE_CUBE_MAP) + MATERIAL_MAP_PREFILTER, // Prefilter material (NOTE: Uses GL_TEXTURE_CUBE_MAP) + MATERIAL_MAP_BRDF // Brdf material +} MaterialMapIndex; + +#define MATERIAL_MAP_DIFFUSE MATERIAL_MAP_ALBEDO +#define MATERIAL_MAP_SPECULAR MATERIAL_MAP_METALNESS + +// Shader location index +typedef enum { + SHADER_LOC_VERTEX_POSITION = 0, // Shader location: vertex attribute: position + SHADER_LOC_VERTEX_TEXCOORD01, // Shader location: vertex attribute: texcoord01 + SHADER_LOC_VERTEX_TEXCOORD02, // Shader location: vertex attribute: texcoord02 + SHADER_LOC_VERTEX_NORMAL, // Shader location: vertex attribute: normal + SHADER_LOC_VERTEX_TANGENT, // Shader location: vertex attribute: tangent + SHADER_LOC_VERTEX_COLOR, // Shader location: vertex attribute: color + SHADER_LOC_MATRIX_MVP, // Shader location: matrix uniform: model-view-projection + SHADER_LOC_MATRIX_VIEW, // Shader location: matrix uniform: view (camera transform) + SHADER_LOC_MATRIX_PROJECTION, // Shader location: matrix uniform: projection + SHADER_LOC_MATRIX_MODEL, // Shader location: matrix uniform: model (transform) + SHADER_LOC_MATRIX_NORMAL, // Shader location: matrix uniform: normal + SHADER_LOC_VECTOR_VIEW, // Shader location: vector uniform: view + SHADER_LOC_COLOR_DIFFUSE, // Shader location: vector uniform: diffuse color + SHADER_LOC_COLOR_SPECULAR, // Shader location: vector uniform: specular color + SHADER_LOC_COLOR_AMBIENT, // Shader location: vector uniform: ambient color + SHADER_LOC_MAP_ALBEDO, // Shader location: sampler2d texture: albedo (same as: SHADER_LOC_MAP_DIFFUSE) + SHADER_LOC_MAP_METALNESS, // Shader location: sampler2d texture: metalness (same as: SHADER_LOC_MAP_SPECULAR) + SHADER_LOC_MAP_NORMAL, // Shader location: sampler2d texture: normal + SHADER_LOC_MAP_ROUGHNESS, // Shader location: sampler2d texture: roughness + SHADER_LOC_MAP_OCCLUSION, // Shader location: sampler2d texture: occlusion + SHADER_LOC_MAP_EMISSION, // Shader location: sampler2d texture: emission + SHADER_LOC_MAP_HEIGHT, // Shader location: sampler2d texture: height + SHADER_LOC_MAP_CUBEMAP, // Shader location: samplerCube texture: cubemap + SHADER_LOC_MAP_IRRADIANCE, // Shader location: samplerCube texture: irradiance + SHADER_LOC_MAP_PREFILTER, // Shader location: samplerCube texture: prefilter + SHADER_LOC_MAP_BRDF // Shader location: sampler2d texture: brdf +} ShaderLocationIndex; + +#define SHADER_LOC_MAP_DIFFUSE SHADER_LOC_MAP_ALBEDO +#define SHADER_LOC_MAP_SPECULAR SHADER_LOC_MAP_METALNESS + +// Shader uniform data type +typedef enum { + SHADER_UNIFORM_FLOAT = 0, // Shader uniform type: float + SHADER_UNIFORM_VEC2, // Shader uniform type: vec2 (2 float) + SHADER_UNIFORM_VEC3, // Shader uniform type: vec3 (3 float) + SHADER_UNIFORM_VEC4, // Shader uniform type: vec4 (4 float) + SHADER_UNIFORM_INT, // Shader uniform type: int + SHADER_UNIFORM_IVEC2, // Shader uniform type: ivec2 (2 int) + SHADER_UNIFORM_IVEC3, // Shader uniform type: ivec3 (3 int) + SHADER_UNIFORM_IVEC4, // Shader uniform type: ivec4 (4 int) + SHADER_UNIFORM_SAMPLER2D // Shader uniform type: sampler2d +} ShaderUniformDataType; + +// Shader attribute data types +typedef enum { + SHADER_ATTRIB_FLOAT = 0, // Shader attribute type: float + SHADER_ATTRIB_VEC2, // Shader attribute type: vec2 (2 float) + SHADER_ATTRIB_VEC3, // Shader attribute type: vec3 (3 float) + SHADER_ATTRIB_VEC4 // Shader attribute type: vec4 (4 float) +} ShaderAttributeDataType; + +// Pixel formats +// NOTE: Support depends on OpenGL version and platform +typedef enum { + PIXELFORMAT_UNCOMPRESSED_GRAYSCALE = 1, // 8 bit per pixel (no alpha) + PIXELFORMAT_UNCOMPRESSED_GRAY_ALPHA, // 8*2 bpp (2 channels) + PIXELFORMAT_UNCOMPRESSED_R5G6B5, // 16 bpp + PIXELFORMAT_UNCOMPRESSED_R8G8B8, // 24 bpp + PIXELFORMAT_UNCOMPRESSED_R5G5B5A1, // 16 bpp (1 bit alpha) + PIXELFORMAT_UNCOMPRESSED_R4G4B4A4, // 16 bpp (4 bit alpha) + PIXELFORMAT_UNCOMPRESSED_R8G8B8A8, // 32 bpp + PIXELFORMAT_UNCOMPRESSED_R32, // 32 bpp (1 channel - float) + PIXELFORMAT_UNCOMPRESSED_R32G32B32, // 32*3 bpp (3 channels - float) + PIXELFORMAT_UNCOMPRESSED_R32G32B32A32, // 32*4 bpp (4 channels - float) + PIXELFORMAT_COMPRESSED_DXT1_RGB, // 4 bpp (no alpha) + PIXELFORMAT_COMPRESSED_DXT1_RGBA, // 4 bpp (1 bit alpha) + PIXELFORMAT_COMPRESSED_DXT3_RGBA, // 8 bpp + PIXELFORMAT_COMPRESSED_DXT5_RGBA, // 8 bpp + PIXELFORMAT_COMPRESSED_ETC1_RGB, // 4 bpp + PIXELFORMAT_COMPRESSED_ETC2_RGB, // 4 bpp + PIXELFORMAT_COMPRESSED_ETC2_EAC_RGBA, // 8 bpp + PIXELFORMAT_COMPRESSED_PVRT_RGB, // 4 bpp + PIXELFORMAT_COMPRESSED_PVRT_RGBA, // 4 bpp + PIXELFORMAT_COMPRESSED_ASTC_4x4_RGBA, // 8 bpp + PIXELFORMAT_COMPRESSED_ASTC_8x8_RGBA // 2 bpp +} PixelFormat; + +// Texture parameters: filter mode +// NOTE 1: Filtering considers mipmaps if available in the texture +// NOTE 2: Filter is accordingly set for minification and magnification +typedef enum { + TEXTURE_FILTER_POINT = 0, // No filter, just pixel approximation + TEXTURE_FILTER_BILINEAR, // Linear filtering + TEXTURE_FILTER_TRILINEAR, // Trilinear filtering (linear with mipmaps) + TEXTURE_FILTER_ANISOTROPIC_4X, // Anisotropic filtering 4x + TEXTURE_FILTER_ANISOTROPIC_8X, // Anisotropic filtering 8x + TEXTURE_FILTER_ANISOTROPIC_16X, // Anisotropic filtering 16x +} TextureFilter; + +// Texture parameters: wrap mode +typedef enum { + TEXTURE_WRAP_REPEAT = 0, // Repeats texture in tiled mode + TEXTURE_WRAP_CLAMP, // Clamps texture to edge pixel in tiled mode + TEXTURE_WRAP_MIRROR_REPEAT, // Mirrors and repeats the texture in tiled mode + TEXTURE_WRAP_MIRROR_CLAMP // Mirrors and clamps to border the texture in tiled mode +} TextureWrap; + +// Cubemap layouts +typedef enum { + CUBEMAP_LAYOUT_AUTO_DETECT = 0, // Automatically detect layout type + CUBEMAP_LAYOUT_LINE_VERTICAL, // Layout is defined by a vertical line with faces + CUBEMAP_LAYOUT_LINE_HORIZONTAL, // Layout is defined by an horizontal line with faces + CUBEMAP_LAYOUT_CROSS_THREE_BY_FOUR, // Layout is defined by a 3x4 cross with cubemap faces + CUBEMAP_LAYOUT_CROSS_FOUR_BY_THREE, // Layout is defined by a 4x3 cross with cubemap faces + CUBEMAP_LAYOUT_PANORAMA // Layout is defined by a panorama image (equirectangular map) +} CubemapLayout; + +// Font type, defines generation method +typedef enum { + FONT_DEFAULT = 0, // Default font generation, anti-aliased + FONT_BITMAP, // Bitmap font generation, no anti-aliasing + FONT_SDF // SDF font generation, requires external shader +} FontType; + +// Color blending modes (pre-defined) +typedef enum { + BLEND_ALPHA = 0, // Blend textures considering alpha (default) + BLEND_ADDITIVE, // Blend textures adding colors + BLEND_MULTIPLIED, // Blend textures multiplying colors + BLEND_ADD_COLORS, // Blend textures adding colors (alternative) + BLEND_SUBTRACT_COLORS, // Blend textures subtracting colors (alternative) + BLEND_ALPHA_PREMULTIPLY, // Blend premultiplied textures considering alpha + BLEND_CUSTOM // Blend textures using custom src/dst factors (use rlSetBlendMode()) +} BlendMode; + +// Gesture +// NOTE: It could be used as flags to enable only some gestures +typedef enum { + GESTURE_NONE = 0, // No gesture + GESTURE_TAP = 1, // Tap gesture + GESTURE_DOUBLETAP = 2, // Double tap gesture + GESTURE_HOLD = 4, // Hold gesture + GESTURE_DRAG = 8, // Drag gesture + GESTURE_SWIPE_RIGHT = 16, // Swipe right gesture + GESTURE_SWIPE_LEFT = 32, // Swipe left gesture + GESTURE_SWIPE_UP = 64, // Swipe up gesture + GESTURE_SWIPE_DOWN = 128, // Swipe down gesture + GESTURE_PINCH_IN = 256, // Pinch in gesture + GESTURE_PINCH_OUT = 512 // Pinch out gesture +} Gesture; + +// Camera system modes +typedef enum { + CAMERA_CUSTOM = 0, // Custom camera + CAMERA_FREE, // Free camera + CAMERA_ORBITAL, // Orbital camera + CAMERA_FIRST_PERSON, // First person camera + CAMERA_THIRD_PERSON // Third person camera +} CameraMode; + +// Camera projection +typedef enum { + CAMERA_PERSPECTIVE = 0, // Perspective projection + CAMERA_ORTHOGRAPHIC // Orthographic projection +} CameraProjection; + +// N-patch layout +typedef enum { + NPATCH_NINE_PATCH = 0, // Npatch layout: 3x3 tiles + NPATCH_THREE_PATCH_VERTICAL, // Npatch layout: 1x3 tiles + NPATCH_THREE_PATCH_HORIZONTAL // Npatch layout: 3x1 tiles +} NPatchLayout; + +// Callbacks to hook some internal functions +// WARNING: This callbacks are intended for advance users +typedef void (*TraceLogCallback)(int logLevel, const char *text, va_list args); // Logging: Redirect trace log messages +typedef unsigned char *(*LoadFileDataCallback)(const char *fileName, unsigned int *bytesRead); // FileIO: Load binary data +typedef bool (*SaveFileDataCallback)(const char *fileName, void *data, unsigned int bytesToWrite); // FileIO: Save binary data +typedef char *(*LoadFileTextCallback)(const char *fileName); // FileIO: Load text data +typedef bool (*SaveFileTextCallback)(const char *fileName, char *text); // FileIO: Save text data + +//------------------------------------------------------------------------------------ +// Global Variables Definition +//------------------------------------------------------------------------------------ +// It's lonely here... + +//------------------------------------------------------------------------------------ +// Window and Graphics Device Functions (Module: core) +//------------------------------------------------------------------------------------ + +#if defined(__cplusplus) +extern "C" { // Prevents name mangling of functions +#endif + +// Window-related functions +RLAPI void InitWindow(int width, int height, const char *title); // Initialize window and OpenGL context +RLAPI bool WindowShouldClose(void); // Check if KEY_ESCAPE pressed or Close icon pressed +RLAPI void CloseWindow(void); // Close window and unload OpenGL context +RLAPI bool IsWindowReady(void); // Check if window has been initialized successfully +RLAPI bool IsWindowFullscreen(void); // Check if window is currently fullscreen +RLAPI bool IsWindowHidden(void); // Check if window is currently hidden (only PLATFORM_DESKTOP) +RLAPI bool IsWindowMinimized(void); // Check if window is currently minimized (only PLATFORM_DESKTOP) +RLAPI bool IsWindowMaximized(void); // Check if window is currently maximized (only PLATFORM_DESKTOP) +RLAPI bool IsWindowFocused(void); // Check if window is currently focused (only PLATFORM_DESKTOP) +RLAPI bool IsWindowResized(void); // Check if window has been resized last frame +RLAPI bool IsWindowState(unsigned int flag); // Check if one specific window flag is enabled +RLAPI void SetWindowState(unsigned int flags); // Set window configuration state using flags (only PLATFORM_DESKTOP) +RLAPI void ClearWindowState(unsigned int flags); // Clear window configuration state flags +RLAPI void ToggleFullscreen(void); // Toggle window state: fullscreen/windowed (only PLATFORM_DESKTOP) +RLAPI void MaximizeWindow(void); // Set window state: maximized, if resizable (only PLATFORM_DESKTOP) +RLAPI void MinimizeWindow(void); // Set window state: minimized, if resizable (only PLATFORM_DESKTOP) +RLAPI void RestoreWindow(void); // Set window state: not minimized/maximized (only PLATFORM_DESKTOP) +RLAPI void SetWindowIcon(Image image); // Set icon for window (only PLATFORM_DESKTOP) +RLAPI void SetWindowTitle(const char *title); // Set title for window (only PLATFORM_DESKTOP) +RLAPI void SetWindowPosition(int x, int y); // Set window position on screen (only PLATFORM_DESKTOP) +RLAPI void SetWindowMonitor(int monitor); // Set monitor for the current window (fullscreen mode) +RLAPI void SetWindowMinSize(int width, int height); // Set window minimum dimensions (for FLAG_WINDOW_RESIZABLE) +RLAPI void SetWindowSize(int width, int height); // Set window dimensions +RLAPI void SetWindowOpacity(float opacity); // Set window opacity [0.0f..1.0f] (only PLATFORM_DESKTOP) +RLAPI void *GetWindowHandle(void); // Get native window handle +RLAPI int GetScreenWidth(void); // Get current screen width +RLAPI int GetScreenHeight(void); // Get current screen height +RLAPI int GetRenderWidth(void); // Get current render width (it considers HiDPI) +RLAPI int GetRenderHeight(void); // Get current render height (it considers HiDPI) +RLAPI int GetMonitorCount(void); // Get number of connected monitors +RLAPI int GetCurrentMonitor(void); // Get current connected monitor +RLAPI Vector2 GetMonitorPosition(int monitor); // Get specified monitor position +RLAPI int GetMonitorWidth(int monitor); // Get specified monitor width (current video mode used by monitor) +RLAPI int GetMonitorHeight(int monitor); // Get specified monitor height (current video mode used by monitor) +RLAPI int GetMonitorPhysicalWidth(int monitor); // Get specified monitor physical width in millimetres +RLAPI int GetMonitorPhysicalHeight(int monitor); // Get specified monitor physical height in millimetres +RLAPI int GetMonitorRefreshRate(int monitor); // Get specified monitor refresh rate +RLAPI Vector2 GetWindowPosition(void); // Get window position XY on monitor +RLAPI Vector2 GetWindowScaleDPI(void); // Get window scale DPI factor +RLAPI const char *GetMonitorName(int monitor); // Get the human-readable, UTF-8 encoded name of the primary monitor +RLAPI void SetClipboardText(const char *text); // Set clipboard text content +RLAPI const char *GetClipboardText(void); // Get clipboard text content +RLAPI void EnableEventWaiting(void); // Enable waiting for events on EndDrawing(), no automatic event polling +RLAPI void DisableEventWaiting(void); // Disable waiting for events on EndDrawing(), automatic events polling + +// Custom frame control functions +// NOTE: Those functions are intended for advance users that want full control over the frame processing +// By default EndDrawing() does this job: draws everything + SwapScreenBuffer() + manage frame timming + PollInputEvents() +// To avoid that behaviour and control frame processes manually, enable in config.h: SUPPORT_CUSTOM_FRAME_CONTROL +RLAPI void SwapScreenBuffer(void); // Swap back buffer with front buffer (screen drawing) +RLAPI void PollInputEvents(void); // Register all input events +RLAPI void WaitTime(double seconds); // Wait for some time (halt program execution) + +// Cursor-related functions +RLAPI void ShowCursor(void); // Shows cursor +RLAPI void HideCursor(void); // Hides cursor +RLAPI bool IsCursorHidden(void); // Check if cursor is not visible +RLAPI void EnableCursor(void); // Enables cursor (unlock cursor) +RLAPI void DisableCursor(void); // Disables cursor (lock cursor) +RLAPI bool IsCursorOnScreen(void); // Check if cursor is on the screen + +// Drawing-related functions +RLAPI void ClearBackground(Color color); // Set background color (framebuffer clear color) +RLAPI void BeginDrawing(void); // Setup canvas (framebuffer) to start drawing +RLAPI void EndDrawing(void); // End canvas drawing and swap buffers (double buffering) +RLAPI void BeginMode2D(Camera2D camera); // Begin 2D mode with custom camera (2D) +RLAPI void EndMode2D(void); // Ends 2D mode with custom camera +RLAPI void BeginMode3D(Camera3D camera); // Begin 3D mode with custom camera (3D) +RLAPI void EndMode3D(void); // Ends 3D mode and returns to default 2D orthographic mode +RLAPI void BeginTextureMode(RenderTexture2D target); // Begin drawing to render texture +RLAPI void EndTextureMode(void); // Ends drawing to render texture +RLAPI void BeginShaderMode(Shader shader); // Begin custom shader drawing +RLAPI void EndShaderMode(void); // End custom shader drawing (use default shader) +RLAPI void BeginBlendMode(int mode); // Begin blending mode (alpha, additive, multiplied, subtract, custom) +RLAPI void EndBlendMode(void); // End blending mode (reset to default: alpha blending) +RLAPI void BeginScissorMode(int x, int y, int width, int height); // Begin scissor mode (define screen area for following drawing) +RLAPI void EndScissorMode(void); // End scissor mode +RLAPI void BeginVrStereoMode(VrStereoConfig config); // Begin stereo rendering (requires VR simulator) +RLAPI void EndVrStereoMode(void); // End stereo rendering (requires VR simulator) + +// VR stereo config functions for VR simulator +RLAPI VrStereoConfig LoadVrStereoConfig(VrDeviceInfo device); // Load VR stereo config for VR simulator device parameters +RLAPI void UnloadVrStereoConfig(VrStereoConfig config); // Unload VR stereo config + +// Shader management functions +// NOTE: Shader functionality is not available on OpenGL 1.1 +RLAPI Shader LoadShader(const char *vsFileName, const char *fsFileName); // Load shader from files and bind default locations +RLAPI Shader LoadShaderFromMemory(const char *vsCode, const char *fsCode); // Load shader from code strings and bind default locations +RLAPI int GetShaderLocation(Shader shader, const char *uniformName); // Get shader uniform location +RLAPI int GetShaderLocationAttrib(Shader shader, const char *attribName); // Get shader attribute location +RLAPI void SetShaderValue(Shader shader, int locIndex, const void *value, int uniformType); // Set shader uniform value +RLAPI void SetShaderValueV(Shader shader, int locIndex, const void *value, int uniformType, int count); // Set shader uniform value vector +RLAPI void SetShaderValueMatrix(Shader shader, int locIndex, Matrix mat); // Set shader uniform value (matrix 4x4) +RLAPI void SetShaderValueTexture(Shader shader, int locIndex, Texture2D texture); // Set shader uniform value for texture (sampler2d) +RLAPI void UnloadShader(Shader shader); // Unload shader from GPU memory (VRAM) + +// Screen-space-related functions +RLAPI Ray GetMouseRay(Vector2 mousePosition, Camera camera); // Get a ray trace from mouse position +RLAPI Matrix GetCameraMatrix(Camera camera); // Get camera transform matrix (view matrix) +RLAPI Matrix GetCameraMatrix2D(Camera2D camera); // Get camera 2d transform matrix +RLAPI Vector2 GetWorldToScreen(Vector3 position, Camera camera); // Get the screen space position for a 3d world space position +RLAPI Vector2 GetScreenToWorld2D(Vector2 position, Camera2D camera); // Get the world space position for a 2d camera screen space position +RLAPI Vector2 GetWorldToScreenEx(Vector3 position, Camera camera, int width, int height); // Get size position for a 3d world space position +RLAPI Vector2 GetWorldToScreen2D(Vector2 position, Camera2D camera); // Get the screen space position for a 2d camera world space position + +// Timing-related functions +RLAPI void SetTargetFPS(int fps); // Set target FPS (maximum) +RLAPI int GetFPS(void); // Get current FPS +RLAPI float GetFrameTime(void); // Get time in seconds for last frame drawn (delta time) +RLAPI double GetTime(void); // Get elapsed time in seconds since InitWindow() + +// Misc. functions +RLAPI int GetRandomValue(int min, int max); // Get a random value between min and max (both included) +RLAPI void SetRandomSeed(unsigned int seed); // Set the seed for the random number generator +RLAPI void TakeScreenshot(const char *fileName); // Takes a screenshot of current screen (filename extension defines format) +RLAPI void SetConfigFlags(unsigned int flags); // Setup init configuration flags (view FLAGS) + +RLAPI void TraceLog(int logLevel, const char *text, ...); // Show trace log messages (LOG_DEBUG, LOG_INFO, LOG_WARNING, LOG_ERROR...) +RLAPI void SetTraceLogLevel(int logLevel); // Set the current threshold (minimum) log level +RLAPI void *MemAlloc(int size); // Internal memory allocator +RLAPI void *MemRealloc(void *ptr, int size); // Internal memory reallocator +RLAPI void MemFree(void *ptr); // Internal memory free + +RLAPI void OpenURL(const char *url); // Open URL with default system browser (if available) + +// Set custom callbacks +// WARNING: Callbacks setup is intended for advance users +RLAPI void SetTraceLogCallback(TraceLogCallback callback); // Set custom trace log +RLAPI void SetLoadFileDataCallback(LoadFileDataCallback callback); // Set custom file binary data loader +RLAPI void SetSaveFileDataCallback(SaveFileDataCallback callback); // Set custom file binary data saver +RLAPI void SetLoadFileTextCallback(LoadFileTextCallback callback); // Set custom file text data loader +RLAPI void SetSaveFileTextCallback(SaveFileTextCallback callback); // Set custom file text data saver + +// Files management functions +RLAPI unsigned char *LoadFileData(const char *fileName, unsigned int *bytesRead); // Load file data as byte array (read) +RLAPI void UnloadFileData(unsigned char *data); // Unload file data allocated by LoadFileData() +RLAPI bool SaveFileData(const char *fileName, void *data, unsigned int bytesToWrite); // Save data to file from byte array (write), returns true on success +RLAPI bool ExportDataAsCode(const char *data, unsigned int size, const char *fileName); // Export data to code (.h), returns true on success +RLAPI char *LoadFileText(const char *fileName); // Load text data from file (read), returns a '\0' terminated string +RLAPI void UnloadFileText(char *text); // Unload file text data allocated by LoadFileText() +RLAPI bool SaveFileText(const char *fileName, char *text); // Save text data to file (write), string must be '\0' terminated, returns true on success +RLAPI bool FileExists(const char *fileName); // Check if file exists +RLAPI bool DirectoryExists(const char *dirPath); // Check if a directory path exists +RLAPI bool IsFileExtension(const char *fileName, const char *ext); // Check file extension (including point: .png, .wav) +RLAPI int GetFileLength(const char *fileName); // Get file length in bytes (NOTE: GetFileSize() conflicts with windows.h) +RLAPI const char *GetFileExtension(const char *fileName); // Get pointer to extension for a filename string (includes dot: '.png') +RLAPI const char *GetFileName(const char *filePath); // Get pointer to filename for a path string +RLAPI const char *GetFileNameWithoutExt(const char *filePath); // Get filename string without extension (uses static string) +RLAPI const char *GetDirectoryPath(const char *filePath); // Get full path for a given fileName with path (uses static string) +RLAPI const char *GetPrevDirectoryPath(const char *dirPath); // Get previous directory path for a given path (uses static string) +RLAPI const char *GetWorkingDirectory(void); // Get current working directory (uses static string) +RLAPI const char *GetApplicationDirectory(void); // Get the directory if the running application (uses static string) +RLAPI bool ChangeDirectory(const char *dir); // Change working directory, return true on success +RLAPI bool IsPathFile(const char *path); // Check if a given path is a file or a directory +RLAPI FilePathList LoadDirectoryFiles(const char *dirPath); // Load directory filepaths +RLAPI FilePathList LoadDirectoryFilesEx(const char *basePath, const char *filter, bool scanSubdirs); // Load directory filepaths with extension filtering and recursive directory scan +RLAPI void UnloadDirectoryFiles(FilePathList files); // Unload filepaths +RLAPI bool IsFileDropped(void); // Check if a file has been dropped into window +RLAPI FilePathList LoadDroppedFiles(void); // Load dropped filepaths +RLAPI void UnloadDroppedFiles(FilePathList files); // Unload dropped filepaths +RLAPI long GetFileModTime(const char *fileName); // Get file modification time (last write time) + +// Compression/Encoding functionality +RLAPI unsigned char *CompressData(const unsigned char *data, int dataSize, int *compDataSize); // Compress data (DEFLATE algorithm), memory must be MemFree() +RLAPI unsigned char *DecompressData(const unsigned char *compData, int compDataSize, int *dataSize); // Decompress data (DEFLATE algorithm), memory must be MemFree() +RLAPI char *EncodeDataBase64(const unsigned char *data, int dataSize, int *outputSize); // Encode data to Base64 string, memory must be MemFree() +RLAPI unsigned char *DecodeDataBase64(const unsigned char *data, int *outputSize); // Decode Base64 string data, memory must be MemFree() + +//------------------------------------------------------------------------------------ +// Input Handling Functions (Module: core) +//------------------------------------------------------------------------------------ + +// Input-related functions: keyboard +RLAPI bool IsKeyPressed(int key); // Check if a key has been pressed once +RLAPI bool IsKeyDown(int key); // Check if a key is being pressed +RLAPI bool IsKeyReleased(int key); // Check if a key has been released once +RLAPI bool IsKeyUp(int key); // Check if a key is NOT being pressed +RLAPI void SetExitKey(int key); // Set a custom key to exit program (default is ESC) +RLAPI int GetKeyPressed(void); // Get key pressed (keycode), call it multiple times for keys queued, returns 0 when the queue is empty +RLAPI int GetCharPressed(void); // Get char pressed (unicode), call it multiple times for chars queued, returns 0 when the queue is empty + +// Input-related functions: gamepads +RLAPI bool IsGamepadAvailable(int gamepad); // Check if a gamepad is available +RLAPI const char *GetGamepadName(int gamepad); // Get gamepad internal name id +RLAPI bool IsGamepadButtonPressed(int gamepad, int button); // Check if a gamepad button has been pressed once +RLAPI bool IsGamepadButtonDown(int gamepad, int button); // Check if a gamepad button is being pressed +RLAPI bool IsGamepadButtonReleased(int gamepad, int button); // Check if a gamepad button has been released once +RLAPI bool IsGamepadButtonUp(int gamepad, int button); // Check if a gamepad button is NOT being pressed +RLAPI int GetGamepadButtonPressed(void); // Get the last gamepad button pressed +RLAPI int GetGamepadAxisCount(int gamepad); // Get gamepad axis count for a gamepad +RLAPI float GetGamepadAxisMovement(int gamepad, int axis); // Get axis movement value for a gamepad axis +RLAPI int SetGamepadMappings(const char *mappings); // Set internal gamepad mappings (SDL_GameControllerDB) + +// Input-related functions: mouse +RLAPI bool IsMouseButtonPressed(int button); // Check if a mouse button has been pressed once +RLAPI bool IsMouseButtonDown(int button); // Check if a mouse button is being pressed +RLAPI bool IsMouseButtonReleased(int button); // Check if a mouse button has been released once +RLAPI bool IsMouseButtonUp(int button); // Check if a mouse button is NOT being pressed +RLAPI int GetMouseX(void); // Get mouse position X +RLAPI int GetMouseY(void); // Get mouse position Y +RLAPI Vector2 GetMousePosition(void); // Get mouse position XY +RLAPI Vector2 GetMouseDelta(void); // Get mouse delta between frames +RLAPI void SetMousePosition(int x, int y); // Set mouse position XY +RLAPI void SetMouseOffset(int offsetX, int offsetY); // Set mouse offset +RLAPI void SetMouseScale(float scaleX, float scaleY); // Set mouse scaling +RLAPI float GetMouseWheelMove(void); // Get mouse wheel movement for X or Y, whichever is larger +RLAPI Vector2 GetMouseWheelMoveV(void); // Get mouse wheel movement for both X and Y +RLAPI void SetMouseCursor(int cursor); // Set mouse cursor + +// Input-related functions: touch +RLAPI int GetTouchX(void); // Get touch position X for touch point 0 (relative to screen size) +RLAPI int GetTouchY(void); // Get touch position Y for touch point 0 (relative to screen size) +RLAPI Vector2 GetTouchPosition(int index); // Get touch position XY for a touch point index (relative to screen size) +RLAPI int GetTouchPointId(int index); // Get touch point identifier for given index +RLAPI int GetTouchPointCount(void); // Get number of touch points + +//------------------------------------------------------------------------------------ +// Gestures and Touch Handling Functions (Module: rgestures) +//------------------------------------------------------------------------------------ +RLAPI void SetGesturesEnabled(unsigned int flags); // Enable a set of gestures using flags +RLAPI bool IsGestureDetected(int gesture); // Check if a gesture have been detected +RLAPI int GetGestureDetected(void); // Get latest detected gesture +RLAPI float GetGestureHoldDuration(void); // Get gesture hold time in milliseconds +RLAPI Vector2 GetGestureDragVector(void); // Get gesture drag vector +RLAPI float GetGestureDragAngle(void); // Get gesture drag angle +RLAPI Vector2 GetGesturePinchVector(void); // Get gesture pinch delta +RLAPI float GetGesturePinchAngle(void); // Get gesture pinch angle + +//------------------------------------------------------------------------------------ +// Camera System Functions (Module: rcamera) +//------------------------------------------------------------------------------------ +RLAPI void SetCameraMode(Camera camera, int mode); // Set camera mode (multiple camera modes available) +RLAPI void UpdateCamera(Camera *camera); // Update camera position for selected mode + +RLAPI void SetCameraPanControl(int keyPan); // Set camera pan key to combine with mouse movement (free camera) +RLAPI void SetCameraAltControl(int keyAlt); // Set camera alt key to combine with mouse movement (free camera) +RLAPI void SetCameraSmoothZoomControl(int keySmoothZoom); // Set camera smooth zoom key to combine with mouse (free camera) +RLAPI void SetCameraMoveControls(int keyFront, int keyBack, int keyRight, int keyLeft, int keyUp, int keyDown); // Set camera move controls (1st person and 3rd person cameras) + +//------------------------------------------------------------------------------------ +// Basic Shapes Drawing Functions (Module: shapes) +//------------------------------------------------------------------------------------ +// Set texture and rectangle to be used on shapes drawing +// NOTE: It can be useful when using basic shapes and one single font, +// defining a font char white rectangle would allow drawing everything in a single draw call +RLAPI void SetShapesTexture(Texture2D texture, Rectangle source); // Set texture and rectangle to be used on shapes drawing + +// Basic shapes drawing functions +RLAPI void DrawPixel(int posX, int posY, Color color); // Draw a pixel +RLAPI void DrawPixelV(Vector2 position, Color color); // Draw a pixel (Vector version) +RLAPI void DrawLine(int startPosX, int startPosY, int endPosX, int endPosY, Color color); // Draw a line +RLAPI void DrawLineV(Vector2 startPos, Vector2 endPos, Color color); // Draw a line (Vector version) +RLAPI void DrawLineEx(Vector2 startPos, Vector2 endPos, float thick, Color color); // Draw a line defining thickness +RLAPI void DrawLineBezier(Vector2 startPos, Vector2 endPos, float thick, Color color); // Draw a line using cubic-bezier curves in-out +RLAPI void DrawLineBezierQuad(Vector2 startPos, Vector2 endPos, Vector2 controlPos, float thick, Color color); // Draw line using quadratic bezier curves with a control point +RLAPI void DrawLineBezierCubic(Vector2 startPos, Vector2 endPos, Vector2 startControlPos, Vector2 endControlPos, float thick, Color color); // Draw line using cubic bezier curves with 2 control points +RLAPI void DrawLineStrip(Vector2 *points, int pointCount, Color color); // Draw lines sequence +RLAPI void DrawCircle(int centerX, int centerY, float radius, Color color); // Draw a color-filled circle +RLAPI void DrawCircleSector(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color); // Draw a piece of a circle +RLAPI void DrawCircleSectorLines(Vector2 center, float radius, float startAngle, float endAngle, int segments, Color color); // Draw circle sector outline +RLAPI void DrawCircleGradient(int centerX, int centerY, float radius, Color color1, Color color2); // Draw a gradient-filled circle +RLAPI void DrawCircleV(Vector2 center, float radius, Color color); // Draw a color-filled circle (Vector version) +RLAPI void DrawCircleLines(int centerX, int centerY, float radius, Color color); // Draw circle outline +RLAPI void DrawEllipse(int centerX, int centerY, float radiusH, float radiusV, Color color); // Draw ellipse +RLAPI void DrawEllipseLines(int centerX, int centerY, float radiusH, float radiusV, Color color); // Draw ellipse outline +RLAPI void DrawRing(Vector2 center, float innerRadius, float outerRadius, float startAngle, float endAngle, int segments, Color color); // Draw ring +RLAPI void DrawRingLines(Vector2 center, float innerRadius, float outerRadius, float startAngle, float endAngle, int segments, Color color); // Draw ring outline +RLAPI void DrawRectangle(int posX, int posY, int width, int height, Color color); // Draw a color-filled rectangle +RLAPI void DrawRectangleV(Vector2 position, Vector2 size, Color color); // Draw a color-filled rectangle (Vector version) +RLAPI void DrawRectangleRec(Rectangle rec, Color color); // Draw a color-filled rectangle +RLAPI void DrawRectanglePro(Rectangle rec, Vector2 origin, float rotation, Color color); // Draw a color-filled rectangle with pro parameters +RLAPI void DrawRectangleGradientV(int posX, int posY, int width, int height, Color color1, Color color2);// Draw a vertical-gradient-filled rectangle +RLAPI void DrawRectangleGradientH(int posX, int posY, int width, int height, Color color1, Color color2);// Draw a horizontal-gradient-filled rectangle +RLAPI void DrawRectangleGradientEx(Rectangle rec, Color col1, Color col2, Color col3, Color col4); // Draw a gradient-filled rectangle with custom vertex colors +RLAPI void DrawRectangleLines(int posX, int posY, int width, int height, Color color); // Draw rectangle outline +RLAPI void DrawRectangleLinesEx(Rectangle rec, float lineThick, Color color); // Draw rectangle outline with extended parameters +RLAPI void DrawRectangleRounded(Rectangle rec, float roundness, int segments, Color color); // Draw rectangle with rounded edges +RLAPI void DrawRectangleRoundedLines(Rectangle rec, float roundness, int segments, float lineThick, Color color); // Draw rectangle with rounded edges outline +RLAPI void DrawTriangle(Vector2 v1, Vector2 v2, Vector2 v3, Color color); // Draw a color-filled triangle (vertex in counter-clockwise order!) +RLAPI void DrawTriangleLines(Vector2 v1, Vector2 v2, Vector2 v3, Color color); // Draw triangle outline (vertex in counter-clockwise order!) +RLAPI void DrawTriangleFan(Vector2 *points, int pointCount, Color color); // Draw a triangle fan defined by points (first vertex is the center) +RLAPI void DrawTriangleStrip(Vector2 *points, int pointCount, Color color); // Draw a triangle strip defined by points +RLAPI void DrawPoly(Vector2 center, int sides, float radius, float rotation, Color color); // Draw a regular polygon (Vector version) +RLAPI void DrawPolyLines(Vector2 center, int sides, float radius, float rotation, Color color); // Draw a polygon outline of n sides +RLAPI void DrawPolyLinesEx(Vector2 center, int sides, float radius, float rotation, float lineThick, Color color); // Draw a polygon outline of n sides with extended parameters + +// Basic shapes collision detection functions +RLAPI bool CheckCollisionRecs(Rectangle rec1, Rectangle rec2); // Check collision between two rectangles +RLAPI bool CheckCollisionCircles(Vector2 center1, float radius1, Vector2 center2, float radius2); // Check collision between two circles +RLAPI bool CheckCollisionCircleRec(Vector2 center, float radius, Rectangle rec); // Check collision between circle and rectangle +RLAPI bool CheckCollisionPointRec(Vector2 point, Rectangle rec); // Check if point is inside rectangle +RLAPI bool CheckCollisionPointCircle(Vector2 point, Vector2 center, float radius); // Check if point is inside circle +RLAPI bool CheckCollisionPointTriangle(Vector2 point, Vector2 p1, Vector2 p2, Vector2 p3); // Check if point is inside a triangle +RLAPI bool CheckCollisionLines(Vector2 startPos1, Vector2 endPos1, Vector2 startPos2, Vector2 endPos2, Vector2 *collisionPoint); // Check the collision between two lines defined by two points each, returns collision point by reference +RLAPI bool CheckCollisionPointLine(Vector2 point, Vector2 p1, Vector2 p2, int threshold); // Check if point belongs to line created between two points [p1] and [p2] with defined margin in pixels [threshold] +RLAPI Rectangle GetCollisionRec(Rectangle rec1, Rectangle rec2); // Get collision rectangle for two rectangles collision + +//------------------------------------------------------------------------------------ +// Texture Loading and Drawing Functions (Module: textures) +//------------------------------------------------------------------------------------ + +// Image loading functions +// NOTE: This functions do not require GPU access +RLAPI Image LoadImage(const char *fileName); // Load image from file into CPU memory (RAM) +RLAPI Image LoadImageRaw(const char *fileName, int width, int height, int format, int headerSize); // Load image from RAW file data +RLAPI Image LoadImageAnim(const char *fileName, int *frames); // Load image sequence from file (frames appended to image.data) +RLAPI Image LoadImageFromMemory(const char *fileType, const unsigned char *fileData, int dataSize); // Load image from memory buffer, fileType refers to extension: i.e. '.png' +RLAPI Image LoadImageFromTexture(Texture2D texture); // Load image from GPU texture data +RLAPI Image LoadImageFromScreen(void); // Load image from screen buffer and (screenshot) +RLAPI void UnloadImage(Image image); // Unload image from CPU memory (RAM) +RLAPI bool ExportImage(Image image, const char *fileName); // Export image data to file, returns true on success +RLAPI bool ExportImageAsCode(Image image, const char *fileName); // Export image as code file defining an array of bytes, returns true on success + +// Image generation functions +RLAPI Image GenImageColor(int width, int height, Color color); // Generate image: plain color +RLAPI Image GenImageGradientV(int width, int height, Color top, Color bottom); // Generate image: vertical gradient +RLAPI Image GenImageGradientH(int width, int height, Color left, Color right); // Generate image: horizontal gradient +RLAPI Image GenImageGradientRadial(int width, int height, float density, Color inner, Color outer); // Generate image: radial gradient +RLAPI Image GenImageChecked(int width, int height, int checksX, int checksY, Color col1, Color col2); // Generate image: checked +RLAPI Image GenImageWhiteNoise(int width, int height, float factor); // Generate image: white noise +RLAPI Image GenImageCellular(int width, int height, int tileSize); // Generate image: cellular algorithm, bigger tileSize means bigger cells + +// Image manipulation functions +RLAPI Image ImageCopy(Image image); // Create an image duplicate (useful for transformations) +RLAPI Image ImageFromImage(Image image, Rectangle rec); // Create an image from another image piece +RLAPI Image ImageText(const char *text, int fontSize, Color color); // Create an image from text (default font) +RLAPI Image ImageTextEx(Font font, const char *text, float fontSize, float spacing, Color tint); // Create an image from text (custom sprite font) +RLAPI void ImageFormat(Image *image, int newFormat); // Convert image data to desired format +RLAPI void ImageToPOT(Image *image, Color fill); // Convert image to POT (power-of-two) +RLAPI void ImageCrop(Image *image, Rectangle crop); // Crop an image to a defined rectangle +RLAPI void ImageAlphaCrop(Image *image, float threshold); // Crop image depending on alpha value +RLAPI void ImageAlphaClear(Image *image, Color color, float threshold); // Clear alpha channel to desired color +RLAPI void ImageAlphaMask(Image *image, Image alphaMask); // Apply alpha mask to image +RLAPI void ImageAlphaPremultiply(Image *image); // Premultiply alpha channel +RLAPI void ImageResize(Image *image, int newWidth, int newHeight); // Resize image (Bicubic scaling algorithm) +RLAPI void ImageResizeNN(Image *image, int newWidth,int newHeight); // Resize image (Nearest-Neighbor scaling algorithm) +RLAPI void ImageResizeCanvas(Image *image, int newWidth, int newHeight, int offsetX, int offsetY, Color fill); // Resize canvas and fill with color +RLAPI void ImageMipmaps(Image *image); // Compute all mipmap levels for a provided image +RLAPI void ImageDither(Image *image, int rBpp, int gBpp, int bBpp, int aBpp); // Dither image data to 16bpp or lower (Floyd-Steinberg dithering) +RLAPI void ImageFlipVertical(Image *image); // Flip image vertically +RLAPI void ImageFlipHorizontal(Image *image); // Flip image horizontally +RLAPI void ImageRotateCW(Image *image); // Rotate image clockwise 90deg +RLAPI void ImageRotateCCW(Image *image); // Rotate image counter-clockwise 90deg +RLAPI void ImageColorTint(Image *image, Color color); // Modify image color: tint +RLAPI void ImageColorInvert(Image *image); // Modify image color: invert +RLAPI void ImageColorGrayscale(Image *image); // Modify image color: grayscale +RLAPI void ImageColorContrast(Image *image, float contrast); // Modify image color: contrast (-100 to 100) +RLAPI void ImageColorBrightness(Image *image, int brightness); // Modify image color: brightness (-255 to 255) +RLAPI void ImageColorReplace(Image *image, Color color, Color replace); // Modify image color: replace color +RLAPI Color *LoadImageColors(Image image); // Load color data from image as a Color array (RGBA - 32bit) +RLAPI Color *LoadImagePalette(Image image, int maxPaletteSize, int *colorCount); // Load colors palette from image as a Color array (RGBA - 32bit) +RLAPI void UnloadImageColors(Color *colors); // Unload color data loaded with LoadImageColors() +RLAPI void UnloadImagePalette(Color *colors); // Unload colors palette loaded with LoadImagePalette() +RLAPI Rectangle GetImageAlphaBorder(Image image, float threshold); // Get image alpha border rectangle +RLAPI Color GetImageColor(Image image, int x, int y); // Get image pixel color at (x, y) position + +// Image drawing functions +// NOTE: Image software-rendering functions (CPU) +RLAPI void ImageClearBackground(Image *dst, Color color); // Clear image background with given color +RLAPI void ImageDrawPixel(Image *dst, int posX, int posY, Color color); // Draw pixel within an image +RLAPI void ImageDrawPixelV(Image *dst, Vector2 position, Color color); // Draw pixel within an image (Vector version) +RLAPI void ImageDrawLine(Image *dst, int startPosX, int startPosY, int endPosX, int endPosY, Color color); // Draw line within an image +RLAPI void ImageDrawLineV(Image *dst, Vector2 start, Vector2 end, Color color); // Draw line within an image (Vector version) +RLAPI void ImageDrawCircle(Image *dst, int centerX, int centerY, int radius, Color color); // Draw circle within an image +RLAPI void ImageDrawCircleV(Image *dst, Vector2 center, int radius, Color color); // Draw circle within an image (Vector version) +RLAPI void ImageDrawRectangle(Image *dst, int posX, int posY, int width, int height, Color color); // Draw rectangle within an image +RLAPI void ImageDrawRectangleV(Image *dst, Vector2 position, Vector2 size, Color color); // Draw rectangle within an image (Vector version) +RLAPI void ImageDrawRectangleRec(Image *dst, Rectangle rec, Color color); // Draw rectangle within an image +RLAPI void ImageDrawRectangleLines(Image *dst, Rectangle rec, int thick, Color color); // Draw rectangle lines within an image +RLAPI void ImageDraw(Image *dst, Image src, Rectangle srcRec, Rectangle dstRec, Color tint); // Draw a source image within a destination image (tint applied to source) +RLAPI void ImageDrawText(Image *dst, const char *text, int posX, int posY, int fontSize, Color color); // Draw text (using default font) within an image (destination) +RLAPI void ImageDrawTextEx(Image *dst, Font font, const char *text, Vector2 position, float fontSize, float spacing, Color tint); // Draw text (custom sprite font) within an image (destination) + +// Texture loading functions +// NOTE: These functions require GPU access +RLAPI Texture2D LoadTexture(const char *fileName); // Load texture from file into GPU memory (VRAM) +RLAPI Texture2D LoadTextureFromImage(Image image); // Load texture from image data +RLAPI TextureCubemap LoadTextureCubemap(Image image, int layout); // Load cubemap from image, multiple image cubemap layouts supported +RLAPI RenderTexture2D LoadRenderTexture(int width, int height); // Load texture for rendering (framebuffer) +RLAPI void UnloadTexture(Texture2D texture); // Unload texture from GPU memory (VRAM) +RLAPI void UnloadRenderTexture(RenderTexture2D target); // Unload render texture from GPU memory (VRAM) +RLAPI void UpdateTexture(Texture2D texture, const void *pixels); // Update GPU texture with new data +RLAPI void UpdateTextureRec(Texture2D texture, Rectangle rec, const void *pixels); // Update GPU texture rectangle with new data + +// Texture configuration functions +RLAPI void GenTextureMipmaps(Texture2D *texture); // Generate GPU mipmaps for a texture +RLAPI void SetTextureFilter(Texture2D texture, int filter); // Set texture scaling filter mode +RLAPI void SetTextureWrap(Texture2D texture, int wrap); // Set texture wrapping mode + +// Texture drawing functions +RLAPI void DrawTexture(Texture2D texture, int posX, int posY, Color tint); // Draw a Texture2D +RLAPI void DrawTextureV(Texture2D texture, Vector2 position, Color tint); // Draw a Texture2D with position defined as Vector2 +RLAPI void DrawTextureEx(Texture2D texture, Vector2 position, float rotation, float scale, Color tint); // Draw a Texture2D with extended parameters +RLAPI void DrawTextureRec(Texture2D texture, Rectangle source, Vector2 position, Color tint); // Draw a part of a texture defined by a rectangle +RLAPI void DrawTextureQuad(Texture2D texture, Vector2 tiling, Vector2 offset, Rectangle quad, Color tint); // Draw texture quad with tiling and offset parameters +RLAPI void DrawTextureTiled(Texture2D texture, Rectangle source, Rectangle dest, Vector2 origin, float rotation, float scale, Color tint); // Draw part of a texture (defined by a rectangle) with rotation and scale tiled into dest. +RLAPI void DrawTexturePro(Texture2D texture, Rectangle source, Rectangle dest, Vector2 origin, float rotation, Color tint); // Draw a part of a texture defined by a rectangle with 'pro' parameters +RLAPI void DrawTextureNPatch(Texture2D texture, NPatchInfo nPatchInfo, Rectangle dest, Vector2 origin, float rotation, Color tint); // Draws a texture (or part of it) that stretches or shrinks nicely +RLAPI void DrawTexturePoly(Texture2D texture, Vector2 center, Vector2 *points, Vector2 *texcoords, int pointCount, Color tint); // Draw a textured polygon + +// Color/pixel related functions +RLAPI Color Fade(Color color, float alpha); // Get color with alpha applied, alpha goes from 0.0f to 1.0f +RLAPI int ColorToInt(Color color); // Get hexadecimal value for a Color +RLAPI Vector4 ColorNormalize(Color color); // Get Color normalized as float [0..1] +RLAPI Color ColorFromNormalized(Vector4 normalized); // Get Color from normalized values [0..1] +RLAPI Vector3 ColorToHSV(Color color); // Get HSV values for a Color, hue [0..360], saturation/value [0..1] +RLAPI Color ColorFromHSV(float hue, float saturation, float value); // Get a Color from HSV values, hue [0..360], saturation/value [0..1] +RLAPI Color ColorAlpha(Color color, float alpha); // Get color with alpha applied, alpha goes from 0.0f to 1.0f +RLAPI Color ColorAlphaBlend(Color dst, Color src, Color tint); // Get src alpha-blended into dst color with tint +RLAPI Color GetColor(unsigned int hexValue); // Get Color structure from hexadecimal value +RLAPI Color GetPixelColor(void *srcPtr, int format); // Get Color from a source pixel pointer of certain format +RLAPI void SetPixelColor(void *dstPtr, Color color, int format); // Set color formatted into destination pixel pointer +RLAPI int GetPixelDataSize(int width, int height, int format); // Get pixel data size in bytes for certain format + +//------------------------------------------------------------------------------------ +// Font Loading and Text Drawing Functions (Module: text) +//------------------------------------------------------------------------------------ + +// Font loading/unloading functions +RLAPI Font GetFontDefault(void); // Get the default Font +RLAPI Font LoadFont(const char *fileName); // Load font from file into GPU memory (VRAM) +RLAPI Font LoadFontEx(const char *fileName, int fontSize, int *fontChars, int glyphCount); // Load font from file with extended parameters, use NULL for fontChars and 0 for glyphCount to load the default character set +RLAPI Font LoadFontFromImage(Image image, Color key, int firstChar); // Load font from Image (XNA style) +RLAPI Font LoadFontFromMemory(const char *fileType, const unsigned char *fileData, int dataSize, int fontSize, int *fontChars, int glyphCount); // Load font from memory buffer, fileType refers to extension: i.e. '.ttf' +RLAPI GlyphInfo *LoadFontData(const unsigned char *fileData, int dataSize, int fontSize, int *fontChars, int glyphCount, int type); // Load font data for further use +RLAPI Image GenImageFontAtlas(const GlyphInfo *chars, Rectangle **recs, int glyphCount, int fontSize, int padding, int packMethod); // Generate image font atlas using chars info +RLAPI void UnloadFontData(GlyphInfo *chars, int glyphCount); // Unload font chars info data (RAM) +RLAPI void UnloadFont(Font font); // Unload font from GPU memory (VRAM) +RLAPI bool ExportFontAsCode(Font font, const char *fileName); // Export font as code file, returns true on success + +// Text drawing functions +RLAPI void DrawFPS(int posX, int posY); // Draw current FPS +RLAPI void DrawText(const char *text, int posX, int posY, int fontSize, Color color); // Draw text (using default font) +RLAPI void DrawTextEx(Font font, const char *text, Vector2 position, float fontSize, float spacing, Color tint); // Draw text using font and additional parameters +RLAPI void DrawTextPro(Font font, const char *text, Vector2 position, Vector2 origin, float rotation, float fontSize, float spacing, Color tint); // Draw text using Font and pro parameters (rotation) +RLAPI void DrawTextCodepoint(Font font, int codepoint, Vector2 position, float fontSize, Color tint); // Draw one character (codepoint) +RLAPI void DrawTextCodepoints(Font font, const int *codepoints, int count, Vector2 position, float fontSize, float spacing, Color tint); // Draw multiple character (codepoint) + +// Text font info functions +RLAPI int MeasureText(const char *text, int fontSize); // Measure string width for default font +RLAPI Vector2 MeasureTextEx(Font font, const char *text, float fontSize, float spacing); // Measure string size for Font +RLAPI int GetGlyphIndex(Font font, int codepoint); // Get glyph index position in font for a codepoint (unicode character), fallback to '?' if not found +RLAPI GlyphInfo GetGlyphInfo(Font font, int codepoint); // Get glyph font info data for a codepoint (unicode character), fallback to '?' if not found +RLAPI Rectangle GetGlyphAtlasRec(Font font, int codepoint); // Get glyph rectangle in font atlas for a codepoint (unicode character), fallback to '?' if not found + +// Text codepoints management functions (unicode characters) +RLAPI int *LoadCodepoints(const char *text, int *count); // Load all codepoints from a UTF-8 text string, codepoints count returned by parameter +RLAPI void UnloadCodepoints(int *codepoints); // Unload codepoints data from memory +RLAPI int GetCodepointCount(const char *text); // Get total number of codepoints in a UTF-8 encoded string +RLAPI int GetCodepoint(const char *text, int *bytesProcessed); // Get next codepoint in a UTF-8 encoded string, 0x3f('?') is returned on failure +RLAPI const char *CodepointToUTF8(int codepoint, int *byteSize); // Encode one codepoint into UTF-8 byte array (array length returned as parameter) +RLAPI char *TextCodepointsToUTF8(const int *codepoints, int length); // Encode text as codepoints array into UTF-8 text string (WARNING: memory must be freed!) + +// Text strings management functions (no UTF-8 strings, only byte chars) +// NOTE: Some strings allocate memory internally for returned strings, just be careful! +RLAPI int TextCopy(char *dst, const char *src); // Copy one string to another, returns bytes copied +RLAPI bool TextIsEqual(const char *text1, const char *text2); // Check if two text string are equal +RLAPI unsigned int TextLength(const char *text); // Get text length, checks for '\0' ending +RLAPI const char *TextFormat(const char *text, ...); // Text formatting with variables (sprintf() style) +RLAPI const char *TextSubtext(const char *text, int position, int length); // Get a piece of a text string +RLAPI char *TextReplace(char *text, const char *replace, const char *by); // Replace text string (WARNING: memory must be freed!) +RLAPI char *TextInsert(const char *text, const char *insert, int position); // Insert text in a position (WARNING: memory must be freed!) +RLAPI const char *TextJoin(const char **textList, int count, const char *delimiter); // Join text strings with delimiter +RLAPI const char **TextSplit(const char *text, char delimiter, int *count); // Split text into multiple strings +RLAPI void TextAppend(char *text, const char *append, int *position); // Append text at specific position and move cursor! +RLAPI int TextFindIndex(const char *text, const char *find); // Find first text occurrence within a string +RLAPI const char *TextToUpper(const char *text); // Get upper case version of provided string +RLAPI const char *TextToLower(const char *text); // Get lower case version of provided string +RLAPI const char *TextToPascal(const char *text); // Get Pascal case notation version of provided string +RLAPI int TextToInteger(const char *text); // Get integer value from text (negative values not supported) + +//------------------------------------------------------------------------------------ +// Basic 3d Shapes Drawing Functions (Module: models) +//------------------------------------------------------------------------------------ + +// Basic geometric 3D shapes drawing functions +RLAPI void DrawLine3D(Vector3 startPos, Vector3 endPos, Color color); // Draw a line in 3D world space +RLAPI void DrawPoint3D(Vector3 position, Color color); // Draw a point in 3D space, actually a small line +RLAPI void DrawCircle3D(Vector3 center, float radius, Vector3 rotationAxis, float rotationAngle, Color color); // Draw a circle in 3D world space +RLAPI void DrawTriangle3D(Vector3 v1, Vector3 v2, Vector3 v3, Color color); // Draw a color-filled triangle (vertex in counter-clockwise order!) +RLAPI void DrawTriangleStrip3D(Vector3 *points, int pointCount, Color color); // Draw a triangle strip defined by points +RLAPI void DrawCube(Vector3 position, float width, float height, float length, Color color); // Draw cube +RLAPI void DrawCubeV(Vector3 position, Vector3 size, Color color); // Draw cube (Vector version) +RLAPI void DrawCubeWires(Vector3 position, float width, float height, float length, Color color); // Draw cube wires +RLAPI void DrawCubeWiresV(Vector3 position, Vector3 size, Color color); // Draw cube wires (Vector version) +RLAPI void DrawCubeTexture(Texture2D texture, Vector3 position, float width, float height, float length, Color color); // Draw cube textured +RLAPI void DrawCubeTextureRec(Texture2D texture, Rectangle source, Vector3 position, float width, float height, float length, Color color); // Draw cube with a region of a texture +RLAPI void DrawSphere(Vector3 centerPos, float radius, Color color); // Draw sphere +RLAPI void DrawSphereEx(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere with extended parameters +RLAPI void DrawSphereWires(Vector3 centerPos, float radius, int rings, int slices, Color color); // Draw sphere wires +RLAPI void DrawCylinder(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone +RLAPI void DrawCylinderEx(Vector3 startPos, Vector3 endPos, float startRadius, float endRadius, int sides, Color color); // Draw a cylinder with base at startPos and top at endPos +RLAPI void DrawCylinderWires(Vector3 position, float radiusTop, float radiusBottom, float height, int slices, Color color); // Draw a cylinder/cone wires +RLAPI void DrawCylinderWiresEx(Vector3 startPos, Vector3 endPos, float startRadius, float endRadius, int sides, Color color); // Draw a cylinder wires with base at startPos and top at endPos +RLAPI void DrawPlane(Vector3 centerPos, Vector2 size, Color color); // Draw a plane XZ +RLAPI void DrawRay(Ray ray, Color color); // Draw a ray line +RLAPI void DrawGrid(int slices, float spacing); // Draw a grid (centered at (0, 0, 0)) + +//------------------------------------------------------------------------------------ +// Model 3d Loading and Drawing Functions (Module: models) +//------------------------------------------------------------------------------------ + +// Model management functions +RLAPI Model LoadModel(const char *fileName); // Load model from files (meshes and materials) +RLAPI Model LoadModelFromMesh(Mesh mesh); // Load model from generated mesh (default material) +RLAPI void UnloadModel(Model model); // Unload model (including meshes) from memory (RAM and/or VRAM) +RLAPI void UnloadModelKeepMeshes(Model model); // Unload model (but not meshes) from memory (RAM and/or VRAM) +RLAPI BoundingBox GetModelBoundingBox(Model model); // Compute model bounding box limits (considers all meshes) + +// Model drawing functions +RLAPI void DrawModel(Model model, Vector3 position, float scale, Color tint); // Draw a model (with texture if set) +RLAPI void DrawModelEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model with extended parameters +RLAPI void DrawModelWires(Model model, Vector3 position, float scale, Color tint); // Draw a model wires (with texture if set) +RLAPI void DrawModelWiresEx(Model model, Vector3 position, Vector3 rotationAxis, float rotationAngle, Vector3 scale, Color tint); // Draw a model wires (with texture if set) with extended parameters +RLAPI void DrawBoundingBox(BoundingBox box, Color color); // Draw bounding box (wires) +RLAPI void DrawBillboard(Camera camera, Texture2D texture, Vector3 position, float size, Color tint); // Draw a billboard texture +RLAPI void DrawBillboardRec(Camera camera, Texture2D texture, Rectangle source, Vector3 position, Vector2 size, Color tint); // Draw a billboard texture defined by source +RLAPI void DrawBillboardPro(Camera camera, Texture2D texture, Rectangle source, Vector3 position, Vector3 up, Vector2 size, Vector2 origin, float rotation, Color tint); // Draw a billboard texture defined by source and rotation + +// Mesh management functions +RLAPI void UploadMesh(Mesh *mesh, bool dynamic); // Upload mesh vertex data in GPU and provide VAO/VBO ids +RLAPI void UpdateMeshBuffer(Mesh mesh, int index, const void *data, int dataSize, int offset); // Update mesh vertex data in GPU for a specific buffer index +RLAPI void UnloadMesh(Mesh mesh); // Unload mesh data from CPU and GPU +RLAPI void DrawMesh(Mesh mesh, Material material, Matrix transform); // Draw a 3d mesh with material and transform +RLAPI void DrawMeshInstanced(Mesh mesh, Material material, const Matrix *transforms, int instances); // Draw multiple mesh instances with material and different transforms +RLAPI bool ExportMesh(Mesh mesh, const char *fileName); // Export mesh data to file, returns true on success +RLAPI BoundingBox GetMeshBoundingBox(Mesh mesh); // Compute mesh bounding box limits +RLAPI void GenMeshTangents(Mesh *mesh); // Compute mesh tangents + +// Mesh generation functions +RLAPI Mesh GenMeshPoly(int sides, float radius); // Generate polygonal mesh +RLAPI Mesh GenMeshPlane(float width, float length, int resX, int resZ); // Generate plane mesh (with subdivisions) +RLAPI Mesh GenMeshCube(float width, float height, float length); // Generate cuboid mesh +RLAPI Mesh GenMeshSphere(float radius, int rings, int slices); // Generate sphere mesh (standard sphere) +RLAPI Mesh GenMeshHemiSphere(float radius, int rings, int slices); // Generate half-sphere mesh (no bottom cap) +RLAPI Mesh GenMeshCylinder(float radius, float height, int slices); // Generate cylinder mesh +RLAPI Mesh GenMeshCone(float radius, float height, int slices); // Generate cone/pyramid mesh +RLAPI Mesh GenMeshTorus(float radius, float size, int radSeg, int sides); // Generate torus mesh +RLAPI Mesh GenMeshKnot(float radius, float size, int radSeg, int sides); // Generate trefoil knot mesh +RLAPI Mesh GenMeshHeightmap(Image heightmap, Vector3 size); // Generate heightmap mesh from image data +RLAPI Mesh GenMeshCubicmap(Image cubicmap, Vector3 cubeSize); // Generate cubes-based map mesh from image data + +// Material loading/unloading functions +RLAPI Material *LoadMaterials(const char *fileName, int *materialCount); // Load materials from model file +RLAPI Material LoadMaterialDefault(void); // Load default material (Supports: DIFFUSE, SPECULAR, NORMAL maps) +RLAPI void UnloadMaterial(Material material); // Unload material from GPU memory (VRAM) +RLAPI void SetMaterialTexture(Material *material, int mapType, Texture2D texture); // Set texture for a material map type (MATERIAL_MAP_DIFFUSE, MATERIAL_MAP_SPECULAR...) +RLAPI void SetModelMeshMaterial(Model *model, int meshId, int materialId); // Set material for a mesh + +// Model animations loading/unloading functions +RLAPI ModelAnimation *LoadModelAnimations(const char *fileName, unsigned int *animCount); // Load model animations from file +RLAPI void UpdateModelAnimation(Model model, ModelAnimation anim, int frame); // Update model animation pose +RLAPI void UnloadModelAnimation(ModelAnimation anim); // Unload animation data +RLAPI void UnloadModelAnimations(ModelAnimation *animations, unsigned int count); // Unload animation array data +RLAPI bool IsModelAnimationValid(Model model, ModelAnimation anim); // Check model animation skeleton match + +// Collision detection functions +RLAPI bool CheckCollisionSpheres(Vector3 center1, float radius1, Vector3 center2, float radius2); // Check collision between two spheres +RLAPI bool CheckCollisionBoxes(BoundingBox box1, BoundingBox box2); // Check collision between two bounding boxes +RLAPI bool CheckCollisionBoxSphere(BoundingBox box, Vector3 center, float radius); // Check collision between box and sphere +RLAPI RayCollision GetRayCollisionSphere(Ray ray, Vector3 center, float radius); // Get collision info between ray and sphere +RLAPI RayCollision GetRayCollisionBox(Ray ray, BoundingBox box); // Get collision info between ray and box +RLAPI RayCollision GetRayCollisionMesh(Ray ray, Mesh mesh, Matrix transform); // Get collision info between ray and mesh +RLAPI RayCollision GetRayCollisionTriangle(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3); // Get collision info between ray and triangle +RLAPI RayCollision GetRayCollisionQuad(Ray ray, Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4); // Get collision info between ray and quad + +//------------------------------------------------------------------------------------ +// Audio Loading and Playing Functions (Module: audio) +//------------------------------------------------------------------------------------ +typedef void (*AudioCallback)(void *bufferData, unsigned int frames); + +// Audio device management functions +RLAPI void InitAudioDevice(void); // Initialize audio device and context +RLAPI void CloseAudioDevice(void); // Close the audio device and context +RLAPI bool IsAudioDeviceReady(void); // Check if audio device has been initialized successfully +RLAPI void SetMasterVolume(float volume); // Set master volume (listener) + +// Wave/Sound loading/unloading functions +RLAPI Wave LoadWave(const char *fileName); // Load wave data from file +RLAPI Wave LoadWaveFromMemory(const char *fileType, const unsigned char *fileData, int dataSize); // Load wave from memory buffer, fileType refers to extension: i.e. '.wav' +RLAPI Sound LoadSound(const char *fileName); // Load sound from file +RLAPI Sound LoadSoundFromWave(Wave wave); // Load sound from wave data +RLAPI void UpdateSound(Sound sound, const void *data, int sampleCount); // Update sound buffer with new data +RLAPI void UnloadWave(Wave wave); // Unload wave data +RLAPI void UnloadSound(Sound sound); // Unload sound +RLAPI bool ExportWave(Wave wave, const char *fileName); // Export wave data to file, returns true on success +RLAPI bool ExportWaveAsCode(Wave wave, const char *fileName); // Export wave sample data to code (.h), returns true on success + +// Wave/Sound management functions +RLAPI void PlaySound(Sound sound); // Play a sound +RLAPI void StopSound(Sound sound); // Stop playing a sound +RLAPI void PauseSound(Sound sound); // Pause a sound +RLAPI void ResumeSound(Sound sound); // Resume a paused sound +RLAPI void PlaySoundMulti(Sound sound); // Play a sound (using multichannel buffer pool) +RLAPI void StopSoundMulti(void); // Stop any sound playing (using multichannel buffer pool) +RLAPI int GetSoundsPlaying(void); // Get number of sounds playing in the multichannel +RLAPI bool IsSoundPlaying(Sound sound); // Check if a sound is currently playing +RLAPI void SetSoundVolume(Sound sound, float volume); // Set volume for a sound (1.0 is max level) +RLAPI void SetSoundPitch(Sound sound, float pitch); // Set pitch for a sound (1.0 is base level) +RLAPI void SetSoundPan(Sound sound, float pan); // Set pan for a sound (0.5 is center) +RLAPI Wave WaveCopy(Wave wave); // Copy a wave to a new wave +RLAPI void WaveCrop(Wave *wave, int initSample, int finalSample); // Crop a wave to defined samples range +RLAPI void WaveFormat(Wave *wave, int sampleRate, int sampleSize, int channels); // Convert wave data to desired format +RLAPI float *LoadWaveSamples(Wave wave); // Load samples data from wave as a 32bit float data array +RLAPI void UnloadWaveSamples(float *samples); // Unload samples data loaded with LoadWaveSamples() + +// Music management functions +RLAPI Music LoadMusicStream(const char *fileName); // Load music stream from file +RLAPI Music LoadMusicStreamFromMemory(const char *fileType, const unsigned char *data, int dataSize); // Load music stream from data +RLAPI void UnloadMusicStream(Music music); // Unload music stream +RLAPI void PlayMusicStream(Music music); // Start music playing +RLAPI bool IsMusicStreamPlaying(Music music); // Check if music is playing +RLAPI void UpdateMusicStream(Music music); // Updates buffers for music streaming +RLAPI void StopMusicStream(Music music); // Stop music playing +RLAPI void PauseMusicStream(Music music); // Pause music playing +RLAPI void ResumeMusicStream(Music music); // Resume playing paused music +RLAPI void SeekMusicStream(Music music, float position); // Seek music to a position (in seconds) +RLAPI void SetMusicVolume(Music music, float volume); // Set volume for music (1.0 is max level) +RLAPI void SetMusicPitch(Music music, float pitch); // Set pitch for a music (1.0 is base level) +RLAPI void SetMusicPan(Music music, float pan); // Set pan for a music (0.5 is center) +RLAPI float GetMusicTimeLength(Music music); // Get music time length (in seconds) +RLAPI float GetMusicTimePlayed(Music music); // Get current music time played (in seconds) + +// AudioStream management functions +RLAPI AudioStream LoadAudioStream(unsigned int sampleRate, unsigned int sampleSize, unsigned int channels); // Load audio stream (to stream raw audio pcm data) +RLAPI void UnloadAudioStream(AudioStream stream); // Unload audio stream and free memory +RLAPI void UpdateAudioStream(AudioStream stream, const void *data, int frameCount); // Update audio stream buffers with data +RLAPI bool IsAudioStreamProcessed(AudioStream stream); // Check if any audio stream buffers requires refill +RLAPI void PlayAudioStream(AudioStream stream); // Play audio stream +RLAPI void PauseAudioStream(AudioStream stream); // Pause audio stream +RLAPI void ResumeAudioStream(AudioStream stream); // Resume audio stream +RLAPI bool IsAudioStreamPlaying(AudioStream stream); // Check if audio stream is playing +RLAPI void StopAudioStream(AudioStream stream); // Stop audio stream +RLAPI void SetAudioStreamVolume(AudioStream stream, float volume); // Set volume for audio stream (1.0 is max level) +RLAPI void SetAudioStreamPitch(AudioStream stream, float pitch); // Set pitch for audio stream (1.0 is base level) +RLAPI void SetAudioStreamPan(AudioStream stream, float pan); // Set pan for audio stream (0.5 is centered) +RLAPI void SetAudioStreamBufferSizeDefault(int size); // Default size for new audio streams +RLAPI void SetAudioStreamCallback(AudioStream stream, AudioCallback callback); // Audio thread callback to request new data + +RLAPI void AttachAudioStreamProcessor(AudioStream stream, AudioCallback processor); // Attach audio stream processor to stream +RLAPI void DetachAudioStreamProcessor(AudioStream stream, AudioCallback processor); // Detach audio stream processor from stream + +#if defined(__cplusplus) +} +#endif + +#endif // RAYLIB_H diff --git a/src/agnostic_interface.rs b/src/agnostic_interface.rs index daec330..ca1e777 100644 --- a/src/agnostic_interface.rs +++ b/src/agnostic_interface.rs @@ -1,3 +1,5 @@ +pub mod raylib_impl; + use std::path::Path; use crate::faux_quicksilver::{Circle, Color, Rectangle, Transform, Vector}; diff --git a/src/agnostic_interface/raylib_impl.rs b/src/agnostic_interface/raylib_impl.rs new file mode 100644 index 0000000..957e814 --- /dev/null +++ b/src/agnostic_interface/raylib_impl.rs @@ -0,0 +1,140 @@ +mod ffi { + #![allow(non_upper_case_globals)] + #![allow(non_camel_case_types)] + #![allow(non_snake_case)] + #![allow(dead_code)] + + include!(concat!(env!("OUT_DIR"), "/raylib_bindings.rs")); +} + +use super::GameInterface; + +struct RaylibGame { + width: f32, + height: f32, +} + +impl RaylibGame { + pub fn new_boxed(width: f32, height: f32) -> Box { + Box::new(Self { + width, + height, + }) + } +} + +impl GameInterface for RaylibGame { + fn get_dimensions(&self) -> Result<(f32, f32), String> { + Ok((self.width, self.height)) + } + + fn get_key_pressed(&mut self, key: char) -> Result { + todo!() + } + + fn get_mouse_pressed(&mut self) -> Result, String> { + todo!() + } + + fn get_mouse_down(&mut self) -> Result, String> { + todo!() + } + + fn get_mouse_xy(&self) -> Result<(f32, f32), String> { + todo!() + } + + fn get_mouse_xy_vec(&self) -> Result { + todo!() + } + + fn get_delta_time(&self) -> f32 { + todo!() + } + + fn clear_window(&mut self, color: crate::faux_quicksilver::Color) -> Result<(), String> { + todo!() + } + + fn begin_drawing(&mut self) -> Result<(), String> { + todo!() + } + + fn end_drawing(&mut self) -> Result<(), String> { + todo!() + } + + fn draw_circle(&mut self, circle: crate::faux_quicksilver::Circle, color: crate::faux_quicksilver::Color) -> Result<(), String> { + todo!() + } + + fn draw_circle_ex( + &mut self, + circle: crate::faux_quicksilver::Circle, + color: crate::faux_quicksilver::Color, + origin: crate::faux_quicksilver::Vector, + rot: f32, + ) -> Result<(), String> { + todo!() + } + + fn draw_circle_transform( + &mut self, + circle: crate::faux_quicksilver::Circle, + color: crate::faux_quicksilver::Color, + transform: crate::faux_quicksilver::Transform, + ) -> Result<(), String> { + todo!() + } + + fn draw_rect(&mut self, rect: crate::faux_quicksilver::Rectangle, color: crate::faux_quicksilver::Color) -> Result<(), String> { + todo!() + } + + fn draw_rect_ex( + &mut self, + rect: crate::faux_quicksilver::Rectangle, + color: crate::faux_quicksilver::Color, + origin: crate::faux_quicksilver::Vector, + rot: f32, + ) -> Result<(), String> { + todo!() + } + + fn draw_rect_transform( + &mut self, + rect: crate::faux_quicksilver::Rectangle, + color: crate::faux_quicksilver::Color, + transform: crate::faux_quicksilver::Transform, + ) -> Result<(), String> { + todo!() + } + + fn load_image(&mut self, path: &std::path::Path) -> Result, String> { + todo!() + } + + fn load_font(&mut self, path: &std::path::Path) -> Result, String> { + todo!() + } + + fn load_sound(&mut self, path: &std::path::Path) -> Result, String> { + todo!() + } + + fn load_music(&mut self, path: &std::path::Path) -> Result, String> { + todo!() + } + + fn get_camera(&mut self) -> Result, String> { + todo!() + } + + fn get_default_camera(&mut self) -> Result, String> { + todo!() + } + + fn set_camera(&mut self, camera: &Box) -> Result<(), String> { + todo!() + } +} From a14f79cadd4da2364917819a8e6776c2beacbfb3 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Sun, 19 Feb 2023 16:52:52 +0900 Subject: [PATCH 12/29] Work on impl of some of raylib_impl --- build.rs | 3 +- src/agnostic_interface.rs | 1 + src/agnostic_interface/raylib_impl.rs | 378 ++++++++++++++++++++++++-- 3 files changed, 352 insertions(+), 30 deletions(-) diff --git a/build.rs b/build.rs index 989e72a..fd45ada 100644 --- a/build.rs +++ b/build.rs @@ -9,8 +9,7 @@ fn linking_raylib() { } #[cfg(feature = "no_link_raylib")] -fn linking_raylib() { -} +fn linking_raylib() {} fn main() { linking_raylib(); diff --git a/src/agnostic_interface.rs b/src/agnostic_interface.rs index ca1e777..0c09bda 100644 --- a/src/agnostic_interface.rs +++ b/src/agnostic_interface.rs @@ -41,6 +41,7 @@ pub trait MusicInterface { fn pause(&mut self) -> Result<(), String>; fn stop(&mut self) -> Result<(), String>; fn set_loop(&mut self, loop_enable: bool) -> Result<(), String>; + fn update(&mut self) -> Result<(), String>; } pub trait CameraInterface { diff --git a/src/agnostic_interface/raylib_impl.rs b/src/agnostic_interface/raylib_impl.rs index 957e814..9faa892 100644 --- a/src/agnostic_interface/raylib_impl.rs +++ b/src/agnostic_interface/raylib_impl.rs @@ -7,65 +7,310 @@ mod ffi { include!(concat!(env!("OUT_DIR"), "/raylib_bindings.rs")); } -use super::GameInterface; +use std::{ + cell::RefCell, + collections::HashMap, + ffi::CString, + os::raw::{c_char, c_int}, + rc::Rc, +}; + +use super::{FontInterface, GameInterface, ImageInterface, MusicInterface, SoundInterface}; + +fn fqcolor_to_color(c: crate::faux_quicksilver::Color) -> ffi::Color { + ffi::Color { + r: c.r, + g: c.g, + b: c.b, + a: c.a, + } +} + +#[derive(Clone, Debug)] +struct RaylibImage { + image: ffi::Image, +} + +#[derive(Clone, Debug)] +struct RaylibImageHandler { + image: Rc, +} + +impl ImageInterface for RaylibImageHandler { + fn draw( + &mut self, + x: f32, + y: f32, + color: crate::faux_quicksilver::Color, + ) -> Result<(), String> { + todo!() + } + + fn draw_sub( + &mut self, + sub_rect: crate::faux_quicksilver::Rectangle, + x: f32, + y: f32, + color: crate::faux_quicksilver::Color, + ) -> Result<(), String> { + todo!() + } + + fn draw_transform( + &mut self, + x: f32, + y: f32, + color: crate::faux_quicksilver::Color, + transform: crate::faux_quicksilver::Transform, + ) -> Result<(), String> { + todo!() + } + + fn draw_sub_transform( + &mut self, + sub_rect: crate::faux_quicksilver::Rectangle, + x: f32, + y: f32, + color: crate::faux_quicksilver::Color, + transform: crate::faux_quicksilver::Transform, + ) -> Result<(), String> { + todo!() + } + + fn get_w(&self) -> usize { + todo!() + } + + fn get_h(&self) -> usize { + todo!() + } + + fn get_wh_rect(&self) -> crate::faux_quicksilver::Rectangle { + todo!() + } +} + +#[derive(Clone, Debug)] +struct RaylibFont { + font: ffi::Font, +} + +#[derive(Clone, Debug)] +struct RaylibFontHandler { + font: Rc, +} + +impl FontInterface for RaylibFontHandler { + fn draw( + &mut self, + s: &str, + size: u32, + x: f32, + y: f32, + color: crate::faux_quicksilver::Color, + ) -> Result<(), String> { + todo!() + } +} + +#[derive(Clone, Debug)] +struct RaylibSound { + sound: ffi::Sound, +} + +#[derive(Clone, Debug)] +struct RaylibSoundHandler { + sound: Rc, +} + +impl SoundInterface for RaylibSoundHandler { + fn play(&mut self, vol: f32) -> Result<(), String> { + unsafe { + ffi::PlaySound(self.sound.sound); + } + Ok(()) + } +} + +#[derive(Clone, Debug)] +struct RaylibMusic { + music: ffi::Music, +} + +impl RaylibMusic { + pub fn update(&mut self) { + unsafe { + ffi::UpdateMusicStream(self.music); + } + } +} + +#[derive(Clone, Debug)] +struct RaylibMusicHandler { + music: Rc>, +} + +impl MusicInterface for RaylibMusicHandler { + fn play(&mut self, vol: f32) -> Result<(), String> { + unsafe { + ffi::SetMusicVolume(self.music.borrow().music, vol); + ffi::PlayMusicStream(self.music.borrow().music); + } + Ok(()) + } + + fn pause(&mut self) -> Result<(), String> { + unsafe { + ffi::PauseMusicStream(self.music.borrow().music); + } + Ok(()) + } + + fn stop(&mut self) -> Result<(), String> { + unsafe { + ffi::StopMusicStream(self.music.borrow().music); + } + Ok(()) + } + + fn set_loop(&mut self, loop_enable: bool) -> Result<(), String> { + self.music.borrow_mut().music.looping = loop_enable; + Ok(()) + } + + fn update(&mut self) -> Result<(), String> { + self.music.borrow_mut().update(); + Ok(()) + } +} struct RaylibGame { - width: f32, - height: f32, + images: HashMap>, + fonts: HashMap>, + sounds: HashMap>, + music: HashMap>>, } impl RaylibGame { - pub fn new_boxed(width: f32, height: f32) -> Box { + pub fn new_boxed(width: u32, height: u32) -> Box { + unsafe { + let string = "One and All LD45\0"; + ffi::InitWindow( + width as c_int, + height as c_int, + string.as_ptr() as *const c_char, + ); + } Box::new(Self { - width, - height, + images: HashMap::new(), + fonts: HashMap::new(), + sounds: HashMap::new(), + music: HashMap::new(), }) } } +impl Drop for RaylibGame { + fn drop(&mut self) { + unsafe { + for (_, image) in &self.images { + ffi::UnloadImage(image.image); + } + for (_, font) in &self.fonts { + ffi::UnloadFont(font.font); + } + for (_, sound) in &self.sounds { + ffi::UnloadSound(sound.sound); + } + for (_, music) in &self.music { + ffi::UnloadMusicStream(music.borrow().music); + } + ffi::CloseWindow(); + } + } +} + impl GameInterface for RaylibGame { fn get_dimensions(&self) -> Result<(f32, f32), String> { - Ok((self.width, self.height)) + unsafe { Ok((ffi::GetScreenWidth() as f32, ffi::GetScreenHeight() as f32)) } } fn get_key_pressed(&mut self, key: char) -> Result { - todo!() + unsafe { Ok(ffi::IsKeyPressed(key.to_ascii_uppercase() as c_int)) } } fn get_mouse_pressed(&mut self) -> Result, String> { - todo!() + unsafe { + if ffi::IsMouseButtonPressed(0) { + Ok(Some((ffi::GetTouchX() as f32, ffi::GetTouchY() as f32))) + } else { + Ok(None) + } + } } fn get_mouse_down(&mut self) -> Result, String> { - todo!() + unsafe { + if ffi::IsMouseButtonDown(0) { + Ok(Some((ffi::GetTouchX() as f32, ffi::GetTouchY() as f32))) + } else { + Ok(None) + } + } } fn get_mouse_xy(&self) -> Result<(f32, f32), String> { - todo!() + unsafe { Ok((ffi::GetTouchX() as f32, ffi::GetTouchY() as f32)) } } fn get_mouse_xy_vec(&self) -> Result { - todo!() + unsafe { + Ok(crate::faux_quicksilver::Vector { + x: ffi::GetTouchX() as f32, + y: ffi::GetTouchY() as f32, + }) + } } fn get_delta_time(&self) -> f32 { - todo!() + unsafe { ffi::GetFrameTime() } } fn clear_window(&mut self, color: crate::faux_quicksilver::Color) -> Result<(), String> { - todo!() + unsafe { + ffi::ClearBackground(fqcolor_to_color(color)); + } + Ok(()) } fn begin_drawing(&mut self) -> Result<(), String> { - todo!() + unsafe { + ffi::BeginDrawing(); + } + Ok(()) } fn end_drawing(&mut self) -> Result<(), String> { - todo!() + unsafe { + ffi::EndDrawing(); + } + Ok(()) } - fn draw_circle(&mut self, circle: crate::faux_quicksilver::Circle, color: crate::faux_quicksilver::Color) -> Result<(), String> { - todo!() + fn draw_circle( + &mut self, + circle: crate::faux_quicksilver::Circle, + color: crate::faux_quicksilver::Color, + ) -> Result<(), String> { + unsafe { + ffi::DrawCircle( + circle.x.round() as i32, + circle.y.round() as i32, + circle.r, + fqcolor_to_color(color), + ); + } + Ok(()) } fn draw_circle_ex( @@ -87,8 +332,21 @@ impl GameInterface for RaylibGame { todo!() } - fn draw_rect(&mut self, rect: crate::faux_quicksilver::Rectangle, color: crate::faux_quicksilver::Color) -> Result<(), String> { - todo!() + fn draw_rect( + &mut self, + rect: crate::faux_quicksilver::Rectangle, + color: crate::faux_quicksilver::Color, + ) -> Result<(), String> { + unsafe { + ffi::DrawRectangle( + rect.x.round() as i32, + rect.y.round() as i32, + rect.w.round() as i32, + rect.h.round() as i32, + fqcolor_to_color(color), + ); + } + Ok(()) } fn draw_rect_ex( @@ -110,20 +368,84 @@ impl GameInterface for RaylibGame { todo!() } - fn load_image(&mut self, path: &std::path::Path) -> Result, String> { - todo!() + fn load_image( + &mut self, + path: &std::path::Path, + ) -> Result, String> { + unsafe { + let path_str = path + .to_str() + .ok_or_else(|| format!("Failed to convert \"{path:?}\" to str!"))?; + let path_buf: Vec = path_str.as_bytes().into(); + let cstring: CString = CString::from_vec_unchecked(path_buf); + let image = ffi::LoadImage(cstring.as_ptr()); + let raylib_image_handler = RaylibImageHandler { + image: Rc::new(RaylibImage { image }), + }; + self.images + .insert(path_str.to_owned(), raylib_image_handler.image.clone()); + Ok(Box::new(raylib_image_handler)) + } } - fn load_font(&mut self, path: &std::path::Path) -> Result, String> { - todo!() + fn load_font( + &mut self, + path: &std::path::Path, + ) -> Result, String> { + unsafe { + let path_str = path + .to_str() + .ok_or_else(|| format!("Failed to convert \"{path:?}\" to str!"))?; + let path_buf: Vec = path_str.as_bytes().into(); + let cstring: CString = CString::from_vec_unchecked(path_buf); + let font = ffi::LoadFont(cstring.as_ptr()); + let raylib_font_handler = RaylibFontHandler { + font: Rc::new(RaylibFont { font }), + }; + self.fonts + .insert(path_str.to_owned(), raylib_font_handler.font.clone()); + Ok(Box::new(raylib_font_handler)) + } } - fn load_sound(&mut self, path: &std::path::Path) -> Result, String> { - todo!() + fn load_sound( + &mut self, + path: &std::path::Path, + ) -> Result, String> { + unsafe { + let path_str = path + .to_str() + .ok_or_else(|| format!("Failed to convert \"{path:?}\" to str!"))?; + let path_buf: Vec = path_str.as_bytes().into(); + let cstring: CString = CString::from_vec_unchecked(path_buf); + let sound = ffi::LoadSound(cstring.as_ptr()); + let raylib_sound_handler = RaylibSoundHandler { + sound: Rc::new(RaylibSound { sound }), + }; + self.sounds + .insert(path_str.to_owned(), raylib_sound_handler.sound.clone()); + Ok(Box::new(raylib_sound_handler)) + } } - fn load_music(&mut self, path: &std::path::Path) -> Result, String> { - todo!() + fn load_music( + &mut self, + path: &std::path::Path, + ) -> Result, String> { + unsafe { + let path_str = path + .to_str() + .ok_or_else(|| format!("Failed to convert \"{path:?}\" to str!"))?; + let path_buf: Vec = path_str.as_bytes().into(); + let cstring: CString = CString::from_vec_unchecked(path_buf); + let music = ffi::LoadMusicStream(cstring.as_ptr()); + let raylib_music_handler = RaylibMusicHandler { + music: Rc::new(RefCell::new(RaylibMusic { music })), + }; + self.music + .insert(path_str.to_owned(), raylib_music_handler.music.clone()); + Ok(Box::new(raylib_music_handler)) + } } fn get_camera(&mut self) -> Result, String> { From 4ef4e707c631b2bf40005c350569ed59d274db38 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Sun, 19 Feb 2023 17:05:30 +0900 Subject: [PATCH 13/29] Add "origin" to draw calls with a transform --- src/agnostic_interface.rs | 4 ++ src/agnostic_interface/raylib_impl.rs | 6 +++ src/original_impl.rs | 70 +++++++++++++++++++++++++-- 3 files changed, 75 insertions(+), 5 deletions(-) diff --git a/src/agnostic_interface.rs b/src/agnostic_interface.rs index 0c09bda..95a67fd 100644 --- a/src/agnostic_interface.rs +++ b/src/agnostic_interface.rs @@ -14,6 +14,7 @@ pub trait ImageInterface { y: f32, color: Color, transform: Transform, + origin: Vector, ) -> Result<(), String>; fn draw_sub_transform( &mut self, @@ -22,6 +23,7 @@ pub trait ImageInterface { y: f32, color: Color, transform: Transform, + origin: Vector, ) -> Result<(), String>; fn get_w(&self) -> usize; fn get_h(&self) -> usize; @@ -76,6 +78,7 @@ pub trait GameInterface { circle: Circle, color: Color, transform: Transform, + origin: Vector, ) -> Result<(), String>; fn draw_rect(&mut self, rect: Rectangle, color: Color) -> Result<(), String>; fn draw_rect_ex( @@ -90,6 +93,7 @@ pub trait GameInterface { rect: Rectangle, color: Color, transform: Transform, + origin: Vector, ) -> Result<(), String>; fn load_image(&mut self, path: &Path) -> Result, String>; diff --git a/src/agnostic_interface/raylib_impl.rs b/src/agnostic_interface/raylib_impl.rs index 9faa892..e6f27df 100644 --- a/src/agnostic_interface/raylib_impl.rs +++ b/src/agnostic_interface/raylib_impl.rs @@ -15,6 +15,8 @@ use std::{ rc::Rc, }; +use crate::faux_quicksilver::Vector; + use super::{FontInterface, GameInterface, ImageInterface, MusicInterface, SoundInterface}; fn fqcolor_to_color(c: crate::faux_quicksilver::Color) -> ffi::Color { @@ -62,6 +64,7 @@ impl ImageInterface for RaylibImageHandler { y: f32, color: crate::faux_quicksilver::Color, transform: crate::faux_quicksilver::Transform, + origin: Vector, ) -> Result<(), String> { todo!() } @@ -73,6 +76,7 @@ impl ImageInterface for RaylibImageHandler { y: f32, color: crate::faux_quicksilver::Color, transform: crate::faux_quicksilver::Transform, + origin: Vector, ) -> Result<(), String> { todo!() } @@ -328,6 +332,7 @@ impl GameInterface for RaylibGame { circle: crate::faux_quicksilver::Circle, color: crate::faux_quicksilver::Color, transform: crate::faux_quicksilver::Transform, + origin: Vector, ) -> Result<(), String> { todo!() } @@ -364,6 +369,7 @@ impl GameInterface for RaylibGame { rect: crate::faux_quicksilver::Rectangle, color: crate::faux_quicksilver::Color, transform: crate::faux_quicksilver::Transform, + origin: Vector, ) -> Result<(), String> { todo!() } diff --git a/src/original_impl.rs b/src/original_impl.rs index d37c824..3c5c869 100644 --- a/src/original_impl.rs +++ b/src/original_impl.rs @@ -643,12 +643,28 @@ impl ParticleSystem { * Transform::rotate(particle.r); window .get_gi_mut() - .draw_rect_transform(particle.rect, self.color, transform * pre_transform) + .draw_rect_transform( + particle.rect, + self.color, + transform * pre_transform, + Vector { + x: particle.rect.x + particle.rect.w / 2.0, + y: particle.rect.y + particle.rect.h / 2.0, + }, + ) .ok(); } else { window .get_gi_mut() - .draw_circle_transform(particle.circle, self.color, transform) + .draw_circle_transform( + particle.circle, + self.color, + transform, + Vector { + x: particle.circle.x, + y: particle.circle.y, + }, + ) .ok(); } } @@ -761,6 +777,10 @@ impl RotatingParticleSystem { transform * Transform::translate(-moved_rect.x / 2.0, -moved_rect.y / 2.0) * Transform::rotate(self.r * 1.3), + Vector { + x: moved_rect.x + moved_rect.w / 2.0, + y: moved_rect.y + moved_rect.h / 2.0, + }, ) .ok(); } else { @@ -770,7 +790,15 @@ impl RotatingParticleSystem { solid_color.a = (self.particle_system.opacity * 255.0) as u8; window .get_gi_mut() - .draw_circle_transform(moved_cir, solid_color, transform) + .draw_circle_transform( + moved_cir, + solid_color, + transform, + Vector { + x: moved_cir.x, + y: moved_cir.y, + }, + ) .ok(); } } @@ -856,7 +884,15 @@ impl ExplConvParticleSystem { * 255.0) as u8; window .get_gi_mut() - .draw_circle_transform(particle.circle, self.color, transform) + .draw_circle_transform( + particle.circle, + self.color, + transform, + Vector { + x: particle.circle.x, + y: particle.circle.y, + }, + ) .ok(); } } @@ -932,7 +968,15 @@ impl Planet { self.particle_system.draw(window, transform); window .get_gi_mut() - .draw_circle_transform(self.circle, self.color, transform) + .draw_circle_transform( + self.circle, + self.color, + transform, + Vector { + x: self.circle.x, + y: self.circle.y, + }, + ) .ok(); for moon in &mut self.moons { moon.draw(window, transform); @@ -999,6 +1043,10 @@ impl Star { image_rect.y, self.color, transform * Transform::rotate(self.r), + Vector { + x: image_rect.x + image_rect.w / 2.0, + y: image_rect.y + image_rect.h / 2.0, + }, ) .ok(); } @@ -1108,6 +1156,10 @@ impl Fish { body_rect.y, self.color, transform * body_tr, + Vector { + x: self.body_rect.x + self.body_rect.w / 2.0, + y: self.body_rect.y + self.body_rect.h / 2.0, + }, ) .ok(); let mut tail_rect = self.tail_rect; @@ -1128,6 +1180,10 @@ impl Fish { tail_rect.y, self.color, transform * tail_tr, + Vector { + x: self.tail_rect.x + self.tail_rect.w / 2.0, + y: self.tail_rect.y + self.tail_rect.h / 2.0, + }, ) .ok(); } @@ -1914,6 +1970,10 @@ impl GameState { Color::from_rgba(255, 255, 255, (self.player_particles.opacity * 255.0) as u8), Transform::translate(-self.player.x / 2.0, -self.player.y / 2.0) * Transform::rotate(self.player_r as f32), + Vector { + x: self.player.x + self.player.w / 2.0, + y: self.player.y + self.player.h / 2.0, + }, )?; self.joining_particles.draw(window, Transform::IDENTITY); for expl_conv_ps in &mut self.expl_conv_p_systems { From 98524fabd71492ec526c0f8ec0a4763a0cffb81d Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Mon, 20 Feb 2023 16:04:13 +0900 Subject: [PATCH 14/29] More work on agnostic_interface/raylib_impl --- src/agnostic_interface.rs | 18 ++-- src/agnostic_interface/raylib_impl.rs | 124 ++++++++++++++++++++------ src/original_impl.rs | 6 +- 3 files changed, 108 insertions(+), 40 deletions(-) diff --git a/src/agnostic_interface.rs b/src/agnostic_interface.rs index 95a67fd..0efd405 100644 --- a/src/agnostic_interface.rs +++ b/src/agnostic_interface.rs @@ -6,8 +6,12 @@ use crate::faux_quicksilver::{Circle, Color, Rectangle, Transform, Vector}; pub trait ImageInterface { fn draw(&mut self, x: f32, y: f32, color: Color) -> Result<(), String>; - fn draw_sub(&mut self, sub_rect: Rectangle, x: f32, y: f32, color: Color) - -> Result<(), String>; + fn draw_sub( + &mut self, + sub_rect: Rectangle, + dest_rect: Rectangle, + color: Color, + ) -> Result<(), String>; fn draw_transform( &mut self, x: f32, @@ -19,8 +23,7 @@ pub trait ImageInterface { fn draw_sub_transform( &mut self, sub_rect: Rectangle, - x: f32, - y: f32, + dest_rect: Rectangle, color: Color, transform: Transform, origin: Vector, @@ -66,13 +69,6 @@ pub trait GameInterface { fn end_drawing(&mut self) -> Result<(), String>; fn draw_circle(&mut self, circle: Circle, color: Color) -> Result<(), String>; - fn draw_circle_ex( - &mut self, - circle: Circle, - color: Color, - origin: Vector, - rot: f32, - ) -> Result<(), String>; fn draw_circle_transform( &mut self, circle: Circle, diff --git a/src/agnostic_interface/raylib_impl.rs b/src/agnostic_interface/raylib_impl.rs index e6f27df..1812577 100644 --- a/src/agnostic_interface/raylib_impl.rs +++ b/src/agnostic_interface/raylib_impl.rs @@ -28,14 +28,40 @@ fn fqcolor_to_color(c: crate::faux_quicksilver::Color) -> ffi::Color { } } +fn fqrect_to_rect(r: crate::faux_quicksilver::Rectangle) -> ffi::Rectangle { + ffi::Rectangle { + x: r.x, + y: r.y, + width: r.w, + height: r.h, + } +} + +fn fqvector_to_vector2(v: crate::faux_quicksilver::Vector) -> ffi::Vector2 { + ffi::Vector2 { x: v.x, y: v.y } +} + #[derive(Clone, Debug)] struct RaylibImage { image: ffi::Image, + texture: Option, } #[derive(Clone, Debug)] struct RaylibImageHandler { - image: Rc, + image: Rc>, +} + +impl RaylibImageHandler { + fn image_to_texture(&mut self) -> Result<(), String> { + if self.image.borrow().texture.is_none() { + unsafe { + self.image.borrow_mut().texture = + Some(ffi::LoadTextureFromImage(self.image.borrow().image)); + } + } + Ok(()) + } } impl ImageInterface for RaylibImageHandler { @@ -45,17 +71,46 @@ impl ImageInterface for RaylibImageHandler { y: f32, color: crate::faux_quicksilver::Color, ) -> Result<(), String> { - todo!() + self.image_to_texture()?; + unsafe { + ffi::DrawTexture( + *self + .image + .borrow() + .texture + .as_ref() + .ok_or_else(|| String::from("RaylibImage has no Texture!"))?, + x.round() as i32, + y.round() as i32, + fqcolor_to_color(color), + ); + } + Ok(()) } fn draw_sub( &mut self, sub_rect: crate::faux_quicksilver::Rectangle, - x: f32, - y: f32, + dest_rect: crate::faux_quicksilver::Rectangle, color: crate::faux_quicksilver::Color, ) -> Result<(), String> { - todo!() + self.image_to_texture()?; + unsafe { + ffi::DrawTexturePro( + *self + .image + .borrow() + .texture + .as_ref() + .ok_or_else(|| String::from("RaylibImage has no Texture!"))?, + fqrect_to_rect(sub_rect), + fqrect_to_rect(dest_rect), + ffi::Vector2 { x: 0.0, y: 0.0 }, + 0.0, + fqcolor_to_color(color), + ); + } + Ok(()) } fn draw_transform( @@ -72,8 +127,7 @@ impl ImageInterface for RaylibImageHandler { fn draw_sub_transform( &mut self, sub_rect: crate::faux_quicksilver::Rectangle, - x: f32, - y: f32, + dest_rect: crate::faux_quicksilver::Rectangle, color: crate::faux_quicksilver::Color, transform: crate::faux_quicksilver::Transform, origin: Vector, @@ -82,15 +136,20 @@ impl ImageInterface for RaylibImageHandler { } fn get_w(&self) -> usize { - todo!() + self.image.borrow().image.width as usize } fn get_h(&self) -> usize { - todo!() + self.image.borrow().image.height as usize } fn get_wh_rect(&self) -> crate::faux_quicksilver::Rectangle { - todo!() + crate::faux_quicksilver::Rectangle { + x: 0.0, + y: 0.0, + w: self.image.borrow().image.width as f32, + h: self.image.borrow().image.height as f32, + } } } @@ -113,7 +172,18 @@ impl FontInterface for RaylibFontHandler { y: f32, color: crate::faux_quicksilver::Color, ) -> Result<(), String> { - todo!() + unsafe { + let cstring = CString::from_vec_unchecked(s.as_bytes().into()); + ffi::DrawTextEx( + self.font.font, + cstring.as_ptr(), + ffi::Vector2 { x, y }, + size as f32, + (size / 10) as f32, + fqcolor_to_color(color), + ); + } + Ok(()) } } @@ -189,7 +259,7 @@ impl MusicInterface for RaylibMusicHandler { } struct RaylibGame { - images: HashMap>, + images: HashMap>>, fonts: HashMap>, sounds: HashMap>, music: HashMap>>, @@ -218,7 +288,10 @@ impl Drop for RaylibGame { fn drop(&mut self) { unsafe { for (_, image) in &self.images { - ffi::UnloadImage(image.image); + if let Some(texture) = image.borrow_mut().texture.take() { + ffi::UnloadTexture(texture); + } + ffi::UnloadImage(image.borrow().image); } for (_, font) in &self.fonts { ffi::UnloadFont(font.font); @@ -317,16 +390,6 @@ impl GameInterface for RaylibGame { Ok(()) } - fn draw_circle_ex( - &mut self, - circle: crate::faux_quicksilver::Circle, - color: crate::faux_quicksilver::Color, - origin: crate::faux_quicksilver::Vector, - rot: f32, - ) -> Result<(), String> { - todo!() - } - fn draw_circle_transform( &mut self, circle: crate::faux_quicksilver::Circle, @@ -361,7 +424,15 @@ impl GameInterface for RaylibGame { origin: crate::faux_quicksilver::Vector, rot: f32, ) -> Result<(), String> { - todo!() + unsafe { + ffi::DrawRectanglePro( + fqrect_to_rect(rect), + fqvector_to_vector2(origin), + rot, + fqcolor_to_color(color), + ); + } + Ok(()) } fn draw_rect_transform( @@ -386,7 +457,10 @@ impl GameInterface for RaylibGame { let cstring: CString = CString::from_vec_unchecked(path_buf); let image = ffi::LoadImage(cstring.as_ptr()); let raylib_image_handler = RaylibImageHandler { - image: Rc::new(RaylibImage { image }), + image: Rc::new(RefCell::new(RaylibImage { + image, + texture: None, + })), }; self.images .insert(path_str.to_owned(), raylib_image_handler.image.clone()); diff --git a/src/original_impl.rs b/src/original_impl.rs index 3c5c869..d085952 100644 --- a/src/original_impl.rs +++ b/src/original_impl.rs @@ -1152,8 +1152,7 @@ impl Fish { fish_img .draw_sub_transform( self.body_rect, - body_rect.x, - body_rect.y, + body_rect, self.color, transform * body_tr, Vector { @@ -1176,8 +1175,7 @@ impl Fish { fish_img .draw_sub_transform( self.tail_rect, - tail_rect.x, - tail_rect.y, + tail_rect, self.color, transform * tail_tr, Vector { From ad1d2536a3646e657501e5d36f78e5a131c5287d Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Mon, 20 Feb 2023 20:07:44 +0900 Subject: [PATCH 15/29] Setup for drawing with transforms by using shaders --- Cargo.toml | 2 +- build.rs | 11 +-- raylib/simple.fs | 20 ++++++ raylib/transform.vs | 25 +++++++ src/agnostic_interface.rs | 13 ++++ src/agnostic_interface/raylib_impl.rs | 98 ++++++++++++++++++++++++++- src/faux_quicksilver.rs | 18 ----- src/main.rs | 1 + src/shaders.rs | 47 +++++++++++++ 9 files changed, 209 insertions(+), 26 deletions(-) create mode 100644 raylib/simple.fs create mode 100644 raylib/transform.vs create mode 100644 src/shaders.rs diff --git a/Cargo.toml b/Cargo.toml index 9842d9f..a503789 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,4 +16,4 @@ bindgen = "0.64" [features] default = [] -no_link_raylib = [] +no_link_libs = [] diff --git a/build.rs b/build.rs index fd45ada..1ed36cf 100644 --- a/build.rs +++ b/build.rs @@ -3,16 +3,17 @@ extern crate bindgen; use std::env; use std::path::PathBuf; -#[cfg(not(feature = "no_link_raylib"))] -fn linking_raylib() { +#[cfg(not(feature = "no_link_libs"))] +fn linking_libs() { println!("cargo:rustc-link-lib=raylib"); + println!("cargo:rustc-link-lib=OpenGL"); } -#[cfg(feature = "no_link_raylib")] -fn linking_raylib() {} +#[cfg(feature = "no_link_libs")] +fn linking_libs() {} fn main() { - linking_raylib(); + linking_libs(); println!("cargo:rerun-if-changed=raylib/raylib.h"); let bindings = bindgen::Builder::default() diff --git a/raylib/simple.fs b/raylib/simple.fs new file mode 100644 index 0000000..3884320 --- /dev/null +++ b/raylib/simple.fs @@ -0,0 +1,20 @@ +#version 100 + +// Default fragment shader used by Raylib. + +precision mediump float; + +// Input vertex attributes (from vertex shader) +varying vec2 fragTexCoord; +varying vec4 fragColor; + +// Input uniform values +uniform sampler2D texture0; +uniform vec4 colDiffuse; + +void main() { + // Texel color fetching from texture sampler + vec4 texelColor = texture2D(texture0, fragTexCoord); + + gl_FragColor = texelColor*colDiffuse*fragColor; +} diff --git a/raylib/transform.vs b/raylib/transform.vs new file mode 100644 index 0000000..9e1a9f4 --- /dev/null +++ b/raylib/transform.vs @@ -0,0 +1,25 @@ +#version 100 + +// Input vertex attributes +attribute vec3 vertexPosition; +attribute vec2 vertexTexCoord; +attribute vec4 vertexColor; + +// Input uniform values +uniform mat4 mvp; + +// Output vertex attributes (to fragment shader) +varying vec2 fragTexCoord; +varying vec4 fragColor; + +// custom +attribute vec2 origin; +attribute mat3 transform; + +void main() { + fragTexCoord = vertexTexCoord; + fragColor = vertexColor; + + vec3 pos = transform * (vertexPosition - vec3(origin, 0.0)) + vec3(origin, 0.0); + gl_Position = mvp * vec4(pos, 1.0); +} diff --git a/src/agnostic_interface.rs b/src/agnostic_interface.rs index 0efd405..8e57ca3 100644 --- a/src/agnostic_interface.rs +++ b/src/agnostic_interface.rs @@ -49,6 +49,13 @@ pub trait MusicInterface { fn update(&mut self) -> Result<(), String>; } +pub trait ShaderInterface { + fn set_transform_attrib(&mut self, transform: Transform) -> Result<(), String>; + fn set_origin_attrib(&mut self, origin: Vector) -> Result<(), String>; + fn begin_draw_shader(&self) -> Result<(), String>; + fn end_draw_shader(&self) -> Result<(), String>; +} + pub trait CameraInterface { fn get_view(&self) -> Result; fn get_view_xy(&self) -> Result<(f32, f32), String>; @@ -96,6 +103,12 @@ pub trait GameInterface { fn load_font(&mut self, path: &Path) -> Result, String>; fn load_sound(&mut self, path: &Path) -> Result, String>; fn load_music(&mut self, path: &Path) -> Result, String>; + fn load_shader( + &mut self, + name: String, + vs: &Path, + fs: &Path, + ) -> Result, String>; fn get_camera(&mut self) -> Result, String>; fn get_default_camera(&mut self) -> Result, String>; diff --git a/src/agnostic_interface/raylib_impl.rs b/src/agnostic_interface/raylib_impl.rs index 1812577..c8b7e09 100644 --- a/src/agnostic_interface/raylib_impl.rs +++ b/src/agnostic_interface/raylib_impl.rs @@ -12,12 +12,18 @@ use std::{ collections::HashMap, ffi::CString, os::raw::{c_char, c_int}, + path::Path, rc::Rc, }; -use crate::faux_quicksilver::Vector; +use crate::{ + faux_quicksilver::{Transform, Vector}, + shaders::{get_attrib_location, set_origin_2f, set_transform_3f}, +}; -use super::{FontInterface, GameInterface, ImageInterface, MusicInterface, SoundInterface}; +use super::{ + FontInterface, GameInterface, ImageInterface, MusicInterface, ShaderInterface, SoundInterface, +}; fn fqcolor_to_color(c: crate::faux_quicksilver::Color) -> ffi::Color { ffi::Color { @@ -41,6 +47,78 @@ fn fqvector_to_vector2(v: crate::faux_quicksilver::Vector) -> ffi::Vector2 { ffi::Vector2 { x: v.x, y: v.y } } +#[derive(Clone, Debug)] +pub struct RaylibShader { + shader: ffi::Shader, +} + +impl RaylibShader { + pub fn get_shader_id(&self) -> ::std::os::raw::c_uint { + self.shader.id as ::std::os::raw::c_uint + } +} + +#[derive(Clone, Debug)] +struct RaylibShaderHandler { + shader: Rc>, +} + +impl ShaderInterface for RaylibShaderHandler { + fn set_transform_attrib(&mut self, transform: Transform) -> Result<(), String> { + let transform_cstr = CString::new("transform") + .map_err(|_| String::from("Failed to create \"transform\" CString!"))?; + let attr_loc = get_attrib_location(&self.shader.borrow(), &transform_cstr); + set_transform_3f(attr_loc, transform); + Ok(()) + } + + fn begin_draw_shader(&self) -> Result<(), String> { + unsafe { + ffi::BeginShaderMode(self.shader.borrow().shader); + } + Ok(()) + } + + fn end_draw_shader(&self) -> Result<(), String> { + unsafe { + ffi::EndShaderMode(); + } + Ok(()) + } + + fn set_origin_attrib(&mut self, origin: Vector) -> Result<(), String> { + let origin_cstr = CString::new("origin") + .map_err(|_| String::from("Failed to create \"origin\" CString!"))?; + let attr_loc = get_attrib_location(&self.shader.borrow(), &origin_cstr); + set_origin_2f(attr_loc, origin); + Ok(()) + } +} + +impl RaylibShaderHandler { + pub fn load_shader(vs: &Path, fs: &Path) -> Result { + unsafe { + let vs_cstr: CString = CString::from_vec_unchecked( + vs.to_str() + .ok_or_else(|| format!("Cannot convert path \"{vs:?}\" to str!"))? + .as_bytes() + .to_owned(), + ); + let fs_cstr: CString = CString::from_vec_unchecked( + fs.to_str() + .ok_or_else(|| format!("Cannot convert path \"{fs:?}\" to str!"))? + .as_bytes() + .to_owned(), + ); + Ok(Self { + shader: Rc::new(RefCell::new(RaylibShader { + shader: ffi::LoadShader(vs_cstr.as_ptr(), fs_cstr.as_ptr()), + })), + }) + } + } +} + #[derive(Clone, Debug)] struct RaylibImage { image: ffi::Image, @@ -263,6 +341,7 @@ struct RaylibGame { fonts: HashMap>, sounds: HashMap>, music: HashMap>>, + shaders: HashMap>>, } impl RaylibGame { @@ -280,6 +359,7 @@ impl RaylibGame { fonts: HashMap::new(), sounds: HashMap::new(), music: HashMap::new(), + shaders: HashMap::new(), }) } } @@ -287,6 +367,9 @@ impl RaylibGame { impl Drop for RaylibGame { fn drop(&mut self) { unsafe { + for (_, shader) in &self.shaders { + ffi::UnloadShader(shader.borrow().shader); + } for (_, image) in &self.images { if let Some(texture) = image.borrow_mut().texture.take() { ffi::UnloadTexture(texture); @@ -528,6 +611,17 @@ impl GameInterface for RaylibGame { } } + fn load_shader( + &mut self, + name: String, + vs: &Path, + fs: &Path, + ) -> Result, String> { + let raylib_shader = RaylibShaderHandler::load_shader(vs, fs)?; + self.shaders.insert(name, raylib_shader.shader.clone()); + Ok(Box::new(raylib_shader)) + } + fn get_camera(&mut self) -> Result, String> { todo!() } diff --git a/src/faux_quicksilver.rs b/src/faux_quicksilver.rs index a78519a..8fc6d16 100644 --- a/src/faux_quicksilver.rs +++ b/src/faux_quicksilver.rs @@ -146,16 +146,12 @@ impl Vector { #[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct Transform { pub mat: [f32; 9], - //translate: Vector, - //rotate: f32, } impl Default for Transform { fn default() -> Self { Self { mat: [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0], - //translate: Vector { x: 0.0, y: 0.0 }, - //rotate: 0.0, } } } @@ -187,8 +183,6 @@ impl Mul for Transform { self.mat[6] * rhs.mat[1] + self.mat[7] * rhs.mat[4] + self.mat[8] * rhs.mat[7], self.mat[6] * rhs.mat[2] + self.mat[7] * rhs.mat[5] + self.mat[8] * rhs.mat[8], ], - //translate: self.translate + rhs.translate, - //rotate: self.rotate + rhs.rotate, } } } @@ -211,26 +205,14 @@ impl Transform { 0.0, 1.0, ], - //rotate: rot, - ..Default::default() } } pub fn translate(x: f32, y: f32) -> Self { Self { mat: [1.0, 0.0, x, 0.0, 1.0, y, 0.0, 0.0, 1.0], - //translate: Vector { x, y }, - ..Default::default() } } - - //pub fn get_translate(&self) -> Vector { - // self.translate - //} - - //pub fn get_rotation(&self) -> f32 { - // self.rotate - //} } pub struct Window { diff --git a/src/main.rs b/src/main.rs index dd8a4ef..4b66d33 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,7 @@ mod agnostic_interface; mod faux_quicksilver; mod original_impl; +mod shaders; fn main() { // TODO diff --git a/src/shaders.rs b/src/shaders.rs new file mode 100644 index 0000000..b1755a4 --- /dev/null +++ b/src/shaders.rs @@ -0,0 +1,47 @@ +use crate::{ + agnostic_interface::raylib_impl::RaylibShader, + faux_quicksilver::{Transform, Vector}, +}; +use std::ffi::CStr; + +extern "C" { + pub fn glVertexAttrib2f(index: ::std::os::raw::c_uint, x: f32, y: f32); +} +extern "C" { + pub fn glVertexAttrib3f(index: ::std::os::raw::c_uint, x: f32, y: f32, z: f32); +} +extern "C" { + pub fn glVertexAttrib4f(index: ::std::os::raw::c_uint, x: f32, y: f32, z: f32, w: f32); +} +extern "C" { + pub fn glGetAttribLocation( + program: ::std::os::raw::c_uint, + name: *const ::std::os::raw::c_char, + ) -> ::std::os::raw::c_int; +} + +pub fn get_attrib_location(raylib_shader: &RaylibShader, name: &CStr) -> ::std::os::raw::c_uint { + unsafe { + glGetAttribLocation(raylib_shader.get_shader_id(), name.as_ptr()) as ::std::os::raw::c_uint + } +} + +pub fn set_transform_3f(index: ::std::os::raw::c_uint, transform: Transform) { + // OpenGL stores matrix indices in column major order. + for idx in index..(index + 3) { + unsafe { + glVertexAttrib3f( + idx, + transform.mat[0 + idx as usize], + transform.mat[3 + idx as usize], + transform.mat[6 + idx as usize], + ); + } + } +} + +pub fn set_origin_2f(index: ::std::os::raw::c_uint, origin: Vector) { + unsafe { + glVertexAttrib2f(index, origin.x, origin.y); + } +} From 29a32f590d8124261c67cbdce8d839241b48ad9b Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Tue, 21 Feb 2023 12:33:28 +0900 Subject: [PATCH 16/29] Impl transform/origin shader loading/usage --- src/agnostic_interface/raylib_impl.rs | 190 ++++++++++++++++++++++++-- {raylib => static}/simple.fs | 0 {raylib => static}/transform.vs | 0 3 files changed, 175 insertions(+), 15 deletions(-) rename {raylib => static}/simple.fs (100%) rename {raylib => static}/transform.vs (100%) diff --git a/src/agnostic_interface/raylib_impl.rs b/src/agnostic_interface/raylib_impl.rs index c8b7e09..cdaf8cb 100644 --- a/src/agnostic_interface/raylib_impl.rs +++ b/src/agnostic_interface/raylib_impl.rs @@ -12,8 +12,9 @@ use std::{ collections::HashMap, ffi::CString, os::raw::{c_char, c_int}, - path::Path, + path::{Path, PathBuf}, rc::Rc, + str::FromStr, }; use crate::{ @@ -56,25 +57,18 @@ impl RaylibShader { pub fn get_shader_id(&self) -> ::std::os::raw::c_uint { self.shader.id as ::std::os::raw::c_uint } -} -#[derive(Clone, Debug)] -struct RaylibShaderHandler { - shader: Rc>, -} - -impl ShaderInterface for RaylibShaderHandler { fn set_transform_attrib(&mut self, transform: Transform) -> Result<(), String> { let transform_cstr = CString::new("transform") .map_err(|_| String::from("Failed to create \"transform\" CString!"))?; - let attr_loc = get_attrib_location(&self.shader.borrow(), &transform_cstr); + let attr_loc = get_attrib_location(self, &transform_cstr); set_transform_3f(attr_loc, transform); Ok(()) } fn begin_draw_shader(&self) -> Result<(), String> { unsafe { - ffi::BeginShaderMode(self.shader.borrow().shader); + ffi::BeginShaderMode(self.shader); } Ok(()) } @@ -89,12 +83,35 @@ impl ShaderInterface for RaylibShaderHandler { fn set_origin_attrib(&mut self, origin: Vector) -> Result<(), String> { let origin_cstr = CString::new("origin") .map_err(|_| String::from("Failed to create \"origin\" CString!"))?; - let attr_loc = get_attrib_location(&self.shader.borrow(), &origin_cstr); + let attr_loc = get_attrib_location(self, &origin_cstr); set_origin_2f(attr_loc, origin); Ok(()) } } +#[derive(Clone, Debug)] +struct RaylibShaderHandler { + shader: Rc>, +} + +impl ShaderInterface for RaylibShaderHandler { + fn set_transform_attrib(&mut self, transform: Transform) -> Result<(), String> { + self.shader.borrow_mut().set_transform_attrib(transform) + } + + fn begin_draw_shader(&self) -> Result<(), String> { + self.shader.borrow().begin_draw_shader() + } + + fn end_draw_shader(&self) -> Result<(), String> { + self.shader.borrow().end_draw_shader() + } + + fn set_origin_attrib(&mut self, origin: Vector) -> Result<(), String> { + self.shader.borrow_mut().set_origin_attrib(origin) + } +} + impl RaylibShaderHandler { pub fn load_shader(vs: &Path, fs: &Path) -> Result { unsafe { @@ -128,6 +145,7 @@ struct RaylibImage { #[derive(Clone, Debug)] struct RaylibImageHandler { image: Rc>, + shader: Rc>>, } impl RaylibImageHandler { @@ -199,7 +217,41 @@ impl ImageInterface for RaylibImageHandler { transform: crate::faux_quicksilver::Transform, origin: Vector, ) -> Result<(), String> { - todo!() + self.image_to_texture()?; + if let Some(shader) = self.shader.borrow_mut().as_mut() { + shader.set_origin_attrib(origin)?; + shader.set_transform_attrib(transform)?; + shader.begin_draw_shader()?; + unsafe { + ffi::DrawTexture( + *self + .image + .borrow() + .texture + .as_ref() + .ok_or_else(|| String::from("RaylibImage has no Texture!"))?, + x.round() as i32, + y.round() as i32, + fqcolor_to_color(color), + ); + } + shader.end_draw_shader()?; + } else { + unsafe { + ffi::DrawTexture( + *self + .image + .borrow() + .texture + .as_ref() + .ok_or_else(|| String::from("RaylibImage has no Texture!"))?, + x.round() as i32, + y.round() as i32, + fqcolor_to_color(color), + ); + } + } + Ok(()) } fn draw_sub_transform( @@ -210,7 +262,45 @@ impl ImageInterface for RaylibImageHandler { transform: crate::faux_quicksilver::Transform, origin: Vector, ) -> Result<(), String> { - todo!() + self.image_to_texture()?; + if let Some(shader) = self.shader.borrow_mut().as_mut() { + shader.set_origin_attrib(origin)?; + shader.set_transform_attrib(transform)?; + shader.begin_draw_shader()?; + unsafe { + ffi::DrawTexturePro( + *self + .image + .borrow() + .texture + .as_ref() + .ok_or_else(|| String::from("RaylibImage has no Texture!"))?, + fqrect_to_rect(sub_rect), + fqrect_to_rect(dest_rect), + ffi::Vector2 { x: 0.0, y: 0.0 }, + 0.0, + fqcolor_to_color(color), + ); + } + shader.end_draw_shader()?; + } else { + unsafe { + ffi::DrawTexturePro( + *self + .image + .borrow() + .texture + .as_ref() + .ok_or_else(|| String::from("RaylibImage has no Texture!"))?, + fqrect_to_rect(sub_rect), + fqrect_to_rect(dest_rect), + ffi::Vector2 { x: 0.0, y: 0.0 }, + 0.0, + fqcolor_to_color(color), + ); + } + } + Ok(()) } fn get_w(&self) -> usize { @@ -278,6 +368,7 @@ struct RaylibSoundHandler { impl SoundInterface for RaylibSoundHandler { fn play(&mut self, vol: f32) -> Result<(), String> { unsafe { + ffi::SetSoundVolume(self.sound.sound, vol); ffi::PlaySound(self.sound.sound); } Ok(()) @@ -480,7 +571,30 @@ impl GameInterface for RaylibGame { transform: crate::faux_quicksilver::Transform, origin: Vector, ) -> Result<(), String> { - todo!() + if let Some(shader) = self.shaders.get_mut("transform_origin") { + shader.borrow_mut().set_origin_attrib(origin)?; + shader.borrow_mut().set_transform_attrib(transform)?; + shader.borrow().begin_draw_shader()?; + unsafe { + ffi::DrawCircle( + circle.x.round() as i32, + circle.y.round() as i32, + circle.r, + fqcolor_to_color(color), + ); + } + shader.borrow().end_draw_shader()?; + } else { + unsafe { + ffi::DrawCircle( + circle.x.round() as i32, + circle.y.round() as i32, + circle.r, + fqcolor_to_color(color), + ); + } + } + Ok(()) } fn draw_rect( @@ -525,7 +639,32 @@ impl GameInterface for RaylibGame { transform: crate::faux_quicksilver::Transform, origin: Vector, ) -> Result<(), String> { - todo!() + if let Some(shader) = self.shaders.get_mut("transform_origin") { + shader.borrow_mut().set_origin_attrib(origin)?; + shader.borrow_mut().set_transform_attrib(transform)?; + shader.borrow().begin_draw_shader()?; + unsafe { + ffi::DrawRectangle( + rect.x.round() as i32, + rect.y.round() as i32, + rect.w.round() as i32, + rect.h.round() as i32, + fqcolor_to_color(color), + ); + } + shader.borrow().end_draw_shader()?; + } else { + unsafe { + ffi::DrawRectangle( + rect.x.round() as i32, + rect.y.round() as i32, + rect.w.round() as i32, + rect.h.round() as i32, + fqcolor_to_color(color), + ); + } + } + Ok(()) } fn load_image( @@ -539,11 +678,20 @@ impl GameInterface for RaylibGame { let path_buf: Vec = path_str.as_bytes().into(); let cstring: CString = CString::from_vec_unchecked(path_buf); let image = ffi::LoadImage(cstring.as_ptr()); + let shader: Option = + if let Some(shader) = self.shaders.get("transform_origin") { + Some(RaylibShaderHandler { + shader: shader.clone(), + }) + } else { + None + }; let raylib_image_handler = RaylibImageHandler { image: Rc::new(RefCell::new(RaylibImage { image, texture: None, })), + shader: Rc::new(RefCell::new(shader)), }; self.images .insert(path_str.to_owned(), raylib_image_handler.image.clone()); @@ -634,3 +782,15 @@ impl GameInterface for RaylibGame { todo!() } } + +impl RaylibGame { + pub fn load_transform_origin_shader(&mut self) -> Result, String> { + self.load_shader( + String::from("transform_origin"), + &PathBuf::from_str("static/transform.vs") + .map_err(|_| String::from("Failed to convert \"static/transform.vs\" to path!"))?, + &PathBuf::from_str("static/simple.fs") + .map_err(|_| String::from("Failed to convert \"static/simple.fs\" to path!"))?, + ) + } +} diff --git a/raylib/simple.fs b/static/simple.fs similarity index 100% rename from raylib/simple.fs rename to static/simple.fs diff --git a/raylib/transform.vs b/static/transform.vs similarity index 100% rename from raylib/transform.vs rename to static/transform.vs From 31465d09231fa30c1c5f62b9ed04ddd561be73b0 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Tue, 21 Feb 2023 14:10:51 +0900 Subject: [PATCH 17/29] Impl camera and camera shader At this point, the agnostic_interface is implemented with Raylib. What's left is testing. Currently the main function does nothing. --- src/agnostic_interface.rs | 4 +- src/agnostic_interface/raylib_impl.rs | 361 +++++++++++++++++++++----- src/faux_quicksilver.rs | 6 + src/shaders.rs | 2 +- static/camera.vs | 23 ++ static/transform.vs | 3 +- 6 files changed, 333 insertions(+), 66 deletions(-) create mode 100644 static/camera.vs diff --git a/src/agnostic_interface.rs b/src/agnostic_interface.rs index 8e57ca3..1fe08a9 100644 --- a/src/agnostic_interface.rs +++ b/src/agnostic_interface.rs @@ -52,14 +52,13 @@ pub trait MusicInterface { pub trait ShaderInterface { fn set_transform_attrib(&mut self, transform: Transform) -> Result<(), String>; fn set_origin_attrib(&mut self, origin: Vector) -> Result<(), String>; + fn set_camera_attrib(&mut self, camera: Vector) -> Result<(), String>; fn begin_draw_shader(&self) -> Result<(), String>; fn end_draw_shader(&self) -> Result<(), String>; } pub trait CameraInterface { - fn get_view(&self) -> Result; fn get_view_xy(&self) -> Result<(f32, f32), String>; - fn set_view(&mut self, rect: Rectangle) -> Result<(), String>; fn set_view_xy(&mut self, x: f32, y: f32) -> Result<(), String>; } @@ -113,4 +112,5 @@ pub trait GameInterface { fn get_camera(&mut self) -> Result, String>; fn get_default_camera(&mut self) -> Result, String>; fn set_camera(&mut self, camera: &Box) -> Result<(), String>; + fn set_camera_xy(&mut self, x: f32, y: f32) -> Result<(), String>; } diff --git a/src/agnostic_interface/raylib_impl.rs b/src/agnostic_interface/raylib_impl.rs index cdaf8cb..0054ff4 100644 --- a/src/agnostic_interface/raylib_impl.rs +++ b/src/agnostic_interface/raylib_impl.rs @@ -19,11 +19,12 @@ use std::{ use crate::{ faux_quicksilver::{Transform, Vector}, - shaders::{get_attrib_location, set_origin_2f, set_transform_3f}, + shaders::{get_attrib_location, set_attr_2f, set_transform_3f}, }; use super::{ - FontInterface, GameInterface, ImageInterface, MusicInterface, ShaderInterface, SoundInterface, + CameraInterface, FontInterface, GameInterface, ImageInterface, MusicInterface, ShaderInterface, + SoundInterface, }; fn fqcolor_to_color(c: crate::faux_quicksilver::Color) -> ffi::Color { @@ -84,7 +85,15 @@ impl RaylibShader { let origin_cstr = CString::new("origin") .map_err(|_| String::from("Failed to create \"origin\" CString!"))?; let attr_loc = get_attrib_location(self, &origin_cstr); - set_origin_2f(attr_loc, origin); + set_attr_2f(attr_loc, origin); + Ok(()) + } + + fn set_camera_attrib(&mut self, camera: Vector) -> Result<(), String> { + let camera_cstr = CString::new("camera") + .map_err(|_| String::from("Failed to create \"camera\" CString!"))?; + let attr_loc = get_attrib_location(self, &camera_cstr); + set_attr_2f(attr_loc, camera); Ok(()) } } @@ -110,6 +119,10 @@ impl ShaderInterface for RaylibShaderHandler { fn set_origin_attrib(&mut self, origin: Vector) -> Result<(), String> { self.shader.borrow_mut().set_origin_attrib(origin) } + + fn set_camera_attrib(&mut self, camera: Vector) -> Result<(), String> { + self.shader.borrow_mut().set_camera_attrib(camera) + } } impl RaylibShaderHandler { @@ -145,7 +158,9 @@ struct RaylibImage { #[derive(Clone, Debug)] struct RaylibImageHandler { image: Rc>, - shader: Rc>>, + tr_or_cam_shader: Rc>>, + cam_shader: Rc>>, + camera: Rc>, } impl RaylibImageHandler { @@ -168,18 +183,37 @@ impl ImageInterface for RaylibImageHandler { color: crate::faux_quicksilver::Color, ) -> Result<(), String> { self.image_to_texture()?; - unsafe { - ffi::DrawTexture( - *self - .image - .borrow() - .texture - .as_ref() - .ok_or_else(|| String::from("RaylibImage has no Texture!"))?, - x.round() as i32, - y.round() as i32, - fqcolor_to_color(color), - ); + if let Some(cam_shader) = self.cam_shader.borrow_mut().as_mut() { + cam_shader.set_camera_attrib(self.camera.borrow().pos)?; + cam_shader.begin_draw_shader()?; + unsafe { + ffi::DrawTexture( + *self + .image + .borrow() + .texture + .as_ref() + .ok_or_else(|| String::from("RaylibImage has no Texture!"))?, + x.round() as i32, + y.round() as i32, + fqcolor_to_color(color), + ); + } + cam_shader.end_draw_shader()?; + } else { + unsafe { + ffi::DrawTexture( + *self + .image + .borrow() + .texture + .as_ref() + .ok_or_else(|| String::from("RaylibImage has no Texture!"))?, + x.round() as i32, + y.round() as i32, + fqcolor_to_color(color), + ); + } } Ok(()) } @@ -191,20 +225,41 @@ impl ImageInterface for RaylibImageHandler { color: crate::faux_quicksilver::Color, ) -> Result<(), String> { self.image_to_texture()?; - unsafe { - ffi::DrawTexturePro( - *self - .image - .borrow() - .texture - .as_ref() - .ok_or_else(|| String::from("RaylibImage has no Texture!"))?, - fqrect_to_rect(sub_rect), - fqrect_to_rect(dest_rect), - ffi::Vector2 { x: 0.0, y: 0.0 }, - 0.0, - fqcolor_to_color(color), - ); + if let Some(cam_shader) = self.cam_shader.borrow_mut().as_mut() { + cam_shader.set_camera_attrib(self.camera.borrow().pos)?; + cam_shader.begin_draw_shader()?; + unsafe { + ffi::DrawTexturePro( + *self + .image + .borrow() + .texture + .as_ref() + .ok_or_else(|| String::from("RaylibImage has no Texture!"))?, + fqrect_to_rect(sub_rect), + fqrect_to_rect(dest_rect), + ffi::Vector2 { x: 0.0, y: 0.0 }, + 0.0, + fqcolor_to_color(color), + ); + } + cam_shader.end_draw_shader()?; + } else { + unsafe { + ffi::DrawTexturePro( + *self + .image + .borrow() + .texture + .as_ref() + .ok_or_else(|| String::from("RaylibImage has no Texture!"))?, + fqrect_to_rect(sub_rect), + fqrect_to_rect(dest_rect), + ffi::Vector2 { x: 0.0, y: 0.0 }, + 0.0, + fqcolor_to_color(color), + ); + } } Ok(()) } @@ -218,9 +273,10 @@ impl ImageInterface for RaylibImageHandler { origin: Vector, ) -> Result<(), String> { self.image_to_texture()?; - if let Some(shader) = self.shader.borrow_mut().as_mut() { + if let Some(shader) = self.tr_or_cam_shader.borrow_mut().as_mut() { shader.set_origin_attrib(origin)?; shader.set_transform_attrib(transform)?; + shader.set_camera_attrib(self.camera.borrow().pos)?; shader.begin_draw_shader()?; unsafe { ffi::DrawTexture( @@ -236,6 +292,23 @@ impl ImageInterface for RaylibImageHandler { ); } shader.end_draw_shader()?; + } else if let Some(cam_shader) = self.cam_shader.borrow_mut().as_mut() { + cam_shader.set_camera_attrib(self.camera.borrow().pos)?; + cam_shader.begin_draw_shader()?; + unsafe { + ffi::DrawTexture( + *self + .image + .borrow() + .texture + .as_ref() + .ok_or_else(|| String::from("RaylibImage has no Texture!"))?, + x.round() as i32, + y.round() as i32, + fqcolor_to_color(color), + ); + } + cam_shader.end_draw_shader()?; } else { unsafe { ffi::DrawTexture( @@ -263,9 +336,10 @@ impl ImageInterface for RaylibImageHandler { origin: Vector, ) -> Result<(), String> { self.image_to_texture()?; - if let Some(shader) = self.shader.borrow_mut().as_mut() { + if let Some(shader) = self.tr_or_cam_shader.borrow_mut().as_mut() { shader.set_origin_attrib(origin)?; shader.set_transform_attrib(transform)?; + shader.set_camera_attrib(self.camera.borrow().pos)?; shader.begin_draw_shader()?; unsafe { ffi::DrawTexturePro( @@ -283,6 +357,25 @@ impl ImageInterface for RaylibImageHandler { ); } shader.end_draw_shader()?; + } else if let Some(cam_shader) = self.cam_shader.borrow_mut().as_mut() { + cam_shader.set_camera_attrib(self.camera.borrow().pos)?; + cam_shader.begin_draw_shader()?; + unsafe { + ffi::DrawTexturePro( + *self + .image + .borrow() + .texture + .as_ref() + .ok_or_else(|| String::from("RaylibImage has no Texture!"))?, + fqrect_to_rect(sub_rect), + fqrect_to_rect(dest_rect), + ffi::Vector2 { x: 0.0, y: 0.0 }, + 0.0, + fqcolor_to_color(color), + ); + } + cam_shader.end_draw_shader()?; } else { unsafe { ffi::DrawTexturePro( @@ -427,12 +520,38 @@ impl MusicInterface for RaylibMusicHandler { } } +#[derive(Debug, Clone)] +struct Camera { + pos: Vector, +} + +impl Default for Camera { + fn default() -> Self { + Self { + pos: Vector { x: 0.0, y: 0.0 }, + } + } +} + +impl CameraInterface for Camera { + fn get_view_xy(&self) -> Result<(f32, f32), String> { + Ok((self.pos.x, self.pos.y)) + } + + fn set_view_xy(&mut self, x: f32, y: f32) -> Result<(), String> { + self.pos.x = x; + self.pos.y = y; + Ok(()) + } +} + struct RaylibGame { images: HashMap>>, fonts: HashMap>, sounds: HashMap>, music: HashMap>>, shaders: HashMap>>, + camera: Rc>, } impl RaylibGame { @@ -445,13 +564,21 @@ impl RaylibGame { string.as_ptr() as *const c_char, ); } - Box::new(Self { + let mut self_unboxed = Self { images: HashMap::new(), fonts: HashMap::new(), sounds: HashMap::new(), music: HashMap::new(), shaders: HashMap::new(), - }) + camera: Rc::new(RefCell::new(Camera::default())), + }; + if let Err(e) = self_unboxed.load_transform_origin_shader() { + println!("WARNING: {e:?}"); + } + if let Err(e) = self_unboxed.load_camera_shader() { + println!("WARNING: {e:?}"); + } + Box::new(self_unboxed) } } @@ -553,13 +680,29 @@ impl GameInterface for RaylibGame { circle: crate::faux_quicksilver::Circle, color: crate::faux_quicksilver::Color, ) -> Result<(), String> { - unsafe { - ffi::DrawCircle( - circle.x.round() as i32, - circle.y.round() as i32, - circle.r, - fqcolor_to_color(color), - ); + if let Some(cam_shader) = self.shaders.get_mut("camera") { + cam_shader + .borrow_mut() + .set_camera_attrib(self.camera.borrow().pos)?; + cam_shader.borrow().begin_draw_shader()?; + unsafe { + ffi::DrawCircle( + circle.x.round() as i32, + circle.y.round() as i32, + circle.r, + fqcolor_to_color(color), + ); + } + cam_shader.borrow().end_draw_shader()?; + } else { + unsafe { + ffi::DrawCircle( + circle.x.round() as i32, + circle.y.round() as i32, + circle.r, + fqcolor_to_color(color), + ); + } } Ok(()) } @@ -574,6 +717,9 @@ impl GameInterface for RaylibGame { if let Some(shader) = self.shaders.get_mut("transform_origin") { shader.borrow_mut().set_origin_attrib(origin)?; shader.borrow_mut().set_transform_attrib(transform)?; + shader + .borrow_mut() + .set_camera_attrib(self.camera.borrow().pos)?; shader.borrow().begin_draw_shader()?; unsafe { ffi::DrawCircle( @@ -584,6 +730,20 @@ impl GameInterface for RaylibGame { ); } shader.borrow().end_draw_shader()?; + } else if let Some(cam_shader) = self.shaders.get_mut("camera") { + cam_shader + .borrow_mut() + .set_camera_attrib(self.camera.borrow().pos)?; + cam_shader.borrow().begin_draw_shader()?; + unsafe { + ffi::DrawCircle( + circle.x.round() as i32, + circle.y.round() as i32, + circle.r, + fqcolor_to_color(color), + ); + } + cam_shader.borrow().end_draw_shader()?; } else { unsafe { ffi::DrawCircle( @@ -602,14 +762,31 @@ impl GameInterface for RaylibGame { rect: crate::faux_quicksilver::Rectangle, color: crate::faux_quicksilver::Color, ) -> Result<(), String> { - unsafe { - ffi::DrawRectangle( - rect.x.round() as i32, - rect.y.round() as i32, - rect.w.round() as i32, - rect.h.round() as i32, - fqcolor_to_color(color), - ); + if let Some(cam_shader) = self.shaders.get_mut("camera") { + cam_shader + .borrow_mut() + .set_camera_attrib(self.camera.borrow().pos)?; + cam_shader.borrow().begin_draw_shader()?; + unsafe { + ffi::DrawRectangle( + rect.x.round() as i32, + rect.y.round() as i32, + rect.w.round() as i32, + rect.h.round() as i32, + fqcolor_to_color(color), + ); + } + cam_shader.borrow().end_draw_shader()?; + } else { + unsafe { + ffi::DrawRectangle( + rect.x.round() as i32, + rect.y.round() as i32, + rect.w.round() as i32, + rect.h.round() as i32, + fqcolor_to_color(color), + ); + } } Ok(()) } @@ -621,13 +798,29 @@ impl GameInterface for RaylibGame { origin: crate::faux_quicksilver::Vector, rot: f32, ) -> Result<(), String> { - unsafe { - ffi::DrawRectanglePro( - fqrect_to_rect(rect), - fqvector_to_vector2(origin), - rot, - fqcolor_to_color(color), - ); + if let Some(cam_shader) = self.shaders.get_mut("camera") { + cam_shader + .borrow_mut() + .set_camera_attrib(self.camera.borrow().pos)?; + cam_shader.borrow().begin_draw_shader()?; + unsafe { + ffi::DrawRectanglePro( + fqrect_to_rect(rect), + fqvector_to_vector2(origin), + rot, + fqcolor_to_color(color), + ); + } + cam_shader.borrow().end_draw_shader()?; + } else { + unsafe { + ffi::DrawRectanglePro( + fqrect_to_rect(rect), + fqvector_to_vector2(origin), + rot, + fqcolor_to_color(color), + ); + } } Ok(()) } @@ -642,6 +835,9 @@ impl GameInterface for RaylibGame { if let Some(shader) = self.shaders.get_mut("transform_origin") { shader.borrow_mut().set_origin_attrib(origin)?; shader.borrow_mut().set_transform_attrib(transform)?; + shader + .borrow_mut() + .set_camera_attrib(self.camera.borrow().pos)?; shader.borrow().begin_draw_shader()?; unsafe { ffi::DrawRectangle( @@ -653,6 +849,21 @@ impl GameInterface for RaylibGame { ); } shader.borrow().end_draw_shader()?; + } else if let Some(cam_shader) = self.shaders.get_mut("camera") { + cam_shader + .borrow_mut() + .set_camera_attrib(self.camera.borrow().pos)?; + cam_shader.borrow().begin_draw_shader()?; + unsafe { + ffi::DrawRectangle( + rect.x.round() as i32, + rect.y.round() as i32, + rect.w.round() as i32, + rect.h.round() as i32, + fqcolor_to_color(color), + ); + } + cam_shader.borrow().end_draw_shader()?; } else { unsafe { ffi::DrawRectangle( @@ -678,7 +889,7 @@ impl GameInterface for RaylibGame { let path_buf: Vec = path_str.as_bytes().into(); let cstring: CString = CString::from_vec_unchecked(path_buf); let image = ffi::LoadImage(cstring.as_ptr()); - let shader: Option = + let tr_or_cam_shader: Option = if let Some(shader) = self.shaders.get("transform_origin") { Some(RaylibShaderHandler { shader: shader.clone(), @@ -686,12 +897,22 @@ impl GameInterface for RaylibGame { } else { None }; + let cam_shader: Option = + if let Some(shader) = self.shaders.get("camera") { + Some(RaylibShaderHandler { + shader: shader.clone(), + }) + } else { + None + }; let raylib_image_handler = RaylibImageHandler { image: Rc::new(RefCell::new(RaylibImage { image, texture: None, })), - shader: Rc::new(RefCell::new(shader)), + tr_or_cam_shader: Rc::new(RefCell::new(tr_or_cam_shader)), + cam_shader: Rc::new(RefCell::new(cam_shader)), + camera: self.camera.clone(), }; self.images .insert(path_str.to_owned(), raylib_image_handler.image.clone()); @@ -771,20 +992,26 @@ impl GameInterface for RaylibGame { } fn get_camera(&mut self) -> Result, String> { - todo!() + Ok(Box::new(self.camera.borrow().clone())) } fn get_default_camera(&mut self) -> Result, String> { - todo!() + Ok(Box::new(Camera::default())) } fn set_camera(&mut self, camera: &Box) -> Result<(), String> { - todo!() + self.camera.borrow_mut().pos = camera.as_ref().get_view_xy()?.into(); + Ok(()) + } + + fn set_camera_xy(&mut self, x: f32, y: f32) -> Result<(), String> { + self.camera.borrow_mut().pos = Vector { x, y }; + Ok(()) } } impl RaylibGame { - pub fn load_transform_origin_shader(&mut self) -> Result, String> { + fn load_transform_origin_shader(&mut self) -> Result, String> { self.load_shader( String::from("transform_origin"), &PathBuf::from_str("static/transform.vs") @@ -793,4 +1020,14 @@ impl RaylibGame { .map_err(|_| String::from("Failed to convert \"static/simple.fs\" to path!"))?, ) } + + fn load_camera_shader(&mut self) -> Result, String> { + self.load_shader( + String::from("camera"), + &PathBuf::from_str("static/camera.vs") + .map_err(|_| String::from("Failed to convert \"static/camera.vs\" to path!"))?, + &PathBuf::from_str("static/simple.fs") + .map_err(|_| String::from("Failed to convert \"static/camera.vs\" to path!"))?, + ) + } } diff --git a/src/faux_quicksilver.rs b/src/faux_quicksilver.rs index 8fc6d16..3d8eb2f 100644 --- a/src/faux_quicksilver.rs +++ b/src/faux_quicksilver.rs @@ -143,6 +143,12 @@ impl Vector { } } +impl From<(f32, f32)> for Vector { + fn from(t: (f32, f32)) -> Self { + Self { x: t.0, y: t.1 } + } +} + #[derive(Copy, Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct Transform { pub mat: [f32; 9], diff --git a/src/shaders.rs b/src/shaders.rs index b1755a4..5a30900 100644 --- a/src/shaders.rs +++ b/src/shaders.rs @@ -40,7 +40,7 @@ pub fn set_transform_3f(index: ::std::os::raw::c_uint, transform: Transform) { } } -pub fn set_origin_2f(index: ::std::os::raw::c_uint, origin: Vector) { +pub fn set_attr_2f(index: ::std::os::raw::c_uint, origin: Vector) { unsafe { glVertexAttrib2f(index, origin.x, origin.y); } diff --git a/static/camera.vs b/static/camera.vs new file mode 100644 index 0000000..e2db57a --- /dev/null +++ b/static/camera.vs @@ -0,0 +1,23 @@ +#version 100 + +// Input vertex attributes +attribute vec3 vertexPosition; +attribute vec2 vertexTexCoord; +attribute vec4 vertexColor; + +// Input uniform values +uniform mat4 mvp; + +// Output vertex attributes (to fragment shader) +varying vec2 fragTexCoord; +varying vec4 fragColor; + +// custom +attribute vec2 camera; + +void main() { + fragTexCoord = vertexTexCoord; + fragColor = vertexColor; + + gl_Position = mvp * vec4(vertexPosition - vec3(camera, 0.0), 1.0); +} diff --git a/static/transform.vs b/static/transform.vs index 9e1a9f4..9cd3c07 100644 --- a/static/transform.vs +++ b/static/transform.vs @@ -13,6 +13,7 @@ varying vec2 fragTexCoord; varying vec4 fragColor; // custom +attribute vec2 camera; attribute vec2 origin; attribute mat3 transform; @@ -21,5 +22,5 @@ void main() { fragColor = vertexColor; vec3 pos = transform * (vertexPosition - vec3(origin, 0.0)) + vec3(origin, 0.0); - gl_Position = mvp * vec4(pos, 1.0); + gl_Position = mvp * vec4(pos - camera, 1.0); } From 20697c37b0d384b05da53b24114b4637777c3bf6 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Tue, 21 Feb 2023 15:23:18 +0900 Subject: [PATCH 18/29] Minor fix, set fps on native builds --- src/agnostic_interface/raylib_impl.rs | 11 +++++++++++ src/original_impl.rs | 7 +------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/agnostic_interface/raylib_impl.rs b/src/agnostic_interface/raylib_impl.rs index 0054ff4..67a24a9 100644 --- a/src/agnostic_interface/raylib_impl.rs +++ b/src/agnostic_interface/raylib_impl.rs @@ -555,6 +555,16 @@ struct RaylibGame { } impl RaylibGame { + #[cfg(not(target_arch = "wasm32"))] + fn native_setup() { + unsafe { + ffi::SetTargetFPS(60); + } + } + + #[cfg(target_arch = "wasm32")] + fn native_setup() {} + pub fn new_boxed(width: u32, height: u32) -> Box { unsafe { let string = "One and All LD45\0"; @@ -564,6 +574,7 @@ impl RaylibGame { string.as_ptr() as *const c_char, ); } + Self::native_setup(); let mut self_unboxed = Self { images: HashMap::new(), fonts: HashMap::new(), diff --git a/src/original_impl.rs b/src/original_impl.rs index d085952..28c1ca4 100644 --- a/src/original_impl.rs +++ b/src/original_impl.rs @@ -1306,12 +1306,7 @@ impl GameState { )?; let mut camera = window.get_gi_mut().get_default_camera()?; - camera.set_view(Rectangle { - x: 0.0, - y: 0.0, - w: WIDTH_F, - h: HEIGHT_F, - })?; + camera.set_view_xy(0.0, 0.0)?; Ok(Self { s_boom, s_get, From 71c699cd7efd0c05703ef2811d5da714d29a6ecc Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Tue, 21 Feb 2023 16:53:36 +0900 Subject: [PATCH 19/29] Fixes, still kind of broken --- src/agnostic_interface.rs | 3 + src/agnostic_interface/raylib_impl.rs | 37 ++++++++- src/faux_quicksilver.rs | 7 ++ src/main.rs | 18 +++++ src/original_impl.rs | 112 ++++++++++++++------------ src/shaders.rs | 8 +- static/transform.vs | 2 +- 7 files changed, 125 insertions(+), 62 deletions(-) diff --git a/src/agnostic_interface.rs b/src/agnostic_interface.rs index 1fe08a9..acb7250 100644 --- a/src/agnostic_interface.rs +++ b/src/agnostic_interface.rs @@ -66,9 +66,12 @@ pub trait GameInterface { fn get_dimensions(&self) -> Result<(f32, f32), String>; fn get_key_pressed(&mut self, key: char) -> Result; fn get_mouse_pressed(&mut self) -> Result, String>; + fn get_mouse_released(&mut self) -> Result; fn get_mouse_down(&mut self) -> Result, String>; fn get_mouse_xy(&self) -> Result<(f32, f32), String>; fn get_mouse_xy_vec(&self) -> Result; + fn xy_to_world(&self, x: f32, y: f32) -> Result; + fn vec_to_world(&self, vec: Vector) -> Result; fn get_delta_time(&self) -> f32; fn clear_window(&mut self, color: Color) -> Result<(), String>; fn begin_drawing(&mut self) -> Result<(), String>; diff --git a/src/agnostic_interface/raylib_impl.rs b/src/agnostic_interface/raylib_impl.rs index 67a24a9..1e345ba 100644 --- a/src/agnostic_interface/raylib_impl.rs +++ b/src/agnostic_interface/raylib_impl.rs @@ -1,4 +1,4 @@ -mod ffi { +pub mod ffi { #![allow(non_upper_case_globals)] #![allow(non_camel_case_types)] #![allow(non_snake_case)] @@ -167,8 +167,8 @@ impl RaylibImageHandler { fn image_to_texture(&mut self) -> Result<(), String> { if self.image.borrow().texture.is_none() { unsafe { - self.image.borrow_mut().texture = - Some(ffi::LoadTextureFromImage(self.image.borrow().image)); + let texture = ffi::LoadTextureFromImage(self.image.borrow().image); + self.image.borrow_mut().texture = Some(texture); } } Ok(()) @@ -545,7 +545,7 @@ impl CameraInterface for Camera { } } -struct RaylibGame { +pub struct RaylibGame { images: HashMap>>, fonts: HashMap>, sounds: HashMap>, @@ -574,7 +574,12 @@ impl RaylibGame { string.as_ptr() as *const c_char, ); } + Self::native_setup(); + unsafe { + ffi::InitAudioDevice(); + } + let mut self_unboxed = Self { images: HashMap::new(), fonts: HashMap::new(), @@ -638,6 +643,16 @@ impl GameInterface for RaylibGame { } } + fn get_mouse_released(&mut self) -> Result { + unsafe { + if ffi::IsMouseButtonReleased(0) { + Ok(true) + } else { + Ok(false) + } + } + } + fn get_mouse_down(&mut self) -> Result, String> { unsafe { if ffi::IsMouseButtonDown(0) { @@ -1019,6 +1034,20 @@ impl GameInterface for RaylibGame { self.camera.borrow_mut().pos = Vector { x, y }; Ok(()) } + + fn xy_to_world(&self, x: f32, y: f32) -> Result { + Ok(Vector { + x: x + self.camera.borrow().pos.x, + y: y + self.camera.borrow().pos.y, + }) + } + + fn vec_to_world(&self, vec: Vector) -> Result { + Ok(Vector { + x: vec.x + self.camera.borrow().pos.x, + y: vec.y + self.camera.borrow().pos.y, + }) + } } impl RaylibGame { diff --git a/src/faux_quicksilver.rs b/src/faux_quicksilver.rs index 3d8eb2f..704a2c3 100644 --- a/src/faux_quicksilver.rs +++ b/src/faux_quicksilver.rs @@ -335,4 +335,11 @@ impl Window { .ok_or_else(|| format!("Music \"{name}\" not found"))? .as_mut()) } + + pub fn update_music(&mut self) -> Result<(), String> { + for (_, music) in &mut self.music { + music.update()?; + } + Ok(()) + } } diff --git a/src/main.rs b/src/main.rs index 4b66d33..6241b62 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,16 @@ +use agnostic_interface::raylib_impl::RaylibGame; +use faux_quicksilver::Window; +use original_impl::GameState; + mod agnostic_interface; mod faux_quicksilver; mod original_impl; mod shaders; +fn will_close() -> bool { + unsafe { agnostic_interface::raylib_impl::ffi::WindowShouldClose() } +} + fn main() { // TODO //run::( @@ -10,4 +18,14 @@ fn main() { // Vector::new(800, 600), // Settings::default(), //); + + let game_interface = RaylibGame::new_boxed(800, 600); + let mut window = Window::new(game_interface); + let mut game_state = GameState::new(&mut window).unwrap(); + + while !will_close() { + window.update_music().unwrap(); + game_state.update(&mut window).unwrap(); + game_state.draw(&mut window).unwrap(); + } } diff --git a/src/original_impl.rs b/src/original_impl.rs index 28c1ca4..fe2b166 100644 --- a/src/original_impl.rs +++ b/src/original_impl.rs @@ -8,15 +8,15 @@ use serde::{Deserialize, Serialize}; const WIDTH_F: f32 = 800.0; const HEIGHT_F: f32 = 600.0; const MUSIC2_LENGTH: f32 = 2.0 * 60.0 * 1000.0; -const TEXT_RATE: f32 = 100.0; -const PP_GEN_RATE: f32 = 75.0; +const TEXT_RATE: f32 = 0.1; +const PP_GEN_RATE: f32 = 0.075; const PARTICLE_RAND_VEL_RANGE: f32 = 0.2; const PARTICLE_RAND_VEL_DIST: f32 = 0.2828427; // dist where x and y = 0.2 const PARTICLE_RAND_ROT_RANGE: f32 = 0.5; const JOINING_OPACITY_RATE: f32 = 0.00013; const JOINING_FAR_DIST: f32 = 700.0; const JOINING_NEAR_DIST: f32 = 150.0; -const DOUBLE_CLICK_TIME: f32 = 350.0; +const DOUBLE_CLICK_TIME: f32 = 0.350; const SL_NOTIF_TIME: f32 = 5000.0; const MAX_MOONS: usize = 5; @@ -218,9 +218,9 @@ impl Menu { fn s_01() -> Menu { Menu { items: vec![ - Menu::pause(500.0, true), + Menu::pause(0.500, true), Menu::text(50.0, HEIGHT_F - 140.0, 40.0, false, "This is how it is."), - Menu::pause(500.0, false), + Menu::pause(0.500, false), Menu::text( 50.0, HEIGHT_F - 100.0, @@ -228,9 +228,9 @@ impl Menu { false, "Nothing is, and everything is nothing.", ), - Menu::pause(500.0, false), + Menu::pause(0.500, false), Menu::text(50.0, HEIGHT_F - 60.0, 40.0, false, "...until you appeared."), - Menu::pause(100.0, false), + Menu::pause(0.100, false), Menu::text( 570.0, HEIGHT_F - 50.0, @@ -252,7 +252,7 @@ impl Menu { true, "Just by being, you brought light into existence.", ), - Menu::pause(500.0, false), + Menu::pause(0.500, false), Menu::text( 50.0, HEIGHT_F - 110.0, @@ -260,7 +260,7 @@ impl Menu { false, "What brings you here? What drives you?", ), - Menu::pause(500.0, false), + Menu::pause(0.500, false), Menu::text( 50.0, HEIGHT_F - 70.0, @@ -327,7 +327,7 @@ impl Menu { true, "Hope... hope that your actions will inspire others..", ), - Menu::pause(500.0, false), + Menu::pause(0.500, false), Menu::text( 50.0, HEIGHT_F - 130.0, @@ -335,7 +335,7 @@ impl Menu { false, "Hope that a brighter future will come tomorrow...", ), - Menu::pause(500.0, false), + Menu::pause(0.500, false), Menu::text( 50.0, HEIGHT_F - 90.0, @@ -358,7 +358,7 @@ impl Menu { true, "Miracles huh?.. I see, then your appearance is special.", ), - Menu::pause(500.0, false), + Menu::pause(0.500, false), Menu::text( 30.0, HEIGHT_F - 130.0, @@ -366,7 +366,7 @@ impl Menu { false, "With your appearance, things may change for the better..", ), - Menu::pause(500.0, false), + Menu::pause(0.500, false), Menu::text( 30.0, HEIGHT_F - 90.0, @@ -389,7 +389,7 @@ impl Menu { true, "Kindness?.. I am in your debt.", ), - Menu::pause(250.0, false), + Menu::pause(0.250, false), Menu::text( 50.0, HEIGHT_F - 130.0, @@ -398,7 +398,7 @@ impl Menu { "It has been a long time since I have encountered", ), Menu::text(50.0, HEIGHT_F - 90.0, 40.0, false, "another being..."), - Menu::pause(500.0, false), + Menu::pause(0.500, false), Menu::text(270.0, HEIGHT_F - 90.0, 40.0, false, "... Thank you..."), ], } @@ -415,7 +415,7 @@ impl Menu { true, "Determination.. I see...", ), - Menu::pause(500.0, false), + Menu::pause(0.500, false), Menu::text( 400.0, HEIGHT_F - 170.0, @@ -430,7 +430,7 @@ impl Menu { false, "must have been difficult to come here..", ), - Menu::pause(500.0, false), + Menu::pause(0.500, false), Menu::text( 50.0, HEIGHT_F - 90.0, @@ -459,7 +459,7 @@ impl Menu { false, "creation for all that will be.", ), - Menu::pause(200.0, false), + Menu::pause(0.200, false), Menu::text( 50.0, HEIGHT_F - 50.0, @@ -486,7 +486,7 @@ impl Menu { fn s_09() -> Menu { Menu { items: vec![ - Menu::pause(400.0, true), + Menu::pause(0.400, true), Menu::text( 50.0, HEIGHT_F - 140.0, @@ -494,7 +494,7 @@ impl Menu { false, "A new planet... It has most certainly been a while.", ), - Menu::pause(500.0, false), + Menu::pause(0.500, false), Menu::text( 50.0, HEIGHT_F - 100.0, @@ -502,7 +502,7 @@ impl Menu { false, "Please, go out and create the new universe, and again..", ), - Menu::pause(300.0, false), + Menu::pause(0.300, false), Menu::text(50.0, HEIGHT_F - 60.0, 40.0, false, "Thank you."), ], } @@ -914,8 +914,8 @@ impl Planet { circle, color, particle_system: ParticleSystem::new( - rand::thread_rng().gen_range(2000.0, 3800.0), - 900.0, + rand::thread_rng().gen_range(2.0, 3.8), + 0.9, Rectangle::new(0.0, 0.0, 1.0, 1.0), circle, false, @@ -931,8 +931,8 @@ impl Planet { let clockwise = rand::thread_rng().gen_bool(0.5); for i in 0..rand::thread_rng().gen_range(0, MAX_MOONS) { planet.moons.push(RotatingParticleSystem::new( - rand::thread_rng().gen_range(1000.0, 2600.0), - 600.0, + rand::thread_rng().gen_range(1.0, 2.6), + 0.6, Rectangle::new(0.0, 0.0, 1.0, 1.0), smaller_circle, false, @@ -997,8 +997,8 @@ impl Star { let mut star = Star { color, particle_system: ParticleSystem::new( - rand::thread_rng().gen_range(80.0, 200.0), - 850.0, + rand::thread_rng().gen_range(0.08, 0.2), + 0.85, Rectangle::new(0.0, 0.0, 1.0, 1.0), circle, false, @@ -1073,12 +1073,12 @@ enum FishState { impl Fish { fn new(pos: Vector, r: f32, color: Color) -> Self { - let anim_timer = rand::thread_rng().gen_range(800.0, 1000.0); + let anim_timer = rand::thread_rng().gen_range(0.8, 1.0); Self { pos, r, - swim_time: 800.0, - swim_timer: 800.0, + swim_time: 0.8, + swim_timer: 0.8, swim_v: 0.2, anim_timer, anim_time: anim_timer, @@ -1101,26 +1101,26 @@ impl Fish { fn set_next(&mut self, state: FishState) { match state { FishState::Idle => { - self.swim_time = rand::thread_rng().gen_range(1100.0, 2400.0); + self.swim_time = rand::thread_rng().gen_range(1.1, 2.4); self.swim_timer = self.swim_time; - self.anim_timer = 1600.0; - self.anim_time = 1600.0; + self.anim_timer = 1.6; + self.anim_time = 1.6; self.swim_v = 0.0; } FishState::Swim => { - self.swim_time = rand::thread_rng().gen_range(1400.0, 2300.0); + self.swim_time = rand::thread_rng().gen_range(1.4, 2.3); self.swim_timer = self.swim_time; self.r = rand::thread_rng().gen_range(0.0, 360.0); - self.anim_timer = rand::thread_rng().gen_range(600.0, 1000.0); + self.anim_timer = rand::thread_rng().gen_range(0.6, 1.0); self.anim_time = self.anim_timer; - self.swim_v = (self.anim_timer / 8000.0) as f32; + self.swim_v = (self.anim_timer / 8.0) as f32; } } } fn update(&mut self, dt: f32) { self.swim_time -= dt; - if self.swim_time < 220.0 { + if self.swim_time < 0.22 { self.swim_v /= 1.1; } if self.swim_time <= 0.0 { @@ -1201,7 +1201,7 @@ enum SaveLoadNotification { Load { text: Option, timer: f32 }, } -struct GameState { +pub struct GameState { s_boom: String, s_get: String, s_power_up: String, @@ -1239,7 +1239,7 @@ struct GameState { } impl GameState { - fn new(window: &mut Window) -> Result { + pub fn new(window: &mut Window) -> Result { let s_boom = String::from("boom.mp3"); window.load_sound( &PathBuf::from_str("static/boom.mp3") @@ -1329,7 +1329,7 @@ impl GameState { player_r: 0.0, player_particles: ParticleSystem::new( PP_GEN_RATE, - 1000.0, + 1.0, Rectangle::new(400.0, 300.0, 32.0, 32.0), Circle::new(100.0, 100.0, 32.0), true, @@ -1340,7 +1340,7 @@ impl GameState { ), joining_particles: RotatingParticleSystem::new( PP_GEN_RATE, - 1000.0, + 1.0, Rectangle::new(400.0, 300.0, 16.0, 16.0), Circle::new(100.0, 100.0, 32.0), true, @@ -1368,12 +1368,13 @@ impl GameState { }) } - fn update(&mut self, window: &mut Window) -> Result<(), String> { + pub fn update(&mut self, window: &mut Window) -> Result<(), String> { let dt = window.get_gi().get_delta_time(); // check mouse pos { self.mouse_pos = window.get_gi().get_mouse_xy_vec()?; + //self.mouse_pos = window.get_gi().vec_to_world(self.mouse_pos)?; let mut hovered = false; for i in 0..self.menu.items.len() { if self.menu.items[i].is_inside(self.mouse_pos.x, self.mouse_pos.y) { @@ -1390,11 +1391,11 @@ impl GameState { } // check mouse down - if window.get_gi_mut().get_mouse_down()?.is_none() { + if window.get_gi_mut().get_mouse_released()? { if self.dbl_click_timeout.is_none() { self.click_release_time = 0.0; } - } else { + } else if window.get_gi_mut().get_mouse_pressed()?.is_some() { if self.current_finished { if self.is_create_mode { if self.click_release_time < DOUBLE_CLICK_TIME { @@ -1403,12 +1404,12 @@ impl GameState { self.click_time = None; if self.state == 8 { let mut expl_conv_system = ExplConvParticleSystem::new( - 1500.0, + 1.5, Circle::new(self.mouse_pos.x, self.mouse_pos.y, 20.0), Color::from_rgba(0x99, 0xFF, 0x99, 255), 1.0, ); - expl_conv_system.activate(30, 200.0); + expl_conv_system.activate(30, 0.2); self.expl_conv_p_systems.push(expl_conv_system); self.state = 9; self.state_dirty = true; @@ -1419,7 +1420,7 @@ impl GameState { if rand_out < 0.6 { // spawn planet let mut expl_conv_system = ExplConvParticleSystem::new( - rng.gen_range(1200.0, 1600.0), + rng.gen_range(1.2, 1.6), Circle::new( self.mouse_pos.x, self.mouse_pos.y, @@ -1434,7 +1435,7 @@ impl GameState { 1.0, ); expl_conv_system - .activate(rng.gen_range(13, 40), rng.gen_range(150.0, 300.0)); + .activate(rng.gen_range(13, 40), rng.gen_range(0.15, 0.3)); self.expl_conv_p_systems.push(expl_conv_system); } else if rand_out < 0.85 { // spawn star @@ -1613,6 +1614,8 @@ impl GameState { if self.state == 10 { self.state = 0; self.state_dirty = true; + window.get_music_mut(&self.music2)?.stop()?; + self.music_on = false; } } @@ -1626,7 +1629,7 @@ impl GameState { if let Some(t) = &mut self.dbl_click_timeout { *t += dt; - if *t > 300.0 { + if *t > 0.3 { self.dbl_click_timeout = None; } } @@ -1641,8 +1644,8 @@ impl GameState { (self.player.y - self.joining_particles.particle_system.host_rect.y) / 30.0; let (cx, cy) = self.camera.get_view_xy()?; self.camera.set_view_xy( - (self.player.x - WIDTH_F / 2.0 - cx) / 40.0, - (self.player.y - HEIGHT_F / 2.0 - cy) / 40.0, + cx + (self.player.x - WIDTH_F / 2.0 - cx) / 40.0, + cy + (self.player.y - HEIGHT_F / 2.0 - cy) / 40.0, )?; window.get_gi_mut().set_camera(&self.camera)?; @@ -1742,7 +1745,7 @@ impl GameState { } if self.player_particles.opacity < 1.0 && self.state > 1 { - self.player_particles.opacity += dt as f32 / 7000.0; + self.player_particles.opacity += dt as f32 / 7.0; if self.player_particles.opacity > 1.0 { self.player_particles.opacity = 1.0; } @@ -1792,6 +1795,7 @@ impl GameState { if *timer > TEXT_RATE { *timer -= TEXT_RATE; *text_idx += 1; + window.get_sound_mut(&self.s_tap).unwrap().play(0.2)?; if *text_idx >= text.len() { mi.is_loaded = true; if i + 1 < self.menu.items.len() { @@ -1898,7 +1902,8 @@ impl GameState { Ok(()) } - fn draw(&mut self, window: &mut Window) -> Result<(), String> { + pub fn draw(&mut self, window: &mut Window) -> Result<(), String> { + window.get_gi_mut().begin_drawing()?; window.get_gi_mut().clear_window(Color::BLACK)?; let mut rect = Rectangle::default(); for mi in &mut self.menu.items { @@ -2000,6 +2005,7 @@ impl GameState { // } // } //} + window.get_gi_mut().end_drawing()?; Ok(()) } diff --git a/src/shaders.rs b/src/shaders.rs index 5a30900..7e36794 100644 --- a/src/shaders.rs +++ b/src/shaders.rs @@ -28,13 +28,13 @@ pub fn get_attrib_location(raylib_shader: &RaylibShader, name: &CStr) -> ::std:: pub fn set_transform_3f(index: ::std::os::raw::c_uint, transform: Transform) { // OpenGL stores matrix indices in column major order. - for idx in index..(index + 3) { + for (i, idx) in (index..(index + 3)).enumerate() { unsafe { glVertexAttrib3f( idx, - transform.mat[0 + idx as usize], - transform.mat[3 + idx as usize], - transform.mat[6 + idx as usize], + transform.mat[0 + i as usize], + transform.mat[3 + i as usize], + transform.mat[6 + i as usize], ); } } diff --git a/static/transform.vs b/static/transform.vs index 9cd3c07..1df0de6 100644 --- a/static/transform.vs +++ b/static/transform.vs @@ -22,5 +22,5 @@ void main() { fragColor = vertexColor; vec3 pos = transform * (vertexPosition - vec3(origin, 0.0)) + vec3(origin, 0.0); - gl_Position = mvp * vec4(pos - camera, 1.0); + gl_Position = mvp * vec4(pos - vec3(camera, 0.0), 1.0); } From c1aacab5f306e8617771a4c41265603b4fc5967f Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Tue, 21 Feb 2023 17:29:59 +0900 Subject: [PATCH 20/29] Fix drawing of player, replace quicksilver text Also fix camera offsets to place planets/stars/fish. TODO: Fix drawing of fish. --- src/original_impl.rs | 36 +++++++++++++----------------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/src/original_impl.rs b/src/original_impl.rs index fe2b166..e2fec24 100644 --- a/src/original_impl.rs +++ b/src/original_impl.rs @@ -137,28 +137,21 @@ impl Menu { Menu::instant_text( 70.0, 50.0, - 55.0, + 45.0, true, "One And All - A Ludum Dare 45 Entry", ), Menu::instant_text( 25.0, HEIGHT_F - 100.0, - 30.0, + 27.0, true, - "Made with quicksilver which is licensed with either", - ), - Menu::instant_text( - 70.0, - HEIGHT_F - 80.0, - 30.0, - true, - "MIT License or Apache License Version 2.0", + "Made with Raylib which is licensed with the zlib license", ), Menu::instant_text( 25.0, HEIGHT_F - 50.0, - 30.0, + 27.0, true, "Uses Clear-Sans which is licensed with Apache License Version 2.0", ), @@ -639,7 +632,7 @@ impl ParticleSystem { * 255.0) as u8; if particle.is_rect { let pre_transform = - Transform::translate(-particle.rect.x / 2.0, -particle.rect.y / 2.0) + Transform::translate(particle.rect.w / 2.0, particle.rect.h / 2.0) * Transform::rotate(particle.r); window .get_gi_mut() @@ -1398,6 +1391,7 @@ impl GameState { } else if window.get_gi_mut().get_mouse_pressed()?.is_some() { if self.current_finished { if self.is_create_mode { + let click_pos = window.get_gi().vec_to_world(self.mouse_pos)?; if self.click_release_time < DOUBLE_CLICK_TIME { self.click_release_time = DOUBLE_CLICK_TIME; self.dbl_click_timeout = Some(0.0); @@ -1405,7 +1399,7 @@ impl GameState { if self.state == 8 { let mut expl_conv_system = ExplConvParticleSystem::new( 1.5, - Circle::new(self.mouse_pos.x, self.mouse_pos.y, 20.0), + Circle::new(click_pos.x, click_pos.y, 20.0), Color::from_rgba(0x99, 0xFF, 0x99, 255), 1.0, ); @@ -1422,8 +1416,8 @@ impl GameState { let mut expl_conv_system = ExplConvParticleSystem::new( rng.gen_range(1.2, 1.6), Circle::new( - self.mouse_pos.x, - self.mouse_pos.y, + click_pos.x, + click_pos.y, rng.gen_range(15.0, 25.0), ), Color::from_rgba( @@ -1441,11 +1435,7 @@ impl GameState { // spawn star let rot_clockwise = rng.gen_bool(0.5); self.stars.push(Star::new( - Circle::new( - self.mouse_pos.x, - self.mouse_pos.y, - rng.gen_range(3.0, 7.0), - ), + Circle::new(click_pos.x, click_pos.y, rng.gen_range(3.0, 7.0)), Color::from_rgba( rng.gen_range(0x58, 0xFF), rng.gen_range(0x58, 0xFF), @@ -1463,7 +1453,7 @@ impl GameState { // spawn fish for i in 0..rng.gen_range(1, 4) { self.fishes.push(Fish::new( - self.mouse_pos, + click_pos, rng.gen_range(0.0, 360.0), Color::from_rgba( rng.gen_range(0x44, 0xFF), @@ -1478,7 +1468,7 @@ impl GameState { } } else if self.state == 10 { self.click_time = Some(0.0); - self.click_pos = self.mouse_pos; + self.click_pos = click_pos; } } else if self.selection_mode { if let Some(idx) = self.current_item { @@ -1966,7 +1956,7 @@ impl GameState { window.get_gi_mut().draw_rect_transform( self.player, Color::from_rgba(255, 255, 255, (self.player_particles.opacity * 255.0) as u8), - Transform::translate(-self.player.x / 2.0, -self.player.y / 2.0) + Transform::translate(self.player.w / 2.0, self.player.h / 2.0) * Transform::rotate(self.player_r as f32), Vector { x: self.player.x + self.player.w / 2.0, From 87a2815a2622f8488b60074a6ebd594d9d0bd958 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Tue, 21 Feb 2023 21:07:23 +0900 Subject: [PATCH 21/29] Fix fish draws and orbiting particles --- src/faux_quicksilver.rs | 9 +++++++- src/original_impl.rs | 46 +++++++++++++++++++---------------------- 2 files changed, 29 insertions(+), 26 deletions(-) diff --git a/src/faux_quicksilver.rs b/src/faux_quicksilver.rs index 704a2c3..b1ba0e7 100644 --- a/src/faux_quicksilver.rs +++ b/src/faux_quicksilver.rs @@ -1,5 +1,5 @@ use std::collections::HashMap; -use std::ops::{Add, AddAssign, Mul, Sub}; +use std::ops::{Add, AddAssign, Mul, Sub, SubAssign}; use std::path::Path; use serde::{Deserialize, Serialize}; @@ -126,6 +126,13 @@ impl AddAssign for Vector { } } +impl SubAssign for Vector { + fn sub_assign(&mut self, rhs: Vector) { + self.x -= rhs.x; + self.y -= rhs.y; + } +} + impl Mul for Vector { type Output = Vector; diff --git a/src/original_impl.rs b/src/original_impl.rs index e2fec24..b6f5cce 100644 --- a/src/original_impl.rs +++ b/src/original_impl.rs @@ -10,10 +10,10 @@ const HEIGHT_F: f32 = 600.0; const MUSIC2_LENGTH: f32 = 2.0 * 60.0 * 1000.0; const TEXT_RATE: f32 = 0.1; const PP_GEN_RATE: f32 = 0.075; -const PARTICLE_RAND_VEL_RANGE: f32 = 0.2; +const PARTICLE_RAND_VEL_RANGE: f32 = 80.0; const PARTICLE_RAND_VEL_DIST: f32 = 0.2828427; // dist where x and y = 0.2 -const PARTICLE_RAND_ROT_RANGE: f32 = 0.5; -const JOINING_OPACITY_RATE: f32 = 0.00013; +const PARTICLE_RAND_ROT_RANGE: f32 = 5.0; +const JOINING_OPACITY_RATE: f32 = 0.13; const JOINING_FAR_DIST: f32 = 700.0; const JOINING_NEAR_DIST: f32 = 150.0; const DOUBLE_CLICK_TIME: f32 = 0.350; @@ -747,7 +747,7 @@ impl RotatingParticleSystem { self.particle_system.update(dt); self.particle_system.host_circle = saved_cir; } - self.r += self.velr * dt as f32; + self.r += self.velr * dt as f32 * 10.0; } fn draw(&mut self, window: &mut Window, transform: Transform) { @@ -767,12 +767,10 @@ impl RotatingParticleSystem { .draw_rect_transform( moved_rect, solid_color, - transform - * Transform::translate(-moved_rect.x / 2.0, -moved_rect.y / 2.0) - * Transform::rotate(self.r * 1.3), + transform * Transform::rotate(self.r * 1.3), Vector { - x: moved_rect.x + moved_rect.w / 2.0, - y: moved_rect.y + moved_rect.h / 2.0, + x: moved_rect.x, + y: moved_rect.y, }, ) .ok(); @@ -1103,7 +1101,7 @@ impl Fish { FishState::Swim => { self.swim_time = rand::thread_rng().gen_range(1.4, 2.3); self.swim_timer = self.swim_time; - self.r = rand::thread_rng().gen_range(0.0, 360.0); + self.r = rand::thread_rng().gen_range(0.0, std::f32::consts::PI * 2.0); self.anim_timer = rand::thread_rng().gen_range(0.6, 1.0); self.anim_time = self.anim_timer; self.swim_v = (self.anim_timer / 8.0) as f32; @@ -1129,7 +1127,7 @@ impl Fish { self.anim_timer = self.anim_time; } - self.pos += Transform::rotate(self.r) * Vector::new(self.swim_v, 0.0) * dt as f32; + self.pos -= Transform::rotate(self.r) * Vector::new(self.swim_v, 0.0) * dt as f32 * 1000.0; } fn draw(&mut self, i_fish: &str, window: &mut Window, transform: Transform) { @@ -1138,10 +1136,9 @@ impl Fish { .expect("\"fish\" Image should be loaded"); let anim_angle = ((self.anim_timer / self.anim_time) * std::f32::consts::PI * 2.0).sin(); let mut body_rect = self.body_rect; - body_rect.x = self.pos.x - body_rect.w / 2.0; - body_rect.y = self.pos.y - body_rect.h / 2.0; - let body_tr = - Transform::rotate(anim_angle as f32 * 30.0) * Transform::rotate(self.r + 180.0); + body_rect.x = self.pos.x - self.body_rect.w / 2.0; + body_rect.y = self.pos.y - self.body_rect.h / 2.0; + let body_tr = Transform::rotate(anim_angle as f32 + self.r); fish_img .draw_sub_transform( self.body_rect, @@ -1149,22 +1146,21 @@ impl Fish { self.color, transform * body_tr, Vector { - x: self.body_rect.x + self.body_rect.w / 2.0, - y: self.body_rect.y + self.body_rect.h / 2.0, + x: self.pos.x, + y: self.pos.y, }, ) .ok(); let mut tail_rect = self.tail_rect; - tail_rect.x = self.pos.x - tail_rect.w / 2.0; - tail_rect.y = self.pos.y - tail_rect.h / 2.0; + tail_rect.x = self.pos.x + body_rect.w / 2.0; + tail_rect.y = self.pos.y - body_rect.h / 2.0; let anim_angle = ((self.anim_timer / self.anim_time) * std::f32::consts::PI * 2.0 - std::f32::consts::PI / 3.0) .sin(); let tail_tr = body_tr - * Transform::translate(body_rect.x / 1.5, 0.0) - * Transform::translate(-tail_rect.x / 2.0, 0.0) - * Transform::rotate(-anim_angle as f32 * 45.0) - * Transform::translate(tail_rect.x / 2.0, 0.0); + * Transform::translate(-body_rect.w / 2.0, 0.0) + * Transform::rotate(-anim_angle as f32) + * Transform::translate(body_rect.w / 2.0, 0.0); fish_img .draw_sub_transform( self.tail_rect, @@ -1172,8 +1168,8 @@ impl Fish { self.color, transform * tail_tr, Vector { - x: self.tail_rect.x + self.tail_rect.w / 2.0, - y: self.tail_rect.y + self.tail_rect.h / 2.0, + x: self.pos.x, + y: self.pos.y, }, ) .ok(); From b7fac557dbddf2e2233296ab60154f537ab45068 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Tue, 21 Feb 2023 21:24:31 +0900 Subject: [PATCH 22/29] Fix most things (except saving/loading) --- src/original_impl.rs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/original_impl.rs b/src/original_impl.rs index b6f5cce..600aaaf 100644 --- a/src/original_impl.rs +++ b/src/original_impl.rs @@ -511,13 +511,13 @@ impl Menu { true, "Single click to move, Double-click to create something", ), - Menu::instant_text( - 20.0, - HEIGHT_F - 20.0, - 20.0, - true, - "S - save; L - load (can load from the start); R - reset", - ), + //Menu::instant_text( + // 20.0, + // HEIGHT_F - 20.0, + // 20.0, + // true, + // "S - save; L - load (can load from the start); R - reset", + //), ], } } @@ -1094,7 +1094,7 @@ impl Fish { FishState::Idle => { self.swim_time = rand::thread_rng().gen_range(1.1, 2.4); self.swim_timer = self.swim_time; - self.anim_timer = 1.6; + self.anim_timer = 2.8; self.anim_time = 1.6; self.swim_v = 0.0; } @@ -1102,7 +1102,7 @@ impl Fish { self.swim_time = rand::thread_rng().gen_range(1.4, 2.3); self.swim_timer = self.swim_time; self.r = rand::thread_rng().gen_range(0.0, std::f32::consts::PI * 2.0); - self.anim_timer = rand::thread_rng().gen_range(0.6, 1.0); + self.anim_timer = rand::thread_rng().gen_range(1.6, 2.0); self.anim_time = self.anim_timer; self.swim_v = (self.anim_timer / 8.0) as f32; } @@ -1127,7 +1127,7 @@ impl Fish { self.anim_timer = self.anim_time; } - self.pos -= Transform::rotate(self.r) * Vector::new(self.swim_v, 0.0) * dt as f32 * 1000.0; + self.pos -= Transform::rotate(self.r) * Vector::new(self.swim_v, 0.0) * dt as f32 * 200.0; } fn draw(&mut self, i_fish: &str, window: &mut Window, transform: Transform) { @@ -1399,7 +1399,7 @@ impl GameState { Color::from_rgba(0x99, 0xFF, 0x99, 255), 1.0, ); - expl_conv_system.activate(30, 0.2); + expl_conv_system.activate(30, 200.0); self.expl_conv_p_systems.push(expl_conv_system); self.state = 9; self.state_dirty = true; @@ -1425,7 +1425,7 @@ impl GameState { 1.0, ); expl_conv_system - .activate(rng.gen_range(13, 40), rng.gen_range(0.15, 0.3)); + .activate(rng.gen_range(13, 40), rng.gen_range(150.0, 300.0)); self.expl_conv_p_systems.push(expl_conv_system); } else if rand_out < 0.85 { // spawn star From 66fce1031863856bcf50e8d68ac3e64c7c4a6a94 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Tue, 21 Feb 2023 21:27:48 +0900 Subject: [PATCH 23/29] Update README.md --- README.md | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 7345467..f34fe55 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,12 @@ # Disclaimer -The hosted WASM versions of this game still work, but I am not entirely sure if -the security issues with this game apply to the WASM versions. **USE AT YOUR OWN -RISK**. - -This game was created in a manner such that it was tightly coupled with the -`quicksilver` dependency. However, `quicksilver` is no longer (actively) -maintained, and its old dependencies no longer allow this game to run properly -(crashes on native, cannot serve WASM version). +This game has been ported away from quicksilver. A WASM version of the new +version will be made soon. # Entry for LD45 - Start with Nothing -This game is a Rust project using the quicksilver 2D game framework. +This game is a Rust project that originally used the quicksilver 2D game +framework. It now uses Raylib. It can be run locally by invoking `cargo run` in the project directory. From f1bd86d60e318dc51cebe9838982dad96ee16396 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Tue, 21 Feb 2023 21:27:59 +0900 Subject: [PATCH 24/29] Update LICENSE year --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index f9de6c5..b70e9ef 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019 Stephen Seo +Copyright (c) 2019,2023 Stephen Seo Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 09159a1f53258deb070065fe21958b7facf1efef Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Wed, 22 Feb 2023 12:20:14 +0900 Subject: [PATCH 25/29] Work on wasm build --- Cargo.toml | 13 +++++++-- build.rs | 1 + src/agnostic_interface/raylib_impl.rs | 4 ++- src/lib.rs | 38 ++++++++++++++++++++++++++ wasm/.gitignore | 5 ++++ wasm/Makefile | 24 ++++++++++++++++ wasm/emsdk_version | 1 + wasm/include/ld45_lib.h | 8 ++++++ wasm/include/raylib.h | 1 + wasm/lib/libraylib.a | Bin 0 -> 1230140 bytes wasm/src/main.c | 16 +++++++++++ 11 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 src/lib.rs create mode 100644 wasm/.gitignore create mode 100644 wasm/Makefile create mode 100644 wasm/emsdk_version create mode 100644 wasm/include/ld45_lib.h create mode 120000 wasm/include/raylib.h create mode 100644 wasm/lib/libraylib.a create mode 100644 wasm/src/main.c diff --git a/Cargo.toml b/Cargo.toml index a503789..920779b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ name = "ld45_one_and_all" version = "0.1.1" authors = ["Stephen Seo "] -edition = "2018" +edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -16,4 +16,13 @@ bindgen = "0.64" [features] default = [] -no_link_libs = [] +no_link_libs = [] + +[lib] +name = "ld45_lib" +crate-type = ["staticlib"] +required-features = ["no_link_libs"] + +[[bin]] +name = "ld45_bin" +path = "src/main.rs" diff --git a/build.rs b/build.rs index 1ed36cf..e16c200 100644 --- a/build.rs +++ b/build.rs @@ -19,6 +19,7 @@ fn main() { let bindings = bindgen::Builder::default() .header("raylib/raylib.h") .parse_callbacks(Box::new(bindgen::CargoCallbacks)) + .clang_arg("-fvisibility=default") .generate() .expect("Unable to generate bindings"); diff --git a/src/agnostic_interface/raylib_impl.rs b/src/agnostic_interface/raylib_impl.rs index 1e345ba..e0eb388 100644 --- a/src/agnostic_interface/raylib_impl.rs +++ b/src/agnostic_interface/raylib_impl.rs @@ -577,7 +577,9 @@ impl RaylibGame { Self::native_setup(); unsafe { - ffi::InitAudioDevice(); + while !ffi::IsAudioDeviceReady() { + ffi::InitAudioDevice(); + } } let mut self_unboxed = Self { diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..c8d8453 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,38 @@ +use agnostic_interface::raylib_impl::RaylibGame; +use faux_quicksilver::Window; +use original_impl::GameState; + +mod agnostic_interface; +mod faux_quicksilver; +mod original_impl; +mod shaders; + +struct WasmState { + pub window: Window, + pub game_state: GameState, +} + +#[no_mangle] +pub extern "C" fn ld45_initialize() -> *mut ::std::os::raw::c_void { + let game_interface = RaylibGame::new_boxed(800, 600); + let mut window = Window::new(game_interface); + let game_state = GameState::new(&mut window).unwrap(); + + Box::into_raw(Box::new(WasmState { window, game_state })) as *mut ::std::os::raw::c_void +} + +#[no_mangle] +pub extern "C" fn ld45_iterate(context: *mut ::std::os::raw::c_void) { + let state_ptr = context as *mut WasmState; + unsafe { + (*state_ptr).window.update_music().unwrap(); + (*state_ptr) + .game_state + .update(&mut (*state_ptr).window) + .unwrap(); + (*state_ptr) + .game_state + .draw(&mut (*state_ptr).window) + .unwrap(); + } +} diff --git a/wasm/.gitignore b/wasm/.gitignore new file mode 100644 index 0000000..b9cd2ac --- /dev/null +++ b/wasm/.gitignore @@ -0,0 +1,5 @@ +/ld45.html +/ld45.js +/ld45.data +/ld45.wasm +/index.html diff --git a/wasm/Makefile b/wasm/Makefile new file mode 100644 index 0000000..9821613 --- /dev/null +++ b/wasm/Makefile @@ -0,0 +1,24 @@ +CC = source "${HOME}/git/emsdk/emsdk_env.sh" && emcc + +all: ld45.html + +ld45.html: src/main.c ../target/wasm32-unknown-emscripten/release/libld45_lib.a + ${CC} -o ld45.html -s USE_GLFW=3 -Iinclude \ + -Llib -lraylib \ + -L../target/wasm32-unknown-emscripten/debug -lld45_lib \ + -sSAFE_HEAP=1 \ + -sEXPORTED_RUNTIME_METHODS=ccall,cwrap \ + --preload-file ../static src/main.c + ln -sf ld45.html index.html + +../target/wasm32-unknown-emscripten/debug/libld45_lib.a: ../src/lib.rs + cd ..; source "${HOME}/git/emsdk/emsdk_env.sh"; cargo build --lib --target wasm32-unknown-emscripten + +.PHONY: clean + +clean: + rm -f ld45.html + rm -f ld45.js + rm -f ld45.wasm + rm -f ld45.data + rm -f index.html diff --git a/wasm/emsdk_version b/wasm/emsdk_version new file mode 100644 index 0000000..ab6c88e --- /dev/null +++ b/wasm/emsdk_version @@ -0,0 +1 @@ +3.1.28 diff --git a/wasm/include/ld45_lib.h b/wasm/include/ld45_lib.h new file mode 100644 index 0000000..cb87442 --- /dev/null +++ b/wasm/include/ld45_lib.h @@ -0,0 +1,8 @@ +#ifndef LD45_ONE_AND_ALL_LIB_H_ +#define LD45_ONE_AND_ALL_LIB_H_ + +extern void *ld45_initialize(); + +extern void ld45_iterate(void *context); + +#endif diff --git a/wasm/include/raylib.h b/wasm/include/raylib.h new file mode 120000 index 0000000..0ace726 --- /dev/null +++ b/wasm/include/raylib.h @@ -0,0 +1 @@ +../raylib/raylib.h \ No newline at end of file diff --git a/wasm/lib/libraylib.a b/wasm/lib/libraylib.a new file mode 100644 index 0000000000000000000000000000000000000000..bcc4351e98420a49e322cc243b5b63041b8eaf1e GIT binary patch literal 1230140 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 z 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

Nxc<}O6LHiuKs|woZ&^4-MDr%BnB`L4b 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 z z=iC8km^1(e1^MbAABukOdzvfs*0qNz+$~2b(+>yo9~MPU?xD3V9dKyNs^mJrX-%Ij}f{d*}B(i0aGf`K08} z#gqIFVmE71WM6Ikgf zWd^7Wd{(bkN06EQ#>{^?Xygi(oV2N_U-0ZS7MCdoVzn&YZTo54RFRvQHNX#O$4 z#XsqFYy_`Na-dKZbdR)m{35LAaXoNfDe5Dto*cJPzEI**t=SS5zFu@ESfugBJl&N4 zE@;bZ-nUe^9hj?9mJ1Zy$d(An8^M`}jLp+m(3^DAMoXCr@0Q1jeWG}qq--GFO%{pB z#Twv3nqQb02q$&J%XQx;psufG_@zd!hA=t<3K`<10$MRb(O@XiCtV!KGv<%PtyTqgaKB?} zi-tpVUSX{zy5U2%ay4~lMN2BRuYzKz=T%c%qKlrdGFjxcRSiCm&gwp5gypaD6Es7NnmjbgCRQcQBsgH7ge}a{ua`ory%eG` znaEuVTdL?EisaJ`v;o2!kTtfrYs)}d{*ejYIU9*u#+VGsRR94ad?mG7L4HK}>(&@I z7$^h@vcf_wSV)od!jH*Xf)8YJgRS4}MybSQ#Dqm?NLh_v4Jm`{7&h36^(5&;uSU@D zj3kROtJs%8+PcUteYKBT`Jr$N+vF#IC+!mvY>KueZ(ngmQcTY&3_JD7 zP5HmYn_QZQ6?tTbUydiPaDM&brR3u*(2GNPJ@bB)ouMBKB6avFlbX< z5G|>v6j#>eqw&Sm@-wc!5nrrsN^r_32_X71IJfCP@^<)Qe+tGQ`%Y^auBNuwu#KV0 zK-Xv~)#E0P6PlwwoGW!s5tA~Gq`Zoq;XtyvolrVW)=|E$@1uP1d1}RuCt-ReG)N+J zjEM9~of*T-CpROX#^N-PN1IH;?a0+Ny{MR@wDIgvmhG9f)(_JL$$d!3MB2@64A7CN zJgQh=+S~>TZ3V5lh>3wNw#HvR3x2^XC6}p5Pqh35ObTLva3w+T-X4YBlC;wF?je+F z9cHGjOEAWkDd6yiAyd9NOv;5va(PHm*Qdk&Q!8Ro`;^~n8X=XC_9i5q76{qhyQN*% zieFb-mDDIoo4Oq4QZW}?PH;KlFPCx2v2T)~o+ObZ%Iu0&(ZKyFUN8s;_FeR_z__OW zLD~qtZP=sX8Dvod!{3`fn1^Iwu{UGhvH&UKgE&k9nL1~uLABn=uZhb##XrSXAHG;n4 z5cDOw5!bW9T>|-}Ik}n}dbmboxhh%SY3^kpH1-`0)Dl9x26tofM;8LsK1owo+q?d6 z?|R9FGge?31z@^BI>8m+J;RsTXNkS|Y9H|70NNM68K6>Sxjxx zfr9BIqr!sNFu(w^j)9wC8;2pfj=%bTKPtr9F%SZHU)b>&F)!^mvZBr8Ocb zTx96BPR{V4?jO*Y9-->H<_zOEz!=qgzGdhL#F?>iiG=$Ibym3l>Z$c1n_DB>n?*eJ z9+nNe5u<4_yNE8~QWVIXlb(hqY$kmhXQ3_QK=UT8q>czJBd*aIwV1OpfE{xqCgKcM zvgXrgv+~C=AMDwJy&WK(1$aaHxq8r zJ~S%xGR<@r@YOoV_7t~JPyGyEhOO8RM~b7I0ikd+;!SBdhWSsL#Fk-x zPjnXU1u(8K!}PNRkUER^%A$fc31#3X>zulmKn1R%&ZK^pb(ZbzoVK@fxFQJ9ZqShuGgJz2z)J<7qt z(DCrFFE_E5#}DwBa457@w}_?}&@QWi#(rp&u{b|Dpfr|TzF2>@buzws2yVyh$GZ+B z=O>S(s{8!p4zgQ{7%ZAkOe&~>fn_oC^6Arq3*!t(Oml-dkt#ySfq^!cIP^Ox&eDn7 zPoVQ>xHj2SraH@+I&GmqoOOEe{N(5vZaJLg35X;A;9+}U7C>m$zm|`hmilXo`ar@WYS4~}W(o?fch76!HRaIn z&0X*B<@R9+Ygbka4fhqAPE<;+olO{BpF+H~3Q`)&ck;4H0GOdmP3*eb*NKW-t#mh! zD^1Jci|M#r4nJZqz$CO|>>F*jJ;Km=niZN@sWd`_z-Aypj8nUv@cfoEZ3=iHrpsl_ zH86`9j+ua*Uo~-WMQP8(k1I z3y|TwW}0zmh9Fotv(NaEz3PF3c7G?dPa-L6f5Nw)os9MafKjD@!4qg2nfq^3gYMpF-^wY;ST#m&RNGtqelH#*!)aM&^8zew`!TiO}- zHHGXsk)|vzU%}n4krR%HfUB76x;zt(NYtorss#t4so5Q5Iq;-*P@bJiucl9Suh5p~ z>&oy+?#h|@IrEIw?vvdsjn$KnJ66q;+`+!F+I6yfH7s2WHJ}_bdT9$Sw$g#RGu3Ik z1Rcq&{6<(PL`w=m{i8@(v_YvwC`znN70y(Nw9)({1D7%%c`a>oB&^*;lpNC+r7p&C z?G3HBEWbuOAX*>i)Md;Yn+d7?tuX-;l&sP9(M@|V#=zw|v%kap)<>Hcgh!}-yg>1d zuK4t`eW?k1gh3cJ|1>-z#Gg{9Q0lf5cu8N-d>S^uLEk%k(Is zQ1nnfv)BLEsrSrHq6K<50(ZuI>J{cwzs=6E4$Mam6LADA87}cKcy>ceO};&F*r3^^ z9Muav7`ya*?Z^D{;q}pjlb`U{aEXP#>oKv5#O#kQ-r%1vSsxwwxbNt$Wqf=8Me_hp zuH+K|KG8CXXJ<+&Dc~7jZIi+|SBDVTMi8}bj%^S%a5%J3$kKFOIhInnApo!mJkiB7 zCmD;_-cp+lm%6MZG*pIhfT;tQ-$n*-SOr8d{WP3D>tehC+8_D%Qni)5q2Bsjf+vqp z{3bw$x9yI#beCgJZ`Uv94&JtwT4U9u9dHsn6tDTZ&rRM(sr>L-6#6Gv_60nV?-i-r zZlEZ?XDzVicUGR-MT*aMU64UMCpyn2(EW54n<2P({74M%R0c|qM@u)Tr#8&2W+-+!Qo#o-o1R1h{x4s*%YzCTfKTlU=Z zfxm9Xjl#X*dJeY^_yw$;+XW*Pef~`i{Ok zvd!7qcluQUiq|1qXr6EUKpdsQR55R{hqFVT7Tkh@PuUDrkQ?ids}8hH|6-Ws0I=bF zgoc=q{MhYLZrMqvHtOVDX3;z}!gW!tfmNcaz)-Tz!@z+E0dDi)8zyy@l&{AlPJUhz zzXjYuyL_XydczsGdlYEYcd$8N!>~fE2YfR|qF-L#w)Pm9)BG*FL+_4m)2?AX^0VVg z*0HzC^=GMTP7c9JD7a$Lr<%;=_m1|mg|AFNBA@+Hl`Vv&n<)Qhd(8X5LT+3%f7zRU z+*|MKXP4aw-`BW^+Q-yim|B(Vw-GH{)~6 z7cVVr`QyW}NeeY+b(O4%u`L-;jmT9>z{xqk&?HWBDGNvXfDsd8LnUxYSXu-ip22t$ z#&Gv`FkIob4;f>n?trQfiQC@v!#UCVHhbJHd(Z5$ANSxJ@Wv>TaMp7HyWgTt_sw~x z^(X2p*l&87*KQE_kO7_9c&RBi_Ob7$SY>TevX99iER`Qq7dsB7J>*UR~o>V5W#;P|@XkVY)KP6OA`8@10*9@{ckMGpw09pxVggPeab3_GJ@ zqn*baw0$_v4(J6rnlwSvRtESv><0Pvr+U#^U_AmG@rLYedh+bneJRV9Pq;=m`I_Z@y#LuWS2!U)HZ$?OrX6(d|LMwsq(M;INq9!A)zl*n0AaJRVi zDz6!;1y3>USR^I33>kRZ0r`4z$6610K`??wnq&|N{-tSj8l)~OK=mq8Ote~GiplX- zBYRk&9%5EX`nkxj0DG?ERf9;+T>JtHM}aV1Z9C*Jeb@jxu$Fx33hZgTa1t#4(B$_3 z+0yC3fFM4ww$mhkaD&gG=h{J{ETp%$2dP!-wk*&cWHFXU3@J;8{YQY*b@(RL`!j_G zI2)}4FeElZ1W9iwOg`3(-^6ElrfHbUu*7l`dB@I&{rshU-YY8^rn$TE7J$Ixdz8t@?&VD zk^#6EKd9rHC^XL*Z-R>N{88d*p;FV+?t$%5-Y){*zKrf2?O|P|2z*8bic3qMj=qt*1IWx0_<5{NVPrrb1H%M*=fa@U0(<62^=-uSgy;gTQ+J zJw{W^GHNHZ+TfoOp<4KlXFsmC5~dXEgguxJ`#ULWv4kQPC}9YWDeXlz8Bw8|rb2Pc zW#Wc}e7)sGr~Z_90rpP)oH%2ZyiP%aY4~B~)y_2@`0rxAj3)Zfz`-1b7u2AjL!Fl% z*#=t@tiBWqE5~&96y%MsONBwez(r!ouh~{K@ghHM)JFK)$nN$+YjGc}F~66taD zKyh6CMcUIRiOy{%tez# zYs^!FeGlS}Tf>2RgSjUfEPKE6$-^q?w*9s+Os^i?Oo3FF0@6xt~tJi*ByjANMK#GW1FiV zLVhat=g>6Fwj=~il^SJ@!zpIxsZ5Q|&=6wEA0q^6KBNV7H0c}U3TBheZ*T9j(f{NO@Ozg%EC73QkBx4#mO1)tn9Y@)bn;vj5qk!w;O2YV z^0@VX#c81jOH;x4U&7pn=70B~t^T5@_gK6G0CC#IJ+6m#Nc++6^12xwfd_hR+MZ7pV zfF>9O&~5=cdn(BYJdE7t-+!Ov%0BP34qbf_S!G8|?cii1MEOBQ^uW)FdN>FTx1_4m zBkz@K8B=Z;PMAF;>ye%-pS0LcOS*vhmLt~+TvdKg)2|M!MZ+FAXqrDb8a&u@K8R}} zR*0Ym@+Q(>$GMhc-tUgb zuCNF5Gaer%xY!kbPvb|Q}| z2!UWXsOizLp14%V;~p6F#xuu!7oH)Mx<3a75n3Ly|K<08PR~)EY&B3AjwI>%{`R;? zW2CyJ-qGbK-x-&ecW|lhWzsXqz09rrf6m|T=9W8LKlY)%--4ABpO;?Zg6k^3oA+9j zd|9%t2hL7ReNsi^{I+B&`(z)~I20f5ftzxngCAE>pPZ?uMyuz@?0OD-zS{q?9$HYt zpVtRCT<5KI&(f*vZ`28+&^YbuhE#r>Rr!5Or*aNaMNhsXkpR^2WY_;b-h}2y`TX{=wt^+cKQ+ikzF^ z0TU}*Q}!&$KU6@=J_iFbjrC0jtU+sW0vh zUrg8+|5|*JRlhhqqW)0$9=q7YI9TbMzvvMe;KH$fL3EqwshBYg)L-@vOgSub(TwKP zbQ*+0>qo6d)3mze>Y*KJk*xNBWO(3w9+_xWu}$Ee0|sWg388SrhEDa_!+_^aA)TB= zik}07?Taj-E@ncqPJ;gKrM9OoWni`GbEk1JE?#R4OVRpLM{&^`)!huoau7||E}c{)9W9Qyq2ItQ z!#Td^rTd+3Hy%==7lQ%d{y}^fg_gkJ70C-buq||z6$H!M70+Iz7cY?NneTTH|M-pS za;f;24r7#!}y7KHf+yGT%iI~g0AZw%|wga5uF7TEQQ8ukB`)E zf@-6nkzj-J;eK*h!N2xfj7rpw^lXN`@+9XhrNKC+KYf^5AZCUYM-J})wmKDz;HSuf1i)N45Va0mc!5k zv)F^yS+db4zdL1h6rpDo#Zn^tDL9i@0sl>VG3c>wM{Z&hA<`?7TM{-7=o$jmKb8AYZe$fxDk9~h{Vdd;Hu7pL6lSgmenU|Y zf#NYhb_lB^v5R-=_Zke{-Ns<-XeBppwqX_6TmjJ0M!|N2O$6Pl2fN6AN+Zn6L+7P7 z3=qgJ2Xwxx9?BFpiF;u6gNNZdAg zPoCUlgUO)9HpwSMvg6t>BD(G{4olSKsrIQNCECOtp%--o593roDBL|!TZ*JD=9LsUx74WWsEas6mafmnGFYE8y`k3KXcawr8C|fzBbFy!9Cn;` zMS^Fy7+Jo$bD5}p@Oj0<)=re}Z;5z#kpi82wn*gO;Ls1-#N`5-;0Fn=!;bk;)F$t= z*`Mekh2Thg0WNGA+(+;3Q?By6d%8f0>(x^+W%fTzPd`G0&NSOasJp>hpNVNh{b4YY2IWoFRM zG)w=c2qVR-GLlZ9zu&#I+{f=rse^Y*`1gF9-?NliBkh6L2ari-4V;_Y+J|!5prj!Q zY2Kxe);D6@NQH_O09uWf0fqV5+4qhq5R^!3*4rQn8ss6N+*;3GXMGn`A;^u7G=sfX z>EQ>U(0i{TU|ES=ql&5<1yz@atoYn!@mO~(^;MdpdC2r5+BUrnQ>P%<&-T1%y+WR{ z*%P~6Ev?pSLZ4# z?~#kyx368Wf>pp4x#WB}LaVj4 z>o;LhB`NG&VFx71O)tj7RddQeOY}e~sbVaI;i>E{5q5~v#CkK232YOyX*l}>O%xn? zVO+I_;Tvcjt`q4HUtM~5k0hm5?uTa1#!dH%1Nr@vvApd4YM=gUDF8NmUlMc>E31bN zFAXp3|L$2Se6TXTqC<#-4!}^1?aSJ%N`N#vEyjyn6XWI8Iq}Oo@Zw>viAIofErSM|n>oEzM z7f;X~vJI2`ZEl#fVD@BP4zy@9s6E+Vi>q~-Oh&|VA?4ovw>%WN81k7Ta_h_mJGBN6 zPtW(?>iK?_W)YM$vY$xwU~0_UM^Z#~`xtuF+f|_<0>$Xae$nPSD8B62LFIEUyS4Ly zo^Ceu4Msq64rRcb;({BUGk4Z7B@5TqI=u$HYSroBl4!b{qG7wfCzcJ|Z)& zff8BdjXo2jDlTHd=wmo~g`tN^OvcPn;DII3NnkwAK1RMGu$zG?1re zxc|Ro9f65|K>QS*rYT9!&hO#mJYeQHe$w1Sz`C*9z&hb_NDhbys$ZdBg{2!suHgq7 zJllWC)*e-`gr2Kv{w(t|kSjMO8iagyi6x1vT9JsUpc=F6O?rNiq>EzOdgqxoMiLTk z8M7wBCRNxIw@WgMA`R~fWo9IW7nL2p)kZ%H9oDC6#(JSY(I)+61t;C=DXsW-J!_^jO>m8w-pHF!#(>&=q%v{tuG!zdOO9Y4O<+xR; zfSo7?XQ%EV?KC7!NMpzGDx32A*&`OrB1q(Cp3=V<5(^R(_C=hZEMI?FGl1RJUkGn> zl*K`uEopx6D|*%Q;@^1DTlCW?s%if3vx^=`_2RRCH>-}H@S?YlPoR~i`CA{HRrC*u zzV9viJ;mea|LThtow0~u(04c$txgwOhn{d$PUQ(y7q5;Ydi$ge7S>?jH~}QrOib0- z4(U`VBU@Xk=MSgGsu{|mbRBi1`Je325ha`RQ*rS4W;k((=a(y4zeW;JfSk&Ptg=*g zvm5k-hw}fauX?PnjH2_R!z5$LA0W5P5RCntNCy`1;C_2Ru!V}~!F~1sLFFIVta=~P zz_(9)t5TGGnL=s)ZL6LatW;!oYd(vmidNu_w^qJ6z&A9@R{+X~*MCiL@!^5;Lrr5t zBvz-sgyYTVD|`{*qqi3yv9mC=7UurW*bxUO*HKx=w6&;K)!rwHPl-_Vp9=l$A#o-o ziDLx#RL8n>(2brIh@XgLfuv0&V)KpsAB$=ZqpMke8BK}RB zNIaySa@3TJV8oVbFVk5U1$KNC{v1C4l^aSiX8 zvHE-JbJhCxt0vWfkIm|kk_r&?E+o1~+?Tz(!g}|X;+v!M_D<&q%-uQlY=>y@+~o2q zAfLC6{bg^*j+70|-Lpz%FQ``b>3N^TAru=%&c(#;g(1pD?jg{?!Ct zvMya0#yjpG z6!M3A-voiuoWO%tLa`6~j>aAn^oitWP*#bE@7nu95yL9z1r|lmFS`j;Fbzv9K;^laT839~6XP5MhjdbQQVS(R~jlKv`|7ldo<4WNj+L0@gHigKC}o&-r-}_Hrz<*VVYVlZHzbLnda`@GX+grHB>#tkm{)~+$ zDTdNK8hCF?6Z)lC?({QC*Ujs~QawKKrqK8hMOueaG`MMetbEyk#D)6<9T2JsuB_IJ z@GPkf{>8^>$A|8e?MQ~bHj%)3HY=d`D=O8xxV1Qf%&Jo-cv@yX5AK$y^_4H$Ij#oV zB8tBBAqgMzJCgd_cEPVRW~v}K^CZ)HcGu%#U1$ro$L)A|cWQegYE>_YOu4W&sR%|{ zW8g^E7(cSc_^IK855A6IjS|3YWS3^QzoL;(jpp=rI}XzeGy zeLc@u#*t)*H|Y($)wfTR^|H&7eH9<`4d18^ZRnVg~EIYErB20c)XLS@8k#vUqnjKSjis3$e#%D8^ z>!{p(^s~n{-0YLv>M?Q${Yh&On0>kvS4J21(Z^1CEKq@ymhC(DKIOk`Ci0+!IH;pl z-w9fKab8^HA?*KKNYT9CY>o5#ip3>Gh`=xPzdyNLs1Tt!@xXIQ@Ww`9d$b~XZcf1R zIq`2XYD{USB{wg~-eV3Rgusj1a*@FqmmteT06|O!2Vr3}QwFMDCVH_}UvKU{YY}M- z3-NM@rr;h$?cOOkPXocBS2O^FAhazko>~8Vq*%3QP%J&uu2GnkTDo;@?(}7 z?dA`mt@${6^pq9J%Tc902 zAAr!JcI0yc9(In?4laB!JJ;vA%aZ_aE&HHV1Oh#Pkm*4=B4M!EVZEx__3!L~GXZ6f zt}ZZ^eL|&`nm5k=+Ul&31gth74)#7LNTe$+P?&w%J}<~Z%K!pM^bcvhpfL5Bn%DjV zO-hN9dhETIiA~8Ois{`&fy2E8;I@PhK}vsB6u|VTRFHKT0H+4?>%K`F`7Zl=lm3D! zQm+eN8?*&jQABb6?V=vntp}hpdwH`y6PSgLJ#3Si&RkxqpYJi$QszhjsX|!O!h5cq z_NBj?#}-RmtT~wPL@Fs>PgWnQ;MH}4MEqw6k7KEmvF-zT5it& z)`6rOB8X~Vifs*uLZg_H;^g!MPOjPuIa?9H?Rsb^EEP6Fgp_S{Y~+W7_TRsv7UJ4Y ze`T8>PdQLQGX?;0@NVF;Nth)*7z=o_wGCsnUigTP(Nd8SCin#$vc|)J&Uc-Sq>U$< zryoO(iUIsLf6Im`_`$(oIXIuUH-!cu)>|s5A8FbePZ@MtiM$dT+CR@b}8!>lU# zYzzq^X#D?vU8fDG>Ql*SVSk!wh+J{nSezC)W1N1r&ku~YyPO8eo^OB((LHn;SZ#Jdb4a;3)YaiAx zZ?jJtlND-BoMG93(A*gH@i=tc<xXyMSiFUc02+| zwi`7OmfCOy9t;-}8x^|<9J*k%WksLusYvVtaTGZ0O);jMdL5QB3f$%UzAbK4V2+`t zj0>9zyDFQWF2fHs+KA#tlGfmr1(1Xy#$IIDl}QW(yc81l++>7`deyPD907McXy&kN z&2m4kv#8(t6gN2w#{p~Q_;7{$S8(WRJcGWy8xD;;}3F&rf6<%k`!@HPoO9`B)>5luu-F;u}Z zD{gE=`{y_|2L)#Q_P);2g@Z!+!OjqS|FC0HSbCr`acS3>{ROUTf7Ilrsp`k3xeuF(%$kKog|`TSCO90T)6&>5|A_lgjmrx+ zi|(^O(?_s*W*Xjd1wt!LK7sOK$<42co8OWulCI0OE0W$Ir9UtU&GW)bi({9$;Jx|s ze(xqAojPjf|6~Q%0)FHR9Z9Uo)cbX-0XF~KBh*^(N5XGkZRwS&Oaa2jsHV64-2;qU zi8og7#ZsJcK3?EM=2VTXP+AAS&nCywX&@Ef-=Sd!$8PB7v%6>Ka*xEV?O zF&09O0MS0HLiT^O7tj;;ubz0xei>GHV&{AQ%kj|qS_#l&q?>o$+}hcdG)T~JLU)l! zWm#Uw+oYmyWqLGufB1-DL<8TSfM0$Yu;dkT7K%b9c_u5`)6V47MwK84Be??7g(Y|5 zS0T^NxXN+9V={GT0mZLZ#5fK#+X5H2V-2Tj6%3(D1uZZm#v^JN$+L9-I$Bcnjg!`91mor~qeheu%9Xc*-DfNjXi zCeJD}4aX8(WOhS7V!ZVZxl?Dqg*l+H2#uQ8FqZC~0k!0_a!9oMbABKRTQ9PLF4EXD zCov+-d!;;;XyM$~T2zVEfv>^5y2#m}PP(+sLwP7?0~0_!FA_Y3e8)onyMF{oakjSz z+NpfzTJVtnz@8R6?enPhzXckhS>GXo={%`8;2(djKCbTH@2~c)R_%2Usg0uAgO!Ax zI*+7OWeRqvK7y$w3YivE%WQ3ut{bnKP@cI`A2VNMCgzjm4zlgj54{&NL} z7N7sP_#7jv^0}gdWbWkJep&3Ci8*GOL>2KxJEtFgZ0x*r4P65T!+6rQ<~htKY#$J1 zF_J_D0FoxhZgb@ThQbqKO@K@MYf`Y0g-#gpUp!#sbAIu_qhA&I5fFm-+z?dlm1J2Q z==81M@z^N(V$Ek?g{o}+*sW!1RXxKVzZM^bF+R>{Oe=`*8ZiW)NSE$u zIu^qgYD1D~sLR@{qz(J=N@^AwNx_8^Q3Q-bU$02c4x#?t=E!Md+nFMRgl(XqMD`;i z0X?l5jau`D<73o8UkvME0kWvX53f$SwG}5k?cKa-l?)sGGxUGG9%CVYQ_l?b!vmN2 zyglZ9;1c&8tMHHd3V-rgg>UkdT-N-lISSvJ*m9LkV>1toDd3fgfygrjI7H&HPS7Z{ zW?D#<5lC#ZNVP|lVA%C!;McM>LdH=sZmJ{XCw@PEO-T&+m9Q+a)Q{2!ZxTwc{XR{W zOs_25kJ7Int8hO`zcEMQPu9BmkB?L>L*dQ;AND-V$x;jK!5ZdZqY3s7CB!-jpm+ts ziMz^F%kC6n6(|9dFm?QaG7>Ma8>YKwH2NvgIdy6ZUSgtF?((!c4`I@VUrM|EyMEfb2j*2Oa* zQnern$r8Dlbwzelg_@9<$$k(@bZLzbe8;@w=6rv%#%>Nr{tf}iE0PjeguEo0ZJU9l zB-o@io5g6{gjY8B+5SM(F|-723M`RnO*9r}f_kZy@Wz$T-YkU#5ez3$>Ze{UMAL`Q z(9WpKa$yMhQZ8}V7m5P9NhuTm?T4ZdT!mh~OR$;9d$BDz*ciT8=mtNU7hWMOXGl6H zo%%urod%540V$VOSE*qE$y{|6n31J(u$h%t7YuQ-H;0shyJs4bsLH<0ZWpo`=VTQ4N)$)T(S7TcwH^o zQ5{a*XKyVfNhyJhaKli*UwR~oAEiD<5nFQ}ZO4=(?|Fl`z?)GMy1knhZ+Fg7`2CH# z;)1k8s$4x&s6u64&o`qB%s~CSY92MBVsI-5cR!uOT(=iy%q?D0kfIHDAXCDJw~OU> zv}985Rzd29eJlK~At;HG=M(0`%#fr&2es*rs7J9~QR=nKSSh=%5kAHxLv$_0S@U=~ zKjde-+%t(6aYqtAxW*-_`)mQIZUyDRmNFIaXiOkcrP-IHe0q&isJG#(zWI042!u>#JC<}&L@i7ID%QJwmdXc0cbS^L-81{w8yKn z`E9W#I3_`%{D*xKiNc$CqbL=A0KbtxG;qbnO?-Z?6N6cu9{cU+08a)KW8)H{<){kbw397DS!$( z?HA`LygMaEsaC}HRJJqPNLoM@2>OIrK_UE(z{1UMlRvE5F{En6Q5$|FJJL5aPz-5g z<6jqURwV1>qS4{mCQt^#kl|Ht9AYxmm3fdB*{_!U8>8tx3oBEnBT-kTOMDtQ6KafM zTRP0(MLS5Ng)4oKGzS_snQE3+khG*+>XDa-+dFdR^N-BVoRNLej^CO@bo;*r}z8Dz_fj1P-9LV5-hRFf!dOqIZ}DXdBgHq*5=te%(*R26G5 zpG!gk9_yrwsmrOyv4+^kO0aQP!}7`%_)YUfe34)|d6a7TKe0vVd48<&J9l0q0<7hqvA>5Q z=r>8UFnRay2wTq}GF(>E|EeR?B@OWe`2_Bk_oi+-8xQx}LJ2KELld;u$lIG>x3A>L z5=g6&e>y2{nXYUi4R@STm9*u!p$RQ|_^pNCrhZZ6 z+D+vjVYAOAhU^KR&)k;AxfKV(n9qH;%9_}{C`~^YNj?m#bIce<+$=lM;3iy zyP?;{D~wQ-e{(Tf6-|kwfk9LiatYa9++mj}G>4tt!bg<@1(aTTZW| zRHIFTT)eQi%L{886oj3W>S6+R`G`BPDrdVvZ{30-HUx_J=i36RLS zkdmjR4WUF^!c|X2(XYB?Zv2;C?)I~H@>Tu?!}u(o@wKD9g&&)v@U8WvNmf_T%L2)5 zNEogpBLKq|dO4)U=W*q^SUt}hD!d~3;$o#mUXeVoxYH!S+V@rY>cJIRyVz#thQMVg zeg9(i!gY7W9@e3%%^*z4#?{ z^9V8bVbx9r$igGx&yVuPj%@D?TV{X8UJ(0D0uL+}X=`PkU3TF90Vo10Fii)wHBZ$x zJ=HhBJ&-+US|d-atmq3AXc~A->>ueUg>#7k!VsvBf0q*N=_~YjU;|bK2h&Wh5(hg6 z{A#3dz&CqF_@3VxQY3FI&{03R=-59}qJa}1_S2HK%xRhgB*fszVDYG!87UCqA=5WS z;o>`p0ToWDHf;LO^;hFxeD3k+E1zLEgQ{W8nS|FagxQ^o*UO}@ z2=T^-AlkRtJ{qwkmmXr+d`>zpe8#%$Gn%ymfmMyNUKE{OW<^xgw!eR$P190y_{Q&n zfc!ptTFk9|F=^7%LWw4|LAspksXt~-9vg$7CMggdHQ5-K5k0yAOYckOTw1a*2@Ym?Kqgxlj+jz|;Hd%JWuiAw+G{932wSN7Cim7MASL<(c zx-}Xg$lh!XmA8Lvw`_Ibv^~3g3g?G7D~$GXgRDd|^}Sok)nqc{ui}50`3ok6j~7n1 zo&*)*EJy&}D~>DE7ucaLswix@!7gWr5YI{LDXJdAJ6|ITK5@DEvE^!=4W;m8&$BOz zN?DvVfU$ut0f5Tw3;ZnyEE&j5jCTs;RyaWLU3T-dqCJpVHhDgi*;+NiQg?ildS14A zcDG|*x_dXJb&@U=;P`Gmzpt=**cJlJwW)7}0Cfu=EqCcU&>)wEDrzb@y52>WS59cE zbn5S`oifwC1^t9B8&Um(l{hZEFEV_2cms~UWnWer`cvUCjcg?ARR3A&HgcT zu7I3Bwwpd&zoS~>ozYB>FtH#L2XJ`4yZNQGNz(HHz zje)`cUs|JU1~tD`mgea7mDSempVw+_66+A9|CT{D7t_qVDrd)1O=sw5VFO+ksw zB7#;uJCVV|eFm*beV4^#<%ff5Ic%2Za8Z@a&J`7FJITNA!Apvc@7xbh&p-6tDwZCs zWM)B*7URiTG6=_Fl>CG?nqQ&a(D?mqsMh##vJp#dM~xg{wJ@}7d!~;~Qxs8l>bM>G zLpr27mWIj4=JBm!!ZM+SPT^fsTb`~44)Iap!6MdzYTJ^^-lD4Kg>WuO zq@I7?y2)o@)F1j&XfZ$9)A>Lm_56+BvwmO=|`^qh|j3CcF4I!i;-zw1$%=NKC;dN+U?jz@V~s@aQw5 z-b_JvWvXA@;k<$fVP{!DgPjt#;bNz>4zlHSuSOVC94kq73PysGhLXn>r)AepSu4YO z0P@Dbs!Jg*M{+QK`$LA6!D1x8_ZH_MKS>>1gyyv5Dt-%3q{XrER9!wL(WIRzwGi+raxfWC`Z5_A9Ke|;le&Pgb{JRsZ z@&C0NzjXpNl8^j^V0_?hf^p{$kKgMXt~;?BKk#iPiYc zlUU>DZWD|*96dfBL$6Oqa`Y1y6qeoY(fplyT}RhwwXk&T9XLREUcuS5?@=C#;{Q?t zACZwMrhC+1$W=3e3rXa^GJUAl;p`~ZBXqkWIl@YpiZ`hZt=bZnyC#bpc2*O!oNN3G z+uYzdG5fH1?JiIx+e36$_SXvTv;BlMT9Z^~XW6k+f$Ex_A?k(&8P|YoA0RUiKl}MH zxiQo$H~i@+>KAT6=UGAFbl{LL?{Gk7P)%oW(<^b4*uvGIGNZQ$(`}EaE!db=;qc>( z9?JeukePqdI$OZNnJfpf_VK!0Iw_GPi2SljXUw8j7#q-b6sucvzb)6+pvM?ub6gl3 z&);XK5cunR>>B+>>n^M;kvknA2cDVCOtWt4Mp;L+3qsl5pk+xXkH~ba!E+ zhhuXoCoPL#;fn9|Ls|V$364YcNj^bR2=mX73e$DNoH3W(sd=yJPPiuOF=$==se<;m zkRae#;96Sfv0_oaLRSi}0K+(Bbx@{!fPxtE44Prd^y~Q}HY0fZ7Lm_X{{7n}zTfzx z>OA?kIE_iKnr;_{!DpAGS0#rD1s0*+!>J)3>7@Tdq^&5(!!;FNmE3FZ^XZxr26SpK z=DkkbQUqsyFJZ&l1LVtTx`k5zLsHVernDA^uh2n${|MHPj9mz@p3F?!}A$~=h`1v z$Kv67Z4{m}gr*U!gFO{>GRkjBWj5lI0oMH~-u1XGcRlNhiADfaO<$-%V8x*Fz`S+& zu0)yxZ_%LkW`cZwuQi~(@B}Mt&Hb{o^7qd_hU%Z)pN``G6VgMUxXWZV-*pBm> z^y>=_k@y~PK2@_E|BINbr$`OQiMmKw+Lq?S=_O29FG@smcl6;+e=MZVhhSCo2J^6o-!RLZ$)k?>EHQ>pLm&T(#*2< zX^zjN?bqE>^5V;nx`f||BNHa6mw3Fzg>Nb7zRUdCsHY#~TljE{b_JmB^x%-m?!8Vl zB@)()Nw@4!c%;_g=wNF$i}d<=fUW6P0fA4ap7 zzXMd9L-6V;5?~w}(GIt7xJGj$~Qzh;cajKeI z0alRbv#ponY@-#}z!TtLcn6aFZ8l>t!NR=WeMt7$y*=}& ztPf7(;vk4RY0$01?+YifsIkSr*^R8Fsd#m?h(RNl7=y+=eSUa|W(S{RQX5F1f4pQz zhgzoE^Zp?TS}lVd;Q|8W7)N}>#6aacG%mafbu^JM4-feVM@cv5kgBQ)_{Z5)t+N*d zfyy6Mn~x0;PKQf#`P7qQRcDE6V8EIc_<`APoo)^}4r^PjqRcfog`LQ4B>xP@UjVjPwo#`Eq-Qf-RY0C>nDOMWb&hP;~^NfV80)@k249?P{IT z-k}&}pQR>JITXOcorc2BfRDheT@=xrW3%B4Qiq zrq0Mlwrs+CS;->cgeVtUW0M28WU<$uP@_RVMWcW`@iLaPW%B5`#yZASb{X9pW#g}< z1KQgjgHRG|Laz#TMno{2c%yp`D)vNMZFd5i;A4i)oH8i!2q*jeUr>Re5A(qBA#1D&k@+pjjAF0(+v?ys(poxwC1i{%wO@sndGc;)_19WK#I8U~==`;_v z;TooQZDra_xBx#oL$ots$B86*k0qcdgRVT>M8^vb?4xLn7id7M63ls5-`A8p~f(R;)-w-Bp{VsP_77X;GeH3;q z!eaEHvo3wr=_)fV&=;|#>Uy(FU(8fJ8FDJ#o{1B~NnO&`;Smv{h+a zch$Bjc~aYkv_xO2$gQM0;;Al!p~Rv#h(XlW`kyc)u_Q0+^H^kvqRN6nV04^e@;W2K zxFExa@mA)4X%7oBqz3;Lg2UEehc1&7Icl8>X-i9pI@GJ5_%g@UrIW2cNR_c@J4svB zK4NDLn;tBnh##$2q)H-`+yy(Ie#T6vjtp^i-RO)B-sWh2k7{e)SWu8wN9RiTBbhGhaD@v) z{Vo3G7I_UA<-7LrMoKU=V!Cj=@lFl^yK8UjS^pnTH9H7v;nR+DVlO(>7?F)#AQ0yq!Q9)2qEFdj` zl>hh4+`ByipZE8^|M&C%oBO%hduPr$Gjrz5nKNg~6-d%7>@a1ZT9gIs@WZs#G}wxU zhKpuquchOBzA8;%;bxIRZ6!S(t!ZiA6G|wmyKZm_-{wvx1B&o#8I37K8zq_hYO7&HNMKW;V4I2<7Q5 zWXt~BSu>R_C-9jVnA=A?f&nL4pwUck5he0qQl4ot42q$gt$zXA@Qm>RPW8p=IN}1h zeI@p70x=+Jr^@~h1WM;~gB?jyK@PoxGk1;MPoa1c14(1{@4sOC{nq5_u-Lu-PJTslaw7U{iar|S6C9KoqM365)M-8w^K=Ql7 z`V?g_2&uvi;Yr!jlXMcsxwI>|XGs*s-sGboJCOzQcchDPCjrs>NFgjmfGXkd7FgT} z3a2H1Mi3p6K2l(Z(;Gn=3(|a`C?On1)y}}8cYHR7?Iq(0VK$srIYPgq;SpFETlhrc zV}`=_S>B`i2+W%+`~_w+4s5YB`c;5)qyp(84D+~#Tztg@L$t6p4SWd{aZLs`y3$Z5r}*aq@V3`>OOK?AFW^7a*H21ciQ!TJ2W zmpt15--%=Dl(wT?`UPO^lz#vgnfeD{QI!z@F(g^UH+NnTsWhx&_{ISVLhu+m^z~Q6 z1Y&)VC4slS$8c(tUvAO(R9>}kL;F@M>WOR^m<swQSX%W8;-)S`qgrx&ZcFCf9~;@`(G90CE4Q71-DB@NXJ>gJGNCP3IpH$|C&* z=8&YK8Q?-m%fBcUM&Qgqp!HTVTWo~` zeK6DD;VV4&ceC<)bpDG}k_{}-;OjFoKR;bzWj8jBfDNP|ENgLYoGeJJ^MsDD9DurD zR*Hm;Li(f3Lt*G}EDVG$0*RV-nREG^)252$s(S zs%t-0*LC+$9U9g3AK9ya1G{C~*+t63(iJ~YS1otT^odn8)M_TI(EO~^qM-w16EEno zD4NtD4nt!MqNiRdLT59eM+&`Dgb4oBCq?K2P*Ss_#7JhbTe`ECe*6UsUl3#FFZ4~t zQDPKcB&LK^3$+=pgV-{etI$R$X){+yfec6cK(b_Y7{z1Wep2kPOPGqG&0OTQ@vNHl zx;h%q|v;c->~ZHyCye8ivssVpW);_l4|>Z>VO7MLV*Q6ul-? zk9sjWLTsjBHKCtl0^h1Yr@V9KFh`TFps8MPrk|%?sBML24!lS_Ih`}@49?)2aRPI1 z7z@(OUd|{6XB4Bfhr1y6o9+t18O3sd1tVVP%!y#wheU`eTBuA#Vf9Pegq{3_8YDvm zcAQL0aA*vypiR=ik&WeOG(me=G*Ty2PWpPYp)0vAg$(iu5o%)SY*>5ts6Bj2=T4^f zJXNsE;cSO*Fd;qYj3*hSfa-<8MWci(_(^gy^c6Bi9`DUG39c8^O zoWl5_&s6$mom+SqPYZ1Ud7fEsiU6fMLPfaUPRL99%~d@QMog3MryV^+}_vk@jVGg}rRGDQpsd1D>17f!MADcC&`@#k+I#Krmq(EUNC(j<^8_ct0Ua=UC@z(0$pr3Hla9wY0;9CGQw-Ylr z-|NfFg?>2^buACgkRs3&3#&QFGvO&3B(Xn^H}(~Mphouikt8JW(n8;f!;V^yTY)-V zoxY&GAc-CDr3vzMz&S@hI8TTgS0Ua~U(^b~JyW=xfN5Ly%mN@!KB#H&BE3Mb` z$pNs0B-#=2mDbB5s}O)W!{Jgpos_x?QQ<4CTW%eMD0x*>2heT@+U?98Fu?&!25WiR z;)%XQKy;Or)=jsU16EmS)@Wj+jT!mM>AL}$z-q`<=Ju8#;FVQoX(h^xJ!dP; zpspeYlkzO*tkyv>oF-BKwmN^J$Dl@<0y1&F9X(A(J4;R!2o7G8z0PX(=$C#!*JP4 z>^8R@iF_++oe@=RFDtYc*b3)YI$RX|hi|YKx?0jY&T&*sD=v21E6i!;F{1%{yQK9b z>Lt#K0$T}+ZmV#*_!D9`N?IJo;6fVible%ZGjV6(w&2djO=6gXI~VtO+=6Alq>Tj4 zE1h!+P%$oBVFjZfO^FOc!sQoL+AHlNGYW0xwn9h6VxZhAGjpooPP`OeC+B7|&`HPa=IvME#W{EDn;R&d&Eq54O_n}~Fm@#lAB zEu6_kbiy!1eIjehwETQLeFm(&$`ZHTz&apns%3IMN@w{Ij~7_17vk{<@?kMR{*<-0 z)5`5-`ID=1iADq7FR{<@Bz%LSwXs&ZE1ac>yj9WEsg)%p6Dt)hY-ZV2WzL0Vc)Lf@ zx=nW4iX3Hg%_WXGE}Ls{ig~cREuuCkTI6_}qr_fhu5g-502B!Eo}zU%kll+*=Qv9Y z-0u{vPXMkzK((rMl~7G8ZUwiDTf~j!PO8=;$6jo!EU7SCZRHh}U}lbefuoRw>M2$0 z7!X`*rJ}-KT3$g#M**n;IBX@3f7wxfGtsb@ z6~)HJ5-V;tX*O?hd>~n?HWxcx<|39wv%Rdc)b6rXIGkm%W{6**vkdLNqF}DQqJV?A zqlcLtZgZKl!dx-WWd~Q?wqiR==7>p~cYet@%8H$4m%YN}urIKcw2%^7d$F_S)b_N| zy5}!;g9m1dt8kv90wN7&r%-`^ZliTDn{y$zwlbqmPq)$J$!K4eGb}PcKX-JB*{lo8 zvM^2g2b05F!Zdj*sm$BMh=%3jOMSrZV_{Qsr%m;uJ{6`#g)FsCHBg>D2-A|mQO-ri zPmJ)JnN$FsNsh<|yxof_%&;aW#;tgh`=hij%;gWZ=C`Fp})c~I3y z4|WfufJei%FkRO0_Ds0e2cE5lO2juiZo_F5Ox0VR&| z0>&P@yPz@|5vvhVp6@CQ!g#Db>zMs8-0?|3*%B&dbOK^N3Khe;)q^2oidoEQpPZE! zmKGGdY^8QLh~3&RLb*1;idWE zui>zAuIl)g(qZM?_Lp!tZ~o|bJ}mI#+S*Q9U$9_~V}7NrsG!{CEVR4b1%4o}cGCI) zq@=t!J~Y7IPFimc5IX*MPGDY(1a9ig2ml~7frokgoR;EW>#X%H*W3FPTluugV1fRs zvlfLsy35hQv98h;I;n=v+E6Nsqs(q|6}Y%=u(tsGaD+CvoGUcg&m%MD+1z?AJb|Rz z;~|~9BD6uETV$(XJu6foFqlz`eAso%ku~#QBed|TPP5(Ra=L(cGD7R18$F(|>$+&2 zCzYZ5bQGCwuDKBKGEy(AyJ!(cu(Mq6%Mrf5i`Id7;w(0o+Dn}-G8kXzqP5qTr{GhFMVNU>VxeMe7MA>8x}W+Ra5yJGTJriyX|tJmMQ`D8iCQ;1ZOH-kCPqwVMQU%H^so=gR!UZdx}FQ!C4S(>RDUJW&Qm9cAW9HfA{sQrR%QY(+&# zo;Z19cW|<##6H(nVs_i@G$LEw9Y8K8>_Bt5qnvoTuDceVgSycNXHRt3I(q5_!hRJI zdZjz(ql0>Rk||dGySi(AzzZl@w{0$pT@1-^gU_(77cN({+{EpE1w&&@`%N4EZp~0qCnewEp=R zgJL-5k#{phx6D~K(#^sFgyT^9=Gfh^0hn!TFbucdvYHk6f zv8UEsFD-GNNv|)7yLxGzp?At)3{(4sbl8cXkN46dEPA^v9cJm}v&=H5e?xlsHHs|qC<-uNBcMRb8U;)DqGy09Wx-{1J(z<%%3T+r#LpF)Vt-ZDG zQ<(lS8&ZwIJ-2Zm?yYsxjXz?oZ?RtKt@YNMT*zX7(p&45KhFm1vD8@<%#|a(Nob5w z5wdZrx7L;f(-@dl_t83Fe9YKctdEOt>!WoyM4AH<(=LKQPQjhdz_NGX!zZZs)H;U#3dOXsX5E+WW zFmFX_J(5Slonf9?Mot$rXHrme?bPRd6RCBNPhzq8fpNzpwV|UELd2P)XE^50tAK3h z(FnAN%*cECYTd_-4grj~jeWH~dfcSk++6c`jMLeOHqYr`-PwD6wJ^OB0KUJk){{or zG}NZyHx0WL{T3{BeYG(Iq9KAb_C}XG#Zq9IQII<|$2?>Rx{3;0$#`Zbq8XBbgVJW0 znW6hsKdryfFLPy%PM<6xU(@paep)2FXTn6>aHI$q;D%Sj`)4`aPfIRm{tZ3^nr<(K zf2PvqMlS(}O<;^01Efi1JWD9sy8g^Ku#w}XU=ABYAs59Vaj5SOM}|qO|Gff-gftL=n;pr$As9hEX0M(KDx7F1AdX zY{_Q6j9Uk4ap$5NEXuD9)JC5Ri;ReZ3a7UXpcH?cM{3Mdgv=Mfs{~I2upStsjXPIr zgvDD5D%P7O86;nvCwhs!Y;MK8AoSIPwa80R!~ekjPu#O`Uxxc~+}vZgaj-VN#r(M| zz`jzyYRP9oq3h$+;8yCxLo2XJtskQG=aJL7@(NYeJBPGVX*%gpm3Df_xw8~pX^#zU zrPB1&TB)@C=ZW4zrLB$DI$ePZVt=fb@ML)!p#?@DLV5LVjn;Z{S<^je{H1`8hWAEm zy->MiWESXcm9;b7gLV`oXX_+6JxZv0nAXW=Bt-oT{aKbHbPj(OL{FyH4b!@Y))6lZ z)4C&ReN?TtZav-iL8~x`);@&7fM9>#6n;f04Bddx280#|h2An;>je8G0Cp`xF_jY# z`ZPivL7`g_dZkY&E57CZ;aU&JWN1fwncZbAak^nkqfZ;1m8JbaKpgVNG-O|lS&~_E9_(o)6_r;S=`8u zF)84-mD$N%ye3u~)(Q@DcIa6m@NKPvSMmuTK9nZ#Ut%>m9g}I6-|%1^iHD=~Fc1&N z@sL9yr|5w~>hX|EAq{vKPY=!XKv7FaY4QXLxt<;ppe_}kckO9%ZgE& zL}{+VFS&E>z%Nbz-G$#V_`Msy3HZGiztk@7!!P+hAHXkGCg;}@2wi$20ON2w}Jr ztP{z`WbjG)vkC9X`ZK}A$61jNK|sw2@uT^3J9-8(g?FH5Ak%XvdImB*N8lc<<94NI z9k)9@>$pAXS;y^7&pK`-p2z68{peZ8HRIXu&r%zYPqzzK3HGc4;h(iLguLntvnFI& zt22ePb;;F<)uY#q5=PD*E=1Q3UN`Xm0k!>wetD6#y|a4l?or)6uA9(xf5h(2yF2ag zD0GbOFuVP_c89erZB1LDZF%_Nuz6ue+f=vd+Ge9E&vZgvr%qM{^%bQ;Nl@zKTKQ)A zQaM^aBkh*fV|)5#Qi{}DY7qB}JH@BP)!2|ZPs|sy#8|Pf*j{WBjtbukp9${@uL~~- zPYUaVyM)_?8-;6yMZ$c_zJTltGhyjpC``bFF|sct3yH#L0ofOjePOULP#7Q}`$DA9 zN9ZN=6uJw@zR(4X?hM9vL`Ag6)lSfGwH3l~h2d(03uCJ>Y!ShjScrk;@EEO~3v4v{ zJFLJNqjmMs(M7I;g|-DuKQBwrdKS6x##M8G&A2W>8^*?7G#@mnEPHVUe1{nr9b95t zFfwBfy-vscKKe!G+IuHK8_oh}I4^NwPH)CMhkFt%eeSk_s!SL?E@52K*wNz>XOhex zPtbbv#1|5{kLg&ze08@bwirK$yho2EQmK<-$54ZQHW9AeDS2ZsJYhDTK9-@}vQV-j zs2Bj3-yHax1AlYiZw~z5&jHKsj|FXzWoFK#X(?v!v@AJ#_4T;A zrwk*%69A2A4Yb@?|Ld8VUiXQh4Glu!-o;?(w*fsY2wL~pc~|?EIu`Na_E8_|`joXd z<5=2TSx7Ub#aMbxOIz;RgOXykBOIgIe1WmC2-34wqs-^hcPhrs>;*!_dB^_JqPn3^w88h+!}7f{tZ;PMuz0Z8%$$QhIpd_y z>ZGx-5i=3Ay8x?y&2uW}x<|U~#B*qZxsHl?m2)tWQ925=Fi(+4zt}b6L(T7zlm6&y zp6g<}y@;0LFv|McBtxlz&MaHS<(wR);72FK3n%^XK2F+-wZ|@6H)D=29A+LJ7oR+G zblm9CSYuy`HC*|&vI<+N&E>F}qqFp!4+}w458|XxgY?Y*aRC|Cmg@2SZv?G3M8qrC z#BploSaL=HKLWr!u*i<7K-!H`Fn+paN^XG_O?3v(tTHK<+i#*gnK}Z`GLh)bXEu7wT+TY_n&QCos)}v+6iWs92`D;&*S-D@(M);wH z)+#z3V7vy5SY6%m1u*7vCzeBE!;i6Ak8FV$u3NFY1M|n0BS4xE0?9l3S7e6=A0`48 zj+S8EXayQ3+af|s=g5YEEn>#xJl~CWK+uu`yRq|C>W6{c-w!#Iw!ZOu50uq~b#ZL% zvl$CdnSP;skOi|IP)h8gQanD1M>Q7noOs@V=b`yCrsrCw=<0nu7A_lIOyIi3&j20c zR|Qil-6VK~<7E&m3!1xSDDUB9BQzSbB^_+ew^bxL8_-(fDX;H`>;1P(a6LkkG1aK zih^wrW_o-AT#JG0ZB&$ynJu5wB|OH=CzAZDnj0A;OsjrGT^n>}V$&=$f;a^ola;sF zg)Rk36ew>1CCNbX-vY>Hz}T92w$h$0GH~Nv&kT@H0(rQBtT%8HS{3(>H%7YC-J?+Mus z%s8(Id503*VkAQYBMh=)qXxU9V$qwhy_SChE&e>wO59N}o;lvbzX;leUOd_%Osfhn zn3i2I;~#nGd~>16r(1Ke3S_EfLhkf}Jp3=nvCOa(WX~Kw9syIQ<>Z>damosHe7}R@ zIoJ1j)?5|v0%4mYbzRg39y^dpW_{E>p{Xe0~B@KBIbHD6rL29q$0_uQP$KXeA~r{q4LY8LM{ep(J@T z(9gLZmDK@JKzfIOFeFG`(R66(GjO~7-~>1CSg6^B3gDD$5fGT2qm%yaOWX_UN-Y|fqBCT;lEpyjJyOb z5`Q1W&LbO)t*oS;Y&4%ACR>u}kGbh23{Ji6@xv&BO@faAGZ5y7qu7BHGcb0H)%U^& ziN>FRr0u8ND_T(CEQ5jI#RJ1`Jw?q!_wD(05{P^lk-q5E>p^zV!mvB4vK$bv17d)V z&d$`JqXc3NZxb!i9Gyt(qP_!Mln2i6zlH!@avH}@lesg4ACeH5rF#(XlO?iX_;CtY zMq9x)XTAuC9@OAzm1Ph|-bXC$w}pye2Q;wK6fCsQVa6kJ`Xc~#j=S3ID8{Dlg;o?D79{ z%%L9Cp@gfa;{l>!_BE+y&wDJdS2x0EUG5uB=bl`p*E%ALE6donwrCDdq{%RfUVu@y zL$7g0eG92Y_23-CTxoFG02jrSHB{i{ilvqOWHd&arq9^5qWPn?C$0n6nr%&Gb_#+EzFqlXc%aQcKDAV8)ji9%QiEiMHvbmzgO;cbQ=^OaG^}BshCXX(g|o77 z9-C+y8e`^fSbt8>I7FfFs-bA9*9@Z?^DQz__pK6=6SPs@L=i!a6B`G-D0-fKnHK;qP9br5J*l3d#7$3tQbO-PC}Ac~xHcBbG)n<=RPj99XQOYK|~eVZ*m z)XJB2I5(o)%R4Vm8C7Q?+ma7*rOpNRTsi^E*gz5O1ᄮVy|T;Zy;Q$wITn7e;D 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%0Dng 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 SfBL(x|A^N9{=2{bv;PlcoA-|Z literal 0 HcmV?d00001 diff --git a/wasm/src/main.c b/wasm/src/main.c new file mode 100644 index 0000000..56be6a8 --- /dev/null +++ b/wasm/src/main.c @@ -0,0 +1,16 @@ +#include +#include + +#include + +void main_loop(void *ud) { + ld45_iterate(ud); +} + +int main(void) { + void *ld45_context = ld45_initialize(); + + emscripten_set_main_loop_arg(main_loop, ld45_context, 0, 1); + + return 0; +} From 9f602ba465c93fcea65c11f7ee43fa671a4a0c7f Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Wed, 22 Feb 2023 13:56:31 +0900 Subject: [PATCH 26/29] Fix wasm build (normal build is broken) --- src/lib.rs | 28 +++++++++++++++++++--------- wasm/Makefile | 17 +++++++++++++---- wasm/include/raylib.h | 2 +- wasm/lib/libraylib.a | Bin 1230140 -> 1230606 bytes wasm/src/main.c | 2 ++ 5 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index c8d8453..0331a45 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,17 +1,27 @@ -use agnostic_interface::raylib_impl::RaylibGame; -use faux_quicksilver::Window; -use original_impl::GameState; - mod agnostic_interface; mod faux_quicksilver; mod original_impl; mod shaders; +use agnostic_interface::raylib_impl::RaylibGame; +use faux_quicksilver::Window; +use original_impl::GameState; + struct WasmState { pub window: Window, pub game_state: GameState, } +impl WasmState { + pub fn get_window_mut(&mut self) -> &mut Window { + &mut self.window + } + + pub fn get_state_mut(&mut self) -> &mut GameState { + &mut self.game_state + } +} + #[no_mangle] pub extern "C" fn ld45_initialize() -> *mut ::std::os::raw::c_void { let game_interface = RaylibGame::new_boxed(800, 600); @@ -25,14 +35,14 @@ pub extern "C" fn ld45_initialize() -> *mut ::std::os::raw::c_void { pub extern "C" fn ld45_iterate(context: *mut ::std::os::raw::c_void) { let state_ptr = context as *mut WasmState; unsafe { - (*state_ptr).window.update_music().unwrap(); + (*state_ptr).get_window_mut().update_music().unwrap(); (*state_ptr) - .game_state - .update(&mut (*state_ptr).window) + .get_state_mut() + .update(&mut (*state_ptr).get_window_mut()) .unwrap(); (*state_ptr) - .game_state - .draw(&mut (*state_ptr).window) + .get_state_mut() + .draw(&mut (*state_ptr).get_window_mut()) .unwrap(); } } diff --git a/wasm/Makefile b/wasm/Makefile index 9821613..cffb398 100644 --- a/wasm/Makefile +++ b/wasm/Makefile @@ -5,14 +5,22 @@ all: ld45.html ld45.html: src/main.c ../target/wasm32-unknown-emscripten/release/libld45_lib.a ${CC} -o ld45.html -s USE_GLFW=3 -Iinclude \ -Llib -lraylib \ - -L../target/wasm32-unknown-emscripten/debug -lld45_lib \ - -sSAFE_HEAP=1 \ + -L../target/wasm32-unknown-emscripten/release -lld45_lib \ + -sTOTAL_MEMORY=1024MB \ + -sALLOW_MEMORY_GROWTH=1 \ + -O2 \ + -sEXPORTED_FUNCTIONS="['_malloc', '_main']" \ -sEXPORTED_RUNTIME_METHODS=ccall,cwrap \ +-fsanitize=address \ +-sWARN_UNALIGNED=1 \ --preload-file ../static src/main.c ln -sf ld45.html index.html -../target/wasm32-unknown-emscripten/debug/libld45_lib.a: ../src/lib.rs - cd ..; source "${HOME}/git/emsdk/emsdk_env.sh"; cargo build --lib --target wasm32-unknown-emscripten +#-fsanitize=address \ +#-sWARN_UNALIGNED=1 \ + +../target/wasm32-unknown-emscripten/release/libld45_lib.a: ../src/lib.rs + cd ..; source "${HOME}/git/emsdk/emsdk_env.sh"; cargo build --lib --release --target wasm32-unknown-emscripten .PHONY: clean @@ -22,3 +30,4 @@ clean: rm -f ld45.wasm rm -f ld45.data rm -f index.html + cd ..; cargo clean diff --git a/wasm/include/raylib.h b/wasm/include/raylib.h index 0ace726..187d613 120000 --- a/wasm/include/raylib.h +++ b/wasm/include/raylib.h @@ -1 +1 @@ -../raylib/raylib.h \ No newline at end of file +../../raylib/raylib.h \ No newline at end of file diff --git a/wasm/lib/libraylib.a b/wasm/lib/libraylib.a index bcc4351e98420a49e322cc243b5b63041b8eaf1e..09e9745882b4ced2a26017f049c3b92b35f1c8ce 100644 GIT binary patch delta 137911 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 z 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 delta 137215 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

B#$Qfq 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 +#include + void main_loop(void *ud) { ld45_iterate(ud); } From f7a635ba7f33e699fac05f1c58f5568494046cf4 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Wed, 22 Feb 2023 14:21:50 +0900 Subject: [PATCH 27/29] Fix native build --- Cargo.lock | 8 ++++---- Cargo.toml | 10 +++------- build.rs | 10 +--------- src/bin.rs | 17 +++++++++++++++++ src/lib.rs | 4 ++-- src/main.rs | 31 ------------------------------- 6 files changed, 27 insertions(+), 53 deletions(-) create mode 100644 src/bin.rs delete mode 100644 src/main.rs diff --git a/Cargo.lock b/Cargo.lock index 91bff41..712ae33 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -247,18 +247,18 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "serde" -version = "1.0.137" +version = "1.0.152" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" +checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.137" +version = "1.0.152" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" +checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 920779b..aeb771b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,15 +14,11 @@ serde = { version = "1.0.101", features = ["derive"] } [build-dependencies] bindgen = "0.64" -[features] -default = [] -no_link_libs = [] - [lib] name = "ld45_lib" -crate-type = ["staticlib"] -required-features = ["no_link_libs"] +path = "src/lib.rs" +crate-type = ["rlib", "staticlib"] [[bin]] name = "ld45_bin" -path = "src/main.rs" +path = "src/bin.rs" diff --git a/build.rs b/build.rs index e16c200..1bb9aed 100644 --- a/build.rs +++ b/build.rs @@ -3,17 +3,9 @@ extern crate bindgen; use std::env; use std::path::PathBuf; -#[cfg(not(feature = "no_link_libs"))] -fn linking_libs() { +fn main() { println!("cargo:rustc-link-lib=raylib"); println!("cargo:rustc-link-lib=OpenGL"); -} - -#[cfg(feature = "no_link_libs")] -fn linking_libs() {} - -fn main() { - linking_libs(); println!("cargo:rerun-if-changed=raylib/raylib.h"); let bindings = bindgen::Builder::default() diff --git a/src/bin.rs b/src/bin.rs new file mode 100644 index 0000000..cdbbb6f --- /dev/null +++ b/src/bin.rs @@ -0,0 +1,17 @@ +use ld45_lib::agnostic_interface; + +fn will_close() -> bool { + unsafe { agnostic_interface::raylib_impl::ffi::WindowShouldClose() } +} + +fn main() { + let state_ptr = ld45_lib::ld45_initialize(); + + while !will_close() { + ld45_lib::ld45_iterate(state_ptr); + } + + unsafe { + drop(Box::from_raw(state_ptr as *mut ld45_lib::WasmState)); + } +} diff --git a/src/lib.rs b/src/lib.rs index 0331a45..7e6484f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,4 @@ -mod agnostic_interface; +pub mod agnostic_interface; mod faux_quicksilver; mod original_impl; mod shaders; @@ -7,7 +7,7 @@ use agnostic_interface::raylib_impl::RaylibGame; use faux_quicksilver::Window; use original_impl::GameState; -struct WasmState { +pub struct WasmState { pub window: Window, pub game_state: GameState, } diff --git a/src/main.rs b/src/main.rs deleted file mode 100644 index 6241b62..0000000 --- a/src/main.rs +++ /dev/null @@ -1,31 +0,0 @@ -use agnostic_interface::raylib_impl::RaylibGame; -use faux_quicksilver::Window; -use original_impl::GameState; - -mod agnostic_interface; -mod faux_quicksilver; -mod original_impl; -mod shaders; - -fn will_close() -> bool { - unsafe { agnostic_interface::raylib_impl::ffi::WindowShouldClose() } -} - -fn main() { - // TODO - //run::( - // "One And All - a Ludum Dare 45 compo entry", - // Vector::new(800, 600), - // Settings::default(), - //); - - let game_interface = RaylibGame::new_boxed(800, 600); - let mut window = Window::new(game_interface); - let mut game_state = GameState::new(&mut window).unwrap(); - - while !will_close() { - window.update_music().unwrap(); - game_state.update(&mut window).unwrap(); - game_state.draw(&mut window).unwrap(); - } -} From 1fa6e1c8b24d0e8b2486dbb80f788202edd10714 Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Wed, 22 Feb 2023 14:22:28 +0900 Subject: [PATCH 28/29] Update note of emsdk version --- wasm/emsdk_version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wasm/emsdk_version b/wasm/emsdk_version index ab6c88e..381c34a 100644 --- a/wasm/emsdk_version +++ b/wasm/emsdk_version @@ -1 +1 @@ -3.1.28 +3.1.32 From 6d95f5b00edb4803ad18214aa690b170965e24fa Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Wed, 22 Feb 2023 14:28:32 +0900 Subject: [PATCH 29/29] Modify wasm Makefile --- wasm/Makefile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/wasm/Makefile b/wasm/Makefile index cffb398..743349b 100644 --- a/wasm/Makefile +++ b/wasm/Makefile @@ -9,10 +9,9 @@ ld45.html: src/main.c ../target/wasm32-unknown-emscripten/release/libld45_lib.a -sTOTAL_MEMORY=1024MB \ -sALLOW_MEMORY_GROWTH=1 \ -O2 \ +-fsanitize=address \ -sEXPORTED_FUNCTIONS="['_malloc', '_main']" \ -sEXPORTED_RUNTIME_METHODS=ccall,cwrap \ --fsanitize=address \ --sWARN_UNALIGNED=1 \ --preload-file ../static src/main.c ln -sf ld45.html index.html