rafx_plugins/features/tile_layer/
plugin.rs

1use 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}