Changelog

All notable changes to tosijs-3d. This project is pre-1.0 (0.x), so minor versions may carry breaking peer-dependency changes — each is called out in a ⚠️ Breaking block in its version section below, with what a consumer must do.

0.9.0

A sea that knows its shore, and a temperature that means one. The water takes the depth and the distance to land from the terrain and draws surf that runs in, pale shallows and sea ice; solid ice is solid for everything in the scene. Temperature is now a real scale (0 is 0 °C, 1 is 50 °C), so the same dial reaches Titan and Venus.

Size: barrel (min, packages external) 948.5 KB raw / 318.9 KB gz, +1.75% on 0.8.15 (the shore model and its shader).

⚠️ Breaking

Changed

Added

Fixed

0.8.15

Rocks and trees that belong to the land. Procedural rocks, Quaternius trees gathered into copses, and a biome shader that colours vegetation by the ground under it and by the season: autumn colour, bare winter branches, snow.

Size: barrel (min, packages external) 932.0 KB raw / 313.0 KB gz, +1.85% on 0.8.14.

Added

Changed

Fixed

0.8.14

Ambient occlusion that works in a headset, and it is the default.

Changed

Added

Fixed

0.8.13

A schema for <tosi-b3d> itself, and an emulated headset in the repo.

Added

0.8.12

0.8.11's ambient occlusion broke VR, and this takes it out of the headset. Also: headset popups can be dragged and closed, and a model no longer shields itself from a blast. The headset fixes were verified in an EMULATED headset (a fake WebXR device in headless Chrome), not yet on a device.

Fixed

Changed

0.8.11

Ambient occlusion. One attribute on <tosi-b3d>, off by default. Checked flat; always (the in-headset setting) is not yet verified per eye on a device, and this release is partly so that it can be.

Added

0.8.10

Two fixes from manta's orbit stage, and the doc site has shadows again without a workaround. Glow no longer whites out the frame under a fading full-screen mesh, and the skybox leaves the background colour alone for a camera that cannot see it. tosijs-ui 1.16 loads the doc site once, which was the cause of ensemble's Cannot redefine property error and our missing doc- site shadows.

Size: barrel (min, packages external) 898.6 KB raw / 300.6 KB gz, +0.05% on 0.8.9.

Fixed

Changed

Added

0.8.9

What ensemble was waiting on, and a safer publish. Schemas for the moon, the weather and decoration elements and sound, with sections, so a schema- driven editor can offer the weather; inputField no longer leaks; fetched attributes refuse anything but a string. And the publish now runs under the practices template where only a code-free job can hold the npm credential.

Size: barrel (min, packages external) 898.1 KB raw / 300.5 KB gz, +0.6% on 0.8.8.

Added

Fixed

Security

0.8.8

Adopter fixes and folding everywhere. Aircraft no longer crash into explosion debris, b3d-planet survives high detail, and bomb and missile blasts can be sized to a game's world (all from manta-recon). Any panel can now fold or tab its sections (foldSections, from ensemble), and tabs fit better when space is tight.

Size: barrel (min, packages external) 891.7 KB raw / 298.6 KB gz, +0.1% on 0.8.7.

Added

Changed

Fixed

0.8.7

Panels that fit. The scene panel caps itself to the space it has, and its sections can fold or become file tabs, captions or icons, with the overlap and stacking of real file tabs. Land and Sky uses icon tabs and a preset menu. Also: a security pin for a build-only dependency.

Size: barrel (min, packages external) 891.2 KB raw / 298.3 KB gz, +0.7% on 0.8.6.

Added

0.8.6

Other worlds. Land and Sky becomes a world builder: presets you pick, save and share, with Earth, Mars, Venus, the Moon, Io and Titan built in. A crater field landform, volcano fields, ground palettes, sea colours, and a sun whose size and brightness follow the world. Lightning casts shadows and darkens the day, and the aircraft demo has weather to fly in.

Size: barrel (min, packages external) 885.2 KB raw / 296.3 KB gz, about +0.3% on 0.8.5.

Added

Fixed

0.8.5

Weather you can watch. Storms that darken the day and strike: lightning that lights the cloud from below, inside and above, lights the landscape and throws shadows, with thunder at the speed of sound. Shafts of sun through a broken sky, and the sky and sun seen through the water from below, with rays fanning down from them. Rain and snow from the weather, the wind carrying aircraft and buffeting them in a storm. And two long-hidden bugs: the cloud deck's local weather was mirrored north-south, and on the doc site no shadow map had rendered at all.

Size: barrel (min, packages external) 883.2 KB raw / 295.6 KB gz (+5.7% gz), for lightning, light shafts, weather cells, trails and caustics.

Fixed

Added

Fixed

0.8.4

A sky you can actually see the stars in, and a world with things growing on it. The encoded sky is decoded exactly (sharp points, not smeared blobs), twinkles, and is rebaked from the new voxel galaxy — one galaxy implementation now, with stable star addresses and a biased "interesting stars" population. Worlds get their own air and dust (a black noon on the Moon, a butterscotch Mars), cosmetic extra moons whose phase follows the sun, and render resolution follows the display by device tier. <tosi-b3d-decorator> scatters rocks and trees by budget and biome, with near-only shadows and colliders. Plus a batch of adopter fixes (ensemble's #76–#91, touch-orbit #52) and review follow-ups, and the first release through the OIDC + staged publish flow.

Size: barrel 837.8 KB min (+5.6%) · 279.6 KB gz (+6.3%); dist total 1.30 MB gz (+4.3%).

Visible, not breaking: every PRNG-seeded output re-rolls (xoshiro128** replaces the Mersenne Twister), so a given seed produces a different galaxy, star system, cloud field, crowd and spawn sequence from 0.8.3 — "same seed, same battles" holds within 0.8.4, not across the upgrade. The shipped sky is rebaked (and now served from a versioned URL). Deprecated names still work and warn once: generateGalaxy (use voxelGalaxy), onEnter/onExit on the trigger, handleChange/handleCommit on the manipulator (whenChange/whenCommit). registerIcons now refuses markup that can run.

Fixed

Added

Changed

0.8.3

A galaxy that costs nothing per frame, a sky that keeps the right time, and clouds that light like clouds. Galaxy billboarding moved into the vertex shader (3.19 ms → ~0.02 ms of CPU per render). The sun now runs a northern arc, ignores starfieldTilt, and a skybox without a sun still knows it is night. The cloud deck's silver lining finally faces the sun, and fair-weather cloud is white from below and outshines the sky at its thinnest. The kitchen-sink demo is now Land and Sky.

Visible, not breaking: scenes tuned by eye will look different. The sun crosses the SOUTH at noon (it crossed the north), the tilt no longer lifts or drops it, the moon rides the night arc, cloud undersides are brighter and their rims glow toward the sun rather than away from it, and a volcano grows a basalt apron. No component API was removed, but two paths moved: the kitchen-sink demo module tosijs-3d/world-sim is now tosijs-3d/land-and-sky (a side-effect-only demo, not a library entry point), and the unused 2048 reference sky (/sky/default_*.png) is no longer served — it lives in reference/sky/ in the repo.

Added

Changed

Fixed

Deprecated

0.8.2

Added

Changed

Fixed

0.8.1

⚠️ Breaking

Nothing breaks at compile time. Two behaviours change, and Migration.md has the before/after for each.

Changed

Fixed

A second headset pass found the rest of these. Between the two, every one was invisible to a green suite — and the ones on panels were all reproducible flat, which is now written down rather than re-learned (CLAUDE.md, "A PANEL IS NOT A HEADSET-ONLY SURFACE").

Five of these came from one headset pass on the terrain editor, which is the argument for RELEASING.md step 5a in one paragraph: every one of them was invisible to 2300 passing tests, and the first was invisible to a day of reading the source.

Added

0.8.0

Lights, editors, and the schema surface tosijs-3d-ensemble asked for — plus the two renames that were waiting for a minor.

⚠️ Breaking

Added

Fixed

Changed

0.7.8

Lights you can see, edit and animate — and the editor surface tosijs-3d-ensemble asked for, built to their spec so they can adopt it without writing widgets.

Added

Fixed

Changed

0.7.7

A lifecycle release. <tosi-b3d> now distinguishes being moved from being removed, which fixes an engine leak and a scene-corruption bug that were the same root cause seen from two ends.

Fixed

Added

0.7.6

An adoption-feedback release: everything here came from tosijs-3d-ensemble hitting it for real.

Fixed

Changed

0.7.5

Added

Changed

Fixed

0.7.4

Added

terraces, plateau, smooth edge, abrupt edge, messy circle`. "ease in-out" describes a graph; "smooth edge" describes a province.

Fixed

0.7.3

Added

Changed

Fixed

Added

0.7.2

Fixed

Added

0.7.1

Fixed

Added

0.7.0

Prereleases, and why the numbering looks backwards. 0.7.0-rc.1 was cut first, then work continued as -beta.1…beta.6. Semver sorts beta BELOW rc, so bun add tosijs-3d@next wrote ^0.7.0-beta.6 and RESOLVED BACKWARDS to the older rc.1 — silently, and bun update even reported the downgrade as an upgrade. Publishing 0.7.0 is what un-inverts the channel, since it sorts above every prerelease.

The rule taken from it: a prerelease channel never moves backwards — the successor to -rc.N is -rc.N+1, never a beta. If you pinned any ^0.7.0-beta.* or 0.7.0-rc.1, move to 0.7.0.

  • 0.7.0-beta.6 (2026-08-17) — carved landforms (the sdf-lattice page, the volcano cutaway, strata, 3D volcanic veins), portal math, and four manta-reported fixes: the explode+library crash that seized the scene (#24), mutual death eating the panel (#25), blasts blind to library destroyables (#28), and pitch authority becoming configurable and asymmetric (#26).
  • 0.7.0-beta.5 (2026-08-15) — MediumOptics + fogLayerFor (⚠️ experimental, not load-bearing: water publishes its optics but still computes its own fog layer). Otherwise identical to beta.4 — the rest is design notes.
  • 0.7.0-beta.4 (2026-08-15) — the medium primitive (space/air/water/ mercury, plane or sphere), medium-aware projectiles closing #13, and pause marked EXPERIMENTAL pending a headset.
  • 0.7.0-beta.3 (2026-08-15) — pause (backgrounding, start-paused, the VR entry gesture, a centred panel), the stick-sign contract test + kind, and four more manta reports: #17/#18 ambient spawn bias, #19 authored projectile meshes, #22 destroyable library models. Plus the HUD circle's portrait sizing and both panels' camera/viewport fixes.
  • 0.7.0-beta.2 (2026-08-15) — adds #13's missile-guide composition, the gear gadget for the glass gamepad, and the live fade. #14 investigated and NOT changed: the glass source measures correct on desktop from four independent angles, so no sign was flipped (see the issue).
  • 0.7.0-beta.1 (2026-08-14) — everything below, including the four manta-recon issues fixed that day: #9 (crashed aircraft eats input) and the b3d-death latching bug behind it, #10 (aircraftMapping ignored its config), #11 (probe and ambient watchdog measuring during load), #12 (the sky ignored the water you were under).

Aircraft that fly like aircraft, and the substrate for volumetric terrain. No peer-dependency changes, but this is a behaviour release: the throttle, the right stick and the on-screen gamepad all work differently, and one attribute was renamed. Read the ⚠️ Breaking block before upgrading a scene that was tuned around the old feel.

⚠️ Breaking

Added

Changed

Fixed

0.7.0-rc.1

Published to npm under the next tag on 2026-08-13, superseded by 0.7.0. Everything in 0.7.0 above applies, with two differences that matter if you installed it:

It was tagged before the pre-release review ran, deliberately, to get it into an adopter's hands sooner. The review found no blocker in the shipped behaviour; what it found were the two release-artifact gaps above.

0.6.2

Terrain gets volcanism and authored landforms, clouds get real shapes, and a systemic timing bug that made half the engine run in slow motion is fixed. Additive only — no API removals, no peer-dependency changes. (The full terrain-system upgrade lands as 0.7.0 once its remaining pieces are in.)

Added

Fixed

0.6.1

First consumer-reported fixes — both filed by manta-recon (tosijs-3d's first external adopter) with root-cause analyses read from the 0.6.0 dist. No API changes.

Fixed

0.6.0

Cut as rc.1 → rc.3 (each reviewed; rc consumers see the per-rc sections in git history), finalized after the nine-lens review's follow-up fixes landed.

The SVG UI surface release: a first-class, VR-ready UI substrate — container, overlay, widgets seam, table, keyboard — plus the interaction contracts that make the same surface work identically in the DOM, on a 3D plane, and under an XR controller ray. No peer-dependency changes.

Added

Changed

Fixed

Added (post-rc, from the review follow-ups)

Fixed (post-rc)

⚠️ Changed

0.5.2

⚠️ Breaking — peer dependency (tosijs ≥ 1.7.8)

Added

Changed

Fixed

0.5.1

⚠️ Breaking — renamed public methods (on* → add*Listener / handle*)

No peer-dependency changes this release. The break is a method rename: tosijs's elementCreator treats any on<Event>-named member as addEventListener sugar and shadows a component method of the same name (it now fires a live warning, and it was a latent bug — the handler silently never ran). So the multi-listener subscribe methods and the lifecycle hooks moved off the on* prefix. The new names are also more honest: the subscribe methods push to a listener list (add/remove semantics), not a single-handler setter.

Old (0.5.0) New (0.5.1) On
onSceneAddition / offSceneAddition addSceneListener / removeSceneListener B3d (scene owner)
onOriginShift / offOriginShift addOriginListener / removeOriginListener B3d (scene owner)
onGainFocus / onLoseFocus handleGainFocus / handleLoseFocus B3dControllable
onButton handleButton TouchGamepadSource, B3dGamepad

What a consumer must do: if you wrote a custom scene child that called owner.onSceneAddition(cb) / owner.onOriginShift(cb), or subclassed B3dControllable and overrode onGainFocus/onLoseFocus, or a gamepad source with an onButton callback, rename to the new members. It's a pure rename — signatures are unchanged. Built-in components are all migrated; this only affects code you wrote against these surfaces.

Added

Changed

Fixed

0.5.0

⚠️ Breaking — peer dependencies

Added

Changed

Fixed