look
Slice 4 of **Sexton's Bell**: light and grade.
look
Slice 4 of Sexton's Bell: light and grade.
The whole lighting rig. The lightning key StormKey driven by
film.strobe(t), the near-black ambient between strokes, the two gas mantles
and the paraffin lantern as practicals with their scripted death at
t = 58.40, the east window throwing ruby and cobalt across eleven white
sheets, height fog and atmosphere, exposure, per-act LUT grades and the post
stack.
Exports
M.slice()— the descriptor theFilmDirectorregisters:{ name = "look", order = 40, sentinel = "Look", build, update }.
Usage
The FilmDirector component on the scene entity Film requires this module
and registers M.slice(). Nothing else calls it.
entity.find("Film").component.get("FilmDirector"):seek(58.38)
Notes
- Serves every shot.
- Owns
demo/look.module/**anddemo/look/**; writes no other path. update(t)is a pure function of absolute film time — no accumulation, nomath.random; usefilm.rand/film.noise.- The full design is
/zero/source/design/spec.md.
Interface
What this asset declares: the schema it conforms to, what it exposes, and the rendered structured payload.
conforms to
zero/source-extract/v2demo.look — SLICE 4 of "Sexton's Bell": light and grade. The whole lighting rig. `StormKey`, the lightning directional light driven by film.strobe(t); the sky and ambient ramp between strokes (film.PAL.nightAmb, near-black and never black); the two gas mantles and the paraffin lantern as practicals, following film.gas(t) and film.lantern(t) — the mantles hunt as pressure fails and are dead from t = 58.40; the east window throwing ruby and cobalt across the sheets when a stroke is behind it (shot 8, weaker in shot 11); height fog and atmosphere; exposure; per-act LUT grades and the post stack (bloom, DoF, grain, flare, shutter). Serves every shot. Owns /zero/source/demo/look.module/** and /zero/source/demo/look/**. Read /zero/source/design/spec.md first. update(t) is a PURE function of t — no accumulation, no math.random; randomness comes from film.rand/film.noise. HOW THE LIGHT IS ORGANISED StormKey holds the scene's SUN. A Light{kind="directional"} on it takes the sun field, so the stroke gets the cascade shadow set — which is what makes four hundred monuments throw four hundred shadows for four frames. The fog, the volumetric medium and the atmosphere all track the scene's sun, so aiming StormKey at the stroke aims the whole medium with it and the air itself flashes. Between strokes the key is off and the picture is carried by an ambient at exactly film.PAL.nightAmb, three-and-a-bit stops of print exposure, and whatever the practicals are still burning. That is the film's floor: near-black, never black.
clamp01(v: number) → number
Small helpers
| arg | type | description |
|---|---|---|
| v | number |
strokeTravel(az: number, el: number) → void
The direction the stroke's light TRAVELS, from its azimuth and elevation. az 0 = world +Z (down the vale), increasing clockwise seen from above.
| arg | type | description |
|---|---|---|
| az | number | |
| el | number |
xyz(p: any) → void
An entity's `position` comes back as a KEYED vec3, so `#p` on it is 0 and a `#p >= 3` guard silently never fires. This reads either shape.
| arg | type | description |
|---|---|---|
| p | any |
try(label: string, fn: () → void
| arg | type | description |
|---|---|---|
| label | string | |
| fn | ( |
nightPrint(crush: number, knee: number, top: number) → void
Per-act grades, as colour lookup tables The print curve. A night film is printed so that the midtones — the lit cloud base, the far ridge, everything the eye would give up on at midnight — collapse toward the shadows, while the top end stays free for the only thing in the film that is genuinely bright. It is what makes bone limestone invisible between strokes and the brightest thing in the frame during one. `crush` how hard the midtones fall (higher = less to see between strokes) `knee` where the highlights are handed back their range `top` the value the knee lands on It runs on LUMINANCE and rescales the three channels by what it did, which is the whole reason it is applied here rather than as the GradeSpec's own `curve`: that one runs per channel, so a colour whose blue crosses the knee while its red does not comes out of it as a channel split — a wet path under a night sky arrives electric cobalt. On luminance the hue is untouched and only the level moves, and `drain` then takes colour OUT of whatever the print pushed down, the way an eye does at this light level.
| arg | type | description |
|---|---|---|
| crush | number | |
| knee | number | |
| top | number |
findLight(name: string) → any
| arg | type | description |
|---|---|---|
| name | string |
changed(key: string, fingerprint: string) → boolean
| arg | type | description |
|---|---|---|
| key | string | |
| fingerprint | string |
forgetPushes( ) → void
resolve( ) → void
Resolve the rig from the scene. It is what makes the slice survive an edit/play flip: the entities are rebuilt, the module's locals are not.
spawnAt(name: string, pos: { number }) → any
| arg | type | description |
|---|---|---|
| name | string | |
| pos | { number } |
addLight(name: string, pos: { number }, fields: any) → any
Add or re-arm one light. The fields are applied whether or not the component was already there: these entities outlive a rebuild of the `Look` root, so an "add only if missing" guard would leave the previous build's radius, cone and colour in place and quietly ignore every change made since.
| arg | type | description |
|---|---|---|
| name | string | |
| pos | { number } | |
| fields | any |
actTable(spec: any) → any
Post-process chain One act's whole look, baked into a table: the colourist's ops from the GradeSpec, then the print curve on luminance with its own drain.
| arg | type | description |
|---|---|---|
| spec | any |
installGrades( ) → void
buildPost( ) → void
add(name: string, opts: any) → void
| arg | type | description |
|---|---|---|
| name | string | |
| opts | any |
build( ) → void
build()
at(...: ?) → void
| arg | type | description |
|---|---|---|
| ... | ? |
setProp(effect: string, prop: string, value: number) → void
update(t) — a pure function of film time
| arg | type | description |
|---|---|---|
| effect | string | |
| prop | string | |
| value | number |
update(t: number) → void
| arg | type | description |
|---|---|---|
| t | number |
mantle(c: any, seed: number, phase: number) → void
| arg | type | description |
|---|---|---|
| c | any | |
| seed | number | |
| phase | number |
slice( ) → void
The slice descriptor the FilmDirector registers.
Sexton's Bell demo slice: look.Sub-parts
Everything contained inside this part. Assets are composite children (clickable cards). Files are leaf payloads. Expand any row to view its source.
Problems
Everything affecting this asset right now: its own problems, anything wrong inside it, and problems on its direct dependencies.
agent_score is exposed.+ quality × 0.35
+ performance × 0.25
± compat factor
Usability ratings
Did the part work as advertised when consumers tried to drop it in. Separate from upvotes: those are taste; this is "did it function".
Scoped to this part · feeds back into the world's score.