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); }
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 {}