rafx_plugins/features/debug3d/
plugin.rs

1use rafx::render_feature_renderer_prelude::*;
2
3use super::*;
4use crate::phases::WireframeRenderPhase;
5use hydrate_base::handle::Handle;
6use rafx::assets::MaterialAsset;
7use rafx::renderer::RendererLoadContext;
8
9pub struct Debug3DStaticResources {
10    pub debug3d_material: Handle<MaterialAsset>,
11}
12
13#[derive(Default)]
14pub struct Debug3DRendererPlugin;
15
16#[cfg(feature = "legion")]
17impl Debug3DRendererPlugin {
18    pub fn legion_init(
19        &self,
20        resources: &mut legion::Resources,
21    ) {
22        resources.insert(Debug3DResource::new());
23    }
24
25    pub fn legion_destroy(resources: &mut legion::Resources) {
26        resources.remove::<Debug3DResource>();
27    }
28}
29
30impl RenderFeaturePlugin for Debug3DRendererPlugin {
31    fn feature_debug_constants(&self) -> &'static RenderFeatureDebugConstants {
32        super::render_feature_debug_constants()
33    }
34
35    fn feature_index(&self) -> RenderFeatureIndex {
36        super::render_feature_index()
37    }
38
39    fn is_view_relevant(
40        &self,
41        view: &RenderView,
42    ) -> bool {
43        view.phase_is_relevant::<WireframeRenderPhase>()
44    }
45
46    fn requires_visible_render_objects(&self) -> bool {
47        false
48    }
49
50    fn configure_render_registry(
51        &self,
52        render_registry: RenderRegistryBuilder,
53    ) -> RenderRegistryBuilder {
54        render_registry.register_feature::<Debug3DRenderFeature>()
55    }
56
57    fn initialize_static_resources(
58        &self,
59        renderer_load_context: &RendererLoadContext,
60        asset_manager: &mut AssetManager,
61        asset_resource: &mut AssetResource,
62        _extract_resources: &ExtractResources,
63        render_resources: &mut RenderResources,
64        _upload: &mut RafxTransferUpload,
65    ) -> RafxResult<()> {
66        let debug3d_material = asset_resource.load_artifact_symbol_name::<MaterialAsset>(
67            "rafx-plugins://materials/debug3d.material",
68        );
69
70        renderer_load_context
71            .wait_for_asset_to_load(
72                render_resources,
73                asset_manager,
74                &debug3d_material,
75                asset_resource,
76                "debug3d.material",
77            )
78            .unwrap();
79
80        render_resources.insert(Debug3DStaticResources { debug3d_material });
81
82        Ok(())
83    }
84
85    fn new_frame_packet(
86        &self,
87        frame_packet_size: &FramePacketSize,
88    ) -> Box<dyn RenderFeatureFramePacket> {
89        Box::new(Debug3DFramePacket::new(
90            self.feature_index(),
91            frame_packet_size,
92        ))
93    }
94
95    fn new_extract_job<'extract>(
96        &self,
97        extract_context: &RenderJobExtractContext<'extract>,
98        frame_packet: Box<dyn RenderFeatureFramePacket>,
99    ) -> Arc<dyn RenderFeatureExtractJob<'extract> + 'extract> {
100        let debug3d_material = extract_context
101            .render_resources
102            .fetch::<Debug3DStaticResources>()
103            .debug3d_material
104            .clone();
105
106        Debug3DExtractJob::new(
107            extract_context,
108            frame_packet.into_concrete(),
109            debug3d_material,
110        )
111    }
112
113    fn new_submit_packet(
114        &self,
115        frame_packet: &Box<dyn RenderFeatureFramePacket>,
116    ) -> Box<dyn RenderFeatureSubmitPacket> {
117        let frame_packet: &Debug3DFramePacket = frame_packet.as_ref().as_concrete();
118
119        let mut view_submit_packets = Vec::with_capacity(frame_packet.view_packets().len());
120        for view_packet in frame_packet.view_packets() {
121            let view_submit_packet =
122                ViewSubmitPacket::from_view_packet::<WireframeRenderPhase>(view_packet, Some(1));
123            view_submit_packets.push(view_submit_packet);
124        }
125
126        Box::new(Debug3DSubmitPacket::new(
127            self.feature_index(),
128            frame_packet.render_object_instances().len(),
129            view_submit_packets,
130        ))
131    }
132
133    fn new_prepare_job<'prepare>(
134        &self,
135        prepare_context: &RenderJobPrepareContext<'prepare>,
136        frame_packet: Box<dyn RenderFeatureFramePacket>,
137        submit_packet: Box<dyn RenderFeatureSubmitPacket>,
138    ) -> Arc<dyn RenderFeaturePrepareJob<'prepare> + 'prepare> {
139        Debug3DPrepareJob::new(
140            prepare_context,
141            frame_packet.into_concrete(),
142            submit_packet.into_concrete(),
143        )
144    }
145
146    fn new_write_job<'write>(
147        &self,
148        write_context: &RenderJobWriteContext<'write>,
149        frame_packet: Box<dyn RenderFeatureFramePacket>,
150        submit_packet: Box<dyn RenderFeatureSubmitPacket>,
151    ) -> Arc<dyn RenderFeatureWriteJob<'write> + 'write> {
152        Debug3DWriteJob::new(
153            write_context,
154            frame_packet.into_concrete(),
155            submit_packet.into_concrete(),
156        )
157    }
158}