//use super::utils::create_debug_label; use bytemuck::{Pod, Zeroable}; use wgpu::util::DeviceExt; #[derive(Debug)] pub struct Globals { bind_group: wgpu::BindGroup, _buffer: wgpu::Buffer, } #[repr(C)] #[derive(Copy, Clone, Debug, Pod, Zeroable)] pub struct GlobalsUniform { view_matrix: [[f32; 4]; 4], } impl Globals { pub fn new( device: &wgpu::Device, layout: &wgpu::BindGroupLayout, viewport_width: u32, viewport_height: u32, ) -> Self { let temp_label = create_debug_label!("Globals buffer"); let buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { label: temp_label.as_deref(), contents: bytemuck::cast_slice(&[GlobalsUniform { view_matrix: [ [1.0 / (viewport_width as f32 / 2.0), 0.0, 0.0, 0.0], [0.0, -1.0 / (viewport_height as f32 / 2.0), 0.0, 0.0], [0.0, 0.0, 1.0, 0.0], [-1.0, 1.0, 0.0, 1.0], ], }]), usage: wgpu::BufferUsages::UNIFORM, }); let bind_group_label = create_debug_label!("Globals bind group"); let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { label: bind_group_label.as_deref(), layout: &layout, entries: &[wgpu::BindGroupEntry { binding: 0, resource: buffer.as_entire_binding(), }], }); Self { bind_group, _buffer: buffer, } } pub fn bind_group(&self) -> &wgpu::BindGroup { &self.bind_group } }