World kits: a library of set pieces, a piece maker, import and lighting looks
Status: design and build, 2026-10-06. It answers finding 4 of
docs/audits/product-audit-2026-10.md, "The starter kits are the limit of every world", and
the lighting half of finding 13. Read with docs/design/m14-immersive-editors.md (the set
explorer), docs/design/m2-generation.md (set patterns and the sampler),
docs/design/m9-tier2.md (the asset pipeline) and docs/adr/0007-versioned-builders-and-canon.md.
The problem
- A blank show had two set patterns, a room of 10 pieces and the open air of 6, each with two lighting presets. The audit's noir jazz club came out as a living room, and its kelp forest as a park bench.
- Studio could not make a piece, and nothing brought a 3D model or a picture in, but a 360° backdrop through chat.
- The set explorer moved and deleted pieces, but could not add one.
- A lighting preset was a key, a fill, an ambient and a rim. Nothing could say "under water" or "a neon street at night".
What a showrunner gets
- A library of kits. Reelwright ships kits of parametric pieces, each a recipe that takes any style's shading, ink and palette: furniture of several eras (club booths, a bar, a bandstand, a piano, bistro and diner and office furniture), architecture (arches, columns, stairs, windows, doors, curtains), nature (trees, rocks, grass, kelp, coral, water), sci-fi and industrial pieces, street dressing (lamps, signs, cars, hydrants) and light fittings. The library is browsable by shelf (interior, exterior, nature, underwater, space, sci-fi, industrial, urban, fantasy, stage, lighting) and by words.
- Set patterns that build whole places from the library: a 1940s jazz club, a kelp forest, a spaceship corridor and more. build_set chooses one by a place's words, so "a 1940s jazz club" and "a kelp forest" come out as themselves, with no model.
- Add a piece. The set explorer's library drawer: drag a piece into the view, and it lands where its dressing rules say (on the floor, on the nearest wall, from the ceiling, on the table under it, or as a clump of kelp), then moves and turns with the gizmos.
- The piece maker. A kit-recipe editor in Studio: parts made of the recipe primitives with their sizes and places, params, materials from the palette, anchors and dressing rules, with the piece live in an RwView3D. It saves to the show's own kit.
- Import. A glTF, GLB or OBJ model comes in as a piece, snapped to the style: its colors to the palette's slots, the style's ink and outlines, a scale in meters, a footprint and a mark at its front. A PNG or JPEG comes in as a standing card, a decal for a wall or a painted backdrop. Both run through the Tier 2 asset pipeline and its QA.
- Lighting looks. A lighting preset editor in the set explorer's inspector, and looks to start from: times of day, interiors, noir, neon, firelight, stage light, under water with caustics, the deep sea, space. Presets gain fog (the air), caustics and a practical's reach.
The data
Kits: SetKit (schemas/v1/kit.schema.json)
- A SetKit is a shelf of pieces:
id(kit.), name,category, an optionalpalette(the colors its pieces' @slots default to),pieces(KitPiece, the same shape as a SetPattern's kit) andlooks(lighting looks that suit it). - A piece is named everywhere as
kit.<kit name>.<piece id>, as a pattern's own pieces are. - Reelwright's library is
engine/addons/reelwright/library/kits/*.kit.json. It is every show's and read-only, and it ships with the engine and the core. - A show keeps its own kits in
kits/<name>.kit.json. Its own kit,kit.<show name>, is made the first time a piece is saved or brought in. A show's kit hides a library kit of the same id. - A set copies the recipe of every piece it uses into its
pieces, as it always has (ADR-0007). A kit changing never changes a set built from it.
Pieces: tags and dressing rules
KitPiece gains two optional fields:
tags: words it answers to beyond its name (booth, banquette, 1940s), for the library's search, for choosing a pattern by words and for a look's practicals.place(PieceDressing): where it goes when it is added to a set.on: floor (the default), wall, ceiling, surface (the top of what is under it) or water.heightM,against(its back to the nearest wall),facing(toward the front, the center, away from its wall, or as dropped),clearanceM.cluster: placed as a clump ofmintomaxwithinradiusM(kelp, rocks, crates), each turned by up toyawJitterDeg.
Recipes: models and pictures (recipe.schema.json)
mesh: a frozen Reelwright mesh (assets/<sha256>.rwmesh,core/src/assets/mesh.ts), its parts drawn in the recipe's material slots (parts), uniformlyscaled, with itsboundsMwritten in, so layout and footprints never read the file.picture: a frozen picture standing up,sizeMwide and high, its see-through pixels cut away, with an optional board behind it (backing), lit as the set is.decal.image: a picture laid on a face (a poster, a sign).- The engine draws them with the cel shader: meshes as recipe triangles (so ink, creases and
palette apply), pictures with its picture variant (
rw_cel_picture.gdshader), which scales the pixels by the style's background saturation and value.
Lighting presets (set.schema.json)
fog: the air. Far things fade into its color, and the background takes it, in place of the style's atmosphere while the preset is on.caustics: light rippling on what faces the key, as through water above, with its color, strength, size and speed. It moves with the frame alone (RwSet.evaluate).timeOfDay: the hour the lighting editor's dial set it for. Asky_gradient.v1sky follows it (docs/design/lighting-mood.md); nothing else renders from it.- A practical's
rangeM: how far its light reaches (2.6 m by default). It shines from its piece's firstlightanchor (a lamp's bulb, a torch's flame); a piece with none lights from 0.25 m off its element, as before. - A LightingLook (
kit.schema.json) is a preset to start from. Its practicals are rules that light every element whose piece has one of their tags or roles.
The tools
All are in the one registry, so chat, MCP, Studio and the CLI share them
(core/src/studio/tools/kits.ts, import.ts).
| Tool | Kind | What it does |
|---|---|---|
| list_kits | read | The show's kits and the library's, shelf by shelf, a line per piece; one kit's recipes in full; the set patterns and the lighting looks |
| add_piece | propose | Stands a piece in a set by its dressing rules: its recipe, the palette colors it lacks (from its kit's palette rules), and a mark at each seat and stand anchor |
| save_piece | propose | Keeps a piece in one of the show's kits, making its own kit the first time |
| revise_kit | propose | Pointer edits to a show's kit |
| add_lighting | propose | A lighting preset from a look, its practicals on the set's own pieces |
| import_model | propose | A glTF, GLB or OBJ model as a piece of the show's kit |
| import_art | propose | A PNG or JPEG as a card, a decal or a painted backdrop |
| build_set | propose | Now builds from the show's patterns and the library's, chosen by the set's words |
Studio calls them as the person's own changes, applied as made and undone with Ctrl+Z.
Import
(implementation) import_model and import_art (core/src/studio/tools/import.ts) run
the Tier 2 pipeline of docs/design/m9-tier2.md: normalize, snap to the style, QA, freeze.
The frozen files go into the show's assets/ at once, inert until the kit change that names
them is approved. A file comes as file, a path (relative to the show; on the web service
inside the show only, a model's own buffers, .mtl and textures included), or as Studio's
upload (the id takes.upload gave its bytes, read through ToolDeps.uploads) with
fileName. The answer has the QA report, the piece's ref (kit.<show>.<id>, in data.piece
with data.kit) and what was snapped. reelwright asset import takes a .glb, .gltf or
.obj (--height, --units) and a picture --as card|decal|backdrop.
Models (core/src/assets/model.ts)
- Read: glTF 2.0 and GLB: the default scene's nodes through their TRS or matrix
transforms; triangles, and strips and fans turned into triangles; indices of u8, u16 or
u32, or none (in order); accessors of every component type, normalized or not, with a
byteStrideor packed. A mirroring node turns its triangles back to face out. A skinned mesh is taken in its bind pose and a morphing one as its base shape. Draco and meshopt compression and sparse accessors are refused, saying to export without them. A.gltf's buffers and images are data URIs or files beside it; sent alone (an upload), one that names a file is refused with "export a .glb". OBJ:v,vt,fin every index form and negative indices, polygons fanned into triangles,usemtlparts (oandgignored), and its.mtlbeside it (Kd,d/Tr,Ns,Pr,Pm,map_Kd); without it, gray. - A part per material. Its color is the mean, by area, of base color × the texture
where the triangle's UVs sample it (seven points a triangle, on a copy at most 64 px) ×
the vertex colors (
COLOR_0), in linear light. Its finish: alpha under 1 (BLEND, or an MTLd) glass; metalness 0.5 or more metal; roughness under 0.25 gloss, under 0.6 satin; else matte. A metallic-roughness map scales its factors by its mean. A primitive with no material is matte gray. Over 16 materials, the smallest parts merge into the nearest in color. - Normalize: meters by
units(auto: meters, unless its longest side is over 60, then centimeters up to 600 and millimeters past that: a 180-unit chair is 180 cm), or scaled toheightM; its base on the floor and its footprint centered on the origin; +Z its front as glTF has it (an OBJ as drawn). Vertices weld at 0.1 mm (the frozen format's step), degenerate triangles are dropped, and each corner's normal is the angle-weighted mean of the faces round its vertex that turn less than 40° from its own: a box has 24 vertices and a ball one per point. - Snap: each part's color goes to the nearest color (ΔE OKLab) of every set's palette and the style's shared palette when the style snaps, and stays as it is otherwise.
- QA (
checkModel): no triangles fails; over 60 000 fails, over 20 000 warns; a longest side under 1 cm or over 60 m fails with the units to try; a license is required; the share of its surface on the palette before snapping is reported (a warning under 90%). A failure stores nothing. - Freeze (
freezeModel): the mesh asassets/<sha256>.rwmesh(model/vnd.reelwright.mesh), the file as it came and every file it named beside it, each with its provenance. The same file and options give the same bytes. - The piece (
core/src/kits/imported.tsmodelPiece): id and name from the file's name unless given,role(furniture by default), "Brought in from: N triangles, W × H × D m.", a scaleparam (1, from 0.1 to 10),footprintMits bounds times the scale, a material slot per part (<piece>_<material>, defaulting to its own@slot), onemeshnode, astandanchor 0.42 m in front of it facing it,placeon the floor andtagsfrom its name. The kit's palette gets a pick rule per part (its snapped color), so a set that adds it takes those colors, and a set's own palette can recolor it. It is proposed through the code save_piece uses (proposePiece); bringing the same piece in again replaces it and its rules.
Pictures (import_art)
Through prepareImage (an sRGB PNG at most 4096 px, snapped when the style snaps, QA):
card: a picture node standing on the floor facing the cameras, 1.6 m tall by default (its width from the picture's shape). With see-through pixels it has no board, so its outline is cut out; an opaque card stands on a 15 mm board.decal: a picture on a 20 mm board hung on the nearest wall, 0.8 m tall by default, its middle at 1.5 m.backdrop: a 2:1 panorama (within 1%) withsetbecomes that set's 360° backdrop through theimport_assetpath (its first backdrop, or a new one calledbackdrop), QA'd for a backdrop's aspect and size; any other picture becomes a painted flat on a board, as wide as the set (8 m without one) and no taller than its ceiling, standing against the back wall.widthMandheightMsize it, keeping its shape when one is given. The board takes the picture's mean color, snapped. The piece's role is dressing.
Choosing a pattern by words
The third product audit (finding 2) asked for "the cramped wheelhouse of an old car ferry: a
ship wheel, chart table, radio, windows all round, a swinging lamp" and got the moon: of the
patterns, only the moon's description said "radio". Its night scene was lit lunar_day, and
"the open steel car deck of an old ferry at night in the rain" came out a sunny park. The
choice is now patternByWords (core/src/generate/set/choose.ts), read from the place's
words by readPlace (core/src/generate/set/place-words.ts), and setPatternFor
(core/src/writers/needs.ts, for build_set and the missing-asset pass) and placesFor
(core/src/studio/makers.ts, the reading's place picker) both use it:
- A place has a kind: the head noun of its name ("FERRY - CAR DECK" is a deck, "MRS. PARK'S
CLASSROOM" a classroom, its owner left out), else of its description's first words ("The
Blue Note: a smoky jazz club" is a club).
PLACE_KINDSsays, for each kind, indoors or out, the words Reelwright's patterns use for it (a market is a street of shopfronts, a noodle shop a diner) and what such a place has in it. - A place of a kind is only ever a pattern of that kind: one whose name or tags say the kind or its words. Of several ("corridor" is the hospital's and the starship's), its other distinctive words choose ("hospital"), else none does. No pattern of its kind: none, whatever its other words say ("a city park" is no city street, "a school corridor" no classroom).
- A place of no kind is a pattern a distinctive word names (a word of its name or tags no other pattern has: "lunar", "kelp", "speakeasy"), or two words only its description says. One such word never decides.
- Words every place has (a table, a lamp, a radio, a window), how it looks, its time and its weather never choose. A tag of two words is said as two ("malt shop" makes no corner shop a diner, "space station" no police station a starship).
- Indoors or out as the heading's INT. or EXT. says, else the words ("inside", "the front of"), else its kind; never the other.
- When a type is asked for (an outline's set), of the patterns of that type as before, then one of another type its own words name (a kelp forest asked for as a room is still a kelp forest), then the show's own of the type.
- Big enough for what its words put there (the fourth product audit, finding 3: "the open
steel car deck of an old ferry" was the library's 2.6 m fishing boat, with no room for its
railings). A place that holds cars (a car deck, a car park) or a big ship's deck (a ferry's,
a liner's) needs a floor of at least 8 by 8 m (
PlaceWords.sizeM), and a pattern whose room cannot be that big is not it (roomFor); the plain room or open air it is built as instead is sized to it.
A type the show's theme has no catalog entry for is left off the set.
A place no pattern is: the plain room or open air, dressed from its words
With no pattern and no type, build_set builds Reelwright's plain room or open air (the
show's copy from library/blank/, else the library's), indoors or out as the words say, and
dressPattern (core/src/generate/set/dress.ts) dresses it from its words:
thingsInreads what the words name: a list after a colon or "with" ("…: a ship wheel, chart table, radio, windows all round, a swinging lamp"), and in an action line the things its sentences name ("Lanterns sway between the chimneys"). The head noun decides and the longest match wins, against the plain pattern's own pieces, the show's kits and the library's, by name, id and tags: "a lamp post" is a street lamp, "a swinging lamp" a pendant, "a lamp on it" a table lamp, "a ship wheel" never a ship's porthole. A piece of the place's own kind is preferred (a ferry's rail, not a house's balustrade). How many ("two windows", "windows all round", "three steps" as one flight of three) and what it stands on ("a desk with a lamp on it") are read too. A thing listed that no piece is is said plainly, in aset.piece_not_madewarning ("Farmyard has no wheelbarrow: no piece in the show's kits or Reelwright's library is one"), as is one that found no room.- Where the words name nothing, the kind of place says what it has (
PLACE_KINDS: a deck its railings, a bedroom its bed, wardrobe, bedside table, lamp and window). - The pattern drawn is the plain one's shell, floor, walls and door, with a placement for each thing: windows and boards hung on the walls (outside, on the front of a house, or on a ship's rail), lamps hung from the ceiling, things stood on what they were said to be on, a line (a rail, a fence, a hedge, a counter) along a side, what stands against a wall pushed to one, the main thing (the kind's first, else the biggest) in the middle facing the cameras, a car's seats behind its dashboard, the rest either side. A mark at each seat and standing place and at the main thing, a single on each, a wide, a two-shot of two seats; its lamps lit by the plain pattern's lighting; its pieces' colors from their kits' palettes; its floor as the words make it ("steel"), the sea beyond a ship's windows and rail, and a window's sky dark when it is only seen at night.
- What its people hold or are is theirs, never the place's: "scrolling on her phone", "the
volcano on his lap", "grabs it with both hands" dress the bus with no phone, lap or hands. A
thing said to be someone's ("her", "his", "their") that a hand can hold (no bigger than
0.6 m) and any part of a body are left out; her bed is still the room's. The director holds
a phone being scrolled, texted or swiped (
action.ts), so the reading offers it as a prop. - Its derivation is the plain pattern's (and its hash), so a dressed room drifts only when that changes.
A pattern the place is also gets what the description names that it may leave out
(addToPattern): the kitchen's kettle, which it places by chance, is there every time, and a
thing it has no rule for is stood in it.
A vehicle that stands still stands still: when its words say it is moored, docked, anchored,
tied up or parked, its engine off or its ramp down (or its heading says PARKED, MOORED or
DOCKED, as it says MOVING), its passing view (passing_view.v1) goes by at no speed
(standStill). One on the move keeps its own.
The reading's "Make a set for …" and "Make all N new sets" pass a description of the place
(placeDescription): its name, the times its headings say, the weather its action says, and
the things its scenes name that a piece is ("Ferry - Wheelhouse, at night, in the fog: windows,
a hanging lamp, a chart table, a wheel, a door, a chair, a radio"), and "standing still" when
its scenes moor or park it ("The ramp is down"). What its people are, wear, carry or do is
theirs, never the place's: in a sentence someone leads, a clause names a thing only from its
first article on ("PIP, thirteen, glasses" has none, "climbs onto a chair" names no ladder),
what they have with them is theirs ("with a lunch tray", "pokes it with a stick"), and what
the director reads them moving is a prop whatever piece its last word could be ("hands the
candy bar to Oscar" is no bar counter), as is a part of what they hold ("the flashlight
beam"). The script's speakers, and kids, students and the like, are people before the cast is
made. What they use where it stands stays: the wheel they grip, the chair they climb onto, the
snack machine they run to. A pattern's own piece by another name is its own ("a table" in a
cafeteria is its lunch tables, a car's windshield is the car), and a gas station is a
forecourt, not a station's office.
Lit for its time and weather
The light a place is seen in is added from the library's looks (lightsFor,
core/src/kits/looks.ts): a night (the lamp-lit night inside, the moonlit night out), an
evening, and rain, snow or fog in that part of the day, made as one look (lookFor: the
time's light under the weather's sky, rain and fog; inside, the rain falls beyond the windows
and no fog bank lies on the floor). build_set adds what its words say. Direct and the CLI's
reelwright direct add what each scene's heading and action ask of its set and the set lacks
(lightScript, core/src/director/lights.ts), and propose the set with the episode; the
reading reads the script the same way. The director's lightingMatch lights a heading's time
by a preset's id, else by what it says of itself or its hour ("The show is on" at 20:00 is a
night), never by a turn of events (a red alert), and an open-air scene whose first sentence
says it is raining, snowing or foggy opens lit for it.
The corpus core/test/words-places.test.ts (38 places, the audit's two verbatim, made through
build_set and through the reading's Make all, then directed) holds this: no pattern a place
is not, indoors or out kept, every piece its words name made or said, and the night and
weather lit, all at 100%; it prints how many of the pieces are made (97% when written).
The library
The library ships 26 kits of 326 pieces and 30 lighting looks
(engine/addons/reelwright/library/kits/), and 29 set patterns that build places from them
with no model (library/sets/). Every piece builds in the engine with no error, inside its
footprint, with every material it names drawn, and every wall builds as cleanly with its
doorway cut (engine/tests/stage/rw_library_kits_test.gd). A piece drawn taller than its
footprint says so (seeThroughToM): the bank's tellers' counter is solid to its marble top,
and its glass screen in brass bars above is seen through by the layout and the cameras, so the
check holds its drawing to that height instead. Every pattern samples cleanly,
never sets the same piece twice within 0.15 m on one surface (seeds 1 to 12), and build_set
picks each by its words (core/test/library.test.ts).
| Kit | Shelf | Pieces |
|---|---|---|
| kit.lighting | lighting | 21 light fittings (lamps, sconces, a chandelier, candles, lanterns, a campfire, string lights, a spotlight on a stand and one hung from the ceiling, neon tubes, arrows, stars and rings, a fluorescent panel) and 21 looks |
| kit.jazz_club | interior | 19: a curved booth, bar and back bar, stools, a bandstand, a grand piano, a bass, a ribbon mic, cocktail tables, bentwood chairs, deco panels, a stage curtain, a neon sign; looks smoky_club and after_hours |
| kit.diner | interior | 15: a 1950s diner's booth, counter, stools, jukebox, soda fountain, and the counter's things laid out once |
| kit.office | interior | 17: desks, chairs, cabinets, a water cooler, cubicles, a rotary phone, a notice board, and a desk's things laid out once (a blotter, papers, a phone, a tray), a lamp's corner kept |
| kit.architecture | interior | 20: floors, walls with door openings (brick in running bond), a ceiling, arches, columns, stairs, windows, doors, curtains, a fireplace |
| kit.nature | nature | 18: ground, trees, bushes, rocks, grass, flowers, a log, a pond, a path, a picket fence |
| kit.reef | underwater | 17: the sea floor, kelp, sea grass, corals, sea fans, anemones, a clam, a wreck's ribs (a heeled hull's frames, some snapped, half sunk), fish, the water's surface |
| kit.spaceship | scifi | 15: corridor walls, grating, a lit ceiling, bulkhead doors, an airlock, consoles, a cryo pod |
| kit.industrial | industrial | 14: drums, pallets, crates, a container, a catwalk, tanks, a forklift |
| kit.street | urban | 24: lamps, a hydrant, a phone booth, traffic lights, a storefront, a 1940s sedan, a bus stop; for a back alley a dumpster, a fire escape, a steel back door, a drainpipe, bin bags |
| kit.fantasy | fantasy | 16: castle walls and a tower of coursed blocks, a gothic arch, a throne, banners, torches, a cauldron, crystals, a giant mushroom |
| kit.stage | stage | 10: a stage, a proscenium arch, house curtains, footlights, seats |
| kit.space | space | 12: moon ground, rocks, a crater, a dome habitat, a lander, a rover |
| kit.hospital | interior | 14: a gurney, a wheelchair, a drip stand, a nurses' station and chart shelves, ward doors (a pair from 1.3 m), waiting chairs, handrails, a row of ceiling lights, an exit sign; for a ward a hospital bed (to lie in, a bedside either side), a curtain on its rail between beds, a bedside cabinet with its lamp, a heart monitor that glows |
| kit.beach | nature | 9: the beach with the sea's edge and horizon, a lifeguard tower, a beach hut, an umbrella, a towel, a deck chair, a surfboard, a beach ball, a sandcastle |
| kit.home | interior | 13: kitchen counters with a sink, wall cupboards, a stove, a fridge, a kitchen table and chairs, a kettle, a bowl of fruit; a bed, bunk beds, a wardrobe, a chest of drawers, a bedside table |
| kit.nautical | exterior | 5: a ship's wheel on its pedestal, a valve radio set, a life ring, a mooring bollard, a ship's rail |
| kit.vehicle | interior | 2: a car seat, a dashboard with its steering wheel and dials |
| kit.school | interior | 3: a chalkboard, a row of pupils' desks, a globe |
| kit.living | interior | 17: a three-seat sofa (to sit on or lie along), an armchair, a coffee table, a TV on its media unit (its screen a light), a floor with a rug, a side table, curtains, a mirror, pictures and posters; a kid's things (a toy box, a teddy, blocks, a beanbag, a kid's desk, clothes on the floor) |
| kit.shop | interior | 8: aisle shelving stocked both sides, wall shelving, a drinks fridge that glows, the shop counter with its sweets rack, a magazine rack, an ice-cream freezer, a back shelf, a neon OPEN sign |
| kit.campus | interior | 8: a bank of lockers, a drinking fountain, a trophy case, a lunch table with its benches, the serving counter behind its sneeze guard, a stack of trays, a milk cooler, bins |
| kit.workplace | interior | 7: a coffee machine, a vending machine that glows, a microwave, a round table, stacking chairs, mugs, a poster |
| kit.playground | exterior | 7: a swing set, a slide, a climbing frame, a sandbox, a seesaw, a roundabout, a picnic table |
| kit.suburb | urban | 8: a house front (one or two storeys, a porch light), a stoop to sit on, a garage, a gate, a mailbox, a front walk, a street of lawns, sidewalk and road, a back fence that a front door's way in passes |
| kit.transport | exterior | 11: a car with its seats and dashboard (one piece, its windows open), a bus's floor, sides, windscreen, back and folding door, rows of bus seats, the driver's seat, a grab pole; fish crates and a coil of rope |
| kit.courtroom | interior | 6: the judge's bench on its dais (the judge's chair behind it, a gavel), the witness stand, a lawyers' table with two chairs, a gallery bench, a flag on its stand, the court's seal |
| kit.locker_room | interior | 3: a locker room bench, hooks of wet towels, a laundry cart |
| kit.bank | interior | 7: the tellers' counter behind glass in brass bars, a safe, a wall of safety deposit boxes, the round vault door (a door piece), the guard's front desk with its lamp and monitor, a velvet rope, a marble pillar to hide beside |
| kit.backstage | stage | 6: a costume rack, the fly rail's ropes and sandbags, a star's dressing room door (a door piece), a make-up table under its ring of bulbs, a black wing curtain, a red cue light |
Looks: dawn, noon, golden_hour, dusk, night, overcast, interior_day, lamp_lit, fluorescent_office, noir, neon_night, firelight, stage_spotlight, horror, dream, underwater (fog and caustics), deep_sea, space, smoky_club, after_hours.
Places (pattern.set.<name>, each with marks, an establishing wide, singles and two-shots,
and two or three lighting presets): rooms jazz_club, spaceship_corridor, diner, office,
castle_hall, warehouse, theater_stage, hospital_corridor, kitchen, classroom; the open air
city_street, forest, coral_reef, kelp_forest (under water: fog and caustics), moon_surface,
beach (a summer's day, sunset, moonlight), back_alley.
The places a sitcom lives in, each with somewhere to sit, stand and lie, a way in and out, and day and night light: kids_bedroom (bunk beds with a bench at their foot, where a grown-up sits clear of the top bunk, a desk, a beanbag), bedroom (a double bed with two to lie in it), living_room (a sofa facing the TV, the front door and the kitchen door, stairs up), corner_shop, school_corridor (lockers, doors at both ends and a classroom's), cafeteria, break_room, park (swings, a slide, a seesaw, benches, a picnic table, grass to lie on), house_street (two house fronts with stoops, the first house's front door a way in), and three on the move: car (inside, drawn in the open air so cameras stand round it), bus (closed on all sides, the door at the front) and boat (a fishing boat's deck: the wheelhouse aft is its back wall and its door the way below; its sides are walls, so no way leads overboard).
The places of the genre shows (staging-words' fresh shows: a courtroom drama, a sports team,
a hospital, a heist, a theatre), each with a piece of its own: courtroom (seen side on, the
judge's bench out from the left wall with a way behind it to the judge's chair, the witness
stand, the defense and prosecution tables facing the bench, a rail, the gallery's benches),
courthouse_hallway (benches under tall windows, the courtroom's doors and its sign, never a
school's lockers), locker_room (its own kind of place, locker room or changing room: banks of
lockers, two benches, the coach's whiteboard, the showers' doors), hospital_ward (beds under
the windows with curtains between them, bedside cabinets, heart monitors), bank_lobby (marble
pillars to crouch beside, the tellers' counter, the guard's front desk, the vault door, a back
door), bank_vault (walls of deposit boxes, the safe, a cash trolley) and backstage (the fly
rail, costume racks, a make-up table, the star's dressing room door, the wings and the stage
door under its cue light, a ghost light).
On the move: the passing view
A car, a bus or a boat reads as moving only when the world goes by outside. Their patterns
draw a passing_view.v1 backdrop (rw_passing_view.gdshader, built by
RwSetBuilder._passing_view): a sphere at the backdrop's distance whose every pixel casts the
camera's own ray, in the set's frame, at the road or the water under the floor (groundM) and
at upright rows of scenery on both sides, each a row of hashed cells: posts, parked cars and
street trees near, house fronts or hedgerows further, tree lines and hills or a shore far off.
The vehicle stands still on the set, its nose to the set's front (heading: front, +Z; or
back), and the world streams past at speed metres a second, so near things race by, far
ones creep, and through the windscreen or the back window the road runs to its vanishing
point. scene is town, country or sea; any other word warns set.unsupported_backdrop
and goes past a town. The sea knows the boat: sternM, bowM (its bow's point) and beamM
(half its width) shape a lumpy collar of foam round the hull, fuller at the bow, and a wake
from the stern. The sea is drawn on a surface at groundM too, the same picture as the dome's
in every direction, so a hull that goes down past it is hidden there and sits in the water
up to its waterline (the boat's groundM is above its keel, at its red stripe). Its sky is the preset's own,
as sky_gradient.v1's: at night the windows, lamps and buoys glow and the scenery takes the
sky's dim light. Everything is a pure function of the direction, the camera, the uniforms and
the frame, so a render repeats exactly. The car's open windows have no glass, so the view
shows through; the lighting editor counts the passing view as the set's sky. To drive through
the country instead of a town, set the backdrop's scene param to country on the set.
Signed off: the places pass
node tools/places-sheet.ts <out> renders every place in each of its lighting presets, a wide
and a medium with a character in it, as one contact sheet a place (the ship's bridge and
engine room too). Looked at as a showrunner looks at a set before the first episode, against
what good animated series do for depth, silhouette, colour key and dressing, the worst of it
was, and is now:
- A room's windows showed daylight at midnight: every window's glass was lit by the room. A
room's window now shows the preset's sky (
RwSetBuilder.window_view). - Moods that read the same. The club's set was the smoky evening again: it now has a spot hung
over the floor (
kit.lighting.ceiling_spot) on the singer through the smoke, the house down to a glow. The diner's three in the morning was its noon: it is dim and sickly green. The castle's torchlight and its feast were one warm room: torchlight is low and orange, the feast bright gold in a haze. The warehouse's and the alley's noir were a grey day: now hard light through the high windows' panes and the fire escape's lattice, black between, the lamps throwing cones. The forest's golden dusk was a beige murk: a gold sky and long shadows. The moon's low sun was its noon: warmer, the dome lit. - A flat backdrop: the city street had sky right behind its shops. Its ground piece now draws
the city's taller buildings far behind (
skyline). - Bare floors before the action: the wides of the warehouse, the kelp forest, the coral reef, the street, the diner, the kitchen and the alley had nothing near the lens. Each has a few pieces downstage (pallets and crates, drums, a rock and sea grass, corals and a starfish, a hydrant and a parking meter, a coat rack, a plant, crates).
- Dressing that seldom stood: the club's loose tables, their chairs and its palm, the diner's second table and the street's newspaper box failed to find room on most draws; their zones give them room now.
The reef's sun_rays piece is a shaft of light that stands in the coral reef and the kelp
forest: light takes no room (madeOfLight), so it stands among the rocks and the kelp.
The weather a mood can carry (rain, snow, wind, fog banks) is in
docs/design/lighting-mood.md.
Not yet right: the sampler draws a dressing rule's things with repeats and keeps them apart only from that rule's own, so a surface carries one drawn thing, or its things laid out as one piece (the office desk's, the diner counter's); drawing without repeats, and apart from every thing on a surface, is the sampler's to do. The club's palm still finds no room on most draws.
In Studio
Add a piece: the library drawer
- The set explorer's toolbar has Add a piece. It opens the library drawer over the view's
left side (
RwKitDrawer): the show's own kits first, then the library, kit by kit. Each piece is a tile with its picture, its name and its size. - The pictures are drawn in the show's style by the set builder, one a frame, offscreen
(
RwPieceThumbs). Each piece is built alone under a plain studio light and kept by its recipe. A model or picture brought in is drawn from its files under the show's folder, read over the service first in a browser (RwPieceThumbs.assets_for); the piece maker draws it the same way. What the drawer shows now is drawn first: pictures asked for in a frame go ahead of those asked for before, so the pieces words find are drawn next, not after the whole shelf. - The search box narrows by words (a piece's name, tags and description), and the shelf menu by kind of place.
- A tile dragged into the view stands the piece where the pointer meets the floor. A
double-click or Enter stands it in the middle of the view. Either way it goes as one
add_piece, the person's own change: shown at once, selected for the gizmos, and undone with Ctrl+Z. A viewer drops nothing. - New piece opens the piece maker on the show's own kit. Bring in brings a model or a
picture in (
RwImportDialog): the file is picked, its license is said, and it is sent withtakes.upload. It comes in throughimport_modelorimport_art, then stands in the set.
The piece maker
- A kit opens in the piece maker (
RwKitEditor), from Sets › Kits or from the drawer's New piece. - The left pane lists the kit's pieces and the chosen piece's parts.
- The view draws the piece live in an RwView3D, built by the set builder in the show's style and lit like the library's pictures. The part chosen glows so it can be found.
- The inspector holds the chosen part's fields: its place, its turn, what it hangs from, its material and its own sizes. Every number may be an expression of the params ("width / 2"). Under them are the piece's name, id, role, words and footprint ("Fit the footprint to the parts"), its set dressing rules, its params, its materials (a palette slot or a color of its own, and a finish) and its anchors (Add a seat, Add a standing place).
- Add a part offers every recipe primitive, with shapes and turned outlines to start from, copies in a row, and a decal. A piece starts blank, from a template (a table, a chair, a lamp, a shelf, a sign, a column, an arch), or as a copy of a library piece.
- Every change builds again at once. A part that cannot be built says why under the view.
- Save to the kit (Ctrl+S) is
save_piece, the person's own change. A library kit opens to look at only. A piece of it is saved as a copy into the show's own kit.
The lighting editor
- The toolbar's Lighting opens the editor over the view's right side
(
RwLightingEditor), on the preset the set is lit with. - Start from a look puts a library look on this preset or adds it as a new one
(
add_lighting, withonto). - Time of day is a dial of the hour (
RwTimeOfDay). The sun's day is the sky's (RwSkyModel.sun_elevation_deg): it rises at 6, stands highest a little after noon and sets at 19:30, as the library's dusk and sunset presets and the director's evening (until 20:00) have it. Around midday the sun keys the set from high and a little in front; at dawn and dusk the key is low, warm and dimmer; after dark the moon keys it, cool and dim, from upstage right. On release, the dial writes the key, fill, ambient, rim andtimeOfDay. - Color swatches and strengths set the key, fill, ambient and rim.
- Fog turns the air on, with its color, thickness and depth.
- Caustics turns on light rippling as under water, with its color, brightness, ripple size and speed.
- What glows lists the practicals, each with its color, strength, reach and flicker. Light the lamps lights every piece that glows, warm and close. Light the neon gives every neon sign a saturated color that reaches far.
- Each change is one guarded
revise_set, shown at once and undone with Ctrl+Z. - Its sections (Lights, Air, Shapes, Sky, Fade) also set gels, shadows, haze, the weather (rain,
snow, wind, fog banks), a gobo, shafts of light and the sky, and try a fade in the view
(
docs/design/lighting-mood.md, "In Studio" and "Weather").