use uzor_render_tiny_skia::TinySkiaCpuRenderContext;
use uzor_render_vello_cpu::VelloCpuRenderContext;
use uzor_render_vello_gpu::VelloGpuRenderContext;
use uzor_render_vello_hybrid::VelloHybridRenderContext;
use uzor_render_wgpu_instanced::{DrawCmd, InstancedRenderContext, InstancedRenderer};
use vello::{Renderer as VelloRenderer, Scene};
use crate::backend::RenderBackend;
pub enum BackendContext<'a> {
VelloGpu(VelloGpuRenderContext<'a>),
VelloHybrid(VelloHybridRenderContext),
Instanced(InstancedRenderContext),
VelloCpu(VelloCpuRenderContext),
TinySkia(TinySkiaCpuRenderContext),
}
impl<'a> BackendContext<'a> {
pub fn vello_gpu(scene: &'a mut Scene, offset_x: f64, offset_y: f64) -> Self {
Self::VelloGpu(VelloGpuRenderContext::new(scene, offset_x, offset_y))
}
pub fn vello_hybrid(dpr: f64) -> Self {
Self::VelloHybrid(VelloHybridRenderContext::new(dpr))
}
pub fn instanced(screen_w: f32, screen_h: f32, offset_x: f32, offset_y: f32) -> Self {
Self::Instanced(InstancedRenderContext::new(screen_w, screen_h, offset_x, offset_y))
}
pub fn vello_cpu(dpr: f64) -> Self {
Self::VelloCpu(VelloCpuRenderContext::new(dpr))
}
pub fn tiny_skia(width: u32, height: u32, dpr: f64) -> Self {
Self::TinySkia(TinySkiaCpuRenderContext::new(width, height, dpr))
}
}
pub struct WindowRenderState {
pub backend: RenderBackend,
pub vello_renderer: VelloRenderer,
pub scene: Scene,
pub instanced_renderer: Option<InstancedRenderer>,
pub instanced_commands: Vec<DrawCmd>,
pub hybrid_renderer: Option<vello_hybrid::Renderer>,
pub hybrid_ctx: Option<VelloHybridRenderContext>,
pub cpu_pixels: Vec<u8>,
pub cpu_dims: (u32, u32),
}
impl WindowRenderState {
pub fn new(backend: RenderBackend, vello_renderer: VelloRenderer) -> Self {
Self {
backend,
vello_renderer,
scene: Scene::new(),
instanced_renderer: None,
instanced_commands: Vec::new(),
hybrid_renderer: None,
hybrid_ctx: None,
cpu_pixels: Vec::new(),
cpu_dims: (0, 0),
}
}
pub fn begin_frame(&mut self) {
self.scene.reset();
self.instanced_commands.clear();
self.hybrid_ctx = None;
}
pub fn set_backend(&mut self, backend: RenderBackend) {
if self.backend == backend {
return;
}
self.backend = backend;
self.instanced_renderer = None;
self.hybrid_renderer = None;
}
}