Commit graph

60 commits

Author SHA1 Message Date
Admin
c460905e2a maps + route: the self-baking Amsterdam test map, reversible mkmap weave, the rtsmap generator, road faces, guarded first-run
Squashed from work:
- rtsmap: one seeded generator for tiled strategy maps
- map: bake a runnable Amsterdam test map from inside the route app
- route: the first-run test map starts itself, and its buttons are guarded
- map: the test map bakes its road faces too, from the same shared pass
- map_tiles: mkmap-extract — the weave is reversible, world-cells reconstructible from world.mkmap
- route: the local dispatcher rides the hub — its copied engine is deleted, limits preserved (aicore P1)
- route + converse: off makepad_ai — the Agent seam moves to converse, route's cloud dispatcher rides the hub's Claude p
- ai-hub: chats run the machine election — route to a serving holder, wait on a loading one, claim and publish when open
- libs: the zero-warning sweep — stitch casts say what they mean, xatlas keeps upstream's surface quietly
2026-09-01 16:46:33 +02:00
Admin
9d2e17e3b9 chore: README, workspace, agent docs, and the box-driving scripts
- README: a build quick-start for macOS and Windows, the honest Linux
    story, what CUDA is for and how to install the separation model.
  - AGENTS.md: the `--remote` control surface protocol, so the harness it
    documents is usable without reading platform/src/remote.rs.
  - Cargo.toml: workspace membership for the crates this series adds and
    removes.
  - tools/: the Windows box scripts (wincmd, winps and friends, winrun) and
    remote_smoke.sh — how a build gets driven on a remote machine.
  - apps/asset-server: the standalone server binary and its README.
  - Small follow-ups in libs/{windows,apple_sys,makepad_test,mbtile_reader,
    converse} and apps/route, plus .gitignore and makepad.splash.
2026-08-23 01:34:36 +02:00
Admin
6d708d9391 Clean the public tree for a checkout other people can use.
Drop the archived old/ tree, root AI notes, splashgame.md (Arcade lives
in the private sandbox), widgets-dll leftovers, and LAN/oracle helper
scripts. Move download_*.sh into tools/, and move sim/math out of
libs/game/ so the public repo no longer has a game/ directory.

Also quiet first-party compile noise and skip asset-ui tests that need
sandbox kits or uncommitted fixtures.
2026-08-18 15:23:19 +02:00
Admin
f0e1f83831 Close the rik2 land: workspace, splash, and sandbox cleanup.
Point the workspace at libs/asset and libs/render. Drop Arcade
frontend, gamemaker, rig, pack registry, physics, and the old
libs/game gameplay crates. Those live in the private sandbox repo.
2026-08-18 14:24:00 +02:00
Admin
f883c689dd The three fixes the AMS single-tile test demanded: shadow-sig sink filter (baker stored a jobs-less signature no runtime could match — shadow bake was dead weight), transmux merges below-z14 duplicate border tiles (protobuf layer-union; first-wins blanked every cell boundary), mapfleet --rebake-from + stale-field strip (rebake straight from baked cells, no respool)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-03 09:56:05 +02:00
Admin
348c7cfb98 mkmap: weave preflight requires full summed source size — blocks mid-run weaves while the store holds the disk, self-resumes when the endgame frees it
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-03 07:37:03 +02:00
Admin
462f95e38f mkmap transmux: skip corrupt sources with a warning + disk preflight — one bad cell mbtiles was aborting every weave, and a too-full disk burned 67GB per failed attempt
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-03 07:33:26 +02:00
Admin
a929dafa18 world grid 2.5 degrees (9792 cells) — dense slices fit the 16GB M4 workers' in-RAM frame receive
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-03 00:45:56 +02:00
Admin
536e0e2be2 mapfleet: 5-degree world grid + chunked socket writes — dense 15-degree cells sliced to 6-23GB, over macOS's 2GB single-write ceiling and worker RAM; oversize slices (>3.5GB) stay on the local worker
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-03 00:33:13 +02:00
Admin
f2f4b1bb50 Spool v2: streaming frontier — the fleet bakes while pass 4 runs
Pass 4 collects relation jobs, bbox-scans them against the RAM stores,
sorts by NL-spiral distance and publishes store/spool-frontier.txt (key
of the first unfinished relation; spool flushed before every publish).
pbf-base slices a LIVE store behind that gate (--bbox only, torn-tail-
tolerant block reads, pid-scoped sort chunks so concurrent slices never
clobber shared edge blocks), and mapfleet claims block per cell on the
frontier instead of waiting for the whole spool.

