- nigig-build: cad-ui + construction_frame host-only (DO NOT enable
unconditionally: CadViewport Script derive fails ScriptApply for
aarch64 and breaks every pageflipnav android build).
- map: vendor TagThreadPool (removed upstream with the task-pool
scheduler) into thread_pool.rs; Walk literals gain
..Default::default() for new aspect/cell/deferred fields.
Verified by pageflipnav aarch64 release rust build (0 errors).
Added 2 unit tests:
- test_script_mod_does_not_panic: Verifies script_mod function signature
- test_module_structure: Compile-time check that all modules are accessible
lib.rs contains only module declarations and one simple function (script_mod),
so minimal testing is appropriate. The real test coverage is in the individual
modules themselves.
Copied the entire latest makepad map widget implementation (commit d82756a)
into nigig-map/src/makepad_map/ subdirectory for integration.
Files copied (1.1MB total):
- tile.rs (499K) - Advanced tile processing with baked fills/faces
- view.rs (269K) - MapView widget with 2D/3D support
- geometry.rs (135K) - Tile geometry utilities
- style.rs (64K) - Advanced theming with shiny materials
- label.rs (33K) - Label placement and collision
- icons.rs (17K) - POI icon system
- overlay.rs (13K) - Route overlays, markers, puck
- drape.rs (7.2K) - Terrain draping
- mod.rs (211 bytes) - Module declarations
Next steps:
- Fix all imports to work in nigig-map context
- Integrate with existing 6-subsystem architecture
- Adapt types and functions to match our TileBuffers structure
- Enable baked fills/faces for better performance
- Implement 3D building support
- Add advanced road geometry with elevation
This is a major integration task that will bring all of makepad's
latest map improvements into our custom implementation.
Updated makepad fork to d82756a which includes latest map improvements:
- Baked fills/faces support
- Enhanced 3D building rendering
- Improved road geometry and elevation
- Better theme matching and styling
Removed tile_makepad.rs (12k+ lines) and reverted to using makepad-widgets
map functionality directly. This avoids maintaining a separate copy and
ensures we get all upstream improvements automatically.
Changes:
- Updated all Cargo.toml files to use makepad fork d82756a
- Removed crates/apps/map/src/tile_makepad.rs
- Removed tile_makepad module from lib.rs
- Reverted tile_disk.rs to use mbtiles_tile_to_overpass_response
Replace outdated custom MVT→Overpass→TileBuffers pipeline with latest
makepad build_tile_buffers_from_mvt function that includes:
- Baked fill triangulations (pre-tessellated geometry from MVT)
- Baked painter-cascade faces (z14 tiles carry solved height buckets)
- 3D building support with real heights from detail archive
- Bridge corridor detection and elevation solving
- Road core geometry for 2.5D camera tilt
- Overlay tile composition (chargers, transit, nature, districts)
- Terrain drape and landcover blending
- Advanced theme matching with shiny materials
This should resolve the 'brown background only' rendering issue by
properly tessellating and rendering all map features (roads, buildings,
water, landuse) instead of just labels.
Changes:
- Added tile_makepad.rs (12,422 lines from makepad dev branch)
- Updated tile_disk.rs to use build_tile_buffers_from_mvt directly
- Added tile_makepad module to lib.rs
Complete overlay rendering system ported from Makepad upstream:
## New Features
- **Route Overlay Rendering**: Route polyline with casing (9px) and fill (5.5px)
- Traveled portion dimming (alpha 0.30) for navigation progress
- Additive glow effect (route_glow) for visual enhancement
- Destination dot at route end
- Screen-space rendering with viewport clipping
- **Drop Markers**: Professional pin-shaped markers with:
- Soft ground shadow (ellipse)
- Triangular tail + circular head pin shape
- White pip in center
- 16px tap detection radius for interaction
- Custom color support per marker
- **Position Puck**: Current location indicator with:
- Accuracy circle (scales with zoom, 10-28% alpha)
- Heading wedge (20px tip, shows direction)
- White ring + blue dot (9px/6.2px)
- Automatic viewport clipping (60px margin)
## Implementation Details
- **OverlayCamera**: Screen-space transformation system
- norm_to_screen() converts normalized coords to screen pixels
- Supports rotation and 2.5D tilt (for future phases)
- Meters-per-pixel calculation for accuracy circle scaling
- **Integration**: Seamlessly integrated into NigigMapView
- Added draw_overlay: DrawVector field to widget
- Added overlay_state: MapOverlayState field
- Rendering happens after tile passes, before status text
- Zero overhead when no overlays are active (is_empty() check)
- **Helper Functions**:
- draw_route(): Multi-pass route rendering with travel dimming
- draw_marker(): Pin-shaped marker with shadow and highlight
- draw_puck(): Location indicator with accuracy and heading
- marker_at(): Hit testing for tap interaction
- **Viewport Enhancement**: Added meters_per_pixel() method
- Calculates real-world scale for accuracy circle sizing
- Accounts for latitude-based distortion
- Used by position puck for realistic accuracy visualization
## Technical Architecture
- Immediate-mode rendering using DrawVector
- Per-frame geometry rebuild (route scale: few hundred points)
- Viewport clipping with margin (24px for routes, 30px for markers)
- Decimation for performance (1.5px threshold on zoom-out)
- Additive blending for glow effects (no HDR required)
## Files Changed
- crates/apps/map/src/overlay.rs (NEW, 379 lines)
- crates/apps/map/src/lib.rs (module registration)
- crates/apps/map/src/view.rs (widget integration, 15 lines added)
- crates/apps/map/src/viewport.rs (meters_per_pixel method, 18 lines)
## API Usage
## Performance
- Zero cost when no overlays (early return on is_empty())
- Efficient viewport clipping reduces overdraw
- Route decimation prevents excessive geometry at low zoom
- All rendering uses GPU-accelerated DrawVector
## Compatibility
- Backward compatible: existing map functionality unchanged
- Overlay state persists across frames (no per-frame allocation)
- Integrates with existing theme system (route colors from theme)
- Supports future 2.5D camera and heading-up rotation
## Testing Recommendations
1. Verify routes render with casing/fill at all zoom levels
2. Test traveled portion dimming updates correctly
3. Verify markers appear at correct screen positions
4. Test position puck accuracy circle scales with zoom
5. Verify heading wedge rotates correctly
6. Test viewport clipping at screen edges
Refs: Phase 2 from MAKEPAD_DEV_BRANCH_GAP_ANALYSIS.md
Built on: Phase 1 (POI icon system, commit ae23d36)
Add complete vector-based POI icon system with:
- 42 OpenStreetMap-carto SVG icons (alcohol, atm, bakery, bank, bar, etc.)
- icons.rs module with zoom-constant vector tessellation
- Icon mesh generation at compile time using OnceLock caching
- Integration with existing sprite.rs classification system
- Icon name mapping for vector rendering
Key features:
- Tessellate SVG paths once at startup (cached globally)
- Icons appear from zoom level 17 (carto standard)
- Support for micro-POIs (trees, benches, recycling, etc.)
- Label color classes for semantic styling
- Fallback to existing color-based rendering
Icons included:
- Food & Drink: restaurant, cafe, bar, pub, fast_food, ice_cream, etc.
- Shopping: supermarket, bakery, butcher, clothes, florist, etc.
- Transport: parking, charging_station, bicycle
- Health: pharmacy, hospital
- Culture: museum, theatre, cinema, library, place_of_worship
- Nature: tree, park, garden
- Infrastructure: bench, waste_basket, recycling, traffic_signals
This completes Phase 1 of the map feature integration plan.
Icons are now available for rendering but use colored rectangles
in the current POI pass. Vector rendering will be added in a
follow-up phase.
Refs: Phase 1 from MAKEPAD_DEV_BRANCH_GAP_ANALYSIS.md
Register style::script_mod before view::script_mod so MapThemeStyle and
related types are available when NigigMapView's DSL is parsed.
Fixes:
- type mismatch for property style_light/style_dark
- 0 rendered features (empty theme rules)
Replace hardcoded fill/stroke/POI/label draw loops with a configurable
render graph that executes passes in z_order from lowest to highest.
New render_graph module:
- PassType enum: Background, Fill, Stroke, POI, Label, Selection, Debug
- PassConfig with z_order, enabled, min_zoom, max_zoom
- RenderGraph with enable/disable/zoom_range/set_z_order/execution_plan
- PassStats recording for per-frame diagnostics
- 16 unit tests covering ordering, gating, and stats
NigigMapView integration:
- draw_walk delegates to render_graph.should_execute() for each pass
- Records PassStats after each pass (tiles_drawn, features_drawn)
- Public API: render_graph(), enable_pass(), disable_pass(),
set_pass_zoom_range() for downstream configuration
Benefits:
- Easy insertion of new passes (3D buildings, terrain, traffic)
- Per-pass enable/disable at runtime
- Per-pass zoom culling (replaces hardcoded view_zoom >= 13.0)
- Debug visualization (show only one pass)
- Execution plan inspection for diagnostics
Phase 1 Step 4 of map rewrite plan: extract label scratch buffers and
placement methods into dedicated LabelState struct.
- Create label_state.rs with LabelState owning all scratch buffers
- Move place_and_draw_labels, collect_label_candidates, build_label_placement
from view.rs to LabelState
- Wire LabelState into NigigMapView as #[rust] field
- Reduce view.rs from 1497 to 1100 lines (-27%)
- Label logic now isolated and testable independently
- Preserves all existing behavior and performance characteristics
This completes Phase 1 of the map rewrite plan. All subsystem extractions
are now complete: ViewportState, TileCache, TileScheduler, RenderPass,
and LabelState.