rafx_plugins/features/debug3d/
plugin.rs1use 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}