set: the room is lit, the blocks are wood, and every hit throws dust
Grade off the UI. The playroom_grade PostProcess declares layer = "scene", so
the pass runs before the interface is composited. Its twelve-tap bloom was
printing a displaced copy of every cream glyph over the 0.90 threshold, which
read as a second misregistered heading on every card, and its tilt-shift band
was defocusing the top and bottom of each one. The scene is still graded.
The sun comes over the player's shoulder. It travelled -Z, towards the camera,
so every block face the player saw was backlit and the fill did the lighting on
its own; that is what read as pale plastic. It now travels (-0.78, -0.42, 0.46)
and rakes the camera-facing faces, with the fill warmed to room bounce and
lifted to 0.28, the key dropped from 3.7 to 2.6 (at 3.7 the newly-lit faces sat
at 0.85 luminance and had no colour left in them), the sky IBL down to 0.20 and
the grade's saturation from 0.26 to 0.15 now the colour comes from the light.
The window opening runs from z = -40 rather than -22 to fit the new angle: the
key crosses the +X wall 14.7 m before the point it lands on, and at the old
opening the whole launcher end of the table stood in the wall's shadow.
The ten block materials move to playroom_paint, the shader the table already
wears, at grain_scale 3.2 / grain_strength 0.42 / wear 0.32 / clearcoat 0.22
and reflectance down from 0.35 to 0.12. The painted_wood texture they used to
bind is white to within four code values, so the albedo pass showed ten flat
colours; it now shows grain and edge wear (albedo spread 115 -> 125).
impacts.module is new: one subscriber on the game's bus that plays the wood
impact effect on impact and blockDisplaced, a bigger burst plus a shockwave
ring on towerToppled, and a puff where a block leaves the table. Plays are
rate-limited by a token bucket, and a burst the bucket refuses is folded into
the next play's count rather than dropped, so a collapsing tower is a handful
of large clouds and not fifty small ones.
The lamp shade and the window get playroom_glow, a new surface with a gradient
down world Y and a fresnel term, so the shade reads as lit paper rather than a
flat white triangle and the window as sky rather than a hole. The four picture
frames get playroom_crayon, also new: a child's drawing of the aeroplane and a
child's tower of blocks, in wax crayon on sugar paper.
box() is now shape() with the cube already chosen. Model.mobility = "static"
was tried on the 58 props and taken back out: three 20-second windows read
mesh_transform_compose at 0.82 ms with no flag, 0.80 on auto and 0.83 on
static. Set gains onModuleReload so a sibling's edit to game.game does not
leave the effects silently unsubscribed.