WIP: World rewrite #2

Draft
Jayrude wants to merge 5 commits from world-rewrite into main
4 changed files with 66 additions and 45 deletions
Showing only changes of commit d9a053ea5a - Show all commits

View File

@ -79,7 +79,10 @@ impl<'window> App<'window> {
gain: 0.5, gain: 0.5,
lacunarity: 2.0, lacunarity: 2.0,
}, },
glam::uvec3(32, 32, 32), voxel::world::ChunkSettings {
dimensions: glam::uvec3(32, 32, 32),
block_dimensions: glam::uvec3(8, 8, 8),
},
); );
let mut renderer = BrickmapRenderer::new(&self.render_ctx, &camera_controller)?; let mut renderer = BrickmapRenderer::new(&self.render_ctx, &camera_controller)?;

View File

@ -1,38 +1,74 @@
use crate::math; use crate::math;
use super::Voxel; use super::{GenerationSettings, Voxel};
#[derive(Debug, Clone, Copy)]
pub struct ChunkSettings {
pub dimensions: glam::UVec3,
pub block_dimensions: glam::UVec3,
}
#[derive(Debug)] #[derive(Debug)]
pub struct Chunk { pub struct Chunk {
pos: glam::IVec3, settings: ChunkSettings,
noise: Vec<f32>, noise: Vec<f32>,
blocks: Vec<Vec<Voxel>>, blocks: Vec<Vec<Voxel>>,
} }
impl Chunk { impl Chunk {
pub fn new(pos: glam::IVec3, noise: Vec<f32>, blocks: Vec<Vec<Voxel>>) -> Self { pub fn new(
Self { pos, noise, blocks } generation_settings: &GenerationSettings,
chunk_settings: ChunkSettings,
pos: glam::IVec3,
) -> Self {
let dims = chunk_settings.dimensions;
// We use dimensions of `chunk_dims + 1` because the corners on the last chunk
// block of each axis step outside of our 0..N bounds, sharing a value with the
// neighbouring chunk
let noise = simdnoise::NoiseBuilder::fbm_3d_offset(
pos.x as f32 * dims.x as f32,
dims.x as usize + 1,
pos.y as f32 * dims.y as f32,
dims.y as usize + 1,
pos.z as f32 * dims.z as f32,
dims.z as usize + 1,
)
.with_seed(generation_settings.seed)
.with_freq(generation_settings.frequency)
.with_octaves(generation_settings.octaves)
.with_gain(generation_settings.gain)
.with_lacunarity(generation_settings.lacunarity)
.generate()
.0;
let num_blocks = dims.x * dims.y * dims.z;
let blocks = vec![vec![]; num_blocks as usize];
Self {
settings: chunk_settings,
noise,
blocks,
}
} }
pub fn get_block(&mut self, block_pos: glam::UVec3, chunk_dims: glam::UVec3) -> Vec<Voxel> { pub fn get_block(&mut self, pos: glam::UVec3) -> Vec<Voxel> {
assert_eq!( let dims = self.settings.dimensions;
self.blocks.len(), assert!(pos.x < dims.x && pos.y < dims.y && pos.z < dims.z);
(chunk_dims.x * chunk_dims.y * chunk_dims.z) as usize
);
let block_idx = math::to_1d_index(block_pos, chunk_dims); let block_idx = math::to_1d_index(pos, dims);
let mut block = &self.blocks[block_idx]; let mut block = &self.blocks[block_idx];
if block.is_empty() { if block.is_empty() {
self.gen_block(block_pos, block_idx, chunk_dims); self.gen_block(pos, block_idx);
block = &self.blocks[block_idx] block = &self.blocks[block_idx]
} }
block.to_owned() block.to_owned()
} }
pub fn gen_block(&mut self, block_pos: glam::UVec3, block_idx: usize, chunk_dims: glam::UVec3) { pub fn gen_block(&mut self, block_pos: glam::UVec3, block_idx: usize) {
let block = &mut self.blocks[block_idx]; let block = &mut self.blocks[block_idx];
let noise_dims = chunk_dims + glam::uvec3(1, 1, 1); let noise_dims = self.settings.dimensions + glam::uvec3(1, 1, 1);
// Extract relevant noise values from the chunk // Extract relevant noise values from the chunk
let mut noise_vals = Vec::new(); let mut noise_vals = Vec::new();

View File

@ -1,25 +1,25 @@
use std::collections::HashMap; use std::collections::HashMap;
use super::{Chunk, GenerationSettings, Voxel}; use super::{chunk::ChunkSettings, Chunk, GenerationSettings, Voxel};
pub struct WorldManager { pub struct WorldManager {
settings: GenerationSettings, generation_settings: GenerationSettings,
chunk_dims: glam::UVec3, chunk_settings: ChunkSettings,
chunks: HashMap<glam::IVec3, Chunk>, chunks: HashMap<glam::IVec3, Chunk>,
} }
impl WorldManager { impl WorldManager {
pub fn new(settings: GenerationSettings, chunk_dims: glam::UVec3) -> Self { pub fn new(generation_settings: GenerationSettings, chunk_settings: ChunkSettings) -> Self {
let chunks = HashMap::new(); let chunks = HashMap::new();
Self { Self {
settings, generation_settings,
chunk_dims, chunk_settings,
chunks, chunks,
} }
} }
pub fn get_chunk_dims(&self) -> glam::UVec3 { pub fn get_chunk_dims(&self) -> glam::UVec3 {
self.chunk_dims self.chunk_settings.dimensions
} }
pub fn get_block(&mut self, chunk_pos: glam::IVec3, local_pos: glam::UVec3) -> Vec<Voxel> { pub fn get_block(&mut self, chunk_pos: glam::IVec3, local_pos: glam::UVec3) -> Vec<Voxel> {
@ -31,31 +31,10 @@ impl WorldManager {
} }
let chunk = self.chunks.get_mut(&chunk_pos).unwrap(); let chunk = self.chunks.get_mut(&chunk_pos).unwrap();
chunk.get_block(local_pos, self.chunk_dims) chunk.get_block(local_pos)
} }
fn gen_chunk(&mut self, pos: glam::IVec3) -> Chunk { fn gen_chunk(&mut self, pos: glam::IVec3) -> Chunk {
// We use dimensions of `chunk_dims + 1` because the corners on the last chunk Chunk::new(&self.generation_settings, self.chunk_settings, pos)
// block of each axis step outside of our 0..N bounds, sharing a value with the
// neighbouring chunk
let noise = simdnoise::NoiseBuilder::fbm_3d_offset(
pos.x as f32 * self.chunk_dims.x as f32,
self.chunk_dims.x as usize + 1,
pos.y as f32 * self.chunk_dims.y as f32,
self.chunk_dims.y as usize + 1,
pos.z as f32 * self.chunk_dims.z as f32,
self.chunk_dims.z as usize + 1,
)
.with_seed(self.settings.seed)
.with_freq(self.settings.frequency)
.with_octaves(self.settings.octaves)
.with_gain(self.settings.gain)
.with_lacunarity(self.settings.lacunarity)
.generate()
.0;
let num_blocks = self.chunk_dims.x * self.chunk_dims.y * self.chunk_dims.z;
let blocks = vec![vec![]; num_blocks as usize];
Chunk::new(pos, noise, blocks)
} }
} }

View File

@ -1,7 +1,10 @@
mod chunk; mod chunk;
mod manager; mod manager;
pub use {chunk::Chunk, manager::*}; pub use {
chunk::{Chunk, ChunkSettings},
manager::*,
};
#[derive(Debug, Copy, Clone, PartialEq, Eq)] #[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum Voxel { pub enum Voxel {