Pass-granular resume: passes 2/3 stamp exact spool block lengths +
counters + stats; a restart rolls the spool back to the newest stamp
and reruns only the remaining passes (unit tests + crash drill).

Weave fixes from the Luxembourg end-to-end smoke run: bake outputs land
via temp+rename so the ledger name never exists half-written, and
transmux verification now checks the union of ALL sources with first-
source-wins ownership (it compared source 0 alone and failed every
multi-source weave).

Also: pass-4 worker clamp 12→14, dead paged NodeStore/WayStore and
emit_lines/emit_polygons deleted (flat stores/prepare_* replaced them),
mapfleet --pbf + startup chunk sweep + end-of-spiral drain and final
weave, world-build.sh refreshes the -run binary copies.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 22:59:15 +02:00
Admin
1e7cf7723c spool: --no-tiles skips pass 5 (nothing consumes it); chain uses it
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 22:15:31 +02:00
Admin
c7f1dbed8e spool: recursive-bisection polygon tiling — continental boundaries clip in O(n log t)
prepare_polygons clipped the FULL ring (and holes) against every tile in
the bbox: a continent-scale boundary relation (millions of points x
millions of tiles) pinned one core for hours at the planet spool's tail.
Halves clip once per split and recurse (geojson-vt scheme); per-tile
output is geometrically identical (equivalence test: same tiles, equal
areas, identical interior vertices — direct's zero-area boundary spikes
are collapsed, which is strictly cleaner).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 22:08:21 +02:00
Admin
be9d49ceb7 spool.md: largest-first scheduling + clip_ring segment prefilter (ideas 8-9)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 20:54:12 +02:00
Admin
0529960542 spool.md: pass-granular resume (idea 7)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 20:05:02 +02:00
Admin
85b292b593 spool.md: v2 bottleneck analysis — spiral-ordered finalization kills the fleet gate
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 18:55:26 +02:00
Admin
a8b52d737d Map: world chain hardening — pipefail (tee masked spool failure), instance locks, mercator-clamped cells
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 17:48:44 +02:00
Admin
cf1b977d00 Map: NL-spiral slab driver — slice/bake/weave per cell, live-growing world shards
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 17:48:44 +02:00
Admin
990f63de26 mkmap: multi-source weave transmux — first-source-wins, spiral-cell assembly
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 17:48:44 +02:00
Admin
489d5aa6a1 Map: world-build chain script — planet download-wait -> spool -> base -> bake -> shards
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 17:48:44 +02:00
Admin
8785b98a25 Map: finalcut runs aliased binaries — dodge the unhunted makepad-map-* name killer
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 17:48:44 +02:00
Admin
0375e344f7 Map: finalcut v6 — integer keyframes 15-18 + v4 dissolved-buildings streams
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 17:48:44 +02:00
Admin
19d231405b Map: finalcut v5 — actually two keyframes (14,16); v4 edit had not applied
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 17:48:42 +02:00
Admin
d0f92ed090 Map: finalcut v4 — two-keyframe morph cut (buckets 14,16)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 17:48:42 +02:00
Admin
781dd2c83e Map: bucket ceiling 17 + bake buckets 14-17 (rz18+ magnifies bucket 17)
5-bucket streams priced at ~2.6x (=130GB archive) — clamped instead:
rz18 shows bucket-17 geometry like any mid-gesture frame, GPU strokes
re-derive widths, nav icons survive. Consumption window 10..=18 stays
(harmless; ceiling makes >17 unreachable).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 17:48:42 +02:00
Admin
5a0839cb50 Map: finalcut outputs europe-base-br-v3 (shadow-baked cut)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 17:48:42 +02:00
Admin
627f0bb04b Map: app reads .mkmap shards — MkmapReader + TileArchiveReader, varint-KV index v2
libs/mbtile_reader gains the .mkmap consumer: root.mkidx parse (Hilbert
tile ids, root ranges -> brotli leaf directories -> shard/offset/len),
positioned shard reads, same get_metadata/get_tile_decoded surface as
MbtilesReader; TileArchiveReader sniffs the path so mbtiles_path can
point at either. Index format v2 drops JSON: the metadata section is now
varint KV like the leaves (writer + reader; no serde in the container).
Loader, zoom-range probe and the headless harness go through the enum;
bridge-dz/overlay sidecars stay mbtiles. Harness parity via shards:
worst AMS rz16 164.7ms, z12 native 51.3ms — identical to mbtiles. App
repointed to local/maps/europe-base-br.mkmap (111 shards + root.mkidx,
the exact bytes a CDN would serve).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 17:48:42 +02:00
Admin
e8c21892dd Map: bake bucket 15 (rz15 is a cruising zoom, not a transient band) + status.md
In-app at z15 every tile ran the 460ms runtime cascade (buckets were
14+16 only); NL smoke: worst rz15 key 600 -> 53ms. Europe final cut
rerunning with 14,15,16.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 17:48:42 +02:00
Admin
9b4d871075 Map: repoint app to europe-base-br-v2 (theme-independent final cut) + pipeline script
Final cut: 9.38M tiles, 133,431 baked (9.6GB streams, zooms 10-14,
threshold 100ms), 107 shards under cap, 253,525 sampled byte-identical.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 17:48:42 +02:00
Admin
fce6c68835 Map: repoint app to europe-base-br-faces-mz (mid-zoom baked) + midzoom pipeline script
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 17:48:42 +02:00
Admin
80d5967198 Map: Europe single-origin archive shipped — 51.8GB base + faces bake + .mkmap shards
Overnight run 2026-08-01: 9,380,390 tiles z2-14 in 3.2h, faces bake 1h
(+8GB, worker-side brotli q10), transmux to 99 shards all <510MB.
App repointed to europe-base-br-faces.mbtiles. nl-bridge-dz verified
byte-identical against the new base (deterministic feature indices).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 17:48:42 +02:00
Admin
9bddc458b9 Map: painter-cascade per-bucket bake (v2-faces-1) + z14 streets merge
- The boolean union cascade (59-77% of heavy tile builds) is now baked
  per (tile, bucket 14/15/16) as additive field 101: cascade output made
  deterministic (1/64 grid snap, canonical ring order, sorted tiers) and
  bit-reproducible; renderer consumes guarded by structure signature +
  coordinate checksum with runtime fallback; MAKEPAD_NO_BAKED_FACES=1.
  Roundtrip bit-identical on all keys x buckets x dz configs. New
  tools/map_bake producer (worker-pool incl. worker-side brotli).
