use bevy::{
prelude::{Component, Resource, Vec2},
render::{
render_resource::{BindingResource, DynamicUniformBuffer, ShaderType},
renderer::{RenderDevice, RenderQueue},
},
};
use super::extract::ExtractedTilemap;
#[derive(Component)]
pub struct DynamicUniformComponent<T>
where
T: ShaderType,
{
pub index: u32,
pub component: T,
}
#[derive(ShaderType, Clone, Copy)]
pub struct TilemapUniform {
pub transform: Vec2,
pub tile_size: Vec2,
}
#[derive(Resource, Default)]
pub struct TilemapUniformsStorage {
buffer: DynamicUniformBuffer<TilemapUniform>,
}
impl TilemapUniformsStorage {
pub fn insert(
&mut self,
tilemap: &ExtractedTilemap,
) -> DynamicUniformComponent<TilemapUniform> {
let component = TilemapUniform {
transform: tilemap.translation,
tile_size: tilemap.tile_render_size,
};
let index = self.buffer.push(component);
DynamicUniformComponent { index, component }
}
pub fn binding(&self) -> Option<BindingResource> {
self.buffer.binding()
}
pub fn clear(&mut self) {
self.buffer.clear();
}
pub fn write(&mut self, render_device: &RenderDevice, render_queue: &RenderQueue) {
self.buffer.write_buffer(render_device, render_queue);
}
}