Cliff overhangs

This commit is contained in:
Joshua Barretto 2021-02-14 14:02:14 +00:00
parent 740dcbb440
commit 4ffdcd0fa1
2 changed files with 17 additions and 10 deletions

View File

@ -1,6 +1,6 @@
use crate::{ use crate::{
column::{ColumnGen, ColumnSample}, column::{ColumnGen, ColumnSample},
util::{RandomField, Sampler, SmallCache}, util::{RandomField, Sampler, SmallCache, FastNoise},
IndexRef, IndexRef,
}; };
use common::terrain::{ use common::terrain::{
@ -71,6 +71,7 @@ impl<'a> BlockGen<'a> {
stone_col, stone_col,
snow_cover, snow_cover,
cliff_offset, cliff_offset,
cliff_height,
.. ..
} = sample; } = sample;
@ -120,12 +121,16 @@ impl<'a> BlockGen<'a> {
if stone_factor >= 0.5 { if stone_factor >= 0.5 {
if wposf.z as f32 > height - cliff_offset.max(0.0) { if wposf.z as f32 > height - cliff_offset.max(0.0) {
let col = Lerp::lerp( if cliff_offset.max(0.0) > cliff_height - (FastNoise::new(37).get(wposf / Vec3::new(6.0, 6.0, 10.0)) * 0.5 + 0.5) * (height - wposf.z as f32).mul(0.25).clamped(0.0, 12.0) {
col.map(|e| e as f32), Some(Block::empty())
col.map(|e| e as f32) * 0.7, } else {
(wposf.z as f32 - basement).div(2.0).sin() * 0.5 + 0.5, let col = Lerp::lerp(
).map(|e| e as u8); col.map(|e| e as f32),
Some(Block::new(BlockKind::Rock, col)) col.map(|e| e as f32) * 0.7,
(wposf.z as f32 - basement).div(2.0).sin() * 0.5 + 0.5,
).map(|e| e as u8);
Some(Block::new(BlockKind::Rock, col))
}
} else { } else {
Some(Block::new(BlockKind::Rock, col)) Some(Block::new(BlockKind::Rock, col))
} }

View File

@ -93,13 +93,13 @@ impl<'a> Sampler<'a> for ColumnGen<'a> {
Some((neighbor_pos, neighbor_chunk, &neighbor_chunk.river)) Some((neighbor_pos, neighbor_chunk, &neighbor_chunk.river))
}); });
let cliff_height = sim.get_interpolated(wpos, |chunk| chunk.cliff_height)?; let cliff_height = sim.get_interpolated(wpos, |chunk| chunk.cliff_height)?;
let cliff_scale = 1.0;
let cliff_factor = (alt let cliff_factor = (alt
+ self.sim.gen_ctx.hill_nz.get(wposf.div(32.0).into_array()) as f32 * 10.0 + self.sim.gen_ctx.hill_nz.get(wposf.div(32.0).into_array()) as f32 * 10.0
+ self.sim.gen_ctx.hill_nz.get(wposf.div(256.0).into_array()) as f32 * 64.0).rem_euclid(128.0) / 64.0 - 1.0; + self.sim.gen_ctx.hill_nz.get(wposf.div(256.0).into_array()) as f32 * 64.0).rem_euclid(128.0) / 64.0 - 1.0;
let cliff_scale = (self.sim.gen_ctx.hill_nz.get(wposf.div(128.0).into_array()) + self.sim.gen_ctx.hill_nz.get(wposf.div(48.0).into_array()) * 0.1 + 0.5).max(0.0) as f32; let cliff_scale = (self.sim.gen_ctx.hill_nz.get(wposf.div(128.0).into_array()) + self.sim.gen_ctx.hill_nz.get(wposf.div(48.0).into_array()) * 0.1 + 0.5).max(0.0) as f32;
let cliff_offset = cliff_factor.abs().powf(if cliff_factor < 0.0 { 1.0 } else { 64.0 }) * cliff_height * cliff_scale; let cliff = if cliff_factor < 0.0 { cliff_factor.abs().powf(1.5) } else { 0.0 };
let alt = alt + cliff_offset; let cliff_offset = cliff * cliff_height;
let alt = alt + (cliff - 0.5) * cliff_height;
let lake_width = (TerrainChunkSize::RECT_SIZE.x as f64 * (2.0f64.sqrt())) + 12.0; let lake_width = (TerrainChunkSize::RECT_SIZE.x as f64 * (2.0f64.sqrt())) + 12.0;
let neighbor_river_data = neighbor_river_data.map(|(posj, chunkj, river)| { let neighbor_river_data = neighbor_river_data.map(|(posj, chunkj, river)| {
@ -1061,6 +1061,7 @@ impl<'a> Sampler<'a> for ColumnGen<'a> {
cave, cave,
snow_cover, snow_cover,
cliff_offset, cliff_offset,
cliff_height,
chunk: sim_chunk, chunk: sim_chunk,
}) })
@ -1092,6 +1093,7 @@ pub struct ColumnSample<'a> {
pub cave: Option<(f32, Vec2<f32>, Cave, Vec2<f32>)>, pub cave: Option<(f32, Vec2<f32>, Cave, Vec2<f32>)>,
pub snow_cover: bool, pub snow_cover: bool,
pub cliff_offset: f32, pub cliff_offset: f32,
pub cliff_height: f32,
pub chunk: &'a SimChunk, pub chunk: &'a SimChunk,
} }