rafx_framework/render_features/jobs/extract/
render_feature_frame_packet.rs

1use crate::render_features::render_features_prelude::*;
2use downcast_rs::{impl_downcast, Downcast};
3
4/// The `ID` of a `RenderObjectInstance` in a specific `FramePacket` for the current frame.
5pub type RenderObjectInstanceId = u32;
6
7impl_downcast!(RenderFeatureFramePacket);
8/// A type-erased trait used by the `Renderer`, `RenderFrameJob`, and `RendererThreadPool`
9/// to control the workload of the rendering process without identifying specific types
10/// used in each `RenderFeature`'s frame packet or workload. See `FramePacket` and `ViewPacket`
11/// for implementation details.
12pub trait RenderFeatureFramePacket: Downcast + Send + Sync {
13    fn get_or_push_render_object_instance(
14        &mut self,
15        render_object_instance: RenderObjectInstance,
16    ) -> RenderObjectInstanceId;
17
18    fn push_render_object_instance_per_view(
19        &mut self,
20        view_index: ViewFrameIndex,
21        render_object_instance_id: RenderObjectInstanceId,
22        render_object_instance: RenderObjectInstance,
23    ) -> RenderObjectInstancePerViewId {
24        let view_packet = self.render_feature_view_packet_mut(view_index);
25        view_packet.push_render_object_instance(render_object_instance_id, render_object_instance)
26    }
27
28    fn push_volume(
29        &mut self,
30        view_index: ViewFrameIndex,
31        object_id: ObjectId,
32    ) {
33        let view_packet = self.render_feature_view_packet_mut(view_index);
34        view_packet.push_volume(object_id);
35    }
36
37    fn render_feature_view_packet(
38        &self,
39        view_index: ViewFrameIndex,
40    ) -> &dyn RenderFeatureViewPacket;
41
42    fn render_feature_view_packet_mut(
43        &mut self,
44        view_index: ViewFrameIndex,
45    ) -> &mut dyn RenderFeatureViewPacket;
46
47    fn feature_index(&self) -> RenderFeatureIndex;
48}
49
50/// Provides `into_concrete` method to downcast into a concrete type.
51pub trait RenderFeatureFramePacketIntoConcrete {
52    /// Downcast `Box<dyn RenderFeatureFramePacket>` into `Box<T>` where `T: RenderFeatureFramePacket`.
53    fn into_concrete<T: RenderFeatureFramePacket>(self) -> Box<T>;
54}
55
56impl RenderFeatureFramePacketIntoConcrete for Box<dyn RenderFeatureFramePacket> {
57    fn into_concrete<T: RenderFeatureFramePacket>(self) -> Box<T> {
58        self.into_any().downcast::<T>().unwrap_or_else(|_| {
59            panic!(
60                "Unable to downcast {} into {}",
61                std::any::type_name::<dyn RenderFeatureFramePacket>(),
62                std::any::type_name::<T>(),
63            )
64        })
65    }
66}
67
68/// Provides `as_concrete` method to downcast as a concrete type.
69pub trait RenderFeatureFramePacketAsConcrete<'a> {
70    /// Downcast `&dyn RenderFeatureFramePacket` into `&T` where `T: RenderFeatureFramePacket`.
71    fn as_concrete<T: RenderFeatureFramePacket>(&'a self) -> &'a T;
72}
73
74impl<'a> RenderFeatureFramePacketAsConcrete<'a> for dyn RenderFeatureFramePacket {
75    fn as_concrete<T: RenderFeatureFramePacket>(&'a self) -> &'a T {
76        self.as_any().downcast_ref::<T>().unwrap_or_else(|| {
77            panic!(
78                "Unable to downcast_ref {} into {}",
79                std::any::type_name::<dyn RenderFeatureFramePacket>(),
80                std::any::type_name::<T>(),
81            )
82        })
83    }
84}