diff --git a/src/renderer/buffers/content.rs b/src/renderer/buffers/content.rs index 72fd0f8..c804769 100644 --- a/src/renderer/buffers/content.rs +++ b/src/renderer/buffers/content.rs @@ -25,7 +25,7 @@ pub struct ContentStats { pub struct Content { nodes: Nodes, node_texture: wgpu::Texture, - block_freed: Vec, + block_freed: Vec, block_freeidx: usize, block_texture: wgpu::Texture, pub bind_layout: wgpu::BindGroupLayout, @@ -101,6 +101,21 @@ impl Content { ContentStats { node_tex_size, block_tex_size, block_tex_used, block_count, block_freed, block_used } } + pub fn free(&mut self, block_pos: Vector3) { + // 0,0 at node buffer center + let half = NODE_TEX_SIZE as i32 / 2; + let pos = block_pos + &Vector3{x: half, y: half, z: half}; + + // Get node + let index = (pos.x + NODE_TEX_SIZE as i32 * (pos.y + NODE_TEX_SIZE as i32 * pos.z)) as usize; + let value = self.nodes.get_node(index) as usize; + + // Free it if used + if value != 0 { + self.block_freed.push(value); + } + } + pub fn write(&mut self, queue: &wgpu::Queue, block_pos: &Vector3, block: &WorldBlock) { // 0,0 at node buffer center @@ -122,7 +137,7 @@ impl Content { if value == 0 { // Reuse freed if available, allocate new if not if let Some(idx) = self.block_freed.pop() { - value = idx as usize; + value = idx; } else { value = self.block_freeidx + 1; } diff --git a/src/renderer/renderer_view.rs b/src/renderer/renderer_view.rs index 35ebf29..b2617bc 100644 --- a/src/renderer/renderer_view.rs +++ b/src/renderer/renderer_view.rs @@ -10,6 +10,7 @@ pub trait RendererView { fn get_camera_transform(&mut self) -> &mut dyn CameraTransform; fn get_ui(&mut self) -> &mut UserInterface; fn get_world_offset(&self) -> Vector3; + fn free(&mut self, block_pos: Vector3); } impl RendererView for Renderer { @@ -19,6 +20,10 @@ impl RendererView for Renderer { self.buffers.content.write(&self.queue, &block_pos, block); } + fn free(&mut self, block_pos: Vector3) { + self.buffers.content.free(block_pos); + } + fn shift(&mut self, offset: Vector3) { self.buffers.content.shift(&-offset); self.world_offset -= offset;