use garasu::{GpuContext, TextRenderer};
pub struct RenderContext<'a> {
pub gpu: &'a GpuContext,
pub text: &'a mut TextRenderer,
pub surface_view: &'a wgpu::TextureView,
pub width: u32,
pub height: u32,
pub elapsed: f32,
pub dt: f32,
}
pub trait RenderCallback: Send + 'static {
fn render(&mut self, ctx: &mut RenderContext<'_>);
fn resize(&mut self, _width: u32, _height: u32) {}
fn init(&mut self, _gpu: &GpuContext) {}
}
pub struct ClearRenderer {
pub color: wgpu::Color,
}
impl Default for ClearRenderer {
fn default() -> Self {
Self {
color: wgpu::Color {
r: 0.180,
g: 0.204,
b: 0.251,
a: 1.0,
},
}
}
}
impl RenderCallback for ClearRenderer {
fn render(&mut self, ctx: &mut RenderContext<'_>) {
let mut encoder = ctx
.gpu
.device
.create_command_encoder(&wgpu::CommandEncoderDescriptor {
label: Some("clear"),
});
{
let _pass = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
label: Some("clear_pass"),
color_attachments: &[Some(wgpu::RenderPassColorAttachment {
view: ctx.surface_view,
resolve_target: None,
ops: wgpu::Operations {
load: wgpu::LoadOp::Clear(self.color),
store: wgpu::StoreOp::Store,
},
})],
depth_stencil_attachment: None,
timestamp_writes: None,
occlusion_query_set: None,
});
}
ctx.gpu.queue.submit(std::iter::once(encoder.finish()));
}
}