Commit Graph

6 Commits

Author SHA1 Message Date
Schuwi
c7c08ebead Add --center-lat, --center-lon, --zoom CLI arguments
Allow overriding the map centre and OSM zoom level from the command
line, keeping the existing values as defaults.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-07 11:10:55 +01:00
Schuwi
71d6588dc3 Derive OSM viewport from zoom level instead of the other way around
Replace the heuristic choose_zoom() back-computation with a fixed
OSM_ZOOM constant (zoom 10). The orthographic projection half-extents
are now derived so that one tile pixel maps exactly to one output pixel,
eliminating bilinear interpolation artefacts on the OSM base layer.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-07 11:04:26 +01:00
Schuwi
ff69c1d2db Add OpenStreetMap base layer with Carto tile overlay
- Fetch Carto Voyager no-label base tiles and label-only tiles separately,
  cached under cache/osm_tiles/{z}/ and cache/osm_tiles/labels/{z}/
- Rasterize both into the orthographic projection via exact inverse projection
  (new unproject/pixel_to_geo methods on OrthoProjection)
- Render pipeline: basemap → cloud blend → label overlay (labels above clouds)
- Bilinear interpolation for base tiles; premultiplied-alpha bilinear for label
  tiles to prevent dark-fringe artifacts at text edges
- Dynamic zoom selection (floor-based) from actual geographic bounding box
- Fix horizontal squish: derive HALF_W_DEG from pixel aspect ratio so
  degrees-per-pixel is equal on both axes
- Add --no-basemap flag to skip tile fetching for offline/fast use
- Remove hardcoded city markers/labels when tile label overlay is present

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-07 10:52:34 +01:00
Schuwi
764f4f6378 Add animated GIF output with parallelised frame quantization
Render an animated clct_animation.gif alongside the per-step PNGs.
Frames are loaded and colour-quantized in parallel via rayon, then
written sequentially with the gif crate.  Also converts timestamps
to CET/CEST using chrono-tz.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-06 22:53:49 +01:00
Schuwi
0c73e04959 Parallelize GRIB2 downloads using a dedicated rayon thread pool
Downloads clat/clon concurrently via rayon::join and all forecast steps
in parallel via par_iter, then renders frames sequentially. A separate
thread pool (up to 16 threads) is used for downloads to avoid blocking
the global pool during CPU-bound rendering.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-06 22:27:39 +01:00
Schuwi
6c9a20bf59 Initial commit 2026-03-03 23:26:05 +01:00