rafx_framework/render_features/jobs/extract/
render_feature_view_packet.rs

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