# KJR-7 SKYLINE NEWS — “CONTACT: COLOSSAL ORGANISM”

A single-page Three.js scene presented as a **live disaster news broadcast**: a huge
bioluminescent jellyfish walks through a rainy neon city at night on eight very tall,
thin, jointed legs — while four live camera feeds, a HUD and an event log report on it.

Everything is generated in code: geometry, shaders, materials, HUD graphics and the
event text. There are **no external models or textures** (the only local asset is the
pinned Three.js build).

```
index.html          markup + broadcast HUD (HTML/CSS) + boot
js/util.js          maths, seeded RNG, shared uniform block, quality tiers
js/glsl.js          shared GLSL: hashes/noise + the city lighting model + fog
js/city.js          towers, neon signage, street lamps, traffic, emergency units,
                    sky dome, rain-slicked reflective streets (procedural cubemap)
js/creature.js      the jellyfish: pulsing translucent bell, tentacles, oral arms,
                    photophores, and eight IK-driven jointed legs with a walking gait
js/weather.js       GPU rain streaks, splash rings, spray bursts, searchlight shafts
js/feeds.js         four camera directors (aerial / street / helicopter / rooftop)
js/broadcast.js     clock, coordinates, telemetry, ticker, minimap, event log, glitch FX
js/main.js          renderer, viewport layout, simulation loop, adaptive quality
vendor/three.min.js Three.js r160 (pinned, UMD build)
```

## Running

Open `index.html` directly (it works over `file://`) or serve the folder:

```bash
python3 -m http.server 8000    # then browse http://localhost:8000/index.html
```

Three.js loads from `vendor/three.min.js`; if that file is missing the page falls back
to the pinned CDN build (`unpkg.com/three@0.160.0`).

## What is on screen

* **Program feed (CAM 01, aerial wide)** – full-frame, slow orbiting crane shot that
  keeps the creature framed, with handheld shake and hard “shot changes”.
* **CAM 02 street level** – cuts between looking up the avenue canyon at the bell and a
  low tracking shot down the wet street; the creature’s feet always plant in the
  avenues between the towers, throwing splash rings and spray.
* **CAM 03 helicopter** – high orbiting feed with a sweeping searchlight whose beam and
  ground spot move with it.
* **CAM 04 rooftop** – fixed on a tower roof chosen for a clear line of sight, with two
  floodlight shafts aimed at the creature.
* **HUD** – channel logo, flashing red `LIVE` badge, clock + timecode, coordinates and
  grid/sector readout, “bio-signature” telemetry (bell pulse, bioluminescence, mass,
  altitude, stride rate, contact points, threat index), a tactical sector map with a
  radar sweep, a `BREAKING` banner, a scrolling news ticker and the timestamped
  **event log** that fills in as the creature crosses the city.

## Simulation notes

* The bell pulse (≈11–13/min) drives a contraction wave through the bell geometry, tugs
  the tentacles, modulates the bioluminescence of the whole creature, and is exported to
  the city shaders as a moving point light — the creature genuinely lights the rain,
  the towers and the wet streets.
* Legs use 2-bone IK with an arthropod-style outward/upward pole; a foot may only step
  when it has fallen behind and its gait group is free, so the walk reads as slow,
  deliberate strides.
* Street lighting is not a Three.js light list: the eight light sources nearest the
  creature (street lamps, idling patrol cars, passing headlights) are packed into a
  uniform block that every custom shader samples, together with the emergency strobes,
  the moon, the ambient skylight and exponential fog.
* Wet asphalt reflects a procedural cube map that is re-rendered as the creature moves,
  plus analytic lamp pools, triplanar ripple distortion and rain rings.

## URL parameters (optional)

| parameter | effect |
|---|---|
| `?t=40` | fast-forward the simulation before the first frame (default 15 s warm start; `?t=0` starts cold) |
| `?q=low\|med\|high` | force a quality tier (otherwise adaptive) |
| `?feed=main\|street\|heli\|roof\|city` | render a single full-frame feed (debug) |
| `?streetmode=0\|1`, `?streetd=340` | force the street camera framing / distance |
| `?freeze=1` | run the renderer without advancing the simulation |
| `?frames=N` | stop after N frames (used for deterministic screenshots) |
| `?aa=1` | enable MSAA |
| `?seed=123` | reseed the procedural city |
