Commit graph

830 commits

Author SHA1 Message Date
Admin
9ea980a8da Map: corridor-segment grid + detail tag whitelist — worst tiles 383/300 -> ~235/226ms
Deck matching was O(verts x corridor segments) per stroke (84ms on the
worst AMS tile): per-tile CorridorGrid + mirrored-pair reuse cut it to
4ms, bit-identical (MAKEPAD_CORRIDOR_VERIFY oracle, MAKEPAD_CORRIDOR_BRUTE
fallback). Detail-merge parsed all six osm_* layers with full tags
(~110ms/tile constant): per-geometry-class layer skip + tag-key whitelist
below icon zooms cut it to 28-40ms; whitelist audited against style.rs
readers ('tunnel' omission flipped Paris plaza rings and MISSed the baked
cascade — CASCADE-GROUP dump + 7-tile size-parity sweep now guard it).
Full-build stage laps (payload/baked/dz/mvt-parse/detail-merge) close the
former ~110ms accounting gap; MAKEPAD_TILE_HASH prints a buffer fnv.

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
92c6139860 Map: fix build-24 livelock — never drop completed tile results
The stale-bucket result drop compared buffers.render_zoom (request-zoom
space, clamped to the archive max) against render_bucket() (unclamped):
never equal at overzoom, so EVERY completed tile at building zooms was
discarded, re-requested and discarded again — one-tile viewport, stuck
queues. Stale-bucket results are drawable; the bucket-restyle path
rebuilds them properly.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 17:48:42 +02:00
Admin
b1329124eb Map: layer-skip, keep-stale fixes, tilt priority, cancellation, budgets
- Regression attributed: the combined archive's six osm_* detail layers
  were wholesale-ingested and STYLED by the base parse (roads double-
  styled via streets + osm_lines: union input 946->3940 rings, stroke
  prep 26x) -> 2.1-5.5x slower than the old two-archive pair. Layer-level
  lazy skip (MvtSink::wants_layer): unconsumed layers skip as raw bytes
  in both passes; all 24 profile cells improve 1.3-2.3x.
- Gray-tile keep-stale: three kill paths fixed — mark_tile_failed no
  longer replaces drawable Ready entries with gray placeholders on batch
  errors (archive rewrites), transient absent reads no longer evict
  Ready meshes + 30s blacklist, retry backoff moved to TileEntry.
- Tilt-aware request priority (camera-projected screen distance with
  toward-camera bias) — the near field builds first under tilt.
- Restyle bursts lift the 4-slot gesture throttle to 12; queued jobs for
  dead zoom/bucket/mode are pruned (TagThreadPool::retain_queued), stale
  results dropped pre-upload; uploads byte-budgeted (24MB/frame).
- Stage matrix: painter-order union cascade = 59-77% of every cell
  (~320-350ms worst key) — per-bucket face bake is the path to <200ms.
- Baked-fill strips: A/B shows no measurable win post fill-tessellator
  optimization -> removal recommended (dissolve stays).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 17:48:42 +02:00
Admin
c7f5a44019 Tessellator: 5.8x fill tessellation + baked-strip fast path
- Sign probe was 57-76% of z9/z13 fill cost (point_in_fill_rule scans all
  contours per probe): exact bbox prefilter (always on, bit-identical) +
  trusted-winding map-only mode (holes take the exterior's sign; bowties
  and orphan slivers keep the probe). Sweep rework: persistent zero-alloc
  tessellator, events sorted once + cursor (BinaryHeap::pop was 40% of
  fill CPU), ~V events instead of 2V, direct index output. 4.4-7x per
  tile, worst per-fill 42.9ms -> 4.5ms, 6798/6798 fixture fills
  bit-identical in both modes. MAKEPAD_TESS_DUMP fixture capture +
  fixture_bench with per-stage split.
- Baked-fill fast path (v2-fills-1, flat mode): field-100 strip decode,
  per-triangle Sutherland-Hodgman clip to the fill overlap rect, edge AA
  via new Tessellator::fill_fringe_into over the deduped rings; 5% area
  guard falls back to runtime tess — and caught a real emitter bug
  (inverted ring winding on z13 water would have erased a water body).
  MAKEPAD_NO_BAKED_FILLS=1 kill switch; baked_fill_audit headless test.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 17:48:42 +02:00
