maplibre/render/systems/
tile_view_pattern_system.rs

1//! Extracts data from the current state.
2
3use crate::{
4    context::MapContext,
5    render::{
6        eventually::{Eventually, Eventually::Initialized},
7        tile_view_pattern::{ViewTileSources, WgpuTileViewPattern, DEFAULT_TILE_SIZE},
8        view_state::ViewStatePadding,
9    },
10    tcs::system::{SystemError, SystemResult},
11};
12
13pub fn tile_view_pattern_system(
14    MapContext {
15        view_state, world, ..
16    }: &mut MapContext,
17) -> SystemResult {
18    let Some((Initialized(tile_view_pattern), view_tile_sources)) = world
19        .resources
20        .query::<(&Eventually<WgpuTileViewPattern>, &ViewTileSources)>()
21    else {
22        return Err(SystemError::Dependencies);
23    };
24
25    // Create the tile view pattern only for tiles in view -> Tight
26    let view_region = view_state.create_view_region(
27        view_state.zoom().zoom_level(DEFAULT_TILE_SIZE),
28        ViewStatePadding::Tight,
29    );
30
31    if let Some(view_region) = &view_region {
32        let zoom = view_state.zoom();
33
34        let view_tiles =
35            tile_view_pattern.generate_pattern(view_region, view_tile_sources, zoom, world);
36
37        // TODO: Can we &mut borrow initially somehow instead of here?
38        let Some(Initialized(tile_view_pattern)) = world
39            .resources
40            .query_mut::<&mut Eventually<WgpuTileViewPattern>>()
41        else {
42            return Err(SystemError::Dependencies);
43        };
44
45        log::trace!("Tiles in view: {}", view_tiles.len());
46
47        tile_view_pattern.update_pattern(view_tiles);
48    }
49
50    Ok(())
51}