Venues: song sky, ride roadside, room camera, filmstrip venue pin

- Shared sky dome (src/venues/sky.js): gradient backdrop from palette /
  section light / style texture, wired into chamber/stage/ride with fog
  matched to the dome mid colour — replaces clear-to-black
- Ride roadside: houses, signs, trees, seeded viz billboard, all analytic
  scroll; popMul fade for crew, arrangement-gated roadside (no mid-section
  popping); parked idle creep + engine shake; analytic dash clock
- Room camera: traverse glide + progress look sweep + per-section dolly,
  single-side room visits, one re-hang max; venue framing per archetype
- Filmstrip venue selector (?venueSel=) with cache key; seed persisted to
  URL on reroll; gallery query plumbing
This commit is contained in:
Dejvino
2026-09-18 18:57:04 +02:00
parent 46fab512df
commit 9c768f13d1
10 changed files with 604 additions and 60 deletions
+16 -1
View File
@@ -7,6 +7,7 @@
// Primitives only in V1 — no glTF kit.
import { actorToGeometry } from '../actors/meshes.js';
import { buildSky, paintSky } from './sky.js';
export const chamber = {
name: 'Chamber',
@@ -212,6 +213,11 @@ export const chamber = {
scene.fog = new T.Fog(0x0e0e12, 12, 28);
scene.userData.transparentBackground = true;
// Song sky above the open room — replaces clear-to-black. Radius 90
// clears the 22-unit room with margin; fog melts the horizon.
const sky = buildSky(T, { radius: 90 });
scene.add(sky.mesh);
// Population container — memories
const popGroup = new T.Group();
popGroup.name = 'memories';
@@ -221,6 +227,7 @@ export const chamber = {
room, floor, floorMat, wallMat, walls, windowMesh, windowMat,
reflection, reflectMat,
ambient, sun, fill,
skyMesh: sky.mesh, skyMat: sky.mat,
popGroup,
seed,
venueSpec: venueSpec || null,
@@ -305,6 +312,12 @@ export const chamber = {
}
}
// Song sky + matched fog. The sky replaces clear-to-black; fog takes
// the dome's mid colour so the horizon melts instead of banding.
paintSky(instance.skyMat, {
palette: pal, light: roomLight, style,
seed: instance.seed,
});
// Fog via space + story: resolution (fog 0.55) closes the room in,
// climax (0.18) opens it. Swing near AND far so the depth change reads.
if (scene.fog) {
@@ -312,7 +325,9 @@ export const chamber = {
const fogDepth = (space ? 12 + space.depth * 6 : 15) * (0.7 + fogMul * 0.75);
scene.fog.near = fogDepth;
scene.fog.far = fogDepth + 10 + fogMul * 10;
scene.fog.color.setRGB(c0[0] * 0.06, c0[1] * 0.06, c0[2] * 0.08);
const mid = instance.skyMat ? instance.skyMat.uniforms.u_mid.value : null;
if (mid) scene.fog.color.copy(mid);
else scene.fog.color.setRGB(c0[0] * 0.06, c0[1] * 0.06, c0[2] * 0.08);
}
// Rebuild population if needed (deterministic, seeded). The arrangement