maplibre/debug/
render_commands.rs1use 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"); 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);