maplibre/background/
resource_system.rs

1use crate::{
2    context::MapContext,
3    render::{
4        eventually::Eventually,
5        resource::{RenderPipeline, TilePipeline},
6        shaders::{BackgroundShader, Shader},
7    },
8};
9
10pub fn resource_system(
11    MapContext {
12        world,
13        renderer:
14            crate::render::Renderer {
15                device,
16                resources: crate::render::RenderResources { surface, .. },
17                settings,
18                ..
19            },
20        ..
21    }: &mut MapContext,
22) -> crate::tcs::system::SystemResult {
23    let Some(background_pipeline) = world
24        .resources
25        .get_mut::<Eventually<BackgroundRenderPipeline>>()
26    else {
27        return Err(crate::tcs::system::SystemError::Dependencies);
28    };
29
30    background_pipeline.initialize(|| {
31        let shader = BackgroundShader {
32            format: surface.surface_format(),
33        };
34
35        let pipeline = TilePipeline::new(
36            "background_pipeline".into(),
37            *settings,
38            shader.describe_vertex(),
39            shader.describe_fragment(),
40            true,                                              // depth stencil used
41            false,                                             // update stencil
42            true,  // debug stencil (Always pass stencil)
43            false, // wireframe
44            surface.is_multisampling_supported(settings.msaa), // multisampling
45            false, // raster
46            false, // glyph
47        )
48        .describe_render_pipeline()
49        .initialize(device);
50
51        BackgroundRenderPipeline(pipeline)
52    });
53
54    Ok(())
55}
56
57pub struct BackgroundRenderPipeline(pub wgpu::RenderPipeline);