- z14 streets merging never ran (early-out at DETAIL_ZOOM): fixed —
  1957->1285 ways (-34%), payload -20MB, cascade input shrunk at source.
- Slow-tile log now prints per-stage ms + a ready-to-paste headless repro
  command; harness honors archive/detail/dz/overlay/rz/3D envs.
- Worst AMS tile: 2-3s cold -> 175ms rz16 (61ms native); NL bake data
  882MB at 60ms threshold; Europe needs threshold 150ms + 2 buckets to
  fit shard budget (+2-4GB est).
- App -> nl-base-br3-faces archive; bridge-dz rebake required (joins
  fail closed against br3 feature indices).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 17:48:42 +02:00
Admin
1afcedd8f6 NL-wide bridge-dz overlay + mbtiles-merge; fix VoiceInput unit handling
- bridge-dz baked for the entire Netherlands (17026 tiles, 29MB):
  AHN-refined over the 8 Amsterdam sheet pairs, solver-only elsewhere.
  Baked as 4 north-south strips with 2-tile overlap — the full-bbox
  global solve peaked past 60GB RSS — merged with the new mbtiles-merge
  subcommand (later input wins on overlaps, block-major write order).
  Route app bridge_dz path ams -> nl.
- audio_unit: the new VoiceInput (VoiceProcessingIO) kind takes the input
  setup/handler paths (set_input_handler panicked and aborted the app);
  VPIO capture forced mono on every platform.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 12:38:48 +02:00
Admin
c77bee1094 Fix Weesperplein shear: per-way DzField reach + shadow hardening
The junction-plaza dz field ingested road ways at the shared 6-unit
(~56 m) reach, and DzField holds full dz until radius-1.5 — so a 1 m
bridge hump raised half of Weesperplein and sheared the square over
its grounded surroundings (worst at high zoom where 1 m is ~43 px of
lift). DzField segments now carry per-source radii: plaza RING sources
keep the wide reach (quay slabs need it across their interior), while
road ways lift the plaza only across their own deck width. Diagnosed
via bake probes + an SVG dump of the paint buffers and a lift-zero
shader bisect; the dz archives themselves are clean and tapered (the
morning stairfix is not implicated).