Admin
386722c473 Map: headless tile-build profiler (reproduces in-app slow tiles exactly)
cargo test -p makepad-widgets --features maps --release profile_tile_build
-- --ignored --nocapture ; TILE_PROFILE_KEYS/REPS/ARCHIVE env overrides.
Uses the real probe theme (a default CompiledMapTheme styles nothing and
skips tessellation). Baseline: z9 water/landuse giants at 0.67ms/feature
vs 0.02 at z13 — vertex-heavy undissolved polygons dominate; decode 3-5ms.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 17:48:42 +02:00
Admin
d8e0811baa Map: fix combined-archive double parse below z14; gesture-aware dispatch
- The combined-archive detail reuse handed the base blob back as detail
  at EVERY zoom, but detail layers exist only at z14 — mid-zoom tiles
  (already 10-20x heavier than the versatiles ones) were parsed twice,
  up to 3.5s per z9 tile. Detail reuse now gates on z>=14.
- While a zoom gesture is live only the 4 most-central tiles dispatch
  (12 after settling): every dispatched job runs immediately on the
  14-thread pool, so speculative edge giants were pinning all slots and
  the zoom target's center waited multiple seconds.
- Slow-tile forensics stay: builds >150ms log key/bytes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 17:48:41 +02:00
Admin
fd51e26d09 Map: center-out tile loading; single decode for combined archives
- Tile requests now dispatch nearest-the-viewport-center first: keys were
  row-major and the 12-slot in-flight cap filled corners before the
  center, which became visible once per-tile cost grew.
- Combined base+detail archives (pbf-base single-file mode) no longer
  brotli-decode every z14 blob twice through a second reader on the same
  file — the base bytes double as the detail input.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 17:48:41 +02:00
