firstlight
The hour in the lamp room of Lucina, written as a ramp.
FL.at(dawn) reads the whole environment off one axis — Core.state.dawn, 0 in
deep night and 1 when first light crests the window — and hands back the key
light's direction, colour and strength, the ambient fill, every value the
authored sky material carries (its three gradient stops, the starfield, the
moon, the glow over the seaward quarter and the sun's disc), the sea's body,
reflection, glint road and white water, the height fog and the marched air the
shafts come out of, and how brightly the room's own oil lamp burns.
Four keys, because the night before a dawn has four moments: deep night — a cold moon forty degrees up beyond the window; first blush; bone — the sky pale and cold above a warming rim, the sun at the waterline and not over it; and first light, apricot and seven degrees up, laid straight in through the glass.
Two directions matter and they are not the same one. skySunDir and skyMoonDir
point AT the sun and the moon as the sky draws them; sunDirection is the
direction the KEY LIGHT travels — the moon's light early and the sun's once it
clears the water. Keeping them apart is what lets the moon hang where a tilted
camera can see it while its light still rakes the room from the quarter the
window is in.
FL.keys() hands back the keys themselves, for a tool that wants to render the
ramp rather than fly through it.
Scoped to this part · feeds back into the world's score.