air
`Film.air(t)` runs 0 → 1 and never comes back down. This slice is that number: the room opens with air so clear that you can see where the light lands and nothing of where it travels, and closes with no beam left and a whole atmosphere you can watch turning.
air — the film's arc, made visible
Film.air(t) runs 0 → 1 and never comes back down. This slice is that number:
the room opens with air so clear that you can see where the light lands and
nothing of where it travels, and closes with no beam left and a whole atmosphere
you can watch turning.
Four things do the work, and every one of them is a pure function of the film
second — Film.seekTo(t) puts the air exactly where playing to t would.
air_field_volume | a box over the whole interior, drawn with demo.air.air_field. Each fragment marches the view ray through it: the settled dust the day lifted, the sun's own light wherever the ray stands inside the picture the south window throws, and the motes. |
air_shimmer_slab | a low slab of hot air over the mosaic, drawn with demo.air.air_shimmer. Bends what is behind it by how much of the slab the ray crossed and how near the patch that crossing was. |
air_floor_dust | the dust film on the floor and the swept arc through it, drawn with demo.air.air_floor. |
volumetricLighting | the engine's own participating medium, at a low density, so every light the light slice places shows the beam it throws and not only the pool it lands in. It carries the grey; the field carries the colour and the motes. |
The beam
The field shader back-projects each sample along the sun's travel onto the
window plane. A sample whose back-projection lands inside the opening is inside
the beam, and the pane it lands on decides its colour and how much light gets
through — the lead came reads as zero, the missing pane at (col 2, row 7) as
clear. Two analytic occluders read from Film.ROOM, the marble counter and the
mezzanine deck, carve their own dark volumes out of it.
The sun
Film.sun(t) is the authority on where the sun is. The unit vector this slice
marches along is built from that elevation and azimuth in Air.sunTravel(t)
rather than taken from Film.sunDirection, whose z component points the opposite
way: at solar noon (azimuth 178°) it returns z = −0.485, which carries the
window's light south, back out through the wall it came in by, and puts the
landing patch at z = −9.3 — three metres outside a room whose south wall is
z = −6. Compass azimuth 180 is due south, so the horizontal unit vector toward
the sun is (sin az, cos az) in (x, z) and the direction of travel is its
negative.
The arc
The swept arc is a property of the sun and the window, not of t, so it is
measured once at module load: 720 samples across the day, the window's four
corners projected onto the floor at each, unioned into 0.25 m bins along the
hall, and a least-squares cubic fitted to the band's centre line and to its half
width. Film.swept(t)'s companion — how far east the sweep has actually reached
at each film second — comes off the same sweep and is handed to the floor
material as front.
Scoped to this part · feeds back into the world's score.