● post-MVP WebGPU wasm32

Shard

One torch-lit room, a corridor and a shrine, walked — and fought through — from a camera pulled in closer than the genre usually allows. It is the first slice of an action-RPG, and it is here to be the load on the render paths a browser is stuck with — every light, every shadow and every bounce you can see is going through a fallback.

shard — crcbl
Starting…
Click the canvas first. A canvas has to hold keyboard focus to receive keys, and browsers will not start audio until you have interacted with the page. Clicking away pauses the game and lets go of whatever key was held — no platform sends the release for a key that was down when focus left.
Touch reaches the engine. A contact arrives as an ordinary pointer, and the first one is also the gesture a browser waits for before it will start audio. Whether this demo can be played with one is in its controls below — not all of them can. Switching tabs pauses the game and lets go of whatever was held: no platform sends the release for an input that was down when focus left.

controls

Walk it. Fight what is in it. Then put the torches out.

The camera is closer than the convention, on purpose. An isometric action-RPG is usually played from far enough back that a face is four pixels and a wet floor is a smear. This sample exists to show what the lighting is doing, so it keeps the isometric elevation — the same atan(1/√2) tilt the genre is named for — and gives up the distance. You cannot pitch it or push it out; the only thing you control is which of four bearings it looks from.

what is actually running

The fallback paths, carrying real content.

Open the panel and it names the three paths this browser selected. It will say IndirectPerBatch, ArrayPages and Rasterised, because a browser has no mesh stage, no bindless and no ray query — and that is the entire reason this zone was built. The engine's own fixtures already prove those paths draw something correctly. What they had never carried is a scene where being wrong is obvious: a dark interior, where a shadow in the wrong place or an ambient term that has forgotten the walls is the first thing you notice.

The torches are point lights that flicker, and they flicker on the simulation's clock rather than the frame's — two sine waves at incommensurable periods, per-torch phase, so the room breathes and never repeats and a slow frame does not change the light. The shrine carries a spot whose cone falls across the corridor's doorposts. There are more lights in the zone than there are shadow slots, so the renderer ranks them by how much of your screen they are worth and shadows the ones that win — walk toward a brazier and watch which one takes over.

Nothing here is flat-lit. The ambient term is a baked irradiance volume: a grid of probes, each one gathered by casting rays into the same colliders your capsule sweeps against, so a torch behind a pillar genuinely does not reach the probe on the far side of it. Screen-space occlusion darkens the creases, and screen-space reflections have a floor smooth enough to show them. The floor is the reason it is smoother than the walls.

The zone itself is one ASCII table in the source. Every floor slab, wall block, pillar, dais, brazier and doorway is read off the same grid the colliders are, which is why what looks solid is solid. That modularity is not tidiness — it is the shape a streamed world has to be, and this is that kit at its first size.

You are a capsule on the same character controller puppet and breach use, and this is the third camera rig driving it: puppet orbits behind the shoulder, breach sits inside the head, and this one hangs at a fixed elevation and snaps between bearings. The controller gained nothing for any of the three — it takes a world-space displacement and returns what the room left of it, and it has never been told where a camera is.

There are three things in here, and they are not the same thing. A husk runs at you and jabs. An adept keeps its distance and throws — walk at it and it walks backwards, so you have to corner it. A warden is slow, takes five blows, and stands perfectly still for a moment before it slams: that stillness is the tell, and stepping out of reach while it is winding up is a slam that lands on nothing. Each of them holds its post until it can actually see you — the sighting is one ray through the same colliders your capsule sweeps, so a doorpost between you is a foe that has not noticed you yet. Your own blow is the same question at arm's length: it answers everything in reach that is not behind stone.

Close the tab and come back. Where you were standing, what you had left, how many times you were put down and which of the three you felled are written into your browser's own private file system about once a second, through the same save container a native build writes to the platform data directory. Reopen this page and you resume; the debug panel (F3) says whether this session did.

This is four verbs of six. The loop this sample is planned around is explore, fight, loot, level, save, resume. Explore, fight, save and resume are here: no item, no rarity, no experience, no inventory, and no streaming past this one zone. The plan for the rest is in the repository.

Open the console for the engine's log. The wasm module imports nothing, not even console.log, so log lines are queued inside wasm and drained by the page each frame. crcbl.audio(), crcbl.saves() and crcbl.logLevel(4) are there too.