USGS has no colour equirect for Europa/Callisto/Titan/Phobos/Charon, so those
mosaics shipped grayscale. Multiply each by its characteristic hue at render
(bodies.js `tint`; moons.js tint-preserving loader keeps the real surface detail,
adds the iconic colour — Titan orange, Europa/Charon tan, Callisto/Phobos warm).
Io/Ganymede/Triton stay true USGS colour (white multiplier). Flagged in CREDITS as
a directorial (non-data) choice per Part ω.2. User-directed ("colourise the moons").
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- source 8 public-domain equirectangular mosaics (io/europa/ganymede/callisto/
titan/triton/charon/phobos) from usgs astrogeology, downscale to 1024x512 jpg
(0.92 mb added total, each <=143 kb); credits.md lists source/mission/license
- bodies.js: texture field on the 8 sourced moon entries only
- moons.js: load textures via ctx.loadTextureInto (same path as planets.js, so
the moon's own 2k map also renders now); flat-color 404 fallback preserved
- moons.js tick: tidal lock rotation.y = 2pi*(jd-J2000)/period + pi (signed
period gives retrograde spin for free)
Stage 3. moons.js: 21 moons as lit spheres with local per-parent compression
(clear the exaggerated parent, ordering preserved), retrograde via negative
period. rings.js: Saturn textured annulus (true 74500–140220 km scaled with
parent) + Uranus thin schematic ring, tilted with axial tilt, DoubleSide. Moons
draw at the parent's exaggeration so Io/Jupiter ≈ 0.026 ratio holds. Label
visibility gated via CSS2DObject.visible (CSS2DRenderer clobbers div.style.display
every frame — fixed). Gate: Galilean laps 1.00:0.50:0.25 (1:2:4), Triton
retrograde (Δθ<0), moons ordered io<europa<ganymede<callisto.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>