Admin
053b1a9d15 Audio: constant gentle ducking beats half-duplex unit swapping
The mid-stream VPIO<->plain unit swap glitched the start of the
assistant's own speech; keep the voice-processing unit armed for the
whole capture (standard+Min ducking) instead. set_echo_cancellation and
the options-rebuild plumbing stay for apps that want the trade.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 17:48:41 +02:00
Admin
419d77c652 Audio: half-duplex echo control — duck only while the assistant speaks
Idle listening now runs PLAIN capture (no VPIO, zero ducking — music
untouched); the app arms the voice-processing unit only while its own
TTS is audibly playing (+0.8s tail), which is the only window where echo
cancellation matters. Options changes rebuild running input units
(AudioUnitAccess.last_input_options); WindowVoiceInput/VoiceWave gain
set_echo_cancellation; route app polls speech playback at 4Hz.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-02 17:48:41 +02:00
Kevin Boos
8e4573ee3b TextFlow: fix inline <code> spans that are too low (beneath text baseline) (#1156)
* TextFlow: fix inline `<code>` spans sagging below the baseline

finish_row_center centered every walk by its own height, so a code run's
shorter walk got a larger downward shift than the surrounding prose under
`RowAlign.Center`. That undid TextFlow's baseline_shift: inline `<code>`
spans sat a few px below the line's baseline, and their descenders poked
out of the bottom of the code box.

* FinishedWalk now carries an optional `align_height` that text runs set
  to their line style's height, so every text run on a row receives the
  same centering shift and stays on the baseline. Also fixes sub- and
  superscripts drifting under `RowAlign.Center`.
* The per-style metrics probe now caches descenders too, since we need
  the full line height (ascender + descender) to compute `align_height`.

* Html/Markdown: make the fixed/code font size scale configurable

Replaces the hardcoded 0.85 `FIXED_FONT_SIZE_SCALE` consts with a
`fixed_font_size_scale` live property on TextFlow (default 0.85), so
apps can tune how much smaller `<code>` text renders than the prose.
2026-08-01 08:25:00 +02:00
Admin
22316f9b8c Audio: echo-cancelled capture option (Apple VoiceProcessingIO)
use_audio_inputs_with_options(devices, AudioInputOptions{echo_cancellation})
— platform-neutral trait default ignores the flag; Apple swaps the input
unit HAL->VoiceProcessingIO (system-wide AEC, the unit iOS input already
uses), so the assistant's own TTS no longer feeds back into the mic.
Voice capture (WindowVoiceInput) requests it always.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 12:16:29 +02:00
Admin
723b7928bb Route assistant: mmap LLM weights, fix batched-attention corruption, kokoro voice out
- ggml: read-only mmap module (unix-gated) + two-region Context (mapped
  weights / dirty caches) + segmented Metal buffer binding; llama loads
  GGUF weights as file-backed clean pages (jetsam-exempt) with owned-arena
  fallback (MAKEPAD_LLAMA_NO_MMAP=1). Route app dirty footprint 12GB -> 4-7GB;
  model load becomes lazy page-in; A/B byte-identical on 4B + 9B.
- llama: fix graph-cache keying corruption — a graph keyed wider than the
  KV cache corrupted attention for any prefill batch >= 2 (flash op reads
  permute-node dims baked at build; view reconfigure never reached the
  kernel; masks were written cache-narrow). Masks now always fill the full
  graph key width and graphs key by 1024-buckets; reconfigure path removed.
  Verified byte-exact vs per-length reference across batch 1/2/8/64/512,
  short+long prompts, mmap on/off, plus a two-session concurrency probe.
- voice: passive VoiceWaves no longer register the global audio-input
  callback (the invisible caption-bar wave stole mic audio — last
  registrant wins — and spawned duplicate whisper workers); whisper back
  to F16 default (voice Metal library has no quantized kernels; q5_0
  failed every GPU matmul); raw transcripts render immediately.
- route: kokoro TTS voice output (speaker toggle; streams reply sentences,
  announces nav maneuvers + arrival) with barge-in — voice activity on the
  mic stops playback instantly; dispatcher context 8k -> 32k (hybrid KV is
  12/48 layers, ~48KB/token); window caption bar suppressed under studio.
- llama-generate: --max-context/--prefill-batch-size + state fingerprints;
  new llama_concurrent_probe bin.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 12:13:31 +02:00
Admin
676255dfc2 Land route app + platform geo/permission APIs, map nav layer, geodata radar
apps/route: AI trip planner on MapView — tool broker + local/cloud agent
dispatch, nav session + simulated drive, layers/theme state, DDG image
search, trip history, tilt-shift DOF layer (linear circle-of-confusion:
level = log2 of radius, constant growth rate, tilt raises only the
ceiling; tilt-shift on by default).

Platform: Cx geo location API (macOS/iOS/Android/web) + permission
plumbing, memory watchdog, headless build cfg. Map: nav layer M0 API,
landcover drape, bridge dz. Geodata: 250m dual-radar compositor
(radar_volume) + KNMI sync. Docs for the route/glass/blur/shiny work.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 00:10:52 +02:00
Admin
0d8c4773d8 Glass blur: 1/8-res floor for deep mips, bicubic sampling, headless JIT fixes
Deep gauss pyramid levels (3-5) are re-homed to 1/8 resolution via
progressive half-texel tent upsamples so no on-screen sample comes from
a texture coarser than 8 device px/texel; half-texel offsets keep the
exposed sigma ladder at ratio-2 per level (full-texel tents inflate deep
levels ~35% and open a visible blur band at the raw->re-homed boundary).
Per-pixel sampling replaces the 13-tap cross cascade with 4-tap bicubic
B-spline reconstruction: C2-smooth (kills the bilinear texel lattice)
and cheaper (glass 26->8 taps, chromatic variant 78->24).

Headless shader JIT fixes found while verifying: RenderCx always emits
vtx_pos (vertex fns that return the position have no VertexPosition io),
vec*vec MulAssign/DivAssign impls, and discard returns a value.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 00:10:52 +02:00
Admin
b16010ebbd Eliminate residual shadow spikes: dilation + fascia gate + opening
Three distinct micro-artifacts all read as 'shadow spikes' in review;
each needed its own cure, pinned down by a material-null shader bisect
and pixel-level crops:
- sub-meter slits between abutting building sections collected shadow
  as dark vertical hairs -> subtracted footprints dilate 0.5 m,
- quay humps (solved dz peaking at exactly 1.0 m) hung 1 px fascia
  bands at their stub ends -> fascias only for decks above 1.0 m,
- the boolean weld left hair-thin shadow tendrils ATTACHED to the main
  body in narrow passages, untouchable by per-ring filters -> a
  morphological opening (0.5 m erode + dilate via OutlineOffset) on
  the final shapes removes anything under ~1 m wide wherever it hides
  and softens shadow corners as a bonus.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 00:10:52 +02:00
Admin
85a8590195 Restore full swept-hull shadows; anchor forest fill to deepest zooms
The spike fixes had over-corrected: dropping the translated-footprint
ring from the shadow union left the far side stitched only from edge
quads, and the 14-degree facing gate then erased the contribution of
grid-aligned walls (most of Amsterdam runs nearly parallel to the NW
sun) — shadows collapsed into sheared wedges and spikes. The union is
back to the full hull (footprint + translated footprint + connecting
quads, degenerate-only gate): thin near-parallel quads are interior to
the hull and cannot surface as spikes, while the winding normalization,
bevel fringe and aa-scaled sliver filter keep handling boolean dust.

Forest crown lattice: extend the shader-side zoom clamp to the
uniform's full range — freezing at 0.25 let the pattern swim against
the map past z18.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 00:10:52 +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
9963941f0d Build shadows as silhouette chain sweeps; night themes drop cast shadows
Per-edge quad soup left hairline slivers welded to the shadow union
wherever a footprint edge ran near-parallel to the sun (needle pins at
building corners). Each ring now sweeps only its contiguous runs of
shadow-facing edges — one clean polygon per silhouette chain plus the
footprint, nothing degenerate to weld on.

Dark/Circuit themes stop baking sun-cast shadows (no sun at night);
baked AO keeps buildings grounded, and Circuit City's glow does the
depth work.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 00:10:52 +02:00
Admin
19bd247cb4 Clamp roof sheen half-vector nudge and fade sheen by zoom
The unbounded screen-position nudge let whole roof fields align with
the sun on wide viewports and bloom out white; sheen now also fades out
toward regional zooms — it is a close-range material.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 00:10:52 +02:00
Admin
1f6b12fe67 Add clickable themes: Circuit City preset + emissive roads + night trees
Circuit City (shiny.md showcase) ships as a built-in third theme slot on
MapView (style_circuit, theme_select 0/1/2, set_theme with the
keep-stale restyle so switching cross-fades per tile as rebakes land):
near-black ground, charcoal volumes with gloss 1.1 sheen, dark
reflective water, and every road an emissive amber filament weighted by
class. Emissive plumbing: MapRoadRule.emissive -> StrokePassStyle ->
PaintGroup/PaintFace -> road-union center faces carry MAT_ROUTE_GLOW +
strength in param1, and the shader pushes the line color white-hot
behind the route_glow gate. Gloss is now a theme value (ShinyConfig).

Street-tree canopy/trunk colors become theme-driven (tree_canopy /
tree_trunk fill rules) so dark themes get night trees. The example's
Layers panel grows Night/Circuit City rows behaving as radios.

Shadow geometry hardening from live review: silhouette simplification
floored at 0.35 units, and a needle filter drops hair-thin boolean
slivers (area/perimeter < 0.05) that read as dark pins at building
corners.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 00:10:52 +02:00
Admin
38e7e5f79c Fix shadow boolean windings, add overpass deck shadows + tilt fade
Difference output can wind hole rings like outers; un-normalized they
inverted the shadow fill into self-overlapping wedges (sharp corner
lines + striping). All boolean shadow output now goes through one
emit_shadow_shapes helper that clips, winding-normalizes and
tessellates.

Elevated road segments cast shadows: per-segment slab quads projected
by their per-vertex deck height (grounded stretches skip), dissolved,
minus building footprints, drawn as the same material-6 decals — the
overpass grounds itself like a building does.

Textured materials now fade back to plain 2D carto as the camera goes
top-down (cos(tilt) drives the blend in-shader, so dragging flat IS the
animation): flat water, flat green, Gouraud canopies, classic ring
trees. Shrub blobs anchor map-physically across the zoom range via a
wide-clamp zoom uniform and blend into the legacy rings at far zoom,
lattice-matched so they replace the circles at the same size/place.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 00:10:52 +02:00
Admin
acdda221a3 Lift extruded building surfaces above ground decals in depth
A wall pixel N px up its quad carries the depth of ground N px behind
it, so the 0.40 shadow decal cut a dark band across building bases
whenever the camera rotation put the shadow behind the building on
screen. Walls, roofs, parapets and balls now sit at 0.50 — above every
ground decal, below lifted deck bumps — plus two more close-zoom FBM
octaves for water, deeper zoom anchoring (clamp 0.03), and grass
rebuilt as sharp blade speckle with traveling gust bands instead of a
domain-warped wavy surface.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 00:10:52 +02:00
Admin
7089b589c1 Fix shadow depth artifacts + shadertoy-style water, grass, shrubs
Shadow fixes from live review: subtract every grounded building
footprint from the per-tile shadow union (overhead the roof lift-depth
vanishes and a decal under a neighbor building blotched its roof/walls);
tree/stoplight contact discs get per-disc depth steps above the union
and are skipped entirely for trees already inside a building shadow
(stacked decals double-darkened and z-fought). Stoplights now cast
discs too. Fill micro-depth ladder rekeyed to paint-order position
(order_pos % 19) — the old feature_count % 16 tied every 16 features
and shimmered green-vs-gray in tilt mode.

Water rebuilt as a fractal slope FBM: value noise with analytic
derivatives over four rotated octaves, each shimmering in place on its
own drift phase, chopped into crests and lit with a Blinn-Phong sun
glint + fresnel sky term. Camera is part of the material — cos(tilt)
and a physical zoom factor (exp2(16 - view_zoom), clamped) gate the
drama so top-down/far views keep the flat 2D color, and high octaves
fade before going sub-pixel. Flow-vector advection was tried and
removed: interpolated per-vertex directions painted seams across big
polygons; the water now shimmers in place.

Green areas: wavy grass (aniso blade noise swaying on a traveling wave,
daisy speckles at close zoom); woods/cemetery pattern fills grow shaded
canopy blobs behind the foliage gate. A 20 Hz heartbeat animates water
and grass while they are visible; everything anchors map-physically via
the same zoom uniform.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 00:10:52 +02:00
Admin
806fb2b455 Default shiny.md baked AO/shadows/water/foliage on in map themes
Screenshot review at Rozengracht/Vondelpark/IJ passed: baked AO and
shadow geometry cost the GPU nothing, water/foliage are a few ALU on
minority pixels, and every toggle A/B-verified back to the classic
frame. Specular sheen defaults on only in the dark theme (it carries
the dark look); route glow stays opt-in.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 00:10:52 +02:00
Admin
6975867c39 Add nav route glow halos (shiny.md T5b, no HDR)
Two wide additive halo passes under the route casing/fill: premultiplied
rgb energy with alpha 0 makes the framebuffer blend pure additive, so
roads under the route brighten instead of being covered — the glow trick
without float targets or a bloom pass. Traveled-portion dimming scales
halo rgb (the alpha multiply is a no-op for additive). Behind the
route_glow theme toggle, stamped per frame.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 00:10:52 +02:00
Admin
b297d4820e Bake building shadow geometry + terrain cast shadows (shiny.md T3)
Shadows are polygons, not passes: each building's roof ring is projected
along the sun's ground direction by height * shadow_len, and footprint +
projection + silhouette quads dissolve into ONE per-tile union (i_overlay
chunked, the road-union lesson) so overlaps never double-darken. Emitted
as material-6 ground fills in the ICON pass — in a city almost all
ground is road surface, and anything earlier gets painted over by the
street passes — with micro-depth 0.40, above the whole grounded road
ladder but below lifted deck bumps. The decal bakes full-dark and the
shader scales it by the live shadow_alpha uniform, so time-of-day fades
don't need a rebake. LOD gates: 3D mode, z>=14, and skip shadows under
2 px at bake magnification. Trees get soft contact-shadow discs.

Terrain: horizon-march cast shadows in the hillshade worker (17-step
exponential stride, ~15 ms per 512px region), skipped automatically
when regional relief is under 150 m. Hillshade + march light from the
one SceneSun via a new per-request sun/flag channel to the worker.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 00:10:52 +02:00
Admin
3d25a9afa0 Add SceneSun + material channels + baked AO (shiny.md phase 1)
One global light (draw/src/scene_sun.rs): SceneSun POD shared by the
tile bake, ball lighting and terrain hillshade, replacing three
hardcoded sun rigs. ShinyConfig carries every shiny.md toggle; it rides
CompiledMapTheme so bake-flag flips reuse the style-epoch restyle and
stale tiles stay drawable (MapView::update_shiny).

T1: shape-0 geometry now carries its surface normal in param1/2 and a
material id in param3 (walls/roofs/water/canopy/green) — channels were
free, no vertex-format growth. DrawMapVector dispatches per-material
pixel effects behind uniform gates that default off (legacy frame when
off): T4 water noise sheen + sun glint, T4b building specular sheen
with heading-rotation highlight sweep, T5 canopy clump noise + rim and
green-area patchiness.

T2 (first slice): wall vertical AO gradient (ground-contact darkening)
and roof-edge parapet AO strips, baked at zero GPU cost behind bake_ao.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 00:10:52 +02:00
Admin
6390434897 Vendor i_overlay polygon boolean crates into libs/
Inhouse i_overlay 7.0.3 and its i_float/i_shape/i_key_sort/i_tree deps
(used by the map road union mesh under the widgets 'maps' feature) as
workspace-excluded path crates, stripped of tests/locks/registry crud.
i_float's no_std libm dependency is removed by switching it to std
float math, so the maps feature no longer pulls any external crates.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 00:10:52 +02:00
Admin
831e276daa Optimize map road geometry and mode transitions 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
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
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
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
d4a3f22a54 map: deck side walls — lifted faces get vertical skirts from deck to ground
Every lifted level part emits wall quads along its boundary rings: top
vertex rides the deck dz field (v=0), bottom stays grounded (v=1), same
x/y — flat mode degenerates them to nothing, tilt reveals the wall.
Darkened face color, drawn one zbias step under the face at a quarter
ladder step below. Decks read as volumes, ramp-displacement crescents are
closed, and underpasses look like underpasses.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 10:42:24 +02:00
Admin
241e5d2e2b map: geometric vertex-alpha AA fringes, strict grounded cover, boot-view + cam readout
- AA fringe coverage now rides per-vertex premultiplied color (inner =
  face color, outer = transparent) with full shader coverage: the ramp
  interpolates across the whole skirt at any magnification, where the
  fwidth-normalized shader ramp pinned to one device pixel and left
  magnified tilt-foreground stairs visible. Skirt sits half a ladder step
  above its face so the up-screen half wins its depth tie.
- Straddling (partially lifted) rings stay visible in both level parts
  but no longer join the grounded cover: a ramp segment spanning the
  threshold was cutting the road underneath along its whole length —
  the under-the-overpass hole at the benchmark interchange.
- /tmp/mp_start_cam boots the app at a saved viewport; the map draws its
  own '@cam lon lat zoom rot tilt' readout bottom-right so any screenshot
  is reproducible.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 10:42:24 +02:00
Admin
7f3f568933 map: opacity-aware AA fringes, single-level translucent rings; macos: skip foreign windows in scroll path
- Opaque faces get boundary-straddling AA skirts (coverage 50% at the
  edge, legacy convention); translucent faces ramp outward only and their
  straddling rings pick one level part — premultiplied translucent color
  must never paint over itself (double-blend darkened plaza boundaries).
- macos event loop: a foreign window class in the scroll-wheel path (the
  screen-capture overlay's TUINSWindow) has no macos_window_ptr ivar —
  skip instead of panicking. This was the random studio death whenever a
  system screenshot overlay was active.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 10:42:24 +02:00
Admin
2a30f55305 map: kill tiler runaway (chunked dissolve), i_overlay 7, AA fringe v1, forensics harness
Runaway root cause, captured via self-sampling memory watchdog + boolean
input dumps: simplify_shape on 17-20k-ring soups (dense tiers at high
overzoom) spins in contour extraction for minutes while allocating
unboundedly (both i_overlay 4 and 7). Chunked dissolve (3000-ring chunks,
union of clean outlines) turns the captured hangs into 91/140 ms; the
full pan/tilt torture that blasted to 100 GB now holds 5-6 GB flat.

- i_overlay 4.5 -> 7.0.3 (API-compatible, booleans ~1.7x faster).
- Boolean input hygiene: 1/64-unit snap + degenerate ring drop.
- DzField: guard degenerate terminal-segment cap extension, clamp grid
  walks (a NaN/huge coord can no longer explode cell insertion).
- AA fringe v1: miter skirts along boolean output rings, u 0.5->0 over
  1px, emitted after each face at its ladder slot.
- Level-straddling rings join both grounded+lifted parts (transition
  seams overlap instead of sharing an epsilon-fragile edge).
- Oneway arrows foreshorten with tilt (ground-plane glyphs).
- Debug: in-app memory watchdog (14 GB: sample own stacks -> abort),
  MP_TILE_PROFILE via /tmp/mp_tile_profile, boolean repro test.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 10:42:24 +02:00
Admin
82566e94b0 map: 3D bake LOD — adaptive tree canopies, no roof AA fringe, wall ring LOD
Dense tiles carried 30-70 MB of fill buffer: thousands of park trees at
16x8 ball tessellation for ~14 px canopies, an AA fringe doubling roof
verts across every building (a lifted roof edge meets its own wall, not
the background), and sub-pixel footprint edges as wall quads. Screen-
adaptive canopy segments + aa=0 roofs + 1.2px wall edge collapse:
67.8 -> 26.0 MB worst measured tile. Also: DzField cap extension so
lifted way ends hold deck height through their round caps.

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
85515cea35 map: 3D terrain displacement, Europe-wide DEM, landcover drape, wind layer
Terrain gets real z in tilt mode: a displaced 288x216 surface mesh plus
per-vertex ground lift for all tile geometry (roads/fills/buildings/icons)
via vertex-stage sample_lod of a terrarium-packed elevation texture, with
labels riding the same ground through a lift-aware camera delta. Depth
domains rescale per frame to stay inside the -24 budget; road passes get
a relief-scaled clearance over the surface so cities keep correct
street-vs-building order. Regional zooms (<z14) drape landcover colors
into the hillshade (full-res MVT rasterization, treeline fade) instead of
lifting km-scale polygons that cannot follow relief.

Terrain build now covers EV-trip Europe (lat 43..58, lon -5..17, 8.8 GB
GLO-30 z6-12) with sign-safe Copernicus stems, transparent no-data, and
an Alpine rock/snow ramp. Terrain requests render 4096x3072 over ~3
viewports and only re-render on real movement.

Also: NOMADS GFS wind particle layer synced to the weather clock with 3D
altitude, rain cloud deck lift, stuck-tile fixes (expiring missing set,
decode-failure backoff, restyle placeholder purge), 78-degree tilt
ceiling, and park fill z-fight fix via widened micro-depth ranks.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 10:42:24 +02:00
Kevin Boos
1de784dd0e PortalList: allow setting layout flow at runtime; AdaptiveView fixes (#1144)
* PortalList: add `set_flow(cx, flow)` to switch a list between vertical and
  horizontal layout flow at runtime. Much faster than using `script_apply_eval`,
  and always fully correct because it updates the `vec_index` axis.
  It also avoids a full ScriptReapply sequence, which is potentially expensive
  across all of an app's widgets.
* AdaptiveView: add `active_variant()` getter so that widgets using AdaptiveView   do not have to separately track which variant it should be in.   Removes all ambiguity and possibility of divergence... finally!
  * Also fixes long-standing TODO item in AdaptiveView about properly handling
    weird window geom events, e.g., on macOS sometimes it spits out a 0-width
    window update which is total b.s.
* DisplayContext: add `is_desktop_width()` helper.
* Window: ignore spurious zero-size window geom events.
2026-07-28 19:31:42 +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