diff --git a/flow-state/DESIGN.md b/flow-state/DESIGN.md index 8f463fa..619b629 100644 --- a/flow-state/DESIGN.md +++ b/flow-state/DESIGN.md @@ -127,6 +127,11 @@ Actors and objects change only at camera cuts: - Model layers share one `Compositor` perspective/depth rig; shader depth stays faked. Venue rooms are furnished with the track's monolith body so the room reads as this track's place. +- With a room present the viz plays ON its screens (window/wall/radio), + never composited over it; model viz additionally stand in the shared + world for shared-rig rooms. A `directCamera` room (ride) owns only its + own rig — the shared rig keeps the subject grammar, or the viz is filmed + through a room camera meant for another world and vanishes. ## 8. 3D on the same terms diff --git a/flow-state/src/Show.js b/flow-state/src/Show.js index dfb204e..b453a40 100644 --- a/flow-state/src/Show.js +++ b/flow-state/src/Show.js @@ -245,14 +245,23 @@ export class Show { // relocates only on story jumps and otherwise holds, while the viz // framing cuts at every shot. Feeding the viz framing to the room // is what threw it around at every section. See _venueFramingAt. - const framing = hasVenue && this.look.venue + // A venue that drives its own rig (directCamera) owns only its own + // camera: the shared rig keeps filming the viz subjects with the + // subject grammar and the viz's own framing. Sending a directCamera + // room down the venue path films the viz through a room camera + // grammar meant for another world — the subject vanishes. See + // Compositor._updateVenueCamera. + const venueForCamera = hasVenue && this.look.venue && + !(this.look.venue.module && this.look.venue.module.directCamera) + ? this.look.venue : null; + const framing = venueForCamera ? this.arc.venueFramingForFrame(timeline.frame) : this.arc.framingForFrame(timeline.frame); this.engine.compositor.updateSharedCamera({ framing, personality: pers, time: timeline.time, - venue: hasVenue && this.look.venue ? this.look.venue : null, + venue: venueForCamera, journey: this.arc.state ? this.arc.state.journey : 0, // Continuous 0→1 across the video. The story journey travels in // held stages (right for narrative, wrong for a camera dolly — diff --git a/flow-state/src/debug/battery.js b/flow-state/src/debug/battery.js index e97e4f6..e854d4b 100644 --- a/flow-state/src/debug/battery.js +++ b/flow-state/src/debug/battery.js @@ -109,11 +109,10 @@ export const SCENARIOS = [ }, { title: 'venue × viz pins', - desc: 'One room, chosen viz behind it. The fastest way to review a venue change.', + desc: 'One room, chosen viz in it: fragment viz play on the room\u2019s screen, model viz stand in the shared world. Combos picked so the viz actually reads — a dark or sparse viz on a small screen is invisible, which is how a dead pin hides. (Ride is excluded: its viz lives on the dash radio, too small to review here.)', links: [ - ['Ride + corridor', `/venue-gallery.html${q({ venueSel: 'Ride', viz: 'Synthwave Corridor', rows: 2, cols: 3 })}`], - ['Chamber + swarm', `/venue-gallery.html${q({ venueSel: 'Chamber', viz: 'Swarm', rows: 2, cols: 3 })}`], - ['Stage + pylons', `/venue-gallery.html${q({ venueSel: 'Stage', viz: 'Pylon Field 3D', rows: 2, cols: 3 })}`], + ['Chamber + Kaleido', `/venue-gallery.html${q({ venueSel: 'Chamber', viz: 'Kaleido Tunnel', rows: 2, cols: 3 })}`], + ['Stage + Assembly', `/venue-gallery.html${q({ venueSel: 'Stage', viz: 'Assembly', rows: 2, cols: 3 })}`], ], }, {