use crate::{
AsBufferPass, GpuRenderer, GraphicsError, Mesh2D, Mesh2DRenderPipeline,
Mesh2DVertex, SetBuffers, VertexBuffer, vbo::OrderedIndex,
};
#[derive(Debug)]
pub struct Mesh2DRenderer {
pub vbos: VertexBuffer<Mesh2DVertex>,
}
impl Mesh2DRenderer {
pub fn new(renderer: &GpuRenderer) -> Result<Self, GraphicsError> {
Ok(Self {
vbos: VertexBuffer::new(renderer.gpu_device()),
})
}
pub fn add_buffer_store(
&mut self,
renderer: &GpuRenderer,
index: OrderedIndex,
buffer_layer: usize,
) {
self.vbos.add_buffer_store(renderer, index, buffer_layer);
}
pub fn finalize(&mut self, renderer: &mut GpuRenderer) {
self.vbos.finalize(renderer);
}
pub fn update(
&mut self,
mesh: &mut Mesh2D,
renderer: &mut GpuRenderer,
buffer_layer: usize,
) {
let index = mesh.update(renderer);
self.add_buffer_store(renderer, index, buffer_layer);
}
}
pub trait RenderMesh2D<'a, 'b>
where
'b: 'a,
{
fn render_2dmeshs(
&mut self,
renderer: &'b GpuRenderer,
buffer: &'b Mesh2DRenderer,
buffer_layer: usize,
);
}
impl<'a, 'b> RenderMesh2D<'a, 'b> for wgpu::RenderPass<'a>
where
'b: 'a,
{
fn render_2dmeshs(
&mut self,
renderer: &'b GpuRenderer,
buffer: &'b Mesh2DRenderer,
buffer_layer: usize,
) {
let vbos = buffer.vbos.get_layer(buffer_layer);
if !vbos.is_empty() {
self.set_buffers(buffer.vbos.as_buffer_pass());
self.set_pipeline(
renderer.get_pipelines(Mesh2DRenderPipeline).unwrap(),
);
for (_layer, details) in vbos {
self.draw_indexed(
details.indices_start..details.indices_end,
details.vertex_base, 0..1,
);
}
self.set_vertex_buffer(0, renderer.buffer_object.vertices());
self.set_index_buffer(
renderer.buffer_object.indices(),
wgpu::IndexFormat::Uint32,
);
}
}
}