use crate::{
AtlasSet, GpuRenderer, GraphicsError, InstanceBuffer, Rect,
RectRenderPipeline, RectVertex, StaticVertexBuffer,
instance_buffer::OrderedIndex,
};
#[derive(Debug)]
pub struct RectRenderer {
pub buffer: InstanceBuffer<RectVertex>,
}
impl RectRenderer {
pub fn new(renderer: &GpuRenderer) -> Result<Self, GraphicsError> {
Ok(Self {
buffer: InstanceBuffer::with_capacity(renderer.gpu_device(), 512),
})
}
pub fn add_buffer_store(
&mut self,
renderer: &GpuRenderer,
index: OrderedIndex,
buffer_layer: usize,
) {
self.buffer.add_buffer_store(renderer, index, buffer_layer);
}
pub fn finalize(&mut self, renderer: &mut GpuRenderer) {
self.buffer.finalize(renderer)
}
pub fn update(
&mut self,
rect: &mut Rect,
renderer: &mut GpuRenderer,
atlas: &mut AtlasSet,
buffer_layer: usize,
) {
let index = rect.update(renderer, atlas);
self.add_buffer_store(renderer, index, buffer_layer);
}
}
pub trait RenderRects<'a, 'b>
where
'b: 'a,
{
fn render_rects(
&mut self,
renderer: &'b GpuRenderer,
buffer: &'b RectRenderer,
atlas: &'b AtlasSet,
buffer_layer: usize,
);
}
impl<'a, 'b> RenderRects<'a, 'b> for wgpu::RenderPass<'a>
where
'b: 'a,
{
fn render_rects(
&mut self,
renderer: &'b GpuRenderer,
buffer: &'b RectRenderer,
atlas: &'b AtlasSet,
buffer_layer: usize,
) {
if let Some(Some(details)) = buffer.buffer.buffers.get(buffer_layer)
&& buffer.buffer.count() > 0
{
self.set_bind_group(1, &atlas.texture_group.bind_group, &[]);
self.set_vertex_buffer(1, buffer.buffer.instances(None));
self.set_pipeline(
renderer.get_pipelines(RectRenderPipeline).unwrap(),
);
self.draw_indexed(
0..StaticVertexBuffer::index_count(),
0,
details.start..details.end,
);
}
}
}