Commit graph

2,205 commits

Author SHA1 Message Date
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
f141c31d4e Update vlm_oracle clip_dump reference
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
ff4e3183c1 Add apps/route AI trip planner M0 skeleton to workspace
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
Kevin Boos
8fa33c86fc fix(linux): don't abort on machines with no usable audio device (#1154)
* fix(linux): survive machines with no usable audio device

Makepad aborted inside libpulse on any machine without a working sound
server: get_updated_descs passed the null pa_operation returned by a
context that is not READY straight to pa_operation_get_state, which is
an assert in libpulse ("Assertion 'o' failed at pulse/operation.c:136").
Headless boxes and containers died on startup. Nearby paths were no
better - a sound server that advertises a sink it cannot open hung the
UI thread for good, and a device that failed to open was re-opened on
every device change, forever.

PulseAudio:
 - never hand a null pa_operation to libpulse, and give up on a context
   that is not ready instead of calling into it
 - PulseAudioAccess::new returns None rather than panicking, so a
   machine without a server simply runs on ALSA
 - PA_CONTEXT_NOAUTOSPAWN: without it pa_context_connect forks and execs
   a sound daemon synchronously, before the mainloop exists, blocking
   the UI thread for as long as the spawn takes (measured 7s) and
   leaving a daemon running on a machine that deliberately had none
 - every wait is bounded by a mainloop timer, so a server that never
   answers cannot freeze the app
 - the context state callback no longer takes the access mutex, which
   the UI thread holds while waiting on the mainloop (a deadlock)
 - null info pointers, eol < 0 and absent default sink/source names are
   handled instead of dereferenced
 - streams still being created cannot be disconnected, so they are
   parked and disconnected once the server answers rather than left
   attached to the microphone for the life of the process
 - callbacks no longer panic across the FFI boundary, and a stream the
   server tears down is reaped and reported instead of going silent

ALSA:
 - track input and output failures apart: both directions of one pcm
   share a device id, so a card with no microphone disabled playback
 - publish a device before opening it, not after. Opening takes ~200ms
   and the check that decides to spawn reads that same list, so two
   device changes inside the window - the normal startup - spawned a
   second thread whose EBUSY marked a device that was playing fine as
   failed
 - a stream that dies mid-playback is reported, so the app can move to
   another device instead of silently losing audio

Both backends:
 - a device that failed to open is not retried on every device change.
   It is retried when the device list changes, or when the app asks for
   a different set than last time, so an explicit request - a user
   picking a device, a widget toggling its microphone - is still
   honoured
 - AudioDevicesEvent::default_output falls back to another working
   device instead of handing back one already known to have failed,
   which is what made apps ask for it again on every event.
   default_input deliberately does not: the next input in the list is
   typically a monitor source, and silently recording the machine's
   own output instead of a microphone would be a privacy breach

* fix(linux): enumerate and prefer the generic ALSA "default" pcm

Device enumeration called snd_device_name_hint once per card. Passing a
card number only returns that card's raw pcms, so the generic ones -
"default", "pipewire", "pulse" - were invisible to makepad, and it then
picked the first plughw: node as its default device. Raw nodes demand
exclusive access to the card, so makepad's chosen device failed with
EBUSY whenever anything else was playing, which on a desktop running
PipeWire is most of the time.

Ask for the whole system instead (card -1), which is what every other
alsa client does and what "aplay -L" prints. It returns the generic pcms
as well as every card's own, so nothing is lost. "default" is now
preferred when picking the default device, for both directions; the old
plughw:/dmix: chain remains for a system with no alsa configuration.

"null" is skipped: it accepts and discards audio and always opens, so
offering it would let the automatic fallback land on a device that looks
like working audio and is silent.

Also frees the hint array, which was leaked on every enumeration.

