Contents

Lighting that carries a mood: fades, haze, shafts, gobos, gels and the sky

Status: design and build, 2026-10-07. It answers finding 13 of docs/audits/product-audit-2026-10.md, "Lighting can't carry a mood". Read with docs/design/world-kits.md (lighting presets, looks and the lighting editor), docs/design/m14-immersive-editors.md (the set explorer) and docs/design/m4-director.md (lighting cues).

The problem

  • Every lighting change was a cut. A cue had no duration, and nothing could dim a preset: the lights could not slowly dim, and night could not fall.
  • A preset was a key, a fill, an ambient and a rim, plus the world kits' fog and caustics. There was no haze, no shafts of light, no gobo, no gel. Lamps cast no shadows.
  • Outside, the sky was a starfield or one flat color. sky_gradient.v1 was named in the schema and dropped by the engine with a warning.

What a showrunner gets

  • Timed changes. A lighting cue fades over durationSec with an easing, and its level dims the preset: 1 as it is, 0.3 dimmed, 0 out. The timeline draws a fade as long as it lasts, and the director reads "the lights slowly dim" and "night falls".
  • Atmosphere. haze hangs light in the air: far things veil toward the haze lit by the key, practicals glow round, and shafts of light show in it.
  • Shafts of light. A shaft goes through a window or a door along the key, as a beam the size of the opening (or as wide as it is set), and the light it lets in lands on the floor beyond. Or it goes down from a lamp's or a spot's light, as a cone. It takes its own color, or the key's or the lamp's. The director reads "Light falls through the stained glass", "a red shaft of light from the window" and "a narrow beam" as the set's preset whose gobo or shafts say so, and names the library's look to add when none does.
  • Light shapes. A gobo (cookie) cuts the key into the shadows of blinds, bars, a window's panes, leaves, a lattice or dapple, or a picture's: the library's stained glass, leafy canopy, a window with its mullions and a cell's bars, or one the show brought in. A picture's colors color the light. It falls everywhere the key does, or in one patch, and on the light a window lets in, in the pool on the floor and the shaft in the air. Gels filter the key and the practicals.
  • Shadows from practicals. A lamp behind a chair throws the chair's shadow on the wall.
  • The sky. A sky_gradient.v1 backdrop is a sky that follows the preset: its colors and the sun or the moon by the hour (dawn, noon, dusk, night with stars), greyed and clouded by the weather (hazy, overcast, storm, fog, snow), and washed by a tint.
  • Weather. Rain and snow fall, the wind sways the leaves, the grass and the kelp, slants the rain and drifts the snow, and fog banks lie low and drift (see "Weather" below). A fade brings them in and takes them away, and the director reads "It starts to rain".
  • A budget on the web. A browser draws the first few shafts, glows and shadow-casting practicals, and fewer raindrops and snowflakes. The set says when a preset asked for more.

The data

Lighting cues (episode.schema.json LightingCue, schemaVersion 1.48)

  • durationSec (0-120): how long the change takes. It fades from how the lights are to the new ones, and the cue is that long, so a cue timed after it waits for the fade.
  • easing (common Easing, default ease_in_out): how the fade goes.
  • level (0-1, default 1): how bright the preset's lights are. The key, fill, caustics and practicals take it. The ambient and rim darken with it to 8% of themselves at 0, so a silhouette still reads.
  • The compiler writes Scene.lightingChanges[] with durationFrames, easing and level (Timeline 1.25). The set_lighting op of edit_episode takes them.

