chunkgen 0.2.0

Minecraft world generation library
Documentation
use crate::world::worldgen::beardifier::Beardifier;

use super::volume::DensityVolume;

pub fn block_pos_as_long(x: i32, y: i32, z: i32) -> i64 {
    ((i64::from(x) & 0x3FF_FFFF) << 38)
        | (i64::from(y) & 0xFFF)
        | ((i64::from(z) & 0x3FF_FFFF) << 12)
}

#[derive(Debug, Clone)]
pub struct CacheCell {
    pub volume: Option<DensityVolume>,
    pub buffer: Vec<f32>,
    pub value_key: i64,
    pub value: f32,
}

impl Default for CacheCell {
    fn default() -> Self {
        Self {
            volume: None,
            buffer: Vec::new(),
            value_key: 0,
            value: f32::NAN,
        }
    }
}

#[derive(Default)]
pub struct SamplerContext<'a> {
    pub beardifier: Option<&'a Beardifier>,
    pub cache_cells: Option<Vec<CacheCell>>,
}

impl<'a> SamplerContext<'a> {
    pub const fn uncached() -> Self {
        Self {
            beardifier: None,
            cache_cells: None,
        }
    }

    pub const fn cached() -> Self {
        Self {
            beardifier: None,
            cache_cells: Some(Vec::new()),
        }
    }

    #[must_use]
    pub const fn with_beardifier(mut self, beardifier: Option<&'a Beardifier>) -> Self {
        self.beardifier = beardifier;
        self
    }

    pub fn cache_cell(&mut self, id: usize) -> Option<&mut CacheCell> {
        let cells = self.cache_cells.as_mut()?;
        if id >= cells.len() {
            let new_size = (id + 1).div_ceil(16) * 16;
            cells.resize_with(new_size, CacheCell::default);
        }
        Some(&mut cells[id])
    }
}