Greybox layout
The greybox is the mall made of plain boxes. We use it to tune movement, the camera and navigation before any art exists (roadmap Phase 1). It's generated by pnpm greybox from tools/greybox/layout.ts, which writes:
| File | What |
|---|---|
client/public/assets/mall/greybox.glb | Visual model: one mesh per material (~14 draw calls) |
client/public/assets/mall/greybox.collision.glb | Collision triangles for the player and camera (≤ 5k tris) |
client/public/assets/mall/mall.meta.json | Slots, seats, spawns, zones, escalators (schema) |
The Blender mall (Phase 2) replaces these files with the same names and formats. Nothing in the client changes.
Conventions
- Metres, Y up. The entrance is at z = 0 and the mall runs along −Z.
- Yaw is in radians around +Y.
yaw = 0faces −Z (into the mall) andyaw = π/2faces −X. Forward is(−sin yaw, 0, −cos yaw), the same as a Three.js object's default facing. - West (−X) is on your left as you walk in. East (+X) is on your right.
Plan (ground floor, seen from above)
z=−64 ┌──────────────────────────────── north wall ────────────────────────────┐
│ FLAGSHIP (stage with 3 steps at the back) │
z=−54 ├───────────┬────────────┬── doorway 10 m ──┬────────────┬───────────────┤
│ (closed) │ │ fountain │ │ (closed) │
z=−52 ├───────────┤ │ │ ├───────────────┤
│ w5 │ │ esc B ↑ (to −32)│ │ e5 │
│ w4 │ concourse │ │ │ e4 │
│ w3 │ 12 m │ (under the bridge│ │ e3 │
│ w2 │ wide │ −25 … −32) │ │ e2 │
│ w1 │ │ esc A ↑ (to −25)│ │ e1 │
│ w0 │ │ │ │ e0 │
z=−4 ├───────────┤ │ │ ├───────────────┤
│ (closed) │ planter │ spawn ↑ │ │ (closed) │
z=0 └───────────┴────────────┴── glass doors ───┴────────────┴───────────────┘
x=−16 x=−6 x=−3 x=3 x=6 x=16| Thing | Where | Size |
|---|---|---|
| Shop units | w0–w5 at x ∈ [−16, −6], e0–e5 at x ∈ [6, 16]; unit i spans z ∈ [−4 − 8i − 8, −4 − 8i] | 10 × 8 m, doorway 6 × 4 m |
| Upper floor | y = 7.6. Same units, prefixed u- | walls 6 m high |
| Atrium opening | upper floor, x ∈ [−3, 3], z ∈ [−52, −8] | railings 1.1 m |
| Sky bridge | upper floor, x ∈ [−3, 3], z ∈ [−32, −25] | |
| Escalator A | x = −2, rises from z = −12 (ground) to −25 (bridge) | 1.2 m wide, ~30°, 1.2 m/s |
| Escalator B | x = 2, rises from z = −45 (ground) to −32 (bridge) | 1.2 m wide, ~32°, 1.2 m/s |
| Flagship | z ∈ [−64, −54], stage 0.6 m high reached by 0.2 m steps | doorway 10 × 4.5 m |
| Benches | ground x = ±4.6 at z −8, −20, −36, −48; upper x = ±4.5 at z −16, −40 | 0.45 m high (you can't step onto them; jump) |
| Spawn | (0, 0, −5.5), facing into the mall | |
| Planters | (−3, −4.5) by the entrance, (−2, −38) | 2 × 2 × 0.6 m |
Zones
Entrance, Main hall, Fountain court, Upper gallery, Sky court, Sky bridge, and one per shop unit (priority 10). The client shows the name of the highest-priority zone containing the player. Shop zones take their name from mall.config.ts.
Movement tests built into the layout
- Step-up: flagship steps (0.2 m) must be walkable. Benches (0.45 m) must block.
- Slopes: escalator surfaces (~30–32°) must be walkable even when they aren't moving.
- Ceilings: walking under the sky bridge and jumping under the upper slab.
- Tight spots: 1.8 m gap between escalator B and the fountain. 1.8 m between the entrance planter and escalator A's side.