rafx_plugins/features/skybox/
plugin.rs

1use rafx::render_feature_renderer_prelude::*;
2
3use super::*;
4use crate::phases::OpaqueRenderPhase;
5use hydrate_base::handle::Handle;
6use rafx::assets::MaterialAsset;
7use rafx::renderer::RendererLoadContext;
8
9pub struct SkyboxStaticResources {
10    pub skybox_material: Handle<MaterialAsset>,
11}
12
13#[derive(Default)]
14pub struct SkyboxRendererPlugin;
15
16#[cfg(feature = "legion")]
17impl SkyboxRendererPlugin {
18    pub fn legion_init(
19        &self,
20        resources: &mut legion::Resources,
21    ) {
22        resources.insert(SkyboxResource::default());
23    }
24
25    pub fn legion_destroy(resources: &mut legion::Resources) {
26        resources.remove::<SkyboxResource>();
27    }
28}
29
30impl RenderFeaturePlugin for SkyboxRendererPlugin {
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::<OpaqueRenderPhase>()
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::<SkyboxRenderFeature>()
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 skybox_material = asset_resource
67            .load_artifact_symbol_name::<MaterialAsset>("rafx-plugins://materials/skybox.material");
68
69        renderer_load_context.wait_for_asset_to_load(
70            render_resources,
71            asset_manager,
72            &skybox_material,
73            asset_resource,
74            "skybox material",
75        )?;
76
77        render_resources.insert(SkyboxStaticResources { skybox_material });
78
79        Ok(())
80    }
81
82    fn new_frame_packet(
83        &self,
84        frame_packet_size: &FramePacketSize,
85    ) -> Box<dyn RenderFeatureFramePacket> {
86        Box::new(SkyboxFramePacket::new(
87            self.feature_index(),
88            frame_packet_size,
89        ))
90    }
91
92    fn new_extract_job<'extract>(
93        &self,
94        extract_context: &RenderJobExtractContext<'extract>,
95        frame_packet: Box<dyn RenderFeatureFramePacket>,
96    ) -> Arc<dyn RenderFeatureExtractJob<'extract> + 'extract> {
97        let static_resources = extract_context
98            .render_resources
99            .fetch::<SkyboxStaticResources>();
100
101        SkyboxExtractJob::new(
102            extract_context,
103            frame_packet.into_concrete(),
104            static_resources.skybox_material.clone(),
105        )
106    }
107
108    fn new_submit_packet(
109        &self,
110        frame_packet: &Box<dyn RenderFeatureFramePacket>,
111    ) -> Box<dyn RenderFeatureSubmitPacket> {
112        let frame_packet: &SkyboxFramePacket = frame_packet.as_ref().as_concrete();
113
114        let mut view_submit_packets = Vec::with_capacity(frame_packet.view_packets().len());
115        for view_packet in frame_packet.view_packets() {
116            let view_submit_packet =
117                ViewSubmitPacket::from_view_packet::<OpaqueRenderPhase>(view_packet, Some(1));
118            view_submit_packets.push(view_submit_packet);
119        }
120
121        Box::new(SkyboxSubmitPacket::new(
122            self.feature_index(),
123            frame_packet.render_object_instances().len(),
124            view_submit_packets,
125        ))
126    }
127
128    fn new_prepare_job<'prepare>(
129        &self,
130        prepare_context: &RenderJobPrepareContext<'prepare>,
131        frame_packet: Box<dyn RenderFeatureFramePacket>,
132        submit_packet: Box<dyn RenderFeatureSubmitPacket>,
133    ) -> Arc<dyn RenderFeaturePrepareJob<'prepare> + 'prepare> {
134        SkyboxPrepareJob::new(
135            prepare_context,
136            frame_packet.into_concrete(),
137            submit_packet.into_concrete(),
138        )
139    }
140
141    fn new_write_job<'write>(
142        &self,
143        write_context: &RenderJobWriteContext<'write>,
144        frame_packet: Box<dyn RenderFeatureFramePacket>,
145        submit_packet: Box<dyn RenderFeatureSubmitPacket>,
146    ) -> Arc<dyn RenderFeatureWriteJob<'write> + 'write> {
147        SkyboxWriteJob::new(
148            write_context,
149            frame_packet.into_concrete(),
150            submit_packet.into_concrete(),
151        )
152    }
153}