Shadow geometry hardening from live review: facing gate widened to
0.25 (near-parallel edges swept hair-thin spikes), sliver filter
scales with the AA fringe, and deck shadows clamp their projected
height (solver outliers turned one segment into a canal-spanning
slab) and skip implausible dz outright. Probe tests document the
Weesperplein window and the dz A/B across archives.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 00:10:52 +02:00
Admin
6fad9915c1 Fix bridge dz steps grade and surface-way clearance feedback
Steps shed height within the staircase (0.6 grade) instead of ramping
30m into the street grid. Surface ways under a deck clear from ground
level instead of reading back their own inherited ramp lift, which
pumped decks up every constraint round. Adds Duivendrecht probe tests.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 00:10:52 +02:00
Admin
304b68d6ad Unify road mesh rendering and elevation seams
Remove the legacy flat-road fallback and A/B harness, keep patterned non-road strokes on their dedicated path, and make solid roads use the geometry/boolean mesh pipeline unconditionally. Reconcile bridge, link, and padded-tile elevation continuations generically in the tile baker and renderer.
2026-07-30 10:42:24 +02:00
Admin
a37db4228c Fix unified road elevation and antialiasing 2026-07-30 10:42:24 +02:00
Admin
273fa1c89b Fix 3D road elevation and join continuity 2026-07-30 10:42:24 +02:00
Admin
cc8ee97b3d Reconcile road deck seams before grade fitting 2026-07-30 10:42:24 +02:00
Admin
ad58d9a8bb Fix 3D road joins and tile seam continuity 2026-07-30 10:42:24 +02:00
Admin
65e63c23ec bake: dual-carriageway lateral consensus + annotate hardening — stepped twins and floating slabs die
The persistent artifacts were four distinct data bugs, found via the
dump_base_dz_at forensic test:
- Dual carriageways: two parallel ways whose ribbons merge in 2D but
  solved to different heights -> a height step down the merged surface.
  New solver pass: each way vertex adopts the max height of PARALLEL
  ways within its own half-width (parallel_max sampler, own line
  excluded); duals equalize, frontage streets are out of reach.
- Stacked grabs: a way split sitting under a parallel deck sampled the
  deck overhead (no direction/distance gate can reject 2D-coincident
  stacked ways). Isolated lifted runs under 25 m arc are zeroed —
  measured in arc, not vertices, so short 2-vertex bridge ways survive
  (zeroing those broke the Gooiseweg viaduct: fixed).
- The final coincident-vertex consensus TELEPORTED heights through
  chance-coincident vertices of stacked ways; it now only reconciles
  values already within 1 m (its actual job: unifying overlap copies).
- Post-consensus values had no ramps behind them (consensus ran after
  blending): grade blend + hold re-runs after it, plus interior zero-run
  interpolation (<120 m) for sampling holes; endpoint fallback keeps a
  relaxed direction gate instead of none.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 10:42:24 +02:00
