hooray! simplex noise

This commit is contained in:
zoe 2022-05-13 18:45:53 +02:00
parent c2c9d9b3e3
commit b6fbb204f1
10 changed files with 189 additions and 108 deletions

View file

@ -16,6 +16,7 @@ derive_builder = "0.11.2"
rand_seeder = "0.2.3"
rand = "0.8.5"
toml = "0.5.9"
noise = "0.7.0"
[profile.dev.package."*"]
opt-level = 3

View file

@ -1,8 +1,6 @@
use gdnative::prelude::*;
use rand::prelude::StdRng;
use rand::seq::SliceRandom;
use rand_seeder::Seeder;
mod gen;
mod tiles;
pub struct World {
@ -32,40 +30,26 @@ impl World {
}
pub fn generate(&mut self) -> Vector3Array {
let mut rng: StdRng = Seeder::from(self.seed.to_owned()).make_rng();
self.tiles = get_vec3(self.xsize, self.ysize, self.zsize);
let mut rng = gen::get_rng(self.seed.to_owned());
let noisemap = gen::get_noise(&mut rng, (self.xsize, self.ysize));
// fill edges with water
for x in 0..self.ysize {
self.tiles[x][0][0] = tiles::Tiletypes::WaterSlab;
self.tiles[x][self.ysize - 1][0] = tiles::Tiletypes::WaterSlab;
}
for y in 0..self.xsize {
self.tiles[0][y][0] = tiles::Tiletypes::WaterSlab;
self.tiles[self.xsize - 1][y][0] = tiles::Tiletypes::WaterSlab;
}
for x in 1..self.xsize - 1 {
for y in 1..self.ysize - 1 {
if self.tile_is_next_to(x, y, 0, tiles::Tiletypes::WaterSlab){
let available = vec![tiles::Tiletypes::WaterSlab, tiles::Tiletypes::Sand];
self.tiles[x][y][0] = available.choose(&mut rng).unwrap().to_owned();
}
else if self.tile_is_next_to(x, y, 0, tiles::Tiletypes::Sand) {
let available = vec![tiles::Tiletypes::Grass, tiles::Tiletypes::Sand];
self.tiles[x][y][0] = available.choose(&mut rng).unwrap().to_owned();
}
else {
self.tiles[x][y][0] = tiles::Tiletypes::Air;
}
}
}
// return array with all changed tiles, needs rework
let mut ret: Vector3Array = Vector3Array::new();
for x in 0..self.xsize {
for y in 0..self.ysize {
for z in 0..self.zsize {
ret.push(Vector3::new(x as f32, y as f32, z as f32));
ret.push(Vector3::new(x as f32, y as f32, 0.0));
if noisemap.get_value(x, y) > 0.5 {
self.tiles[x][y][0] = tiles::Tiletypes::Rock;
}
else if noisemap.get_value(x, y) > 0.0 {
self.tiles[x][y][0] = tiles::Tiletypes::Grass;
}
else if noisemap.get_value(x, y) > -0.1 {
self.tiles[x][y][0] = tiles::Tiletypes::Sand;
}
else {
self.tiles[x][y][0] = tiles::Tiletypes::WaterSlab;
}
}
}

View file

@ -0,0 +1,14 @@
use rand::{prelude::StdRng, Rng};
use noise::{Seedable, utils::{PlaneMapBuilder, NoiseMapBuilder, NoiseMap}, SuperSimplex};
use rand_seeder::Seeder;
pub fn get_rng(seed: String) -> StdRng{
Seeder::from(seed).make_rng()
}
pub fn get_noise(rng: &mut StdRng, size: (usize, usize)) -> NoiseMap{
let noise = SuperSimplex::new().set_seed(rng.gen_range(0..u32::MAX));
PlaneMapBuilder::new(&noise)
.set_size(size.0, size.1)
.build()
}