Ride: venue-owned camera (directCamera) + sidewalk passerby shot

Camera architecture: a module with directCamera:true drives its own rig
inside update() (analytic f(timeline, seed, framing, venueState)); the
shared rig is ignored for that layer only. ModelLayer prefers own camera,
Show skips shared injection. Ride migrates its full grammar over
(traverse, orbit, car tracking, jumps, clamp); Compositor ride branches
removed. Chamber/stage unchanged on the shared path.

Sidewalk shot: new ride-only 'passerby' plan target (breaths only, never
climax, never twice running) plants a static roadside camera; the module
drives the car +12 to -14 on driveT with the world frozen. Verified
far-pass-away through the Show path; lint + 24 tests green.
This commit is contained in:
Dejvino
2026-09-19 07:34:48 +02:00
parent 4b0f27da9a
commit 822f4b12ef
6 changed files with 306 additions and 79 deletions
+8 -5
View File
@@ -436,11 +436,14 @@ export class ModelLayer extends Layer {
const { timeline, features } = ctx;
const w = target ? target.width : renderer.width;
const h = target ? target.height : renderer.height;
// Use the compositor's shared camera when it has been injected; it is
// updated centrally from ArcDriver's framing/gaze so every model layer
// shares one perspective and one depth, and a ground in one layer can
// occlude a subject in another.
const cam = this.sharedCamera || this.camera;
// Who drives the camera: a module with `directCamera: true` owns its
// own rig outright — it drives `camera` inside update() and the shared
// rig is ignored for this layer. Everything else borrows the shared
// camera when injected (updated centrally from framing/gaze so model
// layers share one perspective and one depth buffer), else its own.
// Direct control is analytic like everything else: f(timeline, seed,
// framing, venueState) — seek === playback still holds.
const cam = (this.module.directCamera ? this.camera : (this.sharedCamera || this.camera));
if (cam.aspect !== w / h) {
cam.aspect = w / h;
cam.updateProjectionMatrix();