- ra3.webgl: a Web peer of Vulkan/Direct3D (SDL3 canvas + GLES3/WebGL2), with 2D blit and the GPU terrain raymarch; GLSL ES shaders; null fallback off Emscripten. backend::webgl + default_backend() (webgl under Emscripten). - Emscripten toolchain + Dockerfile.wasm + scripts/build-wasm.sh; import std, global -fexceptions, and Asyncify so the blocking frame loop yields to the browser (display::sleep_frame calls emscripten_sleep). - apps/web/shell.html + apps/web/serve.py (Range-capable dev server). - Assets: browsers forbid synchronous on-demand reads on the main thread (and FS.createLazyFile / the WasmFS fetch backend are worker-only; SDL3's Emscripten backend is main-thread DOM only, so the engine cannot run in a worker). The wasm build therefore preloads a compact per-map set via OPENRA3_WEB_ASSETS. - New openra3 textures --map ID lists the loose terrain TGAs a map resolves to (terrain::resolve_texture_files, shared with load_textures_from_dir). - Fixes: webgl heightmap used GL_R16 = 0x8229 (that is R8) -> upload rejected, terrain flattened to water; now 0x822A. Logger uses a stdout console sink on the web (stderr maps to console.error); a GL error check logs bad uploads. - CI: wasm image + build jobs.
32 lines
1.3 KiB
Bash
32 lines
1.3 KiB
Bash
#!/usr/bin/env bash
|
|
# Build the WebAssembly target (openra3.html/.js/.wasm) with the Emscripten image.
|
|
#
|
|
# Browsers forbid synchronous on-demand file reads on the main thread, so assets
|
|
# are preloaded into the module's filesystem. Prefer a compact, per-map set: one
|
|
# map plus the tiles it uses:
|
|
#
|
|
# OPENRA3_WEB_ASSETS="$(mktemp -d)" \
|
|
# openra3 textures --map map_mp_2_feasel1 # copy these under the set's terrain/
|
|
#
|
|
# then point OPENRA3_WEB_ASSETS at that directory.
|
|
set -euo pipefail
|
|
|
|
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
IMAGE="${OPENRA3_WASM_IMAGE:-openra3-wasm:local}"
|
|
BUILD_DIR="${1:-build/wasm}"
|
|
|
|
docker build --target dev -f "$ROOT/Dockerfile.wasm" -t "$IMAGE" "$ROOT"
|
|
|
|
mounts=(-v "$ROOT:/work")
|
|
configure=(-DCMAKE_TOOLCHAIN_FILE=cmake/toolchains/emscripten-wasm.cmake -DCMAKE_BUILD_TYPE=Release)
|
|
if [ -n "${OPENRA3_WEB_ASSETS:-}" ]; then
|
|
mounts+=(-v "$OPENRA3_WEB_ASSETS:/assets:ro")
|
|
configure+=(-DOPENRA3_WEB_ASSETS=/assets)
|
|
fi
|
|
|
|
docker run --rm "${mounts[@]}" -w /work "$IMAGE" cmake -S . -B "$BUILD_DIR" -G Ninja "${configure[@]}"
|
|
docker run --rm "${mounts[@]}" -w /work "$IMAGE" cmake --build "$BUILD_DIR" -j
|
|
|
|
echo "WebAssembly: $ROOT/$BUILD_DIR/bin/openra3.html (+ .js/.wasm/.data)"
|
|
echo "serve: python3 \"$ROOT/apps/web/serve.py\" --root \"$ROOT/$BUILD_DIR/bin\" --port 8199"
|