From aea7dbd2ea54f2b7f8f621a38e021e00cc91c1c0 Mon Sep 17 00:00:00 2001 From: Protowalker Date: Mon, 20 Jul 2020 19:31:48 -0400 Subject: [PATCH 1/3] Changed from simdnoise to fastnoise_simd; saved 35 seconds on compile time --- Cargo.lock | 203 ++++++++++++++++++--- server/worldgen/Cargo.toml | 2 +- server/worldgen/src/density_map/density.rs | 123 +++++++++---- server/worldgen/src/density_map/height.rs | 43 ++++- 4 files changed, 304 insertions(+), 67 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 320e3a9d2..7a4fab515 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -76,6 +76,15 @@ dependencies = [ "num-traits", ] +[[package]] +name = "ansi_term" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" +dependencies = [ + "winapi 0.3.8", +] + [[package]] name = "anyhow" version = "1.0.31" @@ -178,6 +187,30 @@ dependencies = [ "serde", ] +[[package]] +name = "bindgen" +version = "0.53.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c72a978d268b1d70b0e963217e60fdabd9523a941457a6c42a7315d15c7e89e5" +dependencies = [ + "bitflags", + "cexpr", + "cfg-if", + "clang-sys", + "clap", + "env_logger", + "lazy_static", + "lazycell", + "log", + "peeking_take_while", + "proc-macro2 1.0.17", + "quote 1.0.1", + "regex", + "rustc-hash", + "shlex", + "which", +] + [[package]] name = "bit-set" version = "0.5.2" @@ -275,6 +308,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" +[[package]] +name = "cexpr" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4aedb84272dbe89af497cf81375129abda4fc0a9e7c5d317498c15cc30c0d27" +dependencies = [ + "nom", +] + [[package]] name = "cfb8" version = "0.3.2" @@ -302,15 +344,30 @@ dependencies = [ "time", ] +[[package]] +name = "clang-sys" +version = "0.29.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe6837df1d5cba2397b835c8530f51723267e16abbf83892e9e5af4f0e5dd10a" +dependencies = [ + "glob", + "libc", + "libloading", +] + [[package]] name = "clap" version = "2.33.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bdfa80d47f954d53a35a64987ca1422f495b8d6483c0fe9f7117b36c2a792129" dependencies = [ + "ansi_term", + "atty", "bitflags", + "strsim 0.8.0", "textwrap", "unicode-width", + "vec_map", ] [[package]] @@ -546,7 +603,7 @@ dependencies = [ "ident_case", "proc-macro2 1.0.17", "quote 1.0.1", - "strsim", + "strsim 0.9.3", "syn 1.0.29", ] @@ -621,6 +678,19 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "env_logger" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" +dependencies = [ + "atty", + "humantime 1.3.0", + "log", + "regex", + "termcolor", +] + [[package]] name = "erasable" version = "1.2.1" @@ -653,6 +723,25 @@ dependencies = [ "synstructure", ] +[[package]] +name = "fastnoise-simd" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "257d822f060c5aaa3c4b8bebee0c435550788fefb609bbb861b20910f1c0db68" +dependencies = [ + "fastnoise_simd_bindings", +] + +[[package]] +name = "fastnoise_simd_bindings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d21d4ce1a516d917defd85df6b72656d74f28f0c4ec378d9f11228d0254d36d6" +dependencies = [ + "bindgen", + "cc", +] + [[package]] name = "feather-anvil" version = "0.6.0" @@ -1231,13 +1320,13 @@ version = "0.6.0" dependencies = [ "approx", "bitvec", + "fastnoise-simd", "feather-core", "log", "num-traits", "once_cell", "rand", "rand_xorshift", - "simdnoise", "smallvec", "strum 0.18.0", ] @@ -1539,6 +1628,12 @@ version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bcc8e0c9bce37868955864dbecd2b1ab2bdf967e6f28066d65aaac620444b65c" +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" + [[package]] name = "h2" version = "0.2.5" @@ -1669,6 +1764,15 @@ version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" +[[package]] +name = "humantime" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" +dependencies = [ + "quick-error", +] + [[package]] name = "humantime" version = "2.0.0" @@ -1681,7 +1785,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1c57351e2c81b7a03e82a6c8f4198b309c158f6d67c4adb707af6af7d91465a" dependencies = [ - "humantime", + "humantime 2.0.0", "serde", ] @@ -1841,6 +1945,12 @@ dependencies = [ "spin", ] +[[package]] +name = "lazycell" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" + [[package]] name = "legion" version = "0.2.1" @@ -1904,6 +2014,16 @@ version = "0.2.71" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49" +[[package]] +name = "libloading" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" +dependencies = [ + "cc", + "winapi 0.3.8", +] + [[package]] name = "libm" version = "0.2.1" @@ -1913,7 +2033,7 @@ checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a" [[package]] name = "lieutenant" version = "0.2.0" -source = "git+https://github.com/feather-rs/lieutenant?branch=master#c8f7a3fb02fe852dcd91de5d711e993610dda29a" +source = "git+https://github.com/feather-rs/lieutenant#c8f7a3fb02fe852dcd91de5d711e993610dda29a" dependencies = [ "derivative 2.1.1", "lieutenant-macros", @@ -1924,7 +2044,7 @@ dependencies = [ [[package]] name = "lieutenant-macros" version = "0.1.0" -source = "git+https://github.com/feather-rs/lieutenant?branch=master#c8f7a3fb02fe852dcd91de5d711e993610dda29a" +source = "git+https://github.com/feather-rs/lieutenant#c8f7a3fb02fe852dcd91de5d711e993610dda29a" dependencies = [ "darling", "proc-macro-error", @@ -2460,6 +2580,12 @@ dependencies = [ "syn 1.0.29", ] +[[package]] +name = "peeking_take_while" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" + [[package]] name = "percent-encoding" version = "2.1.0" @@ -2597,6 +2723,12 @@ dependencies = [ "unicode-xid 0.2.0", ] +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + [[package]] name = "quote" version = "0.5.2" @@ -2848,6 +2980,12 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc_version" version = "0.2.3" @@ -3005,6 +3143,12 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" +[[package]] +name = "shlex" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" + [[package]] name = "signal-hook-registry" version = "1.2.0" @@ -3015,25 +3159,6 @@ dependencies = [ "libc", ] -[[package]] -name = "simdeez" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0cc1807d0c7d2e869716572655b1abd32649b5600c047023f10c605bea8310f" -dependencies = [ - "cfg-if", - "paste", -] - -[[package]] -name = "simdnoise" -version = "3.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a31457560eda25097f625438e6583e853580ad201f4cf87c5a57e8aba118ca8" -dependencies = [ - "simdeez", -] - [[package]] name = "simple_asn1" version = "0.4.0" @@ -3134,6 +3259,12 @@ dependencies = [ "generic-array 0.12.3", ] +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + [[package]] name = "strsim" version = "0.9.3" @@ -3252,6 +3383,15 @@ dependencies = [ "winapi 0.3.8", ] +[[package]] +name = "termcolor" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f" +dependencies = [ + "winapi-util", +] + [[package]] name = "textwrap" version = "0.11.0" @@ -3506,6 +3646,12 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fc439f2794e98976c88a2a2dafce96b930fe8010b0a256b3c2199a773933168" +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + [[package]] name = "vek" version = "0.10.4" @@ -3637,6 +3783,15 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "which" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d011071ae14a2f6671d0b74080ae0cd8ebf3a6f8c9589a2cd45f23126fe29724" +dependencies = [ + "libc", +] + [[package]] name = "winapi" version = "0.2.8" diff --git a/server/worldgen/Cargo.toml b/server/worldgen/Cargo.toml index e162d2ed5..82f86db0b 100644 --- a/server/worldgen/Cargo.toml +++ b/server/worldgen/Cargo.toml @@ -12,7 +12,7 @@ smallvec = "1.4" rand = "0.7" rand_xorshift = "0.2" num-traits = "0.2" -simdnoise = "3.1" +fastnoise-simd = "0.1" log = "0.4" once_cell = "1.3" strum = "0.18" diff --git a/server/worldgen/src/density_map/density.rs b/server/worldgen/src/density_map/density.rs index 450791403..a9fd22e43 100644 --- a/server/worldgen/src/density_map/density.rs +++ b/server/worldgen/src/density_map/density.rs @@ -9,7 +9,7 @@ use bitvec::vec::BitVec; use feather_core::biomes::Biome; use feather_core::util::ChunkPosition; use once_cell::sync::Lazy; -use simdnoise::NoiseBuilder; +use fastnoise_simd::{FastNoiseSIMD, FractalProperties, GeneralProperties, NoiseType}; /// A density map generator using 3D Perlin noise. /// @@ -74,43 +74,98 @@ const DENSITY_HEIGHT: usize = 33; fn generate_density(chunk: ChunkPosition, biomes: &NearbyBiomes, seed: u64) -> Vec { // TODO: generate based on biome - let x_offset = (chunk.x * (DENSITY_WIDTH as i32 - 1)) as f32; - let y_offset = 0.0; - let z_offset = (chunk.z * (DENSITY_WIDTH as i32 - 1)) as f32; - let len = DENSITY_WIDTH; - let height = DENSITY_HEIGHT; + let x_offset = chunk.x * (DENSITY_WIDTH as i32 - 1); + let y_offset = 0; + let z_offset = chunk.z * (DENSITY_WIDTH as i32 - 1); + let len = DENSITY_WIDTH as i32; + let height = DENSITY_HEIGHT as i32; let noise_seed = seed as i32; // Generate various noises. - let choice_noise = NoiseBuilder::fbm_3d_offset(x_offset, len, y_offset, height, z_offset, len) - .with_seed(noise_seed) - .with_octaves(2) - .with_freq(0.001) - .generate() - .0; - let density_noise_1 = - NoiseBuilder::fbm_3d_offset(x_offset, len, y_offset, height, z_offset, len) - .with_seed(noise_seed + 1) - .with_octaves(2) - .with_freq(0.2) - .generate() - .0; - let density_noise_2 = - NoiseBuilder::fbm_3d_offset(x_offset, len, y_offset, height, z_offset, len) - .with_seed(noise_seed + 2) - .with_octaves(2) - .with_freq(0.2) - .generate() - .0; - // Additional 2D height noise for extra detail. - let height_noise = NoiseBuilder::fbm_2d_offset(x_offset, len, z_offset, len) - .with_seed(noise_seed + 3) - .with_octaves(2) - .with_freq(0.001) - .generate() - .0; + //let choice_noise = NoiseBuilder::fbm_3d_offset(x_offset, len, y_offset, height, z_offset, len) + // .with_seed(noise_seed) + // .with_octaves(2) + // .with_freq(0.001) + // .generate() + // .0; + + let choice_noise = { + let mut ch = FastNoiseSIMD::new(noise_seed); + ch.set_fractal_properties(FractalProperties {octaves: 2, ..Default::default()}); + ch.set_general_properties(GeneralProperties { + noise_type: NoiseType::Perlin, + seed: noise_seed, + frequency: 0.001, + ..Default::default()}); + + ch.get_noise_set(x_offset, y_offset, z_offset, + len, height, len, 1.0) + .as_vec() + }; + + + // let density_noise_1 = + // NoiseBuilder::fbm_3d_offset(x_offset, len, y_offset, height, z_offset, len) + // .with_seed(noise_seed + 1) + // .with_octaves(2) + // .with_freq(0.2) + // .generate() + // .0; + let density_noise_1 = { + let mut ch = FastNoiseSIMD::new(noise_seed + 1); + ch.set_fractal_properties(FractalProperties {octaves: 2, ..Default::default()}); + ch.set_general_properties(GeneralProperties { + noise_type: NoiseType::Perlin, + seed: noise_seed + 1, + frequency: 0.2, + ..Default::default()}); + + ch.get_noise_set(x_offset, y_offset, z_offset, + len, height, len, 1.0) + .as_vec() + }; + //let density_noise_2 = + // NoiseBuilder::fbm_3d_offset(x_offset, len, y_offset, height, z_offset, len) + // .with_seed(noise_seed + 2) + // .with_octaves(2) + // .with_freq(0.2) + // .generate() + // .0; + let density_noise_2 = { + let mut ch = FastNoiseSIMD::new(noise_seed + 2); + ch.set_fractal_properties(FractalProperties {octaves: 2, ..Default::default()}); + ch.set_general_properties(GeneralProperties { + noise_type: NoiseType::Perlin, + seed: noise_seed + 2, + frequency: 0.2, + ..Default::default()}); + + ch.get_noise_set(x_offset, y_offset, z_offset, + len, height, len, 1.0) + .as_vec() + }; + // Additional 2D height noise for extra detail. + // let height_noise = NoiseBuilder::fbm_2d_offset(x_offset, len, z_offset, len) + // .with_seed(noise_seed + 3) + // .with_octaves(2) + // .with_freq(0.001) + // .generate() + // .0; + let height_noise = { + let mut ch = FastNoiseSIMD::new(noise_seed + 3); + ch.set_fractal_properties(FractalProperties {octaves: 2, ..Default::default()}); + ch.set_general_properties(GeneralProperties { + noise_type: NoiseType::Perlin, + seed: noise_seed + 3, + frequency: 0.001, + ..Default::default()}); + + ch.get_noise_set(x_offset, 0, z_offset, + len, 0, len, 1.0) + .as_vec() + }; let mut result = vec![0.0; DENSITY_WIDTH * DENSITY_HEIGHT * DENSITY_WIDTH]; // Loop through subchunks and generate density for each. @@ -119,7 +174,7 @@ fn generate_density(chunk: ChunkPosition, biomes: &NearbyBiomes, seed: u64) -> V // TODO: average nearby biome parameters let (amplitude, midpoint) = column_parameters(&biomes, subx, subz); - let height = height_noise[(subz * len) + subx] * 25.0; + let height = height_noise[(subz * (len as usize)) + subx] * 25.0; // Loop through Y axis of this subchunk column. for suby in 0..DENSITY_HEIGHT { diff --git a/server/worldgen/src/density_map/height.rs b/server/worldgen/src/density_map/height.rs index 594f29503..36f8f206a 100644 --- a/server/worldgen/src/density_map/height.rs +++ b/server/worldgen/src/density_map/height.rs @@ -6,7 +6,7 @@ use bitvec::order::Local; use bitvec::vec::BitVec; use feather_core::biomes::Biome; use feather_core::util::ChunkPosition; -use simdnoise::NoiseBuilder; +use fastnoise_simd::{FastNoiseSIMD, GeneralProperties, NoiseType}; use std::cmp::min; /// Density map generator which simply uses a height map @@ -25,13 +25,40 @@ impl DensityMapGenerator for HeightMapGenerator { let y_offset = (chunk.z * 16) as f32; let dim = 16; - let (elevation, _, _) = NoiseBuilder::gradient_2d_offset(x_offset, dim, y_offset, dim) - .with_seed(seed as i32) - .with_freq(0.01) - .generate(); - let (detail, _, _) = NoiseBuilder::gradient_2d_offset(x_offset, dim, y_offset, dim) - .with_seed(seed as i32 + 1) - .generate(); + //let (elevation, _, _) = NoiseBuilder::gradient_2d_offset(x_offset, dim, y_offset, dim) + // .with_seed(seed as i32) + // .with_freq(0.01) + // .generate(); + let elevation = { + let mut ch = FastNoiseSIMD::new(seed as i32); + //ch.set_fractal_properties(FractalProperties {octaves: 2, ..Default::default()}); + ch.set_general_properties(GeneralProperties { + noise_type: NoiseType::Perlin, + seed: seed as i32, + frequency: 0.01, + ..Default::default()}); + + ch.get_noise_set(x_offset as i32, 0, y_offset as i32, + dim as i32, 0, dim as i32, 1.0) + .as_vec() + }; + + // let (detail, _, _) = NoiseBuilder::gradient_2d_offset(x_offset, dim, y_offset, dim) + // .with_seed(seed as i32 + 1) + // .generate(); + let detail = { + let mut ch = FastNoiseSIMD::new(seed as i32 + 1); + //ch.set_fractal_properties(FractalProperties {octaves: 2, ..Default::default()}); + ch.set_general_properties(GeneralProperties { + noise_type: NoiseType::Simplex, + seed: seed as i32, + frequency: 0.01, + ..Default::default()}); + + ch.get_noise_set(x_offset as i32, 0, y_offset as i32, + dim as i32, 0, dim as i32, 1.0) + .as_vec() + }; let mut density_map = BitVec::from_vec(vec![0u8; 16 * 256 * 16 / 8]); for x in 0..16 { From 1b8d17604b8e699334de351f97a8ca0033ef1107 Mon Sep 17 00:00:00 2001 From: Protowalker Date: Mon, 20 Jul 2020 21:38:03 -0400 Subject: [PATCH 2/3] Revert "Changed from simdnoise to fastnoise_simd; saved 35 seconds on compile time" This reverts commit aea7dbd2ea54f2b7f8f621a38e021e00cc91c1c0. --- Cargo.lock | 203 +++------------------ server/worldgen/Cargo.toml | 2 +- server/worldgen/src/density_map/density.rs | 123 ++++--------- server/worldgen/src/density_map/height.rs | 43 +---- 4 files changed, 67 insertions(+), 304 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7a4fab515..320e3a9d2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -76,15 +76,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "ansi_term" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" -dependencies = [ - "winapi 0.3.8", -] - [[package]] name = "anyhow" version = "1.0.31" @@ -187,30 +178,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bindgen" -version = "0.53.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c72a978d268b1d70b0e963217e60fdabd9523a941457a6c42a7315d15c7e89e5" -dependencies = [ - "bitflags", - "cexpr", - "cfg-if", - "clang-sys", - "clap", - "env_logger", - "lazy_static", - "lazycell", - "log", - "peeking_take_while", - "proc-macro2 1.0.17", - "quote 1.0.1", - "regex", - "rustc-hash", - "shlex", - "which", -] - [[package]] name = "bit-set" version = "0.5.2" @@ -308,15 +275,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" -[[package]] -name = "cexpr" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4aedb84272dbe89af497cf81375129abda4fc0a9e7c5d317498c15cc30c0d27" -dependencies = [ - "nom", -] - [[package]] name = "cfb8" version = "0.3.2" @@ -344,30 +302,15 @@ dependencies = [ "time", ] -[[package]] -name = "clang-sys" -version = "0.29.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6837df1d5cba2397b835c8530f51723267e16abbf83892e9e5af4f0e5dd10a" -dependencies = [ - "glob", - "libc", - "libloading", -] - [[package]] name = "clap" version = "2.33.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bdfa80d47f954d53a35a64987ca1422f495b8d6483c0fe9f7117b36c2a792129" dependencies = [ - "ansi_term", - "atty", "bitflags", - "strsim 0.8.0", "textwrap", "unicode-width", - "vec_map", ] [[package]] @@ -603,7 +546,7 @@ dependencies = [ "ident_case", "proc-macro2 1.0.17", "quote 1.0.1", - "strsim 0.9.3", + "strsim", "syn 1.0.29", ] @@ -678,19 +621,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "env_logger" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" -dependencies = [ - "atty", - "humantime 1.3.0", - "log", - "regex", - "termcolor", -] - [[package]] name = "erasable" version = "1.2.1" @@ -723,25 +653,6 @@ dependencies = [ "synstructure", ] -[[package]] -name = "fastnoise-simd" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "257d822f060c5aaa3c4b8bebee0c435550788fefb609bbb861b20910f1c0db68" -dependencies = [ - "fastnoise_simd_bindings", -] - -[[package]] -name = "fastnoise_simd_bindings" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d21d4ce1a516d917defd85df6b72656d74f28f0c4ec378d9f11228d0254d36d6" -dependencies = [ - "bindgen", - "cc", -] - [[package]] name = "feather-anvil" version = "0.6.0" @@ -1320,13 +1231,13 @@ version = "0.6.0" dependencies = [ "approx", "bitvec", - "fastnoise-simd", "feather-core", "log", "num-traits", "once_cell", "rand", "rand_xorshift", + "simdnoise", "smallvec", "strum 0.18.0", ] @@ -1628,12 +1539,6 @@ version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bcc8e0c9bce37868955864dbecd2b1ab2bdf967e6f28066d65aaac620444b65c" -[[package]] -name = "glob" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" - [[package]] name = "h2" version = "0.2.5" @@ -1764,15 +1669,6 @@ version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" -[[package]] -name = "humantime" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" -dependencies = [ - "quick-error", -] - [[package]] name = "humantime" version = "2.0.0" @@ -1785,7 +1681,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1c57351e2c81b7a03e82a6c8f4198b309c158f6d67c4adb707af6af7d91465a" dependencies = [ - "humantime 2.0.0", + "humantime", "serde", ] @@ -1945,12 +1841,6 @@ dependencies = [ "spin", ] -[[package]] -name = "lazycell" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" - [[package]] name = "legion" version = "0.2.1" @@ -2014,16 +1904,6 @@ version = "0.2.71" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49" -[[package]] -name = "libloading" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" -dependencies = [ - "cc", - "winapi 0.3.8", -] - [[package]] name = "libm" version = "0.2.1" @@ -2033,7 +1913,7 @@ checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a" [[package]] name = "lieutenant" version = "0.2.0" -source = "git+https://github.com/feather-rs/lieutenant#c8f7a3fb02fe852dcd91de5d711e993610dda29a" +source = "git+https://github.com/feather-rs/lieutenant?branch=master#c8f7a3fb02fe852dcd91de5d711e993610dda29a" dependencies = [ "derivative 2.1.1", "lieutenant-macros", @@ -2044,7 +1924,7 @@ dependencies = [ [[package]] name = "lieutenant-macros" version = "0.1.0" -source = "git+https://github.com/feather-rs/lieutenant#c8f7a3fb02fe852dcd91de5d711e993610dda29a" +source = "git+https://github.com/feather-rs/lieutenant?branch=master#c8f7a3fb02fe852dcd91de5d711e993610dda29a" dependencies = [ "darling", "proc-macro-error", @@ -2580,12 +2460,6 @@ dependencies = [ "syn 1.0.29", ] -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - [[package]] name = "percent-encoding" version = "2.1.0" @@ -2723,12 +2597,6 @@ dependencies = [ "unicode-xid 0.2.0", ] -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - [[package]] name = "quote" version = "0.5.2" @@ -2980,12 +2848,6 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustc_version" version = "0.2.3" @@ -3143,12 +3005,6 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" -[[package]] -name = "shlex" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" - [[package]] name = "signal-hook-registry" version = "1.2.0" @@ -3159,6 +3015,25 @@ dependencies = [ "libc", ] +[[package]] +name = "simdeez" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0cc1807d0c7d2e869716572655b1abd32649b5600c047023f10c605bea8310f" +dependencies = [ + "cfg-if", + "paste", +] + +[[package]] +name = "simdnoise" +version = "3.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a31457560eda25097f625438e6583e853580ad201f4cf87c5a57e8aba118ca8" +dependencies = [ + "simdeez", +] + [[package]] name = "simple_asn1" version = "0.4.0" @@ -3259,12 +3134,6 @@ dependencies = [ "generic-array 0.12.3", ] -[[package]] -name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - [[package]] name = "strsim" version = "0.9.3" @@ -3383,15 +3252,6 @@ dependencies = [ "winapi 0.3.8", ] -[[package]] -name = "termcolor" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f" -dependencies = [ - "winapi-util", -] - [[package]] name = "textwrap" version = "0.11.0" @@ -3646,12 +3506,6 @@ version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fc439f2794e98976c88a2a2dafce96b930fe8010b0a256b3c2199a773933168" -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - [[package]] name = "vek" version = "0.10.4" @@ -3783,15 +3637,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "which" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d011071ae14a2f6671d0b74080ae0cd8ebf3a6f8c9589a2cd45f23126fe29724" -dependencies = [ - "libc", -] - [[package]] name = "winapi" version = "0.2.8" diff --git a/server/worldgen/Cargo.toml b/server/worldgen/Cargo.toml index 82f86db0b..e162d2ed5 100644 --- a/server/worldgen/Cargo.toml +++ b/server/worldgen/Cargo.toml @@ -12,7 +12,7 @@ smallvec = "1.4" rand = "0.7" rand_xorshift = "0.2" num-traits = "0.2" -fastnoise-simd = "0.1" +simdnoise = "3.1" log = "0.4" once_cell = "1.3" strum = "0.18" diff --git a/server/worldgen/src/density_map/density.rs b/server/worldgen/src/density_map/density.rs index a9fd22e43..450791403 100644 --- a/server/worldgen/src/density_map/density.rs +++ b/server/worldgen/src/density_map/density.rs @@ -9,7 +9,7 @@ use bitvec::vec::BitVec; use feather_core::biomes::Biome; use feather_core::util::ChunkPosition; use once_cell::sync::Lazy; -use fastnoise_simd::{FastNoiseSIMD, FractalProperties, GeneralProperties, NoiseType}; +use simdnoise::NoiseBuilder; /// A density map generator using 3D Perlin noise. /// @@ -74,98 +74,43 @@ const DENSITY_HEIGHT: usize = 33; fn generate_density(chunk: ChunkPosition, biomes: &NearbyBiomes, seed: u64) -> Vec { // TODO: generate based on biome - let x_offset = chunk.x * (DENSITY_WIDTH as i32 - 1); - let y_offset = 0; - let z_offset = chunk.z * (DENSITY_WIDTH as i32 - 1); - let len = DENSITY_WIDTH as i32; - let height = DENSITY_HEIGHT as i32; + let x_offset = (chunk.x * (DENSITY_WIDTH as i32 - 1)) as f32; + let y_offset = 0.0; + let z_offset = (chunk.z * (DENSITY_WIDTH as i32 - 1)) as f32; + let len = DENSITY_WIDTH; + let height = DENSITY_HEIGHT; let noise_seed = seed as i32; // Generate various noises. - //let choice_noise = NoiseBuilder::fbm_3d_offset(x_offset, len, y_offset, height, z_offset, len) - // .with_seed(noise_seed) - // .with_octaves(2) - // .with_freq(0.001) - // .generate() - // .0; - - let choice_noise = { - let mut ch = FastNoiseSIMD::new(noise_seed); - ch.set_fractal_properties(FractalProperties {octaves: 2, ..Default::default()}); - ch.set_general_properties(GeneralProperties { - noise_type: NoiseType::Perlin, - seed: noise_seed, - frequency: 0.001, - ..Default::default()}); - - ch.get_noise_set(x_offset, y_offset, z_offset, - len, height, len, 1.0) - .as_vec() - }; - - - // let density_noise_1 = - // NoiseBuilder::fbm_3d_offset(x_offset, len, y_offset, height, z_offset, len) - // .with_seed(noise_seed + 1) - // .with_octaves(2) - // .with_freq(0.2) - // .generate() - // .0; - let density_noise_1 = { - let mut ch = FastNoiseSIMD::new(noise_seed + 1); - ch.set_fractal_properties(FractalProperties {octaves: 2, ..Default::default()}); - ch.set_general_properties(GeneralProperties { - noise_type: NoiseType::Perlin, - seed: noise_seed + 1, - frequency: 0.2, - ..Default::default()}); - - ch.get_noise_set(x_offset, y_offset, z_offset, - len, height, len, 1.0) - .as_vec() - }; - //let density_noise_2 = - // NoiseBuilder::fbm_3d_offset(x_offset, len, y_offset, height, z_offset, len) - // .with_seed(noise_seed + 2) - // .with_octaves(2) - // .with_freq(0.2) - // .generate() - // .0; - let density_noise_2 = { - let mut ch = FastNoiseSIMD::new(noise_seed + 2); - ch.set_fractal_properties(FractalProperties {octaves: 2, ..Default::default()}); - ch.set_general_properties(GeneralProperties { - noise_type: NoiseType::Perlin, - seed: noise_seed + 2, - frequency: 0.2, - ..Default::default()}); - - ch.get_noise_set(x_offset, y_offset, z_offset, - len, height, len, 1.0) - .as_vec() - }; - + let choice_noise = NoiseBuilder::fbm_3d_offset(x_offset, len, y_offset, height, z_offset, len) + .with_seed(noise_seed) + .with_octaves(2) + .with_freq(0.001) + .generate() + .0; + let density_noise_1 = + NoiseBuilder::fbm_3d_offset(x_offset, len, y_offset, height, z_offset, len) + .with_seed(noise_seed + 1) + .with_octaves(2) + .with_freq(0.2) + .generate() + .0; + let density_noise_2 = + NoiseBuilder::fbm_3d_offset(x_offset, len, y_offset, height, z_offset, len) + .with_seed(noise_seed + 2) + .with_octaves(2) + .with_freq(0.2) + .generate() + .0; // Additional 2D height noise for extra detail. - // let height_noise = NoiseBuilder::fbm_2d_offset(x_offset, len, z_offset, len) - // .with_seed(noise_seed + 3) - // .with_octaves(2) - // .with_freq(0.001) - // .generate() - // .0; - let height_noise = { - let mut ch = FastNoiseSIMD::new(noise_seed + 3); - ch.set_fractal_properties(FractalProperties {octaves: 2, ..Default::default()}); - ch.set_general_properties(GeneralProperties { - noise_type: NoiseType::Perlin, - seed: noise_seed + 3, - frequency: 0.001, - ..Default::default()}); - - ch.get_noise_set(x_offset, 0, z_offset, - len, 0, len, 1.0) - .as_vec() - }; + let height_noise = NoiseBuilder::fbm_2d_offset(x_offset, len, z_offset, len) + .with_seed(noise_seed + 3) + .with_octaves(2) + .with_freq(0.001) + .generate() + .0; + let mut result = vec![0.0; DENSITY_WIDTH * DENSITY_HEIGHT * DENSITY_WIDTH]; // Loop through subchunks and generate density for each. @@ -174,7 +119,7 @@ fn generate_density(chunk: ChunkPosition, biomes: &NearbyBiomes, seed: u64) -> V // TODO: average nearby biome parameters let (amplitude, midpoint) = column_parameters(&biomes, subx, subz); - let height = height_noise[(subz * (len as usize)) + subx] * 25.0; + let height = height_noise[(subz * len) + subx] * 25.0; // Loop through Y axis of this subchunk column. for suby in 0..DENSITY_HEIGHT { diff --git a/server/worldgen/src/density_map/height.rs b/server/worldgen/src/density_map/height.rs index 36f8f206a..594f29503 100644 --- a/server/worldgen/src/density_map/height.rs +++ b/server/worldgen/src/density_map/height.rs @@ -6,7 +6,7 @@ use bitvec::order::Local; use bitvec::vec::BitVec; use feather_core::biomes::Biome; use feather_core::util::ChunkPosition; -use fastnoise_simd::{FastNoiseSIMD, GeneralProperties, NoiseType}; +use simdnoise::NoiseBuilder; use std::cmp::min; /// Density map generator which simply uses a height map @@ -25,40 +25,13 @@ impl DensityMapGenerator for HeightMapGenerator { let y_offset = (chunk.z * 16) as f32; let dim = 16; - //let (elevation, _, _) = NoiseBuilder::gradient_2d_offset(x_offset, dim, y_offset, dim) - // .with_seed(seed as i32) - // .with_freq(0.01) - // .generate(); - let elevation = { - let mut ch = FastNoiseSIMD::new(seed as i32); - //ch.set_fractal_properties(FractalProperties {octaves: 2, ..Default::default()}); - ch.set_general_properties(GeneralProperties { - noise_type: NoiseType::Perlin, - seed: seed as i32, - frequency: 0.01, - ..Default::default()}); - - ch.get_noise_set(x_offset as i32, 0, y_offset as i32, - dim as i32, 0, dim as i32, 1.0) - .as_vec() - }; - - // let (detail, _, _) = NoiseBuilder::gradient_2d_offset(x_offset, dim, y_offset, dim) - // .with_seed(seed as i32 + 1) - // .generate(); - let detail = { - let mut ch = FastNoiseSIMD::new(seed as i32 + 1); - //ch.set_fractal_properties(FractalProperties {octaves: 2, ..Default::default()}); - ch.set_general_properties(GeneralProperties { - noise_type: NoiseType::Simplex, - seed: seed as i32, - frequency: 0.01, - ..Default::default()}); - - ch.get_noise_set(x_offset as i32, 0, y_offset as i32, - dim as i32, 0, dim as i32, 1.0) - .as_vec() - }; + let (elevation, _, _) = NoiseBuilder::gradient_2d_offset(x_offset, dim, y_offset, dim) + .with_seed(seed as i32) + .with_freq(0.01) + .generate(); + let (detail, _, _) = NoiseBuilder::gradient_2d_offset(x_offset, dim, y_offset, dim) + .with_seed(seed as i32 + 1) + .generate(); let mut density_map = BitVec::from_vec(vec![0u8; 16 * 256 * 16 / 8]); for x in 0..16 { From 23c016e8072ca7569ddccce2cc35e5538da25218 Mon Sep 17 00:00:00 2001 From: Protowalker Date: Wed, 22 Jul 2020 23:56:32 -0400 Subject: [PATCH 3/3] prevented chests from being opened when a block is above them --- Cargo.lock | 4 +-- core/blocks/Cargo.toml | 1 + core/blocks/src/lib.rs | 4 +++ server/block/src/chest.rs | 17 +++++++--- .../player/src/packet_handlers/placement.rs | 34 +++++++++++++------ 5 files changed, 42 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 320e3a9d2..613020cf5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1913,7 +1913,7 @@ checksum = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a" [[package]] name = "lieutenant" version = "0.2.0" -source = "git+https://github.com/feather-rs/lieutenant?branch=master#c8f7a3fb02fe852dcd91de5d711e993610dda29a" +source = "git+https://github.com/feather-rs/lieutenant#c8f7a3fb02fe852dcd91de5d711e993610dda29a" dependencies = [ "derivative 2.1.1", "lieutenant-macros", @@ -1924,7 +1924,7 @@ dependencies = [ [[package]] name = "lieutenant-macros" version = "0.1.0" -source = "git+https://github.com/feather-rs/lieutenant?branch=master#c8f7a3fb02fe852dcd91de5d711e993610dda29a" +source = "git+https://github.com/feather-rs/lieutenant#c8f7a3fb02fe852dcd91de5d711e993610dda29a" dependencies = [ "darling", "proc-macro-error", diff --git a/core/blocks/Cargo.toml b/core/blocks/Cargo.toml index f9596e467..e2d429b4b 100644 --- a/core/blocks/Cargo.toml +++ b/core/blocks/Cargo.toml @@ -8,6 +8,7 @@ edition = "2018" feather-definitions = { path = "../../definitions" } feather-util = { path = "../util" } + bit-set = "0.5" once_cell = { version = "1.3", features = ["parking_lot"] } anyhow = "1.0" diff --git a/core/blocks/src/lib.rs b/core/blocks/src/lib.rs index fca0df083..baf4505d2 100644 --- a/core/blocks/src/lib.rs +++ b/core/blocks/src/lib.rs @@ -2,8 +2,10 @@ use num_traits::FromPrimitive; use std::convert::TryFrom; use thiserror::Error; + pub use feather_definitions::BlockKind; + mod categories; mod directions; #[allow(warnings)] @@ -11,6 +13,7 @@ mod directions; mod generated; mod wall_blocks; + static BLOCK_TABLE: Lazy = Lazy::new(|| { let bytes = include_bytes!("generated/table.dat"); bincode::deserialize(bytes).expect("failed to deserialize generated block table (bincode)") @@ -90,6 +93,7 @@ impl From for u32 { } } + #[derive(Debug, Error)] pub enum BlockIdFromU32Error { #[error("invalid block kind ID {0}")] diff --git a/server/block/src/chest.rs b/server/block/src/chest.rs index c55b17de9..e4ef52065 100644 --- a/server/block/src/chest.rs +++ b/server/block/src/chest.rs @@ -358,14 +358,21 @@ impl InteractionHandler for ChestInteraction { // For large chests, the top row is the left // chest (ChestKind::Right, oddly enough) and the // bottom row is the right chest (ChestKind::Left). + + - let chests: ArrayVec<[Option; 2]> = opened_chests(game, pos); - let slots = slots(world, &chests); + match game.block_at(pos + BlockPosition::new(0,1,0)){ + Some(block) if block.kind().full_block() => (), + _ => { + let chests: ArrayVec<[Option; 2]> = opened_chests(game, pos); + let slots = slots(world, &chests); - send_open_window(world, player, slots.len(), window_id); - send_window_items(world, player, slots, window_id); + send_open_window(world, player, slots.len(), window_id); + send_window_items(world, player, slots, window_id); - set_player_window(game, world, player, &chests); + set_player_window(game, world, player, &chests); + } + } } fn block_kind(&self) -> BlockKind { diff --git a/server/player/src/packet_handlers/placement.rs b/server/player/src/packet_handlers/placement.rs index 7170808c8..d4cf8303b 100644 --- a/server/player/src/packet_handlers/placement.rs +++ b/server/player/src/packet_handlers/placement.rs @@ -39,6 +39,7 @@ static INTERACTION_HANDLERS: Lazy(player); + + let item = { let inventory = world.get::(player); match inventory.item_in_main_hand(player, world) { @@ -121,20 +124,24 @@ pub fn handle_block_placement( packet.location + packet.face.placement_offset() }; - let current_block = game.block_at(pos).unwrap(); + match game.block_at(pos) { + Some(current_block) => { + if !current_block.is_replaceable() { + return; + } - if !current_block.is_replaceable() { - return; + // Deny replacing grass with grass for example + if current_block.is_replaceable() + && !current_block.is_air() + && !current_block.is_fluid() + && block.is_replaceable() + { + return; + } + }, + None => () } - // Deny replacing grass with grass for example - if current_block.is_replaceable() - && !current_block.is_air() - && !current_block.is_fluid() - && block.is_replaceable() - { - return; - } let block = update_block_state_for_placement( game, @@ -548,3 +555,8 @@ fn facing_directions(d: Vec3d) -> [FacingCubic; 6] { dirs[0].opposite(), ] } + + + + +