From 9e0ec02fcbb3b82a2a73d2713c41af5a6c4523f9 Mon Sep 17 00:00:00 2001 From: Kai Stevenson Date: Mon, 31 Aug 2026 19:43:16 -0700 Subject: remove ms, use noise + lerp --- src/content/world/mines.rs | 126 ++++++--------------------------------------- 1 file changed, 15 insertions(+), 111 deletions(-) (limited to 'src/content') diff --git a/src/content/world/mines.rs b/src/content/world/mines.rs index c9c0aad..d7e23bc 100644 --- a/src/content/world/mines.rs +++ b/src/content/world/mines.rs @@ -1,129 +1,33 @@ -use glam::{IVec2, Vec2}; +use fastnoise_lite::{FastNoiseLite, FractalType}; +use glam::IVec2; -use crate::{ - config::TILESET_SCALING, - content::materials::MaterialId, - proc_gen::{ - Biome, TileCells, - tileset_loader::{Tile, TilesetPixelType}, - }, - sim::{cell::Cell, lib::marching_squares::compute_types}, -}; +use crate::{content::materials::MaterialId, proc_gen::Biome, sim::cell::Cell}; -const FULL: [bool; (TILESET_SCALING * TILESET_SCALING) as usize] = - [true; (TILESET_SCALING * TILESET_SCALING) as usize]; - -const EMPTY: [bool; (TILESET_SCALING * TILESET_SCALING) as usize] = - [false; (TILESET_SCALING * TILESET_SCALING) as usize]; +const ROUGHNESS: f32 = 0.375; pub struct MinesBiome { - pixel_expansion_by_type: [[bool; (TILESET_SCALING * TILESET_SCALING) as usize]; 16], -} - -fn circular_pixel_expansion( - c: Vec2, - r: f32, -) -> [bool; (TILESET_SCALING * TILESET_SCALING) as usize] { - let rs = r.powi(2); - let mut ret = [false; (TILESET_SCALING * TILESET_SCALING) as usize]; - - for y in 0..TILESET_SCALING { - for x in 0..TILESET_SCALING { - // definitely can be optimized a lot - let dist = Vec2::new(x as f32, y as f32).distance_squared(c); - if dist <= rs { - ret[(x + y * TILESET_SCALING) as usize] = true; - } - } - } - - ret + pub edge_roughness: FastNoiseLite, } impl MinesBiome { pub fn new() -> Self { - MinesBiome { - pixel_expansion_by_type: [ - // empty - EMPTY, - // BL - circular_pixel_expansion( - Vec2::new(0.0, TILESET_SCALING as f32 - 1.0), - TILESET_SCALING as f32, - ), - // BR - circular_pixel_expansion( - Vec2::new(TILESET_SCALING as f32 - 1.0, TILESET_SCALING as f32 - 1.0), - TILESET_SCALING as f32, - ), - // BL BR - FULL, - // TR - circular_pixel_expansion( - Vec2::new(TILESET_SCALING as f32 - 1.0, 0.0), - TILESET_SCALING as f32, - ), - // TR BL - FULL, - // TR BR - FULL, - // TR BR BL - FULL, - // TL - circular_pixel_expansion(Vec2::new(0.0, 0.0), TILESET_SCALING as f32), - // TL BL - FULL, - // TL BR - FULL, - // TL BR BL - FULL, - // TL TR - FULL, - // TL TR BL - FULL, - // TL TR BR - FULL, - // surrounded - FULL, - ], - } + let mut edge_roughness = FastNoiseLite::new(); + edge_roughness.octaves = 2; + edge_roughness.fractal_type = FractalType::Ridged; + MinesBiome { edge_roughness } } } impl Biome for MinesBiome { - fn derive_world_from_tile(&self, tile: &Tile) -> TileCells { - let pixels = tile.size(); - let marched_pixels = compute_types(tile); - let size = pixels * TILESET_SCALING; - let mut cells = vec![Cell::void(); (size.x * size.y) as usize]; - - for py in 0..pixels.y { - for px in 0..pixels.x { - let variant = marched_pixels[(px + py * (pixels.x + 1)) as usize]; - - let expansion = self.pixel_expansion_by_type[variant as usize]; - // TODO optimize - let expansion_cells = expansion.map(|c| { - if c { - Cell::from_material(MaterialId::Dirt) - } else { - Cell::void() - } - }); + fn cell(&self, solidity: f32, world: IVec2) -> Cell { + let world = world.as_vec2(); - let origin = IVec2::new(px, py) * TILESET_SCALING; - for i in 0..TILESET_SCALING { - let dst_y = i + origin.y; - let dst_row = (dst_y * size.x + origin.x) as usize; - let src_row = (i * TILESET_SCALING) as usize; + let displacement = ROUGHNESS * self.edge_roughness.get_noise_2d(world.x, world.y); - cells[dst_row..dst_row + TILESET_SCALING as usize].copy_from_slice( - &expansion_cells[src_row..src_row + TILESET_SCALING as usize], - ); - } - } + if solidity + displacement <= 0.0 { + return Cell::void(); } - TileCells { size, cells } + Cell::from_material(MaterialId::Dirt) } } -- cgit v1.3.1