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