diff --git a/src/voxel/world.rs b/src/voxel/world.rs index acee0f1..35fe043 100644 --- a/src/voxel/world.rs +++ b/src/voxel/world.rs @@ -22,56 +22,62 @@ impl Chunk { self.blocks.len(), (chunk_dims.x * chunk_dims.y * chunk_dims.z) as usize ); + + let block = &self.blocks[block_idx]; + if !block.is_empty() { + block.to_owned() + } else { + self.gen_block(pos, block_idx, noise_dims); + self.blocks[block_idx].to_owned() + } + } + + fn gen_block(&mut self, block_pos: glam::UVec3, block_idx: usize, noise_dims: glam::UVec3) { let block = &mut self.blocks[block_idx]; - if block.is_empty() { - // Extract relevant noise values from the chunk - let mut noise_vals = Vec::new(); - - let mut block_sign = 0.0; - for z in 0..2 { - for y in 0..2 { - for x in 0..2 { - let noise_pos = glam::uvec3(x, y, z) + pos; - let noise_idx = math::to_1d_index(noise_pos, noise_dims); - let val = self.noise[noise_idx]; - noise_vals.push(val); - block_sign += val.signum(); - } + // Extract relevant noise values from the chunk + let mut noise_vals = Vec::new(); + let mut block_sign = 0.0; + for z in 0..2 { + for y in 0..2 { + for x in 0..2 { + let noise_pos = glam::uvec3(x, y, z) + block_pos; + let noise_idx = math::to_1d_index(noise_pos, noise_dims); + let val = self.noise[noise_idx]; + noise_vals.push(val); + block_sign += val.signum(); } } + } - // If all the corners are negative, then all the interpolated values - // will be negative too. In that case we can just fill with empty. - if block_sign == -8.0 { - block.resize(512, Voxel::Empty); - } else { - let mut vals = [0.0f32; 512]; - math::tri_lerp_block(&noise_vals, &[8, 8, 8], &mut vals); + // If all the corners are negative, then all the interpolated values + // will be negative too. In that case we can just fill with empty. + if block_sign == -8.0 { + block.resize(512, Voxel::Empty); + } else { + let mut vals = [0.0f32; 512]; + math::tri_lerp_block(&noise_vals, &[8, 8, 8], &mut vals); - // TODO: Better voxel colours - let mut idx = 0; - for z in 0..8 { - for y in 0..8 { - for x in 0..8 { - let val = vals[idx]; - idx += 1; + // TODO: Better voxel colours + let mut idx = 0; + for z in 0..8 { + for y in 0..8 { + for x in 0..8 { + let val = vals[idx]; + idx += 1; - if val > 0.0 { - let r = ((x + 1) * 32 - 1) as u8; - let g = ((y + 1) * 32 - 1) as u8; - let b = ((z + 1) * 32 - 1) as u8; - block.push(Voxel::Color(r, g, b)); - } else { - block.push(Voxel::Empty); - } + if val > 0.0 { + let r = ((x + 1) * 32 - 1) as u8; + let g = ((y + 1) * 32 - 1) as u8; + let b = ((z + 1) * 32 - 1) as u8; + block.push(Voxel::Color(r, g, b)); + } else { + block.push(Voxel::Empty); } } } } } - - block.to_owned() } }