maplibre/debug/
debug_pass.rs

1use std::ops::Deref;
2
3use wgpu::StoreOp;
4
5use crate::{
6    debug::TileDebugItem,
7    render::{
8        eventually::Eventually::Initialized,
9        graph::{Node, NodeRunError, RenderContext, RenderGraphContext, SlotInfo},
10        render_phase::RenderPhase,
11        resource::TrackedRenderPass,
12        RenderResources,
13    },
14    tcs::world::World,
15};
16
17/// Pass which renders debug information on top of the map.
18pub struct DebugPassNode {}
19
20impl DebugPassNode {
21    pub fn new() -> Self {
22        Self {}
23    }
24}
25
26impl Node for DebugPassNode {
27    fn input(&self) -> Vec<SlotInfo> {
28        vec![]
29    }
30
31    fn update(&mut self, _state: &mut RenderResources) {}
32
33    fn run(
34        &self,
35        _graph: &mut RenderGraphContext,
36        render_context: &mut RenderContext,
37        resources: &RenderResources,
38        world: &World,
39    ) -> Result<(), NodeRunError> {
40        let Initialized(render_target) = &resources.render_target else {
41            return Ok(());
42        };
43
44        let color_attachment = wgpu::RenderPassColorAttachment {
45            view: render_target.deref(),
46            ops: wgpu::Operations {
47                // Draws on-top of previously rendered data
48                load: wgpu::LoadOp::Load,
49                store: StoreOp::Store,
50            },
51            resolve_target: None,
52        };
53
54        let render_pass =
55            render_context
56                .command_encoder
57                .begin_render_pass(&wgpu::RenderPassDescriptor {
58                    label: Some("debug_pass"),
59                    color_attachments: &[Some(color_attachment)],
60                    depth_stencil_attachment: None,
61                    timestamp_writes: None,
62                    occlusion_query_set: None,
63                });
64
65        let mut tracked_pass = TrackedRenderPass::new(render_pass);
66
67        if let Some(debug_items) = world.resources.get::<RenderPhase<TileDebugItem>>() {
68            log::trace!(
69                "RenderPhase<TileDebugItem>::size() = {}",
70                debug_items.size()
71            );
72            for item in debug_items {
73                item.draw_function.draw(&mut tracked_pass, world, item);
74            }
75        }
76
77        Ok(())
78    }
79}