-
-
Save nobbele/0d932a993786ed081632254fb6b01e25 to your computer and use it in GitHub Desktop.
Compatibility shim for combining macroquad with wasm-bindgen.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
set -e | |
HELP_STRING=$(cat <<- END | |
usage: build_wasm.sh | |
Build script for combining a Macroquad project with wasm-bindgen, | |
allowing integration with the greater wasm-ecosystem. | |
example: ./build_wasm.sh | |
This'll go through the following steps: | |
1. Build as target 'wasm32-unknown-unknown'. | |
2. Create the directory 'dist' if it doesn't already exist. | |
3. Run wasm-bindgen with output into the 'dist' directory. | |
4. Apply patches to the output js file (detailed here: https://github.com/not-fl3/macroquad/issues/212#issuecomment-835276147). | |
5. Generate coresponding 'index.html' file. | |
Author: Tom Solberg <me@sbg.dev> | |
Edit: Nik codes <nik.code.things@gmail.com> | |
Edit: Nobbele <realnobbele@gmail.com> | |
Version: 0.2 | |
END | |
) | |
die () { | |
echo >&2 "Error: $@" | |
echo >&2 | |
echo >&2 "$HELP_STRING" | |
exit 1 | |
} | |
# Parse primary commands | |
while [[ $# -gt 0 ]] | |
do | |
key="$1" | |
case $key in | |
--release) | |
RELEASE=yes | |
shift | |
;; | |
-h|--help) | |
echo "$HELP_STRING" | |
exit 0 | |
;; | |
*) | |
POSITIONAL+=("$1") | |
shift | |
;; | |
esac | |
done | |
# Restore positionals | |
set -- "${POSITIONAL[@]}" | |
PROJECT_NAME="default-project-name" | |
HTML=$(cat <<- END | |
<html lang="en"> | |
<head> | |
<meta charset="utf-8"> | |
<title>${PROJECT_NAME}</title> | |
<style> | |
html, | |
body, | |
canvas { | |
margin: 0px; | |
padding: 0px; | |
width: 100%; | |
height: 100%; | |
overflow: hidden; | |
position: absolute; | |
z-index: 0; | |
} | |
</style> | |
</head> | |
<body style="margin: 0; padding: 0; height: 100vh; width: 100vw;"> | |
<canvas id="glcanvas" tabindex='1' hidden></canvas> | |
<script src="https://not-fl3.github.io/miniquad-samples/mq_js_bundle.js"></script> | |
<script type="module"> | |
import init, { set_wasm } from "./${PROJECT_NAME}.js"; | |
async function impl_run() { | |
let wbg = await init(); | |
miniquad_add_plugin({ | |
register_plugin: (a) => (a.wbg = wbg), | |
on_init: () => set_wasm(wasm_exports), | |
version: "0.0.1", | |
name: "wbg", | |
}); | |
load("./${PROJECT_NAME}_bg.wasm"); | |
} | |
window.run = function() { | |
document.getElementById("run-container").remove(); | |
document.getElementById("glcanvas").removeAttribute("hidden"); | |
document.getElementById("glcanvas").focus(); | |
impl_run(); | |
} | |
</script> | |
<div id="run-container" style="display: flex; justify-content: center; align-items: center; height: 100%; flex-direction: column;"> | |
<p>Game can't play audio unless a button has been clicked.</p> | |
<button onclick="run()">Run Game</button> | |
</div> | |
</body> | |
</html> | |
END | |
) | |
# Build | |
cargo build --target wasm32-unknown-unknown | |
# Generate bindgen outputs | |
mkdir -p dist | |
wasm-bindgen target/wasm32-unknown-unknown/debug/$PROJECT_NAME.wasm --out-dir dist --target web --no-typescript | |
# Shim to tie the thing together | |
sed -i "s/import \* as __wbg_star0 from 'env';//" dist/$PROJECT_NAME.js | |
sed -i "s/let wasm;/let wasm; export const set_wasm = (w) => wasm = w;/" dist/$PROJECT_NAME.js | |
sed -i "s/imports\['env'\] = __wbg_star0;/return imports.wbg\;/" dist/$PROJECT_NAME.js | |
sed -i "s/const imports = getImports();/return getImports();/" dist/$PROJECT_NAME.js | |
# Create index from the HTML variable | |
echo "$HTML" > dist/index.html |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
this seems like it might potentially be wrecked again (new wasm-bindgen changes perhaps?), getting some interesting errors like this:
TypeError: import object field 'wbg' is not an Object
(with macroquad 0.4.4, maybe i should just try using an older version)
i'll dig a little and see if i can figure it out 👁️
right, that particular issue seems to be related to me trying to use
ewebsock
together with this and macroquad, and if i remove that i end up with...TypeError: import object field 'env' is not an Object
instead!.. figured it out,
getImports
has become__wbg_get_imports
(made a fork with the change)