From 8e01bb4bea788a52edd3b058196391791871ead7 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Wed, 1 Sep 2021 00:44:55 +0100 Subject: [PATCH] Added shrub layer with example shrub --- assets/world/manifests/shrubs.ron | 8 +++++ assets/world/shrub/1.vox | Bin 0 -> 1332 bytes world/src/layer/mod.rs | 5 ++- world/src/layer/shrub.rs | 57 ++++++++++++++++++++++++++++++ world/src/layer/tree.rs | 6 ++-- world/src/lib.rs | 1 + 6 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 assets/world/manifests/shrubs.ron create mode 100644 assets/world/shrub/1.vox create mode 100644 world/src/layer/shrub.rs diff --git a/assets/world/manifests/shrubs.ron b/assets/world/manifests/shrubs.ron new file mode 100644 index 0000000000..ffefe8dfe6 --- /dev/null +++ b/assets/world/manifests/shrubs.ron @@ -0,0 +1,8 @@ +#![enable(unwrap_newtypes)] + +[ + ( + specifier: "world.shrub.1", + center: (6, 6, 2), + ), +] diff --git a/assets/world/shrub/1.vox b/assets/world/shrub/1.vox new file mode 100644 index 0000000000000000000000000000000000000000..3291e72b2afc2ade40828d06b1782f5743a29db6 GIT binary patch literal 1332 zcmd6n(M!`&6vxl@``vqgGZ*T{RcOY}i=gLTzMZ?bwLnOSE_^uW`#tA(?maKR?B$7;5)q9I zq%$0-MG#$0=aRKr@bNM_4=@vxx%3Z?`kZ5=L5?ZNQHmUCxEyJ^Si2m-D9I@8xmmj% z$taD~x#1Y5X&b`iev|7ad#0n@g69ZFF>X`X24gbPWGz?=!Tqc`DvloQNnr~{O7<9w z@h~;oQ^K|sYmUm|+~QnE4{MjSrCZv{EgefoL-Ks~G*a3g#!`%>dz5`8bzy+a^6J#} z?k>Wk2|U;#RGprlvi0+86yLwiV14H?`sOm_{yS6m%eA`x0P2%L_%b2Xrw)LU0yI|x zT5kY-4j_1s5S%9*dPZn{OR(k$-iHJq>%bdA=g2+`&DSBf?8D0Y!x&s5j1>vf8&rN% za4dwT*)SqYF~qm}(YWA8cr}FBt7h2S#}LdDBFj9xMCkoQpmDx`(E=6sgEswDEB$Xq zyeWiqEP{Nz4GV+aRnKd`(T-EsTgy}x*~oABaqXoK<1ZTiRNmD~o;`u{Z4vahM|bW0 zn}(A|0_g2%#&F+p+{$)Ujre{4Y%GA;&PJ@Jj$*5D8qtJ}GedD)DqO_u;wVp#FRT6I`# literal 0 HcmV?d00001 diff --git a/world/src/layer/mod.rs b/world/src/layer/mod.rs index 1ed4cc8410..9d3148eb80 100644 --- a/world/src/layer/mod.rs +++ b/world/src/layer/mod.rs @@ -1,9 +1,12 @@ pub mod scatter; +pub mod shrub; pub mod spot; pub mod tree; pub mod wildlife; -pub use self::{scatter::apply_scatter_to, spot::apply_spots_to, tree::apply_trees_to}; +pub use self::{ + scatter::apply_scatter_to, shrub::apply_shrubs_to, spot::apply_spots_to, tree::apply_trees_to, +}; use crate::{ column::ColumnSample, diff --git a/world/src/layer/shrub.rs b/world/src/layer/shrub.rs new file mode 100644 index 0000000000..8b64402766 --- /dev/null +++ b/world/src/layer/shrub.rs @@ -0,0 +1,57 @@ +use crate::{ + util::{seed_expan, RandomPerm, Sampler, StructureGen2d, UnitChooser}, + Canvas, +}; +use common::{ + assets::AssetHandle, + terrain::structure::{Structure, StructuresGroup}, + vol::ReadVol, +}; +use hashbrown::HashMap; +use lazy_static::lazy_static; +use rand::prelude::*; +use rand_chacha::ChaChaRng; +use vek::*; + +lazy_static! { + static ref SHRUBS: AssetHandle = Structure::load_group("shrubs"); +} + +struct Shrub { + wpos: Vec3, + seed: u32, +} + +pub fn apply_shrubs_to(canvas: &mut Canvas, rng: &mut impl Rng) { + let mut shrub_cache = HashMap::new(); + + let shrub_gen = StructureGen2d::new(canvas.index().seed, 8, 4); + + let info = canvas.info(); + canvas.foreach_col(|canvas, wpos2d, col| { + for (wpos, seed) in std::array::IntoIter::new(shrub_gen.get(wpos2d)) { + shrub_cache.entry(wpos).or_insert_with(|| { + let col = info.col_or_gen(wpos)?; + + if RandomPerm::new(seed).chance(37, col.tree_density * 0.3) { + Some(Shrub { + wpos: wpos.with_z(col.alt as i32), + seed, + }) + } else { + None + } + }); + } + }); + + for shrub in shrub_cache.values().filter_map(|s| s.as_ref()) { + let mut rng = ChaChaRng::from_seed(seed_expan::rng_state(shrub.seed)); + + let units = UnitChooser::new(shrub.seed).get(shrub.seed).into(); + + let shrubs = SHRUBS.read(); + let structure = shrubs.choose(&mut rng).unwrap(); + canvas.blit_structure(shrub.wpos, structure, shrub.seed, units, true); + } +} diff --git a/world/src/layer/tree.rs b/world/src/layer/tree.rs index a511b4ffad..dfbd12e2fa 100644 --- a/world/src/layer/tree.rs +++ b/world/src/layer/tree.rs @@ -360,7 +360,7 @@ impl TreeConfig { } pub fn jungle(rng: &mut impl Rng, scale: f32) -> Self { - let scale = scale * (0.9 + rng.gen::().powi(4) * 1.0); + let scale = scale * (0.8 + rng.gen::() * 0.5); let log_scale = 1.0 + scale.log2().max(0.0); Self { @@ -469,14 +469,14 @@ impl TreeConfig { branch_child_len: 0.75, branch_child_radius: 0.75, branch_child_radius_lerp: true, - leaf_radius: 2.0 * log_scale..2.1 * log_scale, + leaf_radius: 1.5 * log_scale..2.0 * log_scale, leaf_radius_scaled: 0.0, straightness: 0.3, max_depth: 5, splits: 3.5..4.25, split_range: 0.5..1.25, branch_len_bias: 0.0, - leaf_vertical_scale: 0.5, + leaf_vertical_scale: 0.65, proportionality: 0.5, inhabited: false, hanging_sprites: &[(0.00007, SpriteKind::Beehive)], diff --git a/world/src/lib.rs b/world/src/lib.rs index 2ebd01a561..72edb90318 100644 --- a/world/src/lib.rs +++ b/world/src/lib.rs @@ -347,6 +347,7 @@ impl World { }; layer::apply_caves_to(&mut canvas, &mut dynamic_rng); + layer::apply_shrubs_to(&mut canvas, &mut dynamic_rng); layer::apply_trees_to(&mut canvas, &mut dynamic_rng); layer::apply_scatter_to(&mut canvas, &mut dynamic_rng); layer::apply_paths_to(&mut canvas);