maplibre/raster/
queue_system.rs

1//! Queues [PhaseItems](crate::render::render_phase::PhaseItem) for rendering.
2
3use crate::{
4    context::MapContext,
5    raster::render_commands::DrawRasterTiles,
6    render::{
7        eventually::{Eventually, Eventually::Initialized},
8        render_commands::DrawMasks,
9        render_phase::{DrawState, LayerItem, RenderPhase, TileMaskItem},
10        tile_view_pattern::WgpuTileViewPattern,
11    },
12    tcs::{
13        system::{SystemError, SystemResult},
14        tiles::Tile,
15    },
16};
17
18pub fn queue_system(MapContext { world, .. }: &mut MapContext) -> SystemResult {
19    let Some((Initialized(tile_view_pattern),)) = world
20        .resources
21        .query::<(&Eventually<WgpuTileViewPattern>,)>()
22    else {
23        return Err(SystemError::Dependencies);
24    };
25
26    let mut items = Vec::new();
27
28    for view_tile in tile_view_pattern.iter() {
29        let coords = &view_tile.coords();
30        tracing::trace!("Drawing tile at {coords}");
31
32        // draw tile normal or the source e.g. parent or children
33        view_tile.render(|source_shape| {
34            // FIXME if raster_resources.has_tile(source_shape.coords(), world) {
35            items.push((
36                LayerItem {
37                    draw_function: Box::new(DrawState::<LayerItem, DrawRasterTiles>::new()),
38                    index: 0,
39                    is_line: false,
40                    style_layer: "raster".to_string(),
41                    tile: Tile {
42                        coords: source_shape.coords(),
43                    },
44                    source_shape: source_shape.clone(),
45                },
46                // FIXME tsc: Tile masks are currently drawn twice by each plugin
47                TileMaskItem {
48                    draw_function: Box::new(DrawState::<TileMaskItem, DrawMasks>::new()),
49                    source_shape: source_shape.clone(),
50                },
51            ));
52        });
53    }
54
55    let Some((layer_item_phase, tile_mask_phase)) = world
56        .resources
57        .query_mut::<(&mut RenderPhase<LayerItem>, &mut RenderPhase<TileMaskItem>)>()
58    else {
59        return Err(SystemError::Dependencies);
60    };
61
62    for (layer, mask) in items {
63        layer_item_phase.add(layer);
64        tile_mask_phase.add(mask);
65    }
66
67    Ok(())
68}