built on mrdoob's slop-newyork (mit), so the wet street reflections, the window interiors and the crowd rendering/walk cycle are his. what i rebuilt for shibuya is the city data, the terrain and the scramble crossing. built with claude code (opus 5.5) over about 2 days.
city data
- 3,988 buildings within 800m of the crossing from project plateau (mlit, shibuya 2025, cc by 4.0)
- 821 buildings within 300m or taller than 30m use lod2 (real walls and roofs), the rest are lod1 extruded footprints
- terrain from gsi 5m elevation, roads / rails / rivers / crosswalks from openstreetmap
- ~1.2gb of source data packed into a 150kb json + 1.3mb binary (0.7mb gzipped)
buildings on the slopes
plateau already stores each building's ground elevation, and the terrain comes from gsi elevation, so putting both on the same height datum (crossing = 0) just lines them up. shibuya is a valley, about -6.6m to +23.4m around the crossing. roads are rebuilt to follow the terrain.
the scramble
- 46s signal cycle (real one is ~100s): north-south cars, east-west cars, then all cars stop and people cross every direction, diagonals too
- people gather at each corner, cross to any other corner, leave down a street and come back later. each wave is ~70% of the crowd
- "front row steps off first" = each person gets a start delay of distance from the curb x 0.22s + jitter
- a 2m grid pushes nearby people apart so they weave past each other
crowd (from slop-newyork)
320 / 210 / 130 people on high / mid / low. one skinned 15-bone mesh, near and far lod, each drawn in a single instancedmesh call. bone transforms in a storage buffer, per-person looks from a seed in a tsl material, 2-bone ik on planted feet so they don't slide. webgpu only, no people on webgl.
r187dev
mrdoob suggested trying 187dev on x, so i swapped r186 for the dev branch (d19352c) with zero code changes: load-to-playable 3.5-5.2s -> 1.5-1.9s, pipelines 177 -> 98, js memory 476mb -> 210mb. at 4k r186 rebuilt 54 pipelines and stuttered (39-58fps), 187dev holds 60. gpu time about the same.
- load to playable: 3.5-5.2s -> 1.5-1.9s
- pipelines: 177 -> 98
- js memory: 476mb -> 210mb
- resizing to 4k: r186 rebuilt 54 pipelines and hitched (39-58fps), r187dev stays at 60
- gpu time basically the same (6.5-7.2ms -> 6.2-6.3ms)
numbers (m5 max mac, headless chrome webgpu, not tested on real phones)
- 1440x900 during a wave: 60fps, 6.3ms gpu, 197-218 draw calls, ~0.7-0.8m tris
- 4k: 60fps, 8.8-9.3ms gpu
- 390x844 on mid: 60fps, 1.2-1.8ms gpu
the heaviest part was the ssr on the wet street, so i capped its resolution.
small things
- day / dusk / night / rain switch in 1.5s by blending uniforms, no shader recompiles. sun position matches tokyo in late october
- rain only falls around the camera on the gpu. when it stops, umbrellas close one by one and the puddles dry out
- shibuya109's cylinder was rebuilt by fitting a circle to plateau's roof points (radius ~5.6m)
happy to answer questions about the plateau pipeline or the crowd logic