Add halo ring to chunk. Remove swap_cells helper function. Use direct cell access in chunk update
This commit is contained in:
parent
fb56f03a74
commit
f633b3cd4a
|
@ -21,10 +21,17 @@ impl Chunk {
|
||||||
step: 0,
|
step: 0,
|
||||||
width,
|
width,
|
||||||
height,
|
height,
|
||||||
cells: Array2::from_elem((width, height), Element::Air),
|
cells: Array2::from_elem((width + 2, height + 2), Element::None),
|
||||||
dirty_rect: DirtyRect::default(),
|
dirty_rect: DirtyRect::default(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Set Main area to air
|
||||||
|
for y in 0..height {
|
||||||
|
for x in 0..width {
|
||||||
|
initial.set_cell(x, y, Element::Air);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let max_y = height / rand::thread_rng().gen_range(2..10);
|
let max_y = height / rand::thread_rng().gen_range(2..10);
|
||||||
for y in 0..=max_y {
|
for y in 0..=max_y {
|
||||||
for x in 0..width {
|
for x in 0..width {
|
||||||
|
@ -39,18 +46,11 @@ impl Chunk {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let x = x + 1;
|
||||||
|
let y = y + 1;
|
||||||
|
|
||||||
self.cells[(x, y)] = element;
|
self.cells[(x, y)] = element;
|
||||||
self.dirty_rect.add_point(x, y);
|
self.dirty_rect.add_point(x - 1, y - 1);
|
||||||
}
|
|
||||||
|
|
||||||
pub fn swap_cells(&mut self, x0: usize, y0: usize, x1: usize, y1: usize) {
|
|
||||||
if x0 >= self.width || y0 >= self.height || x1 >= self.width || y1 >= self.height {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
self.cells.swap((x0, y0), (x1, y1));
|
|
||||||
self.dirty_rect.add_point(x0, y0);
|
|
||||||
self.dirty_rect.add_point(x1, y1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_cell(&self, x: usize, y: usize) -> Option<Element> {
|
pub fn get_cell(&self, x: usize, y: usize) -> Option<Element> {
|
||||||
|
@ -58,6 +58,9 @@ impl Chunk {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let x = x + 1;
|
||||||
|
let y = y + 1;
|
||||||
|
|
||||||
Some(self.cells[(x, y)])
|
Some(self.cells[(x, y)])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -69,18 +72,20 @@ impl Chunk {
|
||||||
self.step = (self.step + 1) % 4;
|
self.step = (self.step + 1) % 4;
|
||||||
|
|
||||||
// Faster to reuse rather than keep remaking it within the loops
|
// Faster to reuse rather than keep remaking it within the loops
|
||||||
|
// Also we directly access the cells here rather than using the helper function
|
||||||
|
// because we know the values will never be out of bounds
|
||||||
let mut in_elements: [Element; 4] = [Element::None; 4];
|
let mut in_elements: [Element; 4] = [Element::None; 4];
|
||||||
for block_y in 0..(self.height / 2) {
|
for block_y in 0..(self.height / 2) {
|
||||||
let y = block_y * 2 + block_offset.1;
|
let y = block_y * 2 + block_offset.1 + 1;
|
||||||
for block_x in 0..(self.width / 2) {
|
for block_x in 0..(self.width / 2) {
|
||||||
let x = block_x * 2 + block_offset.0;
|
let x = block_x * 2 + block_offset.0 + 1;
|
||||||
|
|
||||||
// Get all the cells in our block and convert them to a rule state for lookup
|
// Get all the cells in our block and convert them to a rule state for lookup
|
||||||
// Because our offset can cause cell look-ups to go ourside of the grid we have
|
// Because our offset can cause cell look-ups to go ourside of the grid we have
|
||||||
// a default `Element::None`
|
// a default `Element::None`
|
||||||
for i in 0..offsets.len() {
|
for i in 0..offsets.len() {
|
||||||
let o = offsets[i];
|
let o = offsets[i];
|
||||||
in_elements[i] = self.get_cell(x + o.0, y + o.1).unwrap_or(Element::None);
|
in_elements[i] = self.cells[(x + o.0, y + o.1)];
|
||||||
}
|
}
|
||||||
let out_elements = rules.get_result(&in_elements);
|
let out_elements = rules.get_result(&in_elements);
|
||||||
|
|
||||||
|
@ -88,7 +93,9 @@ impl Chunk {
|
||||||
for i in 0..offsets.len() {
|
for i in 0..offsets.len() {
|
||||||
let o = offsets[i];
|
let o = offsets[i];
|
||||||
if in_elements[i] != out_elements[i] {
|
if in_elements[i] != out_elements[i] {
|
||||||
self.set_cell(x + o.0, y + o.1, out_elements[i]);
|
let pos = (x + o.0, y + o.1);
|
||||||
|
self.cells[pos] = out_elements[i];
|
||||||
|
self.dirty_rect.add_point(pos.0 - 1, pos.1 - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue