This example computes coordinates for Dragon Curve in native code and then draws it on canvas in JS.
dragon-curve.c— source file for native module. It uses memory provided by caller.dragon-curve.wasm— compiled native module, ready to use.dragon-curve.js— runtime autogenerated by Emscripten. Contains functions for memory handling (mallocandfree)dragon-curve-wrapper.js— example of JS wrapper function that hides implementation details and allocates memoryindex.html— example of using Wasm from browser
Compile:
docker run --rm -v $(pwd):$(pwd) -u $(id -u):$(id -g) -w $(pwd) zloymult/wasm-ttde \
clang --target=wasm32 -O3 -nostdlib -Wl,--no-entry -Wl,--export-all -o dragon-curve.wasm dragon-curve.cOptimize with wasm-opt
docker run --rm -v $(pwd):$(pwd) -u $(id -u):$(id -g) -w $(pwd) zloymult/wasm-ttde \
wasm-opt -Os dragon-curve.wasm -o dragon-curve-opt.wasmObject-dump
docker run --rm -v $(pwd):$(pwd) -u $(id -u):$(id -g) -w $(pwd) zloymult/wasm-ttde \
wasm-objdump dragon-curve-opt.wasm -swasm-to-wat
docker run --rm -v $(pwd):$(pwd) -u $(id -u):$(id -g) -w $(pwd) zloymult/wasm-ttde \
wasm2wat dragon-curve-opt.wasmTo build Wasm file and JS runtime
docker run --rm -v $(pwd):$(pwd) -w $(pwd) zloymult/wasm-ttde \
emcc dragon-curve.c -Os -o dragon-curve-em.js \
-s EXPORTED_FUNCTIONS='["_dragonCurve", "_malloc", "_free"]' \
-s EXPORTED_RUNTIME_METHODS='["ccall"]' \
-s MODULARIZE=1Install wasm-pack https://rustwasm.github.io/wasm-pack/installer
cd rust-example
wasm-pack build --release --target web-
Run web server in this directory:
# If you have ruby installed ruby -run -e httpd . -p 8000 # Or if you have python3 python -m http.server
or via docker
docker run --rm -v $(pwd):$(pwd) -w $(pwd) -p 8000:8000 all-wasm python -m http.server -
Open http://localhost:8000/ in your browser.
A simple curve that could be generated as a sequence of left/right turns
docker run --rm -v $(pwd):$(pwd) -u $(id -u):$(id -g) -w $(pwd) zloymult/wasm-ttde \
python -m http.server