rafx_framework/render_features/jobs/extract/
render_feature_frame_packet.rs1use crate::render_features::render_features_prelude::*;
2use downcast_rs::{impl_downcast, Downcast};
3
4pub type RenderObjectInstanceId = u32;
6
7impl_downcast!(RenderFeatureFramePacket);
8pub 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
50pub trait RenderFeatureFramePacketIntoConcrete {
52 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
68pub trait RenderFeatureFramePacketAsConcrete<'a> {
70 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}