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