diff --git a/src/renderer/buffers/brick_buffer.rs b/src/renderer/buffers/brick_buffer.rs index 2825211..8e32d95 100644 --- a/src/renderer/buffers/brick_buffer.rs +++ b/src/renderer/buffers/brick_buffer.rs @@ -1,14 +1,14 @@ - +use wgpu::util::DeviceExt; use std::convert::TryInto; const BRICK_SIZE : usize = 32; // 32x32x32 brick size -const BRICK_NUM : usize = 64; // 64 bricks in texture +const BRICK_NUM : usize = 10000; // 64 bricks in texture const BRICK_LEN : usize = BRICK_SIZE*BRICK_SIZE*BRICK_SIZE; const DATA_LEN : usize = BRICK_LEN * BRICK_NUM; struct BrickData { - data: Box<[u8]> + pub data: Box<[u8]> } impl BrickData { @@ -24,11 +24,6 @@ impl BrickData { let offset = brick * BRICK_LEN; self.data[offset + local_idx] = value; } - - pub fn get_1024(&mut self, offset: usize) -> [u8; 1024] - { - self.data[offset..offset+1024].try_into().expect("wrong size") - } } @@ -44,7 +39,7 @@ impl BrickBuffer { pub fn new(device: &wgpu::Device) -> Self { // Create texture - let size = wgpu::Extent3d { width: (BRICK_SIZE*BRICK_NUM) as u32, height: BRICK_SIZE as u32, depth: BRICK_SIZE as u32 }; + let size = wgpu::Extent3d { width: BRICK_SIZE as u32, height: BRICK_SIZE as u32, depth: (BRICK_SIZE*BRICK_NUM) as u32 }; let texture = device.create_texture( &wgpu::TextureDescriptor { size: size, @@ -107,6 +102,24 @@ impl BrickBuffer { } // Done + println!("Brick buffer size: {} MB", DATA_LEN as f32 / 1024.0 / 1024.0); Self { bricks, texture, size, bind_layout, bind_group } } + + pub fn write(&mut self, queue: &wgpu::Queue) + { + return (); + + // Get first brick + let brick_bytes : [u8;BRICK_LEN] = self.bricks.data[0..BRICK_LEN].try_into().unwrap(); + let brick_size = wgpu::Extent3d{ width: BRICK_SIZE as u32, height: BRICK_SIZE as u32, depth: BRICK_SIZE as u32 }; + + // Write + queue.write_texture( + wgpu::TextureCopyView { texture: &self.texture, mip_level: 0, origin: wgpu::Origin3d::ZERO }, + &brick_bytes, + wgpu::TextureDataLayout { offset: 0, bytes_per_row: self.size.width, rows_per_image: self.size.height }, + brick_size + ); + } } \ No newline at end of file diff --git a/src/renderer/mod.rs b/src/renderer/mod.rs index 66ecfd7..33e18b8 100644 --- a/src/renderer/mod.rs +++ b/src/renderer/mod.rs @@ -15,6 +15,7 @@ pub struct Renderer { raster_buffer: RasterBuffer, uniform_buffer: UniformBuffer, node_buffer: NodeBuffer, + brick_buffer: BrickBuffer, // Camera pub camera: Camera, } @@ -105,16 +106,19 @@ impl Renderer { // Buffers let uniform_buffer = UniformBuffer::new(&device); let raster_buffer = RasterBuffer::new(&device); + let mut node_buffer = NodeBuffer::new(&device); node_buffer.write(&queue); + let mut brick_buffer = BrickBuffer::new(&device); + brick_buffer.write(&queue); // Pipeline - let pipeline = Self::create_pipeline(&device, &swapchain_desc, &[&uniform_buffer.bind_layout, &node_buffer.bind_layout]); + let pipeline = Self::create_pipeline(&device, &swapchain_desc, &[&uniform_buffer.bind_layout, &node_buffer.bind_layout, &brick_buffer.bind_layout]); // Save values in app println!("Initialized"); - Self { surface, device, queue, swapchain_desc, swapchain, pipeline, raster_buffer, uniform_buffer, node_buffer, camera } + Self { surface, device, queue, swapchain_desc, swapchain, pipeline, raster_buffer, uniform_buffer, node_buffer, brick_buffer, camera } } pub fn resize(&mut self, new_size: Option>) { @@ -162,6 +166,7 @@ impl Renderer { render_pass.set_pipeline(&self.pipeline); render_pass.set_bind_group(0, &self.uniform_buffer.bind_group, &[]); render_pass.set_bind_group(1, &self.node_buffer.bind_group, &[]); + render_pass.set_bind_group(2, &self.brick_buffer.bind_group, &[]); // Vertices and indices render_pass.set_vertex_buffer(0, self.raster_buffer.vertex_buffer.slice(..)); render_pass.set_index_buffer(self.raster_buffer.index_buffer.slice(..), wgpu::IndexFormat::Uint16);