diff --git a/Cargo.lock b/Cargo.lock index f21a6f5bfa..368fe08469 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3695,7 +3695,6 @@ dependencies = [ "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "vek 0.9.9 (registry+https://github.com/rust-lang/crates.io-index)", "veloren-common 0.3.0", - "zerocopy 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -3885,25 +3884,6 @@ name = "xml-rs" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "zerocopy" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", - "zerocopy-derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "zerocopy-derive" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)", - "synstructure 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [metadata] "checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c" "checksum aho-corasick 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "81ce3d38065e618af2d7b77e10c5ad9a069859b4be3c2250f674af3840d9c8a5" @@ -4324,5 +4304,3 @@ dependencies = [ "checksum x11-dl 2.18.4 (registry+https://github.com/rust-lang/crates.io-index)" = "be65e1342a3baae65439cd03306778831a3d133b0d20243a7fb83fd5cf403c58" "checksum xdg 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d089681aa106a86fade1b0128fb5daf07d5867a509ab036d99988dec80429a57" "checksum xml-rs 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "541b12c998c5b56aa2b4e6f18f03664eef9a4fd0a246a55594efae6cc2d964b5" -"checksum zerocopy 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "992b9b31f80fd4a167f903f879b8ca43d6716cc368ea01df90538baa2dd34056" -"checksum zerocopy-derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b090467ecd0624026e8a6405d343ac7382592530d54881330b3fc8e400280fa5" diff --git a/world/Cargo.toml b/world/Cargo.toml index 773a86cb3b..3e1ae0cdac 100644 --- a/world/Cargo.toml +++ b/world/Cargo.toml @@ -12,7 +12,6 @@ hashbrown = { version = "0.5.0", features = ["serde", "nightly"] } lazy_static = "1.3.0" rand = "0.7.0" rand_chacha = "0.2.1" -zerocopy = "0.2.8" [dev-dependencies] minifb = { git = "https://github.com/emoon/rust_minifb.git" } diff --git a/world/src/sim/mod.rs b/world/src/sim/mod.rs index 7467a1d3b4..d1692b5d4f 100644 --- a/world/src/sim/mod.rs +++ b/world/src/sim/mod.rs @@ -103,50 +103,46 @@ pub struct WorldSim { } impl WorldSim { - pub fn generate(mut seed: u32) -> Self { - let seed = &mut seed; - let mut gen_seed = || { - *seed = seed_expan::diffuse(*seed); - *seed - }; + pub fn generate(seed: u32) -> Self { + let mut rng = ChaChaRng::from_seed(seed_expan::rng_state(seed)); let mut gen_ctx = GenCtx { - turb_x_nz: SuperSimplex::new().set_seed(gen_seed()), - turb_y_nz: SuperSimplex::new().set_seed(gen_seed()), - chaos_nz: RidgedMulti::new().set_octaves(7).set_seed(gen_seed()), - hill_nz: SuperSimplex::new().set_seed(gen_seed()), + turb_x_nz: SuperSimplex::new().set_seed(rng.gen()), + turb_y_nz: SuperSimplex::new().set_seed(rng.gen()), + chaos_nz: RidgedMulti::new().set_octaves(7).set_seed(rng.gen()), + hill_nz: SuperSimplex::new().set_seed(rng.gen()), alt_nz: HybridMulti::new() .set_octaves(8) .set_persistence(0.1) - .set_seed(gen_seed()), - temp_nz: SuperSimplex::new().set_seed(gen_seed()), - dry_nz: BasicMulti::new().set_seed(gen_seed()), - small_nz: BasicMulti::new().set_octaves(2).set_seed(gen_seed()), - rock_nz: HybridMulti::new().set_persistence(0.3).set_seed(gen_seed()), - cliff_nz: HybridMulti::new().set_persistence(0.3).set_seed(gen_seed()), - warp_nz: FastNoise::new(gen_seed()), //BasicMulti::new().set_octaves(3).set_seed(gen_seed()), + .set_seed(rng.gen()), + temp_nz: SuperSimplex::new().set_seed(rng.gen()), + dry_nz: BasicMulti::new().set_seed(rng.gen()), + small_nz: BasicMulti::new().set_octaves(2).set_seed(rng.gen()), + rock_nz: HybridMulti::new().set_persistence(0.3).set_seed(rng.gen()), + cliff_nz: HybridMulti::new().set_persistence(0.3).set_seed(rng.gen()), + warp_nz: FastNoise::new(rng.gen()), //BasicMulti::new().set_octaves(3).set_seed(gen_seed()), tree_nz: BasicMulti::new() .set_octaves(12) .set_persistence(0.75) - .set_seed(gen_seed()), - cave_0_nz: SuperSimplex::new().set_seed(gen_seed()), - cave_1_nz: SuperSimplex::new().set_seed(gen_seed()), + .set_seed(rng.gen()), + cave_0_nz: SuperSimplex::new().set_seed(rng.gen()), + cave_1_nz: SuperSimplex::new().set_seed(rng.gen()), - structure_gen: StructureGen2d::new(gen_seed(), 32, 24), - region_gen: StructureGen2d::new(gen_seed(), 400, 96), - cliff_gen: StructureGen2d::new(gen_seed(), 80, 56), + structure_gen: StructureGen2d::new(rng.gen(), 32, 24), + region_gen: StructureGen2d::new(rng.gen(), 400, 96), + cliff_gen: StructureGen2d::new(rng.gen(), 80, 56), humid_nz: Billow::new() .set_octaves(12) .set_persistence(0.125) .set_frequency(1.0) // .set_octaves(6) // .set_persistence(0.5) - .set_seed(gen_seed()), + .set_seed(rng.gen()), - fast_turb_x_nz: FastNoise::new(gen_seed()), - fast_turb_y_nz: FastNoise::new(gen_seed()), + fast_turb_x_nz: FastNoise::new(rng.gen()), + fast_turb_y_nz: FastNoise::new(rng.gen()), - town_gen: StructureGen2d::new(gen_seed(), 2048, 1024), + town_gen: StructureGen2d::new(rng.gen(), 2048, 1024), }; // "Base" of the chunk, to be multiplied by CONFIG.mountain_scale (multiplied value is @@ -298,11 +294,11 @@ impl WorldSim { } let mut this = Self { - seed: *seed, + seed: seed, chunks, locations: Vec::new(), gen_ctx, - rng: ChaChaRng::from_seed(seed_expan::rng_state(*seed)), + rng, }; this.seed_elements(); diff --git a/world/src/util/seed_expan.rs b/world/src/util/seed_expan.rs index 61c19e80b7..8e2989db93 100644 --- a/world/src/util/seed_expan.rs +++ b/world/src/util/seed_expan.rs @@ -1,4 +1,13 @@ -use zerocopy::AsBytes; +fn cast_u32x8_u8x32(a: [u32; 8]) -> [u8; 32] { + let mut r = [0; 32]; + for i in 0..8 { + let a = a[i].to_ne_bytes(); + for j in 0..4 { + r[i * 4 + j] = a[j]; + } + } + r +} /// Simple non-cryptographic diffusion function. pub fn diffuse(mut x: u32) -> u32 { @@ -8,6 +17,7 @@ pub fn diffuse(mut x: u32) -> u32 { x = x.wrapping_add(0xd3a2646c) ^ (x << 9); x = x.wrapping_add(0xfd7046c5).wrapping_add(x << 3); x = (x ^ 0xb55a4f09) ^ (x >> 16); + x = x.wrapping_add((1 << 31) - 1) ^ (x << 13); x } @@ -18,8 +28,5 @@ pub fn rng_state(mut x: u32) -> [u8; 32] { x = diffuse(x); *s = x; } - let bytes = r.as_bytes(); - let mut a: [u8; 32] = [0; 32]; - a.copy_from_slice(bytes); - a + cast_u32x8_u8x32(r) }