maplibre/background/
render_commands.rs

1use crate::{
2    background::resource_system::BackgroundRenderPipeline,
3    render::{
4        eventually::Eventually::{self, Initialized},
5        render_phase::{PhaseItem, RenderCommand, RenderCommandResult},
6        resource::TrackedRenderPass,
7    },
8    tcs::world::World,
9};
10
11pub struct SetBackgroundPipeline;
12impl<P: PhaseItem> RenderCommand<P> for SetBackgroundPipeline {
13    fn render<'w>(
14        world: &'w World,
15        _item: &P,
16        pass: &mut TrackedRenderPass<'w>,
17    ) -> RenderCommandResult {
18        let Some(Initialized(BackgroundRenderPipeline(pipeline))) = world
19            .resources
20            .get::<Eventually<BackgroundRenderPipeline>>()
21        else {
22            return RenderCommandResult::Failure;
23        };
24
25        pass.set_render_pipeline(pipeline);
26        RenderCommandResult::Success
27    }
28}
29
30pub struct DrawBackgroundQuad;
31impl<P: PhaseItem> RenderCommand<P> for DrawBackgroundQuad {
32    fn render<'w>(
33        world: &'w World,
34        item: &P,
35        pass: &mut TrackedRenderPass<'w>,
36    ) -> RenderCommandResult {
37        if let Some(buf) = world
38            .resources
39            .get::<crate::background::queue_system::BackgroundBuffers>()
40        {
41            pass.set_vertex_buffer(0, buf.metadata_buffer.slice(..));
42
43            // Simplified drawing for now, assuming a single background layer or that the first one is sufficient for the test.
44            pass.draw(0..6, 0..1);
45            return RenderCommandResult::Success;
46        }
47        RenderCommandResult::Failure
48    }
49}
50
51pub struct DrawBackground;
52impl<P: PhaseItem> RenderCommand<P> for DrawBackground {
53    fn render<'w>(
54        world: &'w World,
55        item: &P,
56        pass: &mut TrackedRenderPass<'w>,
57    ) -> RenderCommandResult {
58        let mut result = SetBackgroundPipeline::render(world, item, pass);
59        if let RenderCommandResult::Success = result {
60            result = DrawBackgroundQuad::render(world, item, pass);
61        }
62        result
63    }
64}