Pumpkin/crates/pumpkin-world/src/generation/blender/blending_data.rs
Alexander Medvedev 6eb02f65b9 chore: more fixes
2026-08-28 13:31:28 +02:00

96 lines
2.9 KiB
Rust

use pumpkin_data::chunk::Biome;
#[derive(Clone)]
pub struct BlendingData {
pub min_y: i32,
pub max_y: i32,
// Heights at quart positions (16x16 per chunk)
pub heights: Vec<f64>,
// Densities at quart positions (16x16 per chunk, but at what Y levels? 1.18+ uses 4 blocks quart)
// Simplified: only store for current chunk's Y levels
pub densities: Vec<f64>,
// Biomes at quart positions (16x16 per chunk)
pub biomes: Vec<&'static Biome>,
}
impl BlendingData {
#[must_use]
pub fn get_height(&self, cell_x: i32, cell_z: i32) -> f64 {
if !(0..16).contains(&cell_x) || !(0..16).contains(&cell_z) {
return f64::MAX;
}
self.heights[(cell_z * 16 + cell_x) as usize]
}
#[must_use]
pub fn get_density(&self, cell_x: i32, cell_y: i32, cell_z: i32) -> f64 {
if !(0..16).contains(&cell_x) || !(0..16).contains(&cell_z) {
return f64::MAX;
}
let cell_count_y = (self.max_y - self.min_y) / 8;
if !(0..cell_count_y).contains(&cell_y) {
return f64::MAX;
}
let index = (cell_y * 16 * 16 + cell_z * 16 + cell_x) as usize;
if index < self.densities.len() {
self.densities[index]
} else {
f64::MAX
}
}
pub fn iterate_heights<F>(&self, quart_x: i32, quart_z: i32, mut consumer: F)
where
F: FnMut(i32, i32, f64),
{
for z in 0..16 {
for x in 0..16 {
let h = self.heights[z * 16 + x];
if h != f64::MAX {
consumer(quart_x + x as i32, quart_z + z as i32, h);
}
}
}
}
pub fn iterate_densities<F>(
&self,
quart_x: i32,
quart_z: i32,
min_cell_y: i32,
max_cell_y: i32,
mut consumer: F,
) where
F: FnMut(i32, i32, i32, f64),
{
let cell_count_y = (self.max_y - self.min_y) / 8;
for cell_y in min_cell_y..=max_cell_y {
if (0..cell_count_y).contains(&cell_y) {
for z in 0..16 {
for x in 0..16 {
let index = (cell_y * 16 * 16 + z * 16 + x) as usize;
if index < self.densities.len() {
let d = self.densities[index];
if d != f64::MAX {
consumer(quart_x + x, cell_y, quart_z + z, d);
}
}
}
}
}
}
}
pub fn iterate_biomes<F>(&self, quart_x: i32, quart_z: i32, mut consumer: F)
where
F: FnMut(i32, i32, &'static Biome),
{
for z in 0..16 {
for x in 0..16 {
let biome = self.biomes[z * 16 + x];
consumer(quart_x + x as i32, quart_z + z as i32, biome);
}
}
}
}