summaryrefslogtreecommitdiff
path: root/src/content
diff options
context:
space:
mode:
authorKai Stevenson <kai@kaistevenson.com>2026-08-31 19:43:16 -0700
committerKai Stevenson <kai@kaistevenson.com>2026-08-31 19:43:16 -0700
commit9e0ec02fcbb3b82a2a73d2713c41af5a6c4523f9 (patch)
tree6c1dc26b67b62997e286eb7db2e09d8ffbd98e6a /src/content
parent8a4dabfc1196e6263dcc6ed64f4abbb5965a9c34 (diff)
remove ms, use noise + lerp
Diffstat (limited to 'src/content')
-rw-r--r--src/content/world/mines.rs126
1 files changed, 15 insertions, 111 deletions
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)
}
}