Contents

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 optional palette (the colors its pieces' @slots default to), pieces (KitPiece, the same shape as a SetPattern's kit) and looks (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 of min to max within radiusM (kelp, rocks, crates), each turned by up to yawJitterDeg.

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), uniformly scaled, with its boundsM written in, so layout and footprints never read the file.
  • picture: a frozen picture standing up, sizeM wide 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. A sky_gradient.v1 sky 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 first light anchor (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 byteStride or 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, f in every index form and negative indices, polygons fanned into triangles, usemtl parts (o and g ignored), and its .mtl beside 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 MTL d) 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 to heightM; 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 as assets/<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.ts modelPiece): id and name from the file's name unless given, role (furniture by default), "Brought in from : N triangles, W × H × D m.", a scale param (1, from 0.1 to 10), footprintM its bounds times the scale, a material slot per part (<piece>_<material>, defaulting to its own @slot), one mesh node, a stand anchor 0.42 m in front of it facing it, place on the floor and tags from 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%) with set becomes that set's 360° backdrop through the import_asset path (its first backdrop, or a new one called backdrop), 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.
  • widthM and heightM size 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:

  1. 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_KINDS says, 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.
  2. 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).
  3. 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.
  4. 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).
  5. Indoors or out as the heading's INT. or EXT. says, else the words ("inside", "the front of"), else its kind; never the other.
  6. 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.
  7. 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:

  • thingsIn reads 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 a set.piece_not_made warning ("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 with takes.upload. It comes in through import_model or import_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, with onto).
  • 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 and timeOfDay.
  • 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").