use crate::render_features::render_features_prelude::*;
use downcast_rs::{impl_downcast, Downcast};
impl_downcast!(RenderFeatureViewSubmitPacket);
pub trait RenderFeatureViewSubmitPacket: Downcast + Sync + Send {
fn view(&self) -> &RenderView;
fn num_submit_nodes(
&self,
render_phase: RenderPhaseIndex,
) -> usize;
fn get_submit_node_block(
&self,
render_phase: RenderPhaseIndex,
) -> Option<&dyn RenderFeatureSubmitNodeBlock>;
}
pub trait RenderFeatureViewSubmitPacketIntoConcrete {
fn into_concrete<T: RenderFeatureViewSubmitPacket>(self) -> Box<T>;
}
impl RenderFeatureViewSubmitPacketIntoConcrete for Box<dyn RenderFeatureViewSubmitPacket> {
fn into_concrete<T: RenderFeatureViewSubmitPacket>(self) -> Box<T> {
self.into_any().downcast::<T>().unwrap_or_else(|_| {
panic!(
"Unable to downcast {} into {}",
std::any::type_name::<dyn RenderFeatureViewSubmitPacket>(),
std::any::type_name::<T>(),
)
})
}
}
pub trait RenderFeatureViewSubmitPacketAsConcrete<'a> {
fn as_concrete<T: RenderFeatureViewSubmitPacket>(&'a self) -> &'a T;
}
impl<'a> RenderFeatureViewSubmitPacketAsConcrete<'a> for dyn RenderFeatureViewSubmitPacket {
fn as_concrete<T: RenderFeatureViewSubmitPacket>(&'a self) -> &'a T {
self.as_any().downcast_ref::<T>().unwrap_or_else(|| {
panic!(
"Unable to downcast_ref {} into {}",
std::any::type_name::<dyn RenderFeatureViewSubmitPacket>(),
std::any::type_name::<T>(),
)
})
}
}