maplibre/raster/
mod.rs

1use std::{marker::PhantomData, rc::Rc};
2
3use image::RgbaImage;
4
5use crate::{
6    coords::WorldTileCoords,
7    environment::Environment,
8    kernel::Kernel,
9    plugin::Plugin,
10    raster::{
11        populate_world_system::PopulateWorldSystem, queue_system::queue_system,
12        request_system::RequestSystem, resource::RasterResources, resource_system::resource_system,
13        upload_system::upload_system,
14    },
15    render::{eventually::Eventually, tile_view_pattern::ViewTileSources, RenderStageLabel},
16    schedule::Schedule,
17    tcs::{system::SystemContainer, tiles::TileComponent, world::World},
18};
19
20mod populate_world_system;
21mod process_raster;
22mod queue_system;
23mod render_commands;
24mod request_system;
25mod resource;
26mod resource_system;
27mod transferables;
28mod upload_system;
29
30pub use transferables::{
31    DefaultRasterTransferables, LayerRaster, LayerRasterMissing, RasterTransferables,
32};
33
34use crate::render::graph::RenderGraph;
35
36pub struct RasterPlugin<T>(PhantomData<T>);
37
38impl<T: RasterTransferables> Default for RasterPlugin<T> {
39    fn default() -> Self {
40        Self(Default::default())
41    }
42}
43
44impl<E: Environment, T: RasterTransferables> Plugin<E> for RasterPlugin<T> {
45    fn build(
46        &self,
47        schedule: &mut Schedule,
48        kernel: Rc<Kernel<E>>,
49        world: &mut World,
50        _graph: &mut RenderGraph,
51    ) {
52        world
53            .resources
54            .insert(Eventually::<RasterResources>::Uninitialized);
55
56        world
57            .resources
58            .get_or_init_mut::<ViewTileSources>()
59            .add_resource_query::<&Eventually<RasterResources>>();
60
61        schedule.add_system_to_stage(
62            RenderStageLabel::Extract,
63            SystemContainer::new(RequestSystem::<E, T>::new(&kernel)),
64        );
65        schedule.add_system_to_stage(
66            RenderStageLabel::Extract,
67            SystemContainer::new(PopulateWorldSystem::<E, T>::new(&kernel)),
68        );
69        schedule.add_system_to_stage(RenderStageLabel::Prepare, resource_system);
70        schedule.add_system_to_stage(RenderStageLabel::Queue, upload_system);
71        schedule.add_system_to_stage(RenderStageLabel::Queue, queue_system); // FIXME tcs: Upload updates the TileView in tileviewpattern -> upload most run before prepare
72    }
73}
74
75pub struct AvailableRasterLayerData {
76    pub coords: WorldTileCoords,
77    pub source_layer: String,
78    pub image: RgbaImage,
79}
80
81pub struct MissingRasterLayerData {
82    pub coords: WorldTileCoords,
83    pub source_layer: String,
84}
85
86pub enum RasterLayerData {
87    Available(AvailableRasterLayerData),
88    Missing(MissingRasterLayerData),
89}
90
91#[derive(Default)]
92pub struct RasterLayersDataComponent {
93    pub layers: Vec<RasterLayerData>,
94}
95
96impl TileComponent for RasterLayersDataComponent {}