rafx_framework/render_features/jobs/extract/
render_feature_view_packet.rs1use crate::render_features::render_features_prelude::*;
2use downcast_rs::{impl_downcast, Downcast};
3
4pub type ViewFrameIndex = u32;
6
7pub type RenderObjectInstancePerViewId = u32;
9
10impl_downcast!(RenderFeatureViewPacket);
11pub 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
34pub trait RenderFeatureViewPacketIntoConcrete {
36 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
52pub trait RenderFeatureViewPacketAsConcrete<'a> {
54 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}