use cotis::renders::{CotisRenderer, CotisRendererAsync, RenderCompatibleWith};
pub struct RenderModuleReplay<Renderer> {
internal: Renderer,
}
impl<Renderer> RenderModuleReplay<Renderer> {
pub fn new(renderer: Renderer) -> Self {
Self { internal: renderer }
}
}
pub trait RenderModuleReplayTrait<'frame, ConfigType, RenderCommandType, LayoutModule> {
fn replay(
&mut self,
render_commands: impl Iterator<Item = RenderCommandType>,
layout: &mut LayoutModule,
);
}
impl<'frame, ConfigType, RenderCommandType, LayoutModule, Renderer>
RenderModuleReplayTrait<'frame, ConfigType, RenderCommandType, LayoutModule>
for RenderModuleReplay<Renderer>
where
Renderer: RenderCompatibleWith<LayoutModule> + CotisRenderer<RenderCommandType>,
{
fn replay(
&mut self,
render_commands: impl Iterator<Item = RenderCommandType>,
layout: &mut LayoutModule,
) {
self.internal.init(layout);
self.internal.draw_frame(render_commands);
}
}
#[allow(async_fn_in_trait)]
pub trait RenderModuleReplayAsyncTrait<'frame, ConfigType, RenderCommandType, LayoutModule> {
async fn replay(
&mut self,
render_commands: impl Iterator<Item = RenderCommandType>,
layout: &mut LayoutModule,
);
}
impl<'frame, ConfigType, RenderCommandType, LayoutModule, Renderer>
RenderModuleReplayAsyncTrait<'frame, ConfigType, RenderCommandType, LayoutModule>
for RenderModuleReplay<Renderer>
where
Renderer: RenderCompatibleWith<LayoutModule> + CotisRendererAsync<RenderCommandType>,
{
async fn replay(
&mut self,
render_commands: impl Iterator<Item = RenderCommandType>,
layout: &mut LayoutModule,
) {
self.internal.init(layout);
self.internal.draw_frame(render_commands).await;
}
}