Admin
a7b4a9795f bake: hold junction height ~12 m into joining ways — slip roads attach flush
Junction consensus raised a merging way's endpoint to deck height but the
8%/m grade decay started immediately, dropping ~2 m across the visible
gore: every slip road attached below its deck with a ledge along the
merge. The grade blend now holds the junction height for the first 12 m
of the path before decaying, so merges are level through the gore and
descend after.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 10:42:24 +02:00
Admin
92eaef5233 bake: gore-twin second chance kills doubled slabs; remove debug memory watchdog
Split ways duplicate a carriageway with an OFFSET centerline through
gores — the twin failed the direction/median gates and baked a lower
fallback height: two overlapping deck slabs at slightly different
heights, swapping mid-deck (the persistent 'road break'). Rejected
all-zero line paths now resample the field ungated with a tight cap
(2.5u, median <= 2u, 60% hit rate) — a gore twin sits within a lane of
the accepted profile and inherits it; frontage streets stay rejected.
Also: seam_probe forensic test (casing-buffer vertex dump + cross-tile
band compare) that located this; memory watchdog removed at user
request (runaway fixed and verified earlier).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 10:42:24 +02:00
Admin
42f8387f9d bake: global annotation pass + coincident-vertex consensus; renderer: no cap extension at clip cuts
Annotation now runs ONCE over every base tile in global coordinates —
junction consensus and a final exact consensus over coincident vertices
(largest |dz|) unify the overlap clip copies adjacent tiles both render.
DzField terminal cap extension skips endpoints on the tile clip bounds:
holding a cut height flat while the neighbor tile interpolates the ramp
mismatched the overlap band. Reduces (not yet eliminates) the doubled
slab at tile seams on ramping decks.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 10:42:24 +02:00
Admin
1cee8d2e43 bake: ONE global solve for the whole bbox — tile-seam steps and doubled slabs die
Per-tile solves (even with 1-ring context) reached slightly different
heights for the same way on each side of a z14 seam; both tiles then
rendered their clipped copy of the deck in the overlap band at different
heights — visible steps and doubled slabs mid-deck. solve_tile is now
solve_bbox: one graph over every decoded tile (integer-grid node dedup
chains fragments across seams), one AHN pass, one constraint solve, one
global field pair; bridge_dz features bin per source tile and the
annotator samples the global field with per-tile offsets. Bonus: the
Amsterdam bake drops from ~2 min to 21 s (graph built once, not 193x).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 10:42:24 +02:00
Admin
50d0b20357 map: unified surface mesh, flush tier joints, boundary consensus, walls everywhere
- One continuous surface face per group ((surface − grounded cover) ∪
  lifted): no more overlapping level twins micro-diverging at grazing
  tilt (the lens endcaps). Tunnels stay a separate early-painted face.
- Tier-transition joints (bridge/approach style splits from the layer
  rank bias) become FLUSH butt joints — but only at collinear
  continuations; forks and T-junctions keep round caps. No cap discs, no
  wall quads across a joint (suppressed within half_width of the joint).
- Walls/fascia unconditional again (~1.4 m band, clamped at ground): the
  field-probe seam filters false-positived on every low deck through the
  field's edge fade and stripped the thickness the whole look lives on.
- Baker: cross-tile boundary consensus on base_dz — every tile solves
  with 1-ring context, so the same way baked slightly different heights
  across a tile seam (visible mid-deck steps at z14 edges); boundary
  vertices now unify to the largest-|dz| across tiles (153 paths).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 10:42:24 +02:00
Admin
0e0743fba4 map: tunnels — sunk level with negative dz, solver mirror, open underpass fascia
- Baker: tunnel sink solve (downward mirror of the lift solve): 5.5 m
  clearance at every 2D crossing with a surface way, 30 m hold, grade
  ramps, portals pinned to the surface at shared nodes. Tunnel ways get
  their own SolvedField (never mixed with the surface field) and the
  annotator runs a negative sampling pass for paths with no deck lift;
  base_dz now carries signed dm values (195 tiles, +2 tunnel-only).
- Renderer: third level in the cascade — sunk parts with their own cover,
  painting before ALL surface content; sunk faces displace down through
  the existing signed-lift shader path. Tunnels with baked negative dz
  join the union as solid sunk roads in 3D bakes (tunnel tag stripped for
  styling); flat bakes keep carto dashes. Tunnel ways stay out of the
  stroke/arrow corridors so surface streets above a tunnel line cannot
  inherit the sink.
- Deck walls become fascia bands (~1.4 m below the deck edge, clamped at
  ground): underpasses are OPEN — you can see through them.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 10:42:24 +02:00
Admin
4043031b1a map: level-split disjoint cascade, dissolve-first booleans, memory caps, perf harness
- Two-cover cascade: grounded content subtracts grounded cover, lifted
  subtracts lifted — a deck cuts its own casing (no more cap outlines
  bleeding through on bridges) but never the road running underneath;
  ramp feet still cut streets. Group parts dissolve to clean outlines
  (simplify_shape) before any cross-group op.
- Depth ladder by slot (per face, per stroke rank) instead of per event:
  coarser, safer separation between coplanar overlaps.
- DzField sampling gated by active-area bbox per face; corridor bbox
  prefilter for interleaved strokes.
- Byte-budget tile cache eviction (1.2 GB) + pending-upload queue cap
  (384 MB): 3D building bakes run 30-70 MB of fill buffer per tile and a
  count-capped cache alone reached tens of GB.
- MP_TILE_PROFILE stage clock + headless union_perf_probe test with the
  live theme mirrored (probe_compiled_theme): rz17 tile build 1.4s -> 0.9-1.0s.