Lighting presets (set.schema.json lighting)

  • key.gel and a practical's gel ($defs.Gel): cto, half_cto, ctb, half_ctb, straw, amber, red, rose, magenta, lavender, blue, steel, teal, green, yellow. Each filters the light's color (RwGels).
  • A practical's shadows: its light casts shadows.
  • haze: density (0 clear, 1 thick smoke) and its own color (default: the key's).
  • gobo: the cookie (blinds, bars, window, leaves, lattice, dapple, image), with an image for a picture (an AssetRef: a library picture, which the set carries into the show, or a frozen picture of the show's). scaleM sets one repeat's size, angleDeg turns it, block sets how much of the key its dark parts stop, and softness softens its edges. A patch (centerM, radiusM) puts it in one place, with spill of the key outside it.
  • shafts[]: the element it comes from, and its beam. A beam is through (default for a window or door) or down (default for anything else). It also takes strength, lengthM, widthM and color (default: the key's, or the practical's).
  • sky: weather (clear, hazy, overcast, storm, fog, snow), tint, clouds and stars. The hour comes from timeOfDay, else from the key's height.
  • weather (see "Weather" below): rain, snow, wind and windDeg, and fogBanks.
  • The set inspector's per-name hints offer the new choices (gel, cookie, beam, weather), switches (shadows, stars) and ranges (rain, snow, wind, windDeg).

Looks (kit.schema.json LightingLook)

  • A look brings haze, gobo (a picture by its frozen reference), sky and weather as they are, and shafts[] rules. Each rule throws a shaft from every element whose piece has one of its tags or roles (every window), with its beam, strength, lengthM, widthM and color. A look's practicals rules take gel and shadows (presetFromLook, core/src/kits/looks.ts).

Pictures (kit.schema.json KitPicture, a kit's pictures)

  • A kit lists pictures a gobo can take: id, name, description, tags and its image, a frozen file kept with the kit. The library's are in the lighting kit, drawn by node tools/library-pictures.ts: Stained glass (leaded diamond panes of ruby, cobalt, gold and green), Leafy canopy (leaves and twigs against the sky), Window with its mullions (six panes in their frame) and Barred cell window (thick bars and a crossbar). Each is 256 pixels square, high in contrast and tileable, frozen in the library as a show freezes its art (library/assets/<sha256>.png, its provenance beside it, CC0-1.0). Drawn again with other bytes, the script rewrites every reference to it in the library's kits and places.
  • A look or a place's preset names a picture by the same reference (assets/<sha256>.png, pinned by its hash). A set that names one carries it into the show: when a change is proposed, the store copies each frozen file of the library's that its documents name and the show lacks, with its provenance, to the same path in the show (carryLibraryAssets, core/src/kits/pictures.ts), as a tool stores any bytes before it proposes. So a set built from words, a look put on a preset and the lighting editor's Picture all leave a set whose picture is the show's own frozen file, which validation, render jobs (jobAssets), the browser (RwJobDocuments.asset_paths) and runners read like any other. reelwright generate set carries them too.
  • The engine draws a picture from the show's file, pinned by its hash. When the show does not hold it yet (a picture chosen in the editor, before the daemon has carried it; a browser before it has read it), it draws the library's own copy of the same reference (RwSetDesign.LIBRARY_DIR), imported with Godot's other resources, in Studio and in the browser alike.
  • list_kits lists the pictures: the library's, then the show's own frozen pictures (art brought in, painted skies, reference pictures), newest first.

In the library

The library's looks (library/kits/lighting.kit.json) and places carry these moods, so a set built from words is lit with them and a look put on a preset brings them.

  • Looks: dawn, golden hour, dusk, a moonlit night and overcast bring their sky; dawn and the golden hour throw shafts through every window, and interior day softer ones. Noir has haze, blinds in the key and shafts through the windows. The stage spotlight hazes the air and throws a beam from each spotlight, and the deep sea from its lamps. Neon night, firelight, horror, dream and underwater have haze. New looks: Moonlight through the blinds (the one the director names when a set has none), Misty morning and Storm. The golden hour is 18:45, where the sun's day has it low.
  • Looks with pictures and shaped shafts: Through stained glass (stained_glass: a high cool sun cut into colored glass, shafts through every window, haze); Through the bars (cell_window: a cell's bars over a cold night key, a narrow beam 0.5 m wide through each window); Neon through the window (neon_window: a red shaft through each window from a sign outside); Sun through the leaves (leaf_light: a summer sun broken by the leafy canopy). The director names them when a set has nothing for its words.
  • Places outdoors (the forest, the beach, the city street and the alley) have a sky_gradient.v1 sky 120 m out, and each preset its weather. The ground and the beach take cyclorama: 0, so their painted sky card gives way to it (kit.nature.ground and kit.beach.beach have the param; 1 by default). The forest's day is dappled by leaves in a patch round the glade; the street's neon night throws cones down from its gas lamps.
  • Places indoors: the office's noir night has haze, blinds and a shaft through each window, and its day softer shafts; the jazz club's evening is smoky; the theatre's show hazes the house and throws a beam from each spotlight along its aim; the castle's daylight comes through the stained glass of its arched windows, in colored pools across the floor; the warehouse's lamps throw cones; the kitchen's morning and the classroom's afternoon come through their windows, each window's panes laid on the floor. The reef and the kelp forest hang light in the water.
  • The reef's Sun rays (kit.reef.sun_rays) are a finish shaft piece, bright where they enter and fading as they fall; the coral reef and the kelp forest place them midwater. A piece that is only light (every material a haze or a shaft, madeOfLight) takes no room: build_set stands it among the rocks and the kelp, people walk through it (isObstacle), cameras see through it (sightBlockers) and nothing is set down on it. The water's surface over the whole floor had left the reef's sand no room for its sea grass.

Backdrops

  • sky_gradient.v1 draws the sky (rw_sky.gdshader) at the backdrop's distance. Its cloud drifts by the backdrop's motion. The core warns set.unknown_generator for a generator the engine does not draw.
  • A room's windows show the light outside (RwSetBuilder.window_view): the glass (a recipe slot of finish glass on an element whose role is window) glows with the preset's sky low over the horizon, pale by day, gold at dusk, deep blue at night, whether or not the set has a sky backdrop, and a fade mixes it with the sky. Outdoors a window's glass is lit as any surface, since a shop window shows the shop.
  • A window that paints its view rather than glazing it (the blank room's: a sky over a hill, in slots sky and hill, RwSetBuilder.VIEW_SLOTS) takes the same light: its colors are multiplied by the sky low over the horizon against a clear day's (RwSetBuilder.outside_light), so it keeps them exactly by day and goes gold in the evening, deep blue at night and grey in the rain. The same sky in a picture on the wall is a picture's, lit as the room is. A window built again in the set explorer takes the light again. A preset that says no hour is day outside unless its key is the moon's (RwSkyModel._is_night), so the blank room's evening says its hour, 19:00.

Weather

What a showrunner gets

A mood can rain, snow, blow and roll fog in. A rainy street at night, the rain slanting through the gas lamps' light; snow drifting down in the woods; a gale thrashing the palms on the beach; fog lying in banks between the trunks at dawn. The weather is part of the lighting preset, so a lighting cue that fades to a rainy preset brings the rain in over its fade, and one back takes it away. Every frame draws the same from the frame alone, so a render repeats exactly and a scrub back shows the rain where it was.

The data (set.schema.json lighting.weather)

  • rain (Unit, default 0): how hard it rains, 0 none to 1 a downpour.
  • snow (Unit, default 0): how thick the snow falls, 0 none to 1 a blizzard.
  • wind (Unit, default 0): how hard the wind blows, 0 still to 1 a gale. Leaves, grass and kelp sway with it, rain slants and snow and fog banks drift.
  • windDeg (-180 to 180, default 0): which way it blows, turned from across the stage toward +X (to the right as the audience sees it) toward upstage (90) or the audience (-90).
  • fogBanks: low fog lying on the ground in soft banks that drift with the wind (fog rolling in, mist on a moor, dry ice on a stage). density (Unit, required) is how thick it lies, heightM (default 1) how high it reaches, color its own (default a pale grey, lit by the key and the ambient). Unlike the preset's fog it hides only what is low.
  • What sways is the piece's to say: a recipe's material slot takes sway (recipe.schema.json MaterialSlot, Unit, default 0), how much the wind moves it. Every slot of a piece that sways bends from the lowest point of them all, more the higher it reaches, so a tree's canopy and its darker underside sway as one over a trunk that stays.
  • A look (kit.schema.json LightingLook) brings weather as it is (presetFromLook).

How the engine draws it

  • Rain and snow (RwSetWeather, rw_weather_fall.gdshader). Each is one mesh of quads, a raindrop's streak or a snowflake, made once for each size. No particle system: GPUParticles3D and CPUParticles3D carry state from frame to frame. The vertex shader puts each quad where it falls from its index, the set's seed (<set>/weather/rain) and weather_time, which RwSet.evaluate sets from the frame as it sets caustics_time. They fill a box round the camera (rain 22 m across and 9 m high, snow 16 m and 7 m, so snow is thicker), wrapping as they fall and blow through it. A streak lies along the way it falls, turned to the camera; a flake faces the camera and wanders as it falls. Neither is drawn thinner than a pixel (it is fainter instead), and each fades out close to the lens and toward the box's edge. They are lit by the key and the ambient: pale in the day, dark at night. Indoors none falls inside the room (the stage's bounds up to the ceiling), so rain is seen through the windows and the doors. The amount says how many fall: at 1, 9000 drops or 8000 flakes.
  • Wind. Rain slants with it (up to 7 m/s sideways at a gale) and snow is carried (3.2 m/s). In the cel shader (rw_weather.gdshaderinc) a surface with sway bends downwind by the square of how high it stands over its slot's lowest point: it leans and swings in a rhythm of its own place, gusting and fluttering a little across the wind. Its ink and creases bend with it, and so does its shadow. A gale moves a 3 m canopy's top about 0.4 m.
  • Fog banks. Also in the cel shader and the ink: the fog between the camera and each point is summed in six steps along the view, thickest on the floor and gone above the banks' height, which rises and falls bank by bank in drifting noise. It lies over the surface's own air (FOG), nearer the camera. They drift downwind, slowly even in still air. A sky_gradient.v1 sky takes them along its horizon.
  • Fades. RwLightingState.mix mixes rain, snow, wind and fog banks in a line, and the wind turns round; a side with no wind or no banks takes the other's way, height and color, so only the amount fades. RwSetBuilder.blend puts the mix on the set, so as a fade goes the rain thins drop by drop (each falls where it would have).
  • The budget (RwLightBudget). A browser draws at most 3000 raindrops and 2400 snowflakes. A preset that asks for more draws that many and the set says so once (set.light_budget, "asks for 9000 raindrops; 3000 are drawn here").

In the library

  • Looks: Storm rains (0.85) on a gale; new Rain (steady rain from a low grey sky), Snowfall (snow falling soft under a white sky) and Windy day (bright sun between racing clouds, everything thrashing). Misty morning lays fog banks along the ground.
  • Places: the city street's rainy night (the neon smeared in the wet) and the alley's rainy noir; the forest's misty dawn (fog banks between the trunks) and snowfall, and a breeze in its dappled day; a sea breeze in the beach's summer day; the current in the kelp forest's presets and the coral reef's noon.
  • Foliage that sways: the leafy tree, the pine, the palm (its coconuts with its fronds), the bush, the hedge, a grass tuft and the fern; the potted palm and the office plant; kelp, sea grass and the weed on a sunken barrel and a wreck's ribs. The ground's grass and moss stay.

In Studio

The lighting editor's Air section sets the weather under the haze: Rain, Snow and Wind sliders (0 takes each away), the way the wind blows once it blows, and Fog banks with their thickness, height and color. Each change is one guarded revise_set of the preset's weather and shows in the view before the daemon answers (relight); Ctrl+Z takes it back. Under them the editor says when a browser would draw fewer drops or flakes ("5400 raindrops: a browser draws the first 3000"). The view holds frame 0, so the rain stands still in it; a render plays it.

The director

The heuristic director reads the weather coming in and going as it reads moonlight: "It starts to rain", "Rain lashes the windows", "Snow falls", "The wind picks up", "Fog rolls in", and "The rain stops". It fades (6 s, 12 s slowly) to the set's preset that has that weather (or, going, one without it), else one whose id or description says it, lighting the same part of the day. In the scene's opening words the scene opens with it. With none it says so (director.no_lighting) and names the library's look to add (rain, snowfall, windy, misty_morning) or the field to give a preset (weather.rain); a show's own weather effect named in the words (an fx.rain) stands for it.

How it is checked

  • Engine: engine/tests/stage/rw_weather_test.gd, on the desktop (Forward+) and under Compatibility. A preset's weather is read and the set lets it fall; the same frame rendered twice is byte for byte the same, and the next frame differs where the rain is (two dry frames do not); snow falls and is carried; the wind sways the canopy (and its ink) and not the block beside it, and nothing moves in still air; fog banks pale the floor, not the wall's top, and drift; indoors no rain falls in the room; a browser draws fewer drops and the set says so once; a fade mixes the weather.
  • Studio: engine/tests/ui/rw_world_kits_ui_test.gd sets rain, wind and its way, and fog banks, each shown in the set node before the daemon answers, and takes them away. Live, tools/lighting-watch.sh puts rain on a gale on the street after its storm and Ctrl+Z takes it back with the rest, the file byte for byte.
  • Core: core/test/kits.test.ts (a look's weather, the schema's bounds), core/test/library.test.ts (the looks, the places and what sways), core/test/heuristic-lighting.test.ts (the weather's words).
  • Stills: node tools/lighting-stills.ts <out> renders the library's rainy street, rainy noir alley, misty dawn and snowfall in the woods, and moods set by hand: a storm on the street, snow on the street at night, a gale on the beach, fog rolling into the alley.

How the engine draws it

  • Gobo. One include, rw_gobo.gdshaderinc, draws the cookie square to the key's way. The cel shader multiplies it into the key's pass with the shadow (rw_gobo_pass), and into the light a window lets in (rw_gobo_through, no spill outside a patch), so the blinds stripe the pool on the floor in step with the key's stripes. The shaft through the window carries the same pattern at the same world points, so it hangs in the air as sheets of light that run on into the pool. A picture is one repeat per scaleM, read as the light sees it, and its colors filter the light as a gel does (stained glass throws colored light). It is the same in Forward+ and Compatibility.
  • Haze. It adds to the air every surface and line fades into (RwStyleMaterials.air_of): far things veil toward the haze lit by the key and the ambient, and the background takes the same air. Glows are additive discs facing the camera at each practical's light (rw_light_glow.gdshader), at haze density × intensity.
  • Shafts (RwSetLightShapes, rw_light_shaft.gdshader). These are additive volumes, brightest at their source and soft where seen edge on. Their strength scales with the air: 0.45 in clear air plus 1.6 × the haze density. A shaft through a window brings a narrow spot from far behind the window, without shadows, so its light lands on the floor beyond it. A shaft down from a light is a cone from the piece's light anchor. It runs along the anchor's facing when that tips down (a stage spot aimed at the stage, a street lamp's head), else straight down, and it stops at the floor.
  • Sky (RwSkyModel). It computes the zenith, horizon and ground colors, the sun or the moon, the stars and the cloud for a preset. The sun stands where its hour puts it: up at 6, highest a little after noon, down at 19:30 (the time-of-day dial's day too), so 19:30 is a sunset and 20:00 is night with the moon. A fade mixes two skies.
  • Fades. RwSceneStage.lighting_of(scene, frame) gives the preset and level the scene is lit with at a frame, and while a change fades, how far through it is, eased. It is a function of the frame alone, so scrubbing back relights back. RwSetBuilder.blend mixes the two presets' lighting states (RwLightingState.mix): the key turns, colors and strengths go in a line, and a gobo of another shape fades out then in. The old preset's practicals, shafts and glows (fade group 0) fade out as the new one's (group 1) fade in (RwSet.set_fade). relight takes a level.
  • The budget (RwLightBudget). It allows 16 shafts, 32 glows and 4 shadow-casting practicals on the desktop and in renders, and 6, 10 and 1 in a browser. The set says set.light_budget (info) when a preset asks for more.

In Studio

The lighting editor

The set explorer's Lighting editor (RwLightingEditor; see docs/design/world-kits.md, "The lighting editor") edits all of it, live. Below the look and the time of day are five sections, shown one at a time:

  • Lights: the key, fill, ambient and rim, and the key's gel. Then what glows: each practical has its color, strength, reach, flicker, a gel and Casts shadows.
  • Air: fog, then haze: on or off, its density, and its color (the key's until one is chosen). Then caustics.
  • Shapes: the gobo's shape (blinds, bars, window panes, leaves, a lattice, dapple or a Picture), its size, turn, block and softness. A new shape starts at its own size. A picture is the library's first until another is chosen from the Picture menu, which offers the library's pictures and the show's own (list_kits); it shows in the view at once from the library's copy, and the daemon carries it into the show. In one patch puts it in one place: on the floor under the piece selected, else under the middle of the view, with the patch's size and spill. Center it here moves the patch there. Shafts of light lists the shafts, each with its strength, length, beam (through it or down from it), width (the one drawn now until it has its own, RwExplorerKits.shaft_width) and color (the key's through a window and the practical's down from a light, until it has its own; the x takes its own away). Add a shaft from the selected piece throws one through a window or a door along the key, or down from the light of anything else. The element's role decides, else its piece's. A piece throws one shaft at most, and with nothing selected the view says to select one.
  • Sky: an exterior with no sky_gradient.v1 backdrop offers Add a sky, which adds one 120 m away as one revise_set. Once it has one, the section sets the weather, a tint, the cloud and stars at night. The time of day moves the sun or the moon in it. Indoors the section says there is no sky to see.
  • Fade: Try the fade plays a fade from the preset shown to another of the set, over the seconds and with the easing chosen, in the view only (RwSetExplorer.try_fade). Each frame is RwSetBuilder.blend, the end is held a second, then relight puts the preset back. It changes no file, so a viewer may try one too. A change to the set shown stops it.

Each change is one guarded revise_set of the preset, checked by the preset's id. It shows in the view before the daemon answers: a lighting change relights the set, and haze, the gobo, shafts, gels, shadows and the sky all follow relight. A backdrop added builds the set again. Ctrl+Z takes each change back. The time of day keeps the key's gel. Another preset chosen in the editor, in the toolbar or with L lights the view, and the editor then edits that one.

The budget in Studio

Under the shafts, the haze and the practicals, the editor says when more are asked for than are drawn (RwLightingEditor.budget_note). In a browser it says, for example, "2 lamps casting shadows: this browser draws the first 1." On the desktop it says when a browser would draw fewer: "8 shafts of light: a browser draws the first 6." Each note is also said once where a tool can hear it (a browser's console).

How it is checked

  • Core: core/test/compile.test.ts ("fade over their frames, eased, and dim to a level, in a 1.25 Timeline"), core/test/versions.test.ts (1.48), core/test/kits.test.ts (a look's haze, gobo, sky, gels and shafts), core/test/assets.test.ts (sky_gradient.v1 is drawn, an unknown generator is said).
  • Engine: engine/tests/stage/rw_lighting_mood_test.gd. It tests that gels filter, that the blinds stripe the floor (rendered), and that haze veils and glows. Shafts go through a window along the key and down from a lamp, with their landing light and the budget. The blinds stripe the light a window lets in (rendered: down a column through the pool on the floor, and through the shaft seen from the side against bare air, each less the set without it, striped with the gobo and smooth without; the same in Compatibility). A picture gobo is drawn from the library's own copy when no show holds it, and the library's stained glass throws ruby and cobalt light on the floor where the plain key is gray (rendered). Shadows follow the budget. The sky follows the hour and the weather (rendered: blue at noon, dark at night). A fade mixes and a level dims, and a scene's change fades over its frames, eased. engine/tests/stage/rw_world_kits_test.gd: a job names the pictures its gobos cut.
  • Pictures and the director: core/test/library.test.ts (the library's pictures are frozen in the library, hold their bytes and are CC0-1.0, every look and place names one its kit lists; a castle hall built from words carries its stained glass into the show, which validates; the kelp forest's sun rays stand among its rocks and kelp and its sand is dressed), core/test/kits.test.ts (a look brings its picture and its shafts' width and color; add_lighting and a revise_set naming a library picture carry it in, a frozen path neither holds is refused; list_kits lists the library's pictures and the show's own), core/test/mesh.test.ts (a job's files include its gobos' pictures), core/test/heuristic-lighting.test.ts ("Light falls through the stained glass", "a red shaft of light", "a narrow beam", and the look named when the set has none) and core/test/director-model.test.ts (a model director is told a preset's picture and its shafts' width and color).
  • Stills: node tools/lighting-stills.ts <out> builds a blank show's places from words and renders each mood. First the library's own: the office's noir night, the club's smoky evening, the theatre's show, the hall by day through its stained glass, the forest's dappled day and campfire night, the street's neon night, the beach at sunset, the reef's sun rays, the alley's noir, the kelp forest's sun rays among the kelp and the kitchen's morning through its window's panes. Then moods set by hand: moonlight through the blinds, a lamp under a warm gel casting shadows, a smoky club with shafts and glows, a misty dawn under leaves, noon, dusk, a moonlit night and a storm; and the library's looks put on a place: the office through a cell's bars with a narrow beam and with a red neon shaft, the wood in sun through the leaves. It then renders the demo's bridge dimming slowly and a red alarm fading up, as stills before, during and after each fade.
  • Studio: engine/tests/ui/rw_world_kits_ui_test.gd, on a fake daemon that holds its answer. A picture chosen as the shape and another from the Picture menu each show in the view at once (the library's copy) and go as one guarded edit; a shaft's width, color and beam each change the view at once, and its own color is taken off again. Haze, a gel on the key, a lamp's gel and shadows, blinds, a gobo patch, shafts and an exterior's sky each show in the set node before the daemon answers, and each edit is the schema's. The hour keeps the key's gel. A shaft needs a selection, and a piece throws one at most. The budget notes say what a browser draws. A fade tried plays part way, then lights the set as before and sends nothing. A viewer may try one, and another preset chosen in the editor is the one it edits.
  • Studio, live: tools/lighting-watch.sh on the desktop and node tools/web/lighting-check.ts in a browser against reelwright host. Each builds an office and a street from words. In the office's lamp-lit night (the noir night has its haze and blinds already) it puts on haze, blinds, a shaft through the window, puts the desk lamp out and lights it again, a CTO gel and shadows, tries a fade to the day, then Ctrl+Z takes each change back until the file is byte for byte. On the street it adds a sky, sets dusk and a storm, then takes them back. Each step is a PNG (.claude/skills/verify/features/studio.md has the runs).

Not yet

  • Weather: characters take no fog banks (they take no air at all), and neither does the background color behind a set with no sky. Rain makes nothing wet: no splashes, no puddles, no darker ground; snow lies nowhere. Nothing but foliage sways (no flags, no hair, no cloth). A set built before its pieces' recipes said sway keeps the old recipes: its leaves stay still until it is built again. Practicals do not light the rain near them.

  • A fade tried in the lighting editor plays both presets at full light; a cue's level is set on the timeline.

  • A gobo cuts the key and the light through a window, not a practical's. It is laid out square to the key, so where the key does not come through a window, its pool is cut along the key too.

  • Walls cast the key's shadow, so a window's own patch of light comes from its landing light, not from the key.