← All cases
Case 014 Multiplayer / Simulation

Shared 3D Table

Live — andrewwigman-001-site6.htempurl.com ↗

Online tabletop tools make you choose: a rules-enforced implementation of one specific game, or a virtual tabletop where everything is a flat sprite you slide around. Neither lets a group just sit at a table and mess with objects. And when physics runs on each client, everyone's dice land differently — so most tools fake the throw rather than simulate it.

A shared 3D table joined with a name and a four-letter code. One server-side rigid-body simulation drives everything — dice tumble, tokens shove, thrown objects land in the same place for every player — with cards, hidden hands, boards and a growing set of games layered on top of the same table rather than built as separate apps.

Chess dressed onto the shared table — the pieces are physical objects in the same simulation as the dice, not board squares.
Exhibit 014-A Chess dressed onto the shared table — the pieces are physical objects in the same simulation as the dice, not board squares.
Pool: a racked triangle, a cue ball and an aim line, all resolved by the server-side rigid-body engine so every player sees the same break.
Exhibit 014-B Pool: a racked triangle, a cue ball and an aim line, all resolved by the server-side rigid-body engine so every player sees the same break.
The table's game drawer — ten sports and board games that re-skin the table and lay out the pieces, plus movable board objects and card-and-chip layouts.
Exhibit 014-C The table's game drawer — ten sports and board games that re-skin the table and lay out the pieces, plus movable board objects and card-and-chip layouts.
Physics
hand-rolled C# rigid-body engine, server-authoritative at 60 Hz — one simulation for everyone
Network model
20 Hz snapshots over the Blazor SignalR circuit; clients interpolate ~120 ms behind
Rendering
raw WebGPU with hand-written WGSL — no Three.js, no JS dependencies, no NuGet
Games on the table
10 — chess, checkers, backgammon, shuffleboard, bowling, curling, pool, snooker, air hockey, beystadium
Hidden information
hand contents filtered server-side — your card faces never reach another browser
Test suites
839 xUnit across the physics engine and the room model
Codebase
~39k lines of C# and ~18k lines of JS/WGSL, all first-party

.NET 10 Blazor Server with a 60 Hz room ticker over a transport-agnostic core; built in numbered waves against a module map that gives each agent its own file, so the renderer, physics and room model advance in parallel — every wave verified in-browser with two real players before the next one starts.

An unhandled error has occurred. Reload 🗙

Rejoining the server...

Rejoin failed... trying again in seconds.

Failed to rejoin.
Please retry or reload the page.

The session has been paused by the server.

Failed to resume the session.
Please retry or reload the page.