updraftLook
UPDRAFT's second slice: **the arc of light**, which is this film's arc.
updraftLook
UPDRAFT's second slice: the arc of light, which is this film's arc.
The Codex Tower opens lit by one cold moon and forty oil lamps, and ends lit by
nothing but itself. This module owns that inversion and every camera control it
is photographed through. It registers with film.updraftFilm as "look" and is
driven one frame at a time from tick(s); nothing else in the world drives it,
and every value it sets is a pure function of s, so the second run of the film
is the first run's picture.
What it puts in the world
Everything lands under Stage, spawned by build(ctx).
| Entity | What it is |
|---|---|
Look_Air | VolumetricLighting — the air the moon shaft and the fire are seen through |
Look_Atmosphere | PhysicalAtmosphere — moonlight is sunlight a few hundred thousand times dimmer and scatters the same way, so the night sky and the eight hundred metres of air in shot 14 are computed rather than painted |
Look_Fog | HeightFog — the still winter night outside, and the smoke ceiling inside, whose heightRef follows Film.smokeY |
Look_Exposure | AutoExposure — the film runs from moonlight to a chimney of fire, which is more stops than one exposure can hold |
Look_Lens | DepthOfField + LensFx + MotionBlur + VelocityDilation — the lens and the film behind it |
Look_ShaftSpot, Look_ShaftLight | the moon shaft as light: a spot standing in the lantern, and the pool it lands in on the slate |
Look_ShaftBeam, Look_ShaftPool | the moon shaft as a surface — the moonShaft material, drawn as a volume |
Look_Practical_1..40 | the forty 1800 K oil lamps, each guttering on its own clock |
Look_Column_1..18, Look_DomeCore | the vertical gradient, and the moon before it |
Look_Beacon | what the tower reads as from eight hundred metres, armed only for the exterior shots |
Look_Shimmer_1..9 | bands of hot air standing in front of the shelving — the heatShimmer material |
The one idea worth knowing
One set of fixtures up the tower's axis carries the whole inversion. In
Movement I the column lights are the MOON: cold, faint, strongest just under the
lantern and dying away downward, so twenty-two rings of shelving read as
silhouettes against nothing. In Movement IV they are the FIRE: each one coloured
by its own height out of Film.look — fireBase at the slate, fireMid at
mid-shaft, fireTop at the dome — and lit as the flame front passes it. The
colour crosses over exactly where the light does.
That is why the inversion reads as one thing happening rather than as a crossfade between two rigs, and it is why the gradient is a real gradient: the sources making it are.
What it reads, and never re-derives
Film.geo for every dimension, Film.look for every colour, Film.heat(t) for
how far the inferno has gone, Film.emptied(t) for how much of the archive has
left, Film.smokeY(t) for the smoke ceiling, film.updraftShots for each
set-up's lens — the shot's stated vertical field of view IS the focal length, so
a lens is never authored twice — and luts.updraftGrade for the base colour cube
and the five per-movement corrections.
Per-frame values ride instance lanes, not material properties
Model:setMaterialProperty re-authors the material's mat.yaml on disk, so a
value written every frame writes a file every frame (OrigoZero/zero#8909). Every
value this slice changes per frame goes through renderer.instanceData.set and
is read from input.shader_data in the shader; each material's README names its
lanes.
Known blocked
moonShaft and heatShimmer are blend-queue surfaces, and in this world a
transparent material's pipeline stays pending and the mesh never draws
(OrigoZero/zero#10503) — renderer.drawDiagnostics() reports
outcome = "notDrawn", programStatus = "pending". The shaft is therefore
carried by Look_ShaftSpot and the volumetric air, which is a renderer pass and
reaches the frame; the two materials are authored, compiling, and driven, and
come back the moment a transparent draw lands.
Scoped to this part · feeds back into the world's score.