- Revert baker lateral clearance: the constraint cascaded through solver
  rounds and lifted the whole network; needs a bounded formulation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 10:42:24 +02:00
Admin
103ec8f5d3 map: rank-interleaved paint ladder, per-tier dz fields, lifted decks keep under-roads
- Union faces and legacy strokes merge into one rank-ordered paint sequence
  (plazas, casings, centers) — cycle lanes and park paths draw above the
  surfaces they ride, higher tiers still cover both; flat = buffer order,
  tilt = same order via the param5 ladder.
- Joint coverage: bevel wedges at gentle bends, discs at corners/ends;
  union ways get the same chaikin smoothing as legacy strokes (dz-aware).
- Per-tier DzField (nearest-way-wins, grounded ways at 0) + crack-free
  midpoint face subdivision replace the narrow runtime corridors: decks
  lift edge-to-edge, casings stay attached, no tents or shards.
- Lifted rings no longer subtract from lower groups: roads continue
  underneath decks (paint order hides them flat, real depth when tilted).
- Lift-aware tilt depth: deck depth margin scales with lift so water and
  ground at the display position can't depth-win over a bridge.
- Baker: tapered lateral clearance for elevated ways running beside
  lower-layer roads (ribbon widths overlap without centerline crossings);
  connected ways exempt.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 10:42:24 +02:00
Admin
fff629bb3f map: bridge dz solver+AHN bake, base_dz transcode, road overlay unifier
Bridge elevation (bridge.md M1+M2): tools/map_tiles bridge-bake solves
per-vertex road/rail dz over the OSM graph (crossing clearance, grade
ramps, deck holds, junction consensus) with AHN DSM-DTM measured deck
profiles (BigTIFF reader in geodata, WGS84->RD), baked as bridge_dz +
per-base-tile base_dz (L/F/P join to exact renderer geometry). Renderer
joins dz through parse into TileWay.dz; strokes/arrows/fills lift off
their own profiles; tunnels never deck.

Road overlay unifier: painter's algorithm as geometry — per-way segment
rects + vertex discs, i_overlay top-down subtraction cascade into
DISJOINT faces (overlay_paint_groups), triangulated once; flat render is
pixel-equal to paint order (proven 0-diff on the abstract unit case) and
tilt cannot reorder it. Legacy strokes interleave by rank; plazas join
the cascade at true alpha. @roads 0/1 A/B toggle, @abtest headless
CPU-raster diff harness (1.50% vs 2D reference on the Raampoort tile),
@cam debug camera, bridge_eval.sh aerial-vs-render loop.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 10:42:24 +02:00
Admin
c0aeb25b0a map: rain radar overlay, flying 3D markers, Europe routing, geodata crate
- rain radar layer: pure-Rust KNMI HDF5 reader (superblock v0 walk,
  single-chunk deflate datasets, byte-exact vs h5py), ellipsoidal polar
  stereographic reprojection (20 m vs product corners), bilinear value
  sampling -> smooth banded isolines, textured quad overlay through the
  overlay camera, 25-frame nowcast animation; RadarSync polls at most
  once per 4 min through a disk-persisted gate and caches frames on disk
- makepad-geodata + makepad-tesla crates join the workspace (overlay
  builders, radar sync, NL open-data layers; transit routes now z7-14)
- Europe major-roads routing graph: nav-build --major-roads does a
  ways-first scan (5.7M ways / 46M nodes / 194 s / 971 MB) and the app
  falls back to it when a route leaves the regional graph — Amsterdam to
  Paris routes offline (501.8 km)
- 3D flying markers: chargers/POIs/stops ride thin stalks with DYNAMIC
  height (each pin clears its own building +8 m); labels, kW text,
  brand and tap zones all consume the baked per-marker lift; stalks and
  buildings grow together on the 2D->3D transition (per-tile flat->3D
  fade heights, no replay on zoom regens)
- markers depth-honest (small bias, buildings occlude them); phong-lit
  canopy/light spheres matching the buildings' NW sun; buildings tint by
  BAG age in 3D; district area tints (rank 60, alpha .32); transit line
  labels + stop names; follow-mode is an explicit attach/detach toggle;
  rotation release schedules the label re-place (no stuck upside-down
  labels after a fast spin)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 18:00:27 +02:00