look
<!-- zero:scaffolded-readme --> <!-- Replace the line below with what this module provides and who consumes it, then delete both comment lines. -->
look
<!-- zero:scaffolded-readme --> <!-- Replace the line below with what this module provides and who consumes it, then delete both comment lines. -->TODO: describe this module.
Interface
What this asset declares: the schema it conforms to, what it exposes, and the rendered structured payload.
conforms to
zero/source-extract/v2ffe.cinema.look — the light of FIRE FOR EFFECT. Everything here is a pure function of film time. Four sources carry the whole arc between them: THE SUN crosses 11 deg to 4 deg of elevation and 262 to 271 of azimuth, reddening from gold to blood as it drops. It is the scene's sun (a `Light` of kind `directional` on the entity `Sun`), so it owns the cascade shadows that rake east across the snow and lengthen all film. THE FILL a cold blue-violet distant light from the opposite side of the saddle. It is what makes snow in shadow read (0.13, 0.18, 0.33) instead of black. THE UNDERFIRE a distant light travelling straight UP, the colour of the orange welling through the torn deck. Zero for the first half of the film, riding `Film.ruin(t)` after — the reason half the light in shot 16 comes from below. THE AIR a physical atmosphere, so three kilometres of deck are seen through three kilometres of air, plus height fog that pools on the saddle as gun smoke accumulates. Two things about the light rig that were established by looking, not read: * The scene's sun is a `Light { kind = "directional" }`. A `DirectionalLight` component is an ADDITIONAL distant row and does not hold the cascade set, so the sun of a film with raking shadows has to be the former. The scene build places a `DirectionalLight` on `Sun`; `build()` replaces it with the sun proper. * Nothing in this file goes through the `lighting` toolbox. `setSun` and `setAmbient` fault on any entity carrying a `DirectionalLight` (#10510) and spawn scene-durable light entities outside `FilmRoot`. Every light here is a component this slice writes directly, on an entity it owns.
lerp(a: number, b: number, k: number) → number
Curves
| arg | type | description |
|---|---|---|
| a | number | |
| b | number | |
| k | number |
ramp(stops: { { number } }, k: number) → void
Sample a list of { stop, r, g, b } at 0..1.
| arg | type | description |
|---|---|---|
| stops | { { number } } | |
| k | number |
dayProgress(t: number) → number
How far through the afternoon we are: 0 at the head of the film, 1 at the tail.
| arg | type | description |
|---|---|---|
| t | number |
sunAngles(t: number) → void
Sun elevation and azimuth in degrees at film time t.
| arg | type | description |
|---|---|---|
| t | number |
sunTravel(t: number) → void
The direction the sun's light TRAVELS. Azimuth is compass-style — 0 is +Z, 90 is +X — so 270 is due west, and the light runs east across the saddle.
| arg | type | description |
|---|---|---|
| t | number |
sunColor(t: number) → void
| arg | type | description |
|---|---|---|
| t | number |
sunIntensity(t: number) → number
| arg | type | description |
|---|---|---|
| t | number |
fillColor(t: number) → void
| arg | type | description |
|---|---|---|
| t | number |
fillIntensity(t: number) → number
| arg | type | description |
|---|---|---|
| t | number |
deckHoles(t: number) → number
How many of the six holes are open in the deck at film time t. EXACTLY zero until the registration round bursts under it at t = 39.8, one from there, four as the first salvos go through, and six by the aerial of shot 12. `ffe.ordnance` tears the deck; the light coming back up through it is this slice's, and this is the number the two agree on.
| arg | type | description |
|---|---|---|
| t | number |
underfireIntensity(t: number) → number
| arg | type | description |
|---|---|---|
| t | number |
try(what: string, fn: any, arg: any) → boolean
| arg | type | description |
|---|---|---|
| what | string | |
| fn | any | |
| arg | any |
changed(key: string, v: number, eps: number) → boolean
| arg | type | description |
|---|---|---|
| key | string | |
| v | number | |
| eps | number |
distant(name: string, root: any, dir: { number }, col: { number }) → any
| arg | type | description |
|---|---|---|
| name | string | |
| root | any | |
| dir | { number } | |
| col | { number } |
writeLight(e: any, kind: string, dir: { number }, col: { number }, intensity: number) → void
| arg | type | description |
|---|---|---|
| e | any | |
| kind | string | |
| dir | { number } | |
| col | { number } | |
| intensity | number |
build(root: any) → void
Re-entrant. Everything is found before it is made, and the two lights this slice owns hang under FilmRoot.
| arg | type | description |
|---|---|---|
| root | any |
tick(t: number, _dt: number) → void
Drive the light for film time t.
| arg | type | description |
|---|---|---|
| t | number | |
| _dt | number |
reset( ) → void
report(t: number) → void
What the light reads as at a given film second — the data half of the "t = 4 and t = 100 are different light" proof.
| arg | type | description |
|---|---|---|
| t | number |
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.