use crate::render_features::render_features_prelude::*;
pub trait SubmitPacketData {
type PerFrameSubmitData: Sync + Send;
type RenderObjectInstanceSubmitData: Sync + Send;
type PerViewSubmitData: Sync + Send;
type RenderObjectInstancePerViewSubmitData: Sync + Send;
type SubmitNodeData: Sync + Send;
type RenderFeature: RenderFeature;
}
pub struct SubmitPacket<SubmitPacketDataT: SubmitPacketData> {
feature_index: RenderFeatureIndex,
pub(crate) per_frame_submit_data: AtomicOnceCell<SubmitPacketDataT::PerFrameSubmitData>,
pub(crate) render_object_instances_submit_data:
AtomicOnceCellArray<SubmitPacketDataT::RenderObjectInstanceSubmitData>,
view_submit_packets: Vec<ViewSubmitPacket<SubmitPacketDataT>>,
}
impl<SubmitPacketDataT: SubmitPacketData + Send + Sync + 'static> SubmitPacket<SubmitPacketDataT> {
pub fn new(
feature_index: RenderFeatureIndex,
num_render_object_instances: usize,
view_submit_packets: Vec<ViewSubmitPacket<SubmitPacketDataT>>,
) -> Self {
#[cfg(debug_assertions)]
for (i, vp) in view_submit_packets.iter().enumerate() {
assert_eq!(i, vp.view_frame_index() as usize);
}
Self {
feature_index,
per_frame_submit_data: AtomicOnceCell::new(),
render_object_instances_submit_data: AtomicOnceCellArray::with_capacity(
num_render_object_instances,
),
view_submit_packets,
}
}
pub fn view_submit_packets(&self) -> &Vec<ViewSubmitPacket<SubmitPacketDataT>> {
&self.view_submit_packets
}
pub fn view_submit_packet(
&self,
view_frame_index: ViewFrameIndex,
) -> &ViewSubmitPacket<SubmitPacketDataT> {
self.view_submit_packets
.get(view_frame_index as usize)
.unwrap_or_else(|| {
panic!(
"ViewSubmitPacket with ViewFrameIndex {} was not found in {}.",
view_frame_index,
std::any::type_name::<SubmitPacketDataT>()
)
})
}
pub fn render_object_instances_submit_data(
&self
) -> &AtomicOnceCellArray<SubmitPacketDataT::RenderObjectInstanceSubmitData> {
&self.render_object_instances_submit_data
}
pub fn per_frame_submit_data(&self) -> &AtomicOnceCell<SubmitPacketDataT::PerFrameSubmitData> {
&self.per_frame_submit_data
}
}
impl<SubmitPacketDataT: 'static + Send + Sync + SubmitPacketData> RenderFeatureSubmitPacket
for SubmitPacket<SubmitPacketDataT>
{
fn render_feature_view_submit_packet(
&self,
view_index: ViewFrameIndex,
) -> &dyn RenderFeatureViewSubmitPacket {
self.view_submit_packet(view_index)
}
fn feature_index(&self) -> u32 {
self.feature_index
}
}