use crate::render_features::render_features_prelude::*;
use downcast_rs::{impl_downcast, Downcast};
pub type ViewFrameIndex = u32;
pub type RenderObjectInstancePerViewId = u32;
impl_downcast!(RenderFeatureViewPacket);
pub trait RenderFeatureViewPacket: Downcast + Sync + Send {
fn view(&self) -> &RenderView;
fn view_frame_index(&self) -> ViewFrameIndex;
fn num_render_object_instances(&self) -> usize;
fn push_render_object_instance(
&mut self,
render_object_instance_id: RenderObjectInstanceId,
render_object_instance: RenderObjectInstance,
) -> RenderObjectInstancePerViewId;
fn push_volume(
&mut self,
object_id: ObjectId,
);
}
pub trait RenderFeatureViewPacketIntoConcrete {
fn into_concrete<T: RenderFeatureViewPacket>(self) -> Box<T>;
}
impl RenderFeatureViewPacketIntoConcrete for Box<dyn RenderFeatureViewPacket> {
fn into_concrete<T: RenderFeatureViewPacket>(self) -> Box<T> {
self.into_any().downcast::<T>().unwrap_or_else(|_| {
panic!(
"Unable to downcast {} into {}",
std::any::type_name::<dyn RenderFeatureViewPacket>(),
std::any::type_name::<T>(),
)
})
}
}
pub trait RenderFeatureViewPacketAsConcrete<'a> {
fn as_concrete<T: RenderFeatureViewPacket>(&'a self) -> &'a T;
}
impl<'a> RenderFeatureViewPacketAsConcrete<'a> for dyn RenderFeatureViewPacket {
fn as_concrete<T: RenderFeatureViewPacket>(&'a self) -> &'a T {
self.as_any().downcast_ref::<T>().unwrap_or_else(|| {
panic!(
"Unable to downcast_ref {} into {}",
std::any::type_name::<dyn RenderFeatureViewPacket>(),
std::any::type_name::<T>(),
)
})
}
}