Measured with the raw card held by another process: before, makepad's
first pick failed; now it opens "default" and audio flows immediately.
2026-07-30 21:25:38 +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
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
1b558cefd9 Linux: derive window app id from the binary name, or app override (#1151)
Every window hardcoded `create_app_id = "Makepad"`. GNOME Shell matches Wayland
toplevels to their `.desktop` file by app id, so packaged apps looked for
`Makepad.desktop`, missed, and lost their icon. X11 was unaffected, having always
used argv[0] for WM_CLASS.

* Default `create_app_id` to the argv[0] basename via `window::default_app_id()`.
* Add a `window.app_id` DSL field to override it, for rDNS packaging like Flatpak.
* Route X11's WM_CLASS through `create_app_id` too, replacing its own inline copy
  of the argv[0] chain, so both identities come from one field.
2026-07-30 08:51:06 +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
Jason Yau
ccd1adbaf6 Fix Windows WASAPI open failures and infinite retry spam (#1148)
Co-authored-by: jasonqiu <jasonqiuchen@outlook.com>
2026-07-28 18:46:52 +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
Admin
16a5f507bb map: transit lines/labels, districts, 3D signals+trees, label flip invariant
- transit routes draw as per-line colored strokes (stable ref-hash
  palette) on white casings, labeled "Tram 7"/"Metro 52"; stops get
  name labels (stations z13+, local z15+)
- districts layer: tiered admin boundaries (gemeente/wijk/buurt) and
  centroid name labels staged by zoom, muted admin purple
- upside-down labels fixed structurally: post-placement invariant
  re-places any glyph run that reads net-leftward (hairpin ramps fooled
  every pre-placement chord heuristic); vertical dead band ±4°
- overlay charger pins hold collision priority over base charging_station
  icons, which are suppressed while a charger overlay is active; pins
  reserve their bubble box so POI text places beside them
- per-icon zoom floors: overlay pins use kW tier floors (8/10/12) —
  micro floor 16.5 no longer hides them; 0.6 zoom grace; fail-open when
  the icon_zoom uniform is unset; oneway arrows from z15
- rail z-fighting: stroke merge drops duplicate quantized segments from
  forked ways (switches drew shared segments twice, shimmering in tilt)
- 3D mode: stoplights (pole + red/amber/green lights) and taller
  ellipsoid trees; live_reload names its override files

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 16:57:07 +02:00
Admin
1b0decc6c9 map: charger pin redesign, upright/billboard labels, 3D trees, exits
- Tesla-style droplet pins anchored at the tail tip (rotate around the
  exact site point in tilted views); red exclusively Tesla, amber DC,
  blue AC; Tesla pins show stall count, others peak kW
- in-pin text through the normal text renderer: billboard-anchored
  glyphs (anchor scales with the map, glyph size constant), exempt from
  label collision/repeat culling, no halo
- upright camera-delta labels: straightened labels (place names, POIs,
  brands, pin text) translate with the rotation gesture but stay
  horizontal — no more rotate-then-snap on regen
- per-icon zoom floors baked in vertex param4 + live icon_zoom uniform:
  stale deeper-bucket tiles never flash markers on zoom-out (param4 is
  lift-height only for non-icon shapes — icons stay on the ground)
- motorway exit labels (street_labels_points): carto-red name + ref
- 2D/3D mode: tilt gesture syncs app state (TiltChanged action), tilt
  release near-flat settles to exact 0, mode flip re-bakes tiles
  (extrusions appear/disappear without a zoom nudge)
- Simple 3D Buildings: building:part volumes with min_height bases;
  outlines containing parts flatten to footprints; famous buildings
  with tourism=attraction extrude instead of dying as attraction fills
- little 3D trees in tilt mode: crossed trunk quads + sphere-slice
  ball canopy (architecture-model proportions)
- searchdb/mbtiles support work: reach-based distance ranking, direct
  tile lookup + writer ordering

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 16:02:44 +02:00
Admin
dabbd0bbc6 llama: image-span prefill + M-RoPE — full VLM pipeline matches llama.cpp exactly
LlamaSession gains append_image_embeddings: precomputed vision embeddings
prefill through a second Embeddings-input graph spec sharing the same
cache tensors (SessionGraphParams grows an embeddings_input discriminant).
HybridDecodeBatchLayout gains an optional pre-expanded rope_positions
override, threaded to encode_rope_positions — cache indices and attention
masks stay linear while image tokens get qwen-vl 2D positions
[pos0, pos0+y, pos0+x, 0] and the span advances rope position by
max(w, h). Text after an image continues from the shifted position; pure
text paths are byte-identical to before (verified via llama-generate).

vlm-probe runs the whole thing: ppm -> vision tower -> chatml with
vision_start/end -> greedy. Output is token-for-token identical to
llama-mtmd-cli --temp 0 on both test images (radar scene description and
'A red circle.'). 229-token mixed prefill 0.98s, generation 27.9 tok/s
on the 9B UD-Q4_K_XL.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 14:31:44 +02:00
Admin
56153ce02a llama: qwen3.5 vision tower on makepad-ggml — oracle parity achieved
New vision module: mmproj GGUF load (reuses the arch-agnostic loader),
exact-port preprocessing (calc_size_preserved_ratio, f64 bilinear resize to
match the reference binary's double promotion, block-major patch unfold),
and the 27-block ViT graph: patchify as two matmuls vs the flattened conv
weights, interpolated learned pos-embd (gpu bilinear+antialias, gathered to
block order), 2D vision rope, full bidirectional flash attention (f16 k/v,
f32 prec), layernorm composed as norm-mul-add, and the qwen3vl_merger
2-layer MLP into the LLM's 4096-dim space.

vlm-vision-probe validates against clip.cpp dumps: preproc bit-exact on
aligned images (1e-7), embeddings rms 3e-4..9e-4 / cosine 0.99999+ on all
three test images — inside the oracle's own flash-vs-composed spread
(rms 8.9e-4). 64-token encode 38ms, 192-token 103ms after graph compile.

Also fixes a stale DeltaNetRecurrentBlockSpec test initializer that broke
cargo test compilation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-28 14:23:26 +02:00
Admin
1b1d908d2a map: exact camera-delta matrix — labels land where the regen lands
The snap: tilt does not commute with rotation. The placement maps world
points rotate-then-y-compress, so the true delta between the cached
camera (r0,t0) and now (r1,t1) is S(t1)*R(d)*S(1/t0) — a general 2x2
matrix, not the rotate+scale previously approximated. The shader takes
the full matrix; the pan shift pre-inverts through it so pans during
rotation land correctly. Between-frame tracking now converges on the
exact re-place result — no more rotate-snap in 2.5D.

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