use crate::{
AnimImage, AnimImageRenderPipeline, AtlasSet, GpuRenderer, GraphicsError,
ImageVertex, InstanceBuffer, StaticVertexBuffer,
instance_buffer::OrderedIndex,
};
#[derive(Debug)]
pub struct AnimImageRenderer {
pub buffer: InstanceBuffer<ImageVertex>,
}
impl AnimImageRenderer {
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,
image: &mut AnimImage,
renderer: &mut GpuRenderer,
atlas: &mut AtlasSet,
buffer_layer: usize,
) {
let index = image.update(renderer, atlas);
self.add_buffer_store(renderer, index, buffer_layer);
}
}
pub trait RenderAnimImage<'a, 'b>
where
'b: 'a,
{
fn render_animated_image(
&mut self,
renderer: &'b GpuRenderer,
buffer: &'b AnimImageRenderer,
atlas: &'b AtlasSet,
buffer_layer: usize,
);
}
impl<'a, 'b> RenderAnimImage<'a, 'b> for wgpu::RenderPass<'a>
where
'b: 'a,
{
fn render_animated_image(
&mut self,
renderer: &'b GpuRenderer,
buffer: &'b AnimImageRenderer,
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.bind_group(), &[]);
self.set_vertex_buffer(1, buffer.buffer.instances(None));
self.set_pipeline(
renderer.get_pipelines(AnimImageRenderPipeline).unwrap(),
);
self.draw_indexed(
0..StaticVertexBuffer::index_count(),
0,
details.start..details.end,
);
}
}
}