freeing methods in renderer
This commit is contained in:
@@ -25,7 +25,7 @@ pub struct ContentStats {
|
|||||||
pub struct Content {
|
pub struct Content {
|
||||||
nodes: Nodes,
|
nodes: Nodes,
|
||||||
node_texture: wgpu::Texture,
|
node_texture: wgpu::Texture,
|
||||||
block_freed: Vec<u32>,
|
block_freed: Vec<usize>,
|
||||||
block_freeidx: usize,
|
block_freeidx: usize,
|
||||||
block_texture: wgpu::Texture,
|
block_texture: wgpu::Texture,
|
||||||
pub bind_layout: wgpu::BindGroupLayout,
|
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 }
|
ContentStats { node_tex_size, block_tex_size, block_tex_used, block_count, block_freed, block_used }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn free(&mut self, block_pos: Vector3<i32>) {
|
||||||
|
// 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<i32>, block: &WorldBlock) {
|
pub fn write(&mut self, queue: &wgpu::Queue, block_pos: &Vector3<i32>, block: &WorldBlock) {
|
||||||
|
|
||||||
// 0,0 at node buffer center
|
// 0,0 at node buffer center
|
||||||
@@ -122,7 +137,7 @@ impl Content {
|
|||||||
if value == 0 {
|
if value == 0 {
|
||||||
// Reuse freed if available, allocate new if not
|
// Reuse freed if available, allocate new if not
|
||||||
if let Some(idx) = self.block_freed.pop() {
|
if let Some(idx) = self.block_freed.pop() {
|
||||||
value = idx as usize;
|
value = idx;
|
||||||
} else {
|
} else {
|
||||||
value = self.block_freeidx + 1;
|
value = self.block_freeidx + 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ pub trait RendererView {
|
|||||||
fn get_camera_transform(&mut self) -> &mut dyn CameraTransform;
|
fn get_camera_transform(&mut self) -> &mut dyn CameraTransform;
|
||||||
fn get_ui(&mut self) -> &mut UserInterface;
|
fn get_ui(&mut self) -> &mut UserInterface;
|
||||||
fn get_world_offset(&self) -> Vector3<i32>;
|
fn get_world_offset(&self) -> Vector3<i32>;
|
||||||
|
fn free(&mut self, block_pos: Vector3<i32>);
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RendererView for Renderer {
|
impl RendererView for Renderer {
|
||||||
@@ -19,6 +20,10 @@ impl RendererView for Renderer {
|
|||||||
self.buffers.content.write(&self.queue, &block_pos, block);
|
self.buffers.content.write(&self.queue, &block_pos, block);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn free(&mut self, block_pos: Vector3<i32>) {
|
||||||
|
self.buffers.content.free(block_pos);
|
||||||
|
}
|
||||||
|
|
||||||
fn shift(&mut self, offset: Vector3<i32>) {
|
fn shift(&mut self, offset: Vector3<i32>) {
|
||||||
self.buffers.content.shift(&-offset);
|
self.buffers.content.shift(&-offset);
|
||||||
self.world_offset -= offset;
|
self.world_offset -= offset;
|
||||||
|
|||||||
Reference in New Issue
Block a user