Allow for arbitrary world chunk sizes
This commit is contained in:
		
							parent
							
								
									27b61c624d
								
							
						
					
					
						commit
						f57bf565e4
					
				| 
						 | 
				
			
			@ -68,13 +68,16 @@ impl App {
 | 
			
		|||
            0.25,
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        let mut world = voxel::world::WorldManager::new(voxel::world::GenerationSettings {
 | 
			
		||||
            seed: 0,
 | 
			
		||||
            frequency: 0.04,
 | 
			
		||||
            octaves: 3,
 | 
			
		||||
            gain: 0.5,
 | 
			
		||||
            lacunarity: 2.0,
 | 
			
		||||
        });
 | 
			
		||||
        let mut world = voxel::world::WorldManager::new(
 | 
			
		||||
            voxel::world::GenerationSettings {
 | 
			
		||||
                seed: 0,
 | 
			
		||||
                frequency: 0.04,
 | 
			
		||||
                octaves: 3,
 | 
			
		||||
                gain: 0.5,
 | 
			
		||||
                lacunarity: 2.0,
 | 
			
		||||
            },
 | 
			
		||||
            glam::uvec3(16, 32, 32),
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        let mut renderer = voxel::VoxelRenderer::new(&self.render_ctx, &camera_controller);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,11 +15,13 @@ pub struct Chunk {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
impl Chunk {
 | 
			
		||||
    fn get_block(&mut self, pos: glam::UVec3) -> Vec<Voxel> {
 | 
			
		||||
        let chunk_dims = glam::uvec3(32, 32, 32);
 | 
			
		||||
    fn get_block(&mut self, pos: glam::UVec3, chunk_dims: glam::UVec3) -> Vec<Voxel> {
 | 
			
		||||
        let noise_dims = chunk_dims + glam::uvec3(1, 1, 1);
 | 
			
		||||
        let block_idx = math::to_1d_index(pos, chunk_dims);
 | 
			
		||||
        assert_eq!(self.blocks.len(), 32768);
 | 
			
		||||
        assert_eq!(
 | 
			
		||||
            self.blocks.len(),
 | 
			
		||||
            (chunk_dims.x * chunk_dims.y * chunk_dims.z) as usize
 | 
			
		||||
        );
 | 
			
		||||
        let block = &mut self.blocks[block_idx];
 | 
			
		||||
 | 
			
		||||
        if block.is_empty() {
 | 
			
		||||
| 
						 | 
				
			
			@ -47,6 +49,7 @@ impl Chunk {
 | 
			
		|||
                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 {
 | 
			
		||||
| 
						 | 
				
			
			@ -83,13 +86,22 @@ pub struct GenerationSettings {
 | 
			
		|||
 | 
			
		||||
pub struct WorldManager {
 | 
			
		||||
    settings: GenerationSettings,
 | 
			
		||||
    chunk_dims: glam::UVec3,
 | 
			
		||||
    chunks: HashMap<glam::IVec3, Chunk>,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl WorldManager {
 | 
			
		||||
    pub fn new(settings: GenerationSettings) -> Self {
 | 
			
		||||
    pub fn new(settings: GenerationSettings, chunk_dims: glam::UVec3) -> Self {
 | 
			
		||||
        let chunks = HashMap::new();
 | 
			
		||||
        Self { settings, chunks }
 | 
			
		||||
        Self {
 | 
			
		||||
            settings,
 | 
			
		||||
            chunk_dims,
 | 
			
		||||
            chunks,
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn get_chunk_dims(&self) -> glam::UVec3 {
 | 
			
		||||
        self.chunk_dims
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn get_block(&mut self, chunk_pos: glam::IVec3, local_pos: glam::UVec3) -> Vec<Voxel> {
 | 
			
		||||
| 
						 | 
				
			
			@ -101,20 +113,20 @@ impl WorldManager {
 | 
			
		|||
        }
 | 
			
		||||
 | 
			
		||||
        let chunk = self.chunks.get_mut(&chunk_pos).unwrap();
 | 
			
		||||
        chunk.get_block(local_pos)
 | 
			
		||||
        chunk.get_block(local_pos, self.chunk_dims)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn gen_chunk(&mut self, pos: glam::IVec3) -> Chunk {
 | 
			
		||||
        // We use dimensions of 33 because the corners on the last chunk block of each
 | 
			
		||||
        // axis step outside of our 0..32 bounds, sharing a value with the neighbouring
 | 
			
		||||
        // chunk
 | 
			
		||||
        // 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,
 | 
			
		||||
            33,
 | 
			
		||||
            self.chunk_dims.x as usize + 1,
 | 
			
		||||
            pos.y as f32,
 | 
			
		||||
            33,
 | 
			
		||||
            self.chunk_dims.y as usize + 1,
 | 
			
		||||
            pos.z as f32,
 | 
			
		||||
            33,
 | 
			
		||||
            self.chunk_dims.z as usize + 1,
 | 
			
		||||
        )
 | 
			
		||||
        .with_seed(self.settings.seed)
 | 
			
		||||
        .with_freq(self.settings.frequency)
 | 
			
		||||
| 
						 | 
				
			
			@ -124,8 +136,8 @@ impl WorldManager {
 | 
			
		|||
        .generate()
 | 
			
		||||
        .0;
 | 
			
		||||
 | 
			
		||||
        let mut blocks = Vec::with_capacity(32768);
 | 
			
		||||
        blocks.resize(blocks.capacity(), vec![]);
 | 
			
		||||
        let num_blocks = self.chunk_dims.x * self.chunk_dims.y * self.chunk_dims.z;
 | 
			
		||||
        let blocks = vec![vec![]; num_blocks as usize];
 | 
			
		||||
        Chunk { pos, noise, blocks }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue