The office learns where it stands, and the sky stops being a backdrop
**Aircraft actually move now, and the reason they did not is the headline.**
`HttpFlights` holds a frozen snapshot between network refreshes and is
polled at 1 Hz, so a live feed handed the layer the same position five to
fifteen times and then jumped. `span` therefore measured the poll interval
rather than the gap between the two positions that differ, the teleport
test saw an airliner covering 36 units in a "second" against a ceiling of
8, and **every live track's history was wiped on every refresh** — so no
aircraft on the deployed site could ever grow a trail, however long
TRAIL_POINTS was set. Skipping the repeat fixes the motion and the trail
at once. Trails then go to 72 points / 240 s, which is about seventy
seconds of flying.
Three more defects in the same file, found while looking: trail
truncation dropped the segments nearest the aircraft (leaving a streak
with no aeroplane attached), MAX_TRACKS was declared and never enforced,
and one missing target deleted its whole trail. The buffer now uploads
only what it wrote, rather than 46 MB/s of untouched array.
**You can get above the constellation.** Dome to 1.05 board *radii* and
the orbit to 2.0 spans. Radii, not spans: scene space is centred on the
city and the Bay Area board runs forty kilometres down the peninsula, so
the furthest corner is 0.94 spans out where the half-diagonal is 0.65 —
sized off the half-diagonal the dome sat inside its own city. The far
plane goes to 4 spans to stop clipping the sky from off-centre chapters,
and `PointsMaterial` defaults `fog: true`, which was quietly dimming the
whole constellation with the city's haze.
**An office can say where it stands.** `Office.site` — lat, lng, height
above the ground outside, and the compass bearing the pack's −Z points
along — and with one it gets the same sun the city does, a sky, and a
horizon at `-elevation`. CONTRACT §4 reserved this as "a later
refinement"; it is taken up rather than overturned, and `daylight.ts`
computes no light of its own. It does the two things a room needs that a
map does not: turn the sun into the building's frame, and move the fog
outdoors before it greys out the far wall.
Two buildings now, and they are deliberately unalike: Lumbridge HQ 188 m
up a Transbay tower facing 205°, and **Frontier Valley**, a startup in a
hangar at Alameda Point — one room, 54 x 30 m, nine metres to the
trusses, four metres above reclaimed ground.
Floor-to-floor in the reference pack is now 16.8 m: the interstitial is
ten times a real one, so the space between the slabs is somewhere things
can hang. It is frankly not architecture, `PLENUM` is the one number to
change, and the file says so.
Also fixed, all found by review rather than by looking at the screen:
- `sun.shadow.camera.updateProjectionMatrix()` was never called, so
three's default ±5 unit box has been in force this whole time and
every `shadowExtent` this repo passes — including the city's ±752 —
has been silently ignored.
- A missing aircraft was kept alive by the new grace period and *drawn*,
so it froze in mid-air at full opacity for 32 s.
- Frontier Valley's mezzanine was a `Room`, which carries no height: its
slab lay on the concrete, its chairs floated 4.4 m over it, and its
balustrade fenced off a patch of ground floor. It is a `Level`.
- Overlapping floor slabs z-fought. The format permits overlap and
resolves later-first, so `shell.ts` now lifts a slab a hair per
earlier slab it overlaps — and by nothing at all in a pack, like the
reference office, whose rooms only ever abut.
- `switchOffice` bypassed the `entering` guard (leaking a whole scene
per double-click) and tore down the old room before knowing the new
one would load, with no way back.
Known and not fixed: raising MAX_SPAN to 30 s doubles the worst-case
re-base snap when a feed's gap shortens. It is bounded, pre-existing in
kind, and the fix wants carrying the live head into the next leg.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+22
-3
@@ -154,9 +154,28 @@ constructed and mutated the same three lights.
|
||||
LightingState`, which the scene applies. One direction, no write-backs.
|
||||
- Solar position is computed locally with **no network** — a NOAA/Meeus
|
||||
implementation in `src/engine/solar.ts`, dependency-free.
|
||||
- An **office gets no Atmosphere**: `fog: null`, no `scene.background` drive,
|
||||
interior lighting is its own fixed rig. Daylight through windows is a later
|
||||
refinement, not a v1 coupling.
|
||||
- An **office with no `site` gets no Atmosphere**: `fog: null`, no
|
||||
`scene.background` drive, interior lighting is its own fixed rig. This is
|
||||
still the default and still the promise — a pack can be authored, rendered and
|
||||
shared without owning a coordinate, an account or a network.
|
||||
- **An office that declares a `site` gets the same sun the city does.** This is
|
||||
the "later refinement" this clause reserved, taken up rather than a reversal of
|
||||
it: `Atmosphere` is still the sole light owner and there is still one direction
|
||||
of flow. `interiors/daylight.ts` adapts what `apply()` returned; it computes no
|
||||
light of its own.
|
||||
|
||||
Two things are true only indoors, and they are the whole of the adapter:
|
||||
|
||||
- **The building is rotated.** `Atmosphere` works in the city's frame, where
|
||||
−Z is north because a city pack is a map. `OfficeSite.heading` is the bearing
|
||||
the pack's −Z actually points along, and the sun is turned by it — otherwise
|
||||
"the daylight side" in a pack's comments is a label rather than a fact.
|
||||
- **The fog starts outside.** A city fog beginning 1,150 units away is fine at
|
||||
94 m per unit and is *inside the room* at 1 m per unit. The colour is kept
|
||||
and the distances are replaced.
|
||||
|
||||
A sited office also gets a `sky` and a ground plane at `-site.elevation`, which
|
||||
is what makes 188 m up a tower feel different from 4 m above an airfield.
|
||||
|
||||
## 5. One server
|
||||
|
||||
|
||||
Reference in New Issue
Block a user