mirror of
https://github.com/hanzo-templates/rapier-physics.git
synced 2026-10-30 20:55:16 +00:00
Fracture Yard: Rapier owns the simulation, three.js only draws it. Physics state
lives in WASM and is read back once per frame, so the JS side stays a renderer
and the sim stays deterministic. Live HUD reports body count and per-step solver
cost; CCD on the projectile so a fast ball cannot tunnel the tower.
Why this exists: static-SPA builders cannot ship a game. Proving hanzo.app can
meant finding what actually stopped it, and three things did:
1. POST /v1/projects/:slug/deploy carries the entire build in ONE request body
and the public edge caps a body at 4 MiB (measured: 4194304 accepted,
4198400 gets the opaque fasthttp "Error when parsing request"). Godot emits
a 43 MB engine wasm; Unity 22 MB + 5.7 MB of data. The artifact lane cannot
express a game at all, so these ship through the release lane instead: stage
to the object store, then POST /v1/sites/:slug/publish promotes it
server-side with no body.
2. Engine loaders emit NON-fingerprinted filenames (index.js, <name>.loader.js)
and clients/sites.CacheControlFor only marks a content-hashed name
immutable. A redeploy therefore leaves the CDN and the browser running the
OLD loader against the NEW wasm. That is not a visible error: emscripten
prints "still waiting on run dependencies" forever and the canvas stays
300x150. Every template here fingerprints its own asset names so the case
cannot recur.
3. A cross-origin-isolated document (COEP: require-corp) BLOCKS a plain
cross-origin script, so the shared a.hanzo.ai runtime needs
crossorigin="anonymous" on exactly the pages that opt into isolation.
Co-authored-by: Hanzo Dev <[email protected]>
26 lines
1.2 KiB
HTML
26 lines
1.2 KiB
HTML
<!doctype html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
|
|
<title>Fracture Yard — Rapier3D physics</title>
|
|
<meta name="description" content="A real rigid-body sandbox: Rapier3D (Rust compiled to WebAssembly) runs the simulation, three.js draws it. Click to fire, R to rebuild.">
|
|
<style>
|
|
:root { color-scheme: dark }
|
|
html,body { margin:0; height:100%; background:#0b0f1a; overflow:hidden;
|
|
font:13px/1.5 ui-monospace,SFMono-Regular,Menlo,monospace; color:#e2e8f0 }
|
|
canvas { display:block }
|
|
#hud { position:fixed; left:16px; top:14px; white-space:pre; pointer-events:none;
|
|
text-shadow:0 1px 3px #000 }
|
|
#tag { position:fixed; right:16px; bottom:12px; opacity:.5; pointer-events:none }
|
|
</style>
|
|
<script src="https://a.hanzo.ai/analytics.js" data-org="hanzo" crossorigin="anonymous" defer></script>
|
|
<script src="https://a.hanzo.ai/chat.js" data-org="hanzo" data-mode="site" crossorigin="anonymous" defer></script>
|
|
</head>
|
|
<body>
|
|
<div id="hud">loading physics wasm…</div>
|
|
<div id="tag">Fracture Yard · rapier3d + three.js · hanzo.app</div>
|
|
<script type="module" src="./app.js"></script>
|
|
</body>
|
|
</html>
|