Skip to content

2.3.0 — The ground, rebuilt

Choose a tag to compare

@github-actions github-actions released this 07 Aug 22:48
· 294 commits to main since this release

The ground, rebuilt as a quadtree

The 3D world is no longer a fixed window of tiles chasing the model — it is the design Google Earth and Cesium use: a quadtree of web-mercator tiles, split wherever their geometric error would show on screen, so the camera decides where the detail is. Coarse roots cover the whole region for pennies; leaves are metre-sharp under the model; a fast traverse can no longer fly off the edge of the loaded world.

Velebit, replayed Traffic, live
velebit traffic
  • Cold start: ground in about a second, first pictures right behind it, full sharpness a breath later through a stepped ladder. Warm view switches in milliseconds.
  • Pictures live under a real budget. The cache answers at the size it was asked — it used to hand back the sharpest picture it held, which quietly put the card 40% over budget and starved the tiles you were actually looking at.
  • Detail chases the view: tiles behind the camera split reluctantly and stay covered by the roots, so a turn shows soft ground that sharpens instead of a hole.
  • 120 Hz steady on the test phone, worst frames in the tens of milliseconds, memory bounded and measured — no lock-ups under fast panning, scrubbing, or view switches.

Data that heals itself

  • The elevation dataset has holes — whole columns near the Velebit flight start answer a 270-byte void at two zoom levels while the level below is whole. The ground now builds from the level below the damage instead of failing every thirty seconds forever; each step down is named in the diagnostics.
  • A failed fetch is not a hole in the data: no signal keeps the old road — retry and end sharp — instead of settling for coarse ground.
  • S3 throttling a burst of elevation requests is no longer remembered as "these tiles do not exist" for the rest of the run.
  • Watermark "no imagery" tiles are told apart from snowfields; incomplete fallback mosaics are never cached under the sharper name they failed to be.

One flight, two arrows, three lines

The lines and their settings were rebuilt around what each one means, the same in both views:

  • Home line (blue, like the arrow it stands on): drone to where this phone is now, live and during playback — for walking to a downed model, so it draws on top. Hidden with the arrow.
  • Show recorded operator is one switch for the whole idea: the orange arrow where the operator stood as recorded, its accuracy ring, and the operator line from the drone to it — playback only, together on or off, with the colour settings greyed out under it.
  • Every line is hidden with its arrow — a line pointing at nothing points at nothing — and settings apply the moment you come back from them, over a paused replay too.
  • "Record operator position" writes your position into the flight log so the operator can be drawn at replay; turning it off silences the rows rather than repeating the last place forever.

Traffic in 3D

Flightradar24 aircraft were an orange cross on a post. They are now small planes at their true altitude, pointed down their track, on the same ground post — height over ground is the thing a flat map cannot say. Tap one and it answers with the same card the 2D marker shows: type, registration, altitude, speed, route. Barometric altitude near high ground is floored just above the terrain, so no aircraft is drawn inside a hill.

The phone knows where it stands

  • The one location listener lives in the service that outlives the screen: a connected flight records your position and heading with the phone in your pocket, which the screen-owned listener never could.
  • The last fix survives the screen going away. Coming back from the settings or another app, the arrow stands exactly where it stood — ring and all — instead of wandering while the satellites are asked again.
  • Nothing listens in the background without a link: no flight, no location icon.

Also in here

Playback starts by itself only when its switch says so, and holds on the ground until the terrain is dressed. Scrubbing is coalesced to what the screen can show. Field diagnostics write one named file per app start — debug builds only, coordinates stay off release phones — and every failure the terrain can have now logs its tile and its reason, which is how most of the above was found.

Re-released in place with three late fixes: the disk caches got ceilings — two gigabytes all told (1000MB imagery squares, 625MB mosaics, 375MB heights), oldest out first, where the squares previously grew without bound; tiles bordering the elevation dataset's damaged stripe stopped being rebuilt forever for data that was never coming; and the setting is Model color now, because it colours the quad and the helicopter too.