maplibre/debug/
render_commands.rs

1//! Specifies the instructions which are going to be sent to the GPU. Render commands can be concatenated
2//! into a new render command which executes multiple instruction sets.
3use crate::{
4    debug::{DebugPipeline, TileDebugItem},
5    render::{
6        eventually::{Eventually, Eventually::Initialized},
7        render_phase::{PhaseItem, RenderCommand, RenderCommandResult},
8        resource::TrackedRenderPass,
9        tile_view_pattern::WgpuTileViewPattern,
10    },
11    tcs::world::World,
12};
13
14pub struct SetDebugPipeline;
15impl<P: PhaseItem> RenderCommand<P> for SetDebugPipeline {
16    fn render<'w>(
17        world: &'w World,
18        _item: &P,
19        pass: &mut TrackedRenderPass<'w>,
20    ) -> RenderCommandResult {
21        let Some(Initialized(pipeline)) = world.resources.get::<Eventually<DebugPipeline>>() else {
22            return RenderCommandResult::Failure;
23        };
24
25        pass.set_render_pipeline(pipeline);
26        RenderCommandResult::Success
27    }
28}
29
30pub struct DrawDebugOutline;
31impl RenderCommand<TileDebugItem> for DrawDebugOutline {
32    fn render<'w>(
33        world: &'w World,
34        item: &TileDebugItem,
35        pass: &mut TrackedRenderPass<'w>,
36    ) -> RenderCommandResult {
37        let Some(Initialized(tile_view_pattern)) =
38            world.resources.get::<Eventually<WgpuTileViewPattern>>()
39        else {
40            return RenderCommandResult::Failure;
41        };
42
43        let source_shape = &item.source_shape;
44
45        let tile_view_pattern_buffer = source_shape
46            .buffer_range()
47            .expect("tile_view_pattern needs to be uploaded first"); // FIXME tcs
48        pass.set_vertex_buffer(
49            0,
50            tile_view_pattern.buffer().slice(tile_view_pattern_buffer),
51        );
52
53        const TILE_MASK_SHADER_VERTICES: u32 = 24;
54        pass.draw(0..TILE_MASK_SHADER_VERTICES, 0..1);
55
56        RenderCommandResult::Success
57    }
58}
59
60pub type DrawDebugOutlines = (SetDebugPipeline, DrawDebugOutline);