mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Paths and smoother region borders
This commit is contained in:
parent
86f13af8cb
commit
216c2583fb
@ -37,8 +37,8 @@ fn main() {
|
|||||||
let loc_color = location
|
let loc_color = location
|
||||||
.map(|l| {
|
.map(|l| {
|
||||||
(
|
(
|
||||||
l.name().bytes().nth(0).unwrap() * 17,
|
l.loc.name().bytes().nth(0).unwrap() * 17,
|
||||||
l.name().bytes().nth(1).unwrap() * 17,
|
l.loc.name().bytes().nth(1).unwrap() * 17,
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
.unwrap_or((0, 0));
|
.unwrap_or((0, 0));
|
||||||
@ -67,10 +67,10 @@ fn main() {
|
|||||||
gain -= 10.0;
|
gain -= 10.0;
|
||||||
}
|
}
|
||||||
if win.is_key_down(minifb::Key::R) {
|
if win.is_key_down(minifb::Key::R) {
|
||||||
scale += 1;
|
scale += 6;
|
||||||
}
|
}
|
||||||
if win.is_key_down(minifb::Key::F) {
|
if win.is_key_down(minifb::Key::F) {
|
||||||
scale -= 1;
|
scale -= 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
win.update_with_buffer(&buf).unwrap();
|
win.update_with_buffer(&buf).unwrap();
|
||||||
|
@ -103,8 +103,7 @@ impl<'a> SamplerMut for BlockGen<'a> {
|
|||||||
(true, alt, water_level)
|
(true, alt, water_level)
|
||||||
} else {
|
} else {
|
||||||
// Apply warping
|
// Apply warping
|
||||||
let warp = (self
|
let warp = (world
|
||||||
.world
|
|
||||||
.sim()
|
.sim()
|
||||||
.gen_ctx
|
.gen_ctx
|
||||||
.warp_nz
|
.warp_nz
|
||||||
|
@ -1,4 +1,10 @@
|
|||||||
use crate::{all::ForestKind, sim::Location, util::Sampler, World, CONFIG};
|
use crate::{
|
||||||
|
all::ForestKind,
|
||||||
|
sim::{Location, LocationInfo},
|
||||||
|
util::Sampler,
|
||||||
|
World,
|
||||||
|
CONFIG,
|
||||||
|
};
|
||||||
use common::{
|
use common::{
|
||||||
terrain::{Block, TerrainChunkSize},
|
terrain::{Block, TerrainChunkSize},
|
||||||
vol::{VolSize, Vox},
|
vol::{VolSize, Vox},
|
||||||
@ -116,6 +122,30 @@ impl<'a> Sampler for ColumnGen<'a> {
|
|||||||
temp.sub(CONFIG.desert_temp).mul(32.0),
|
temp.sub(CONFIG.desert_temp).mul(32.0),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Work out if we're on a path
|
||||||
|
let near_0 = sim_chunk.location.as_ref().map(|l| l.near[0].block_pos).unwrap_or(Vec2::zero()).map(|e| e as f32);
|
||||||
|
let near_1 = sim_chunk.location.as_ref().map(|l| l.near[1].block_pos).unwrap_or(Vec2::zero()).map(|e| e as f32);
|
||||||
|
|
||||||
|
let dist_to_path = (0.0
|
||||||
|
+ (near_1.y - near_0.y) * wposf.x as f32
|
||||||
|
- (near_1.x - near_0.x) * wposf.y as f32
|
||||||
|
+ near_1.x * near_0.y
|
||||||
|
- near_0.x * near_1.y)
|
||||||
|
.abs()
|
||||||
|
.div(near_0.distance(near_1));
|
||||||
|
|
||||||
|
let alt = if dist_to_path < 15.0 {
|
||||||
|
alt - 100.0
|
||||||
|
} else {
|
||||||
|
alt
|
||||||
|
};
|
||||||
|
|
||||||
|
let ground = if dist_to_path < 5.0 {
|
||||||
|
Rgb::new(0.0, 0.0, 0.0)
|
||||||
|
} else {
|
||||||
|
ground
|
||||||
|
};
|
||||||
|
|
||||||
// Caves
|
// Caves
|
||||||
let cave_at = |wposf: Vec2<f64>| {
|
let cave_at = |wposf: Vec2<f64>| {
|
||||||
(sim.gen_ctx.cave_0_nz.get(
|
(sim.gen_ctx.cave_0_nz.get(
|
||||||
@ -202,5 +232,5 @@ pub struct ColumnSample<'a> {
|
|||||||
pub cliff_hill: f32,
|
pub cliff_hill: f32,
|
||||||
pub close_cliffs: [(Vec2<i32>, u32); 9],
|
pub close_cliffs: [(Vec2<i32>, u32); 9],
|
||||||
pub temp: f32,
|
pub temp: f32,
|
||||||
pub location: Option<&'a Arc<Location>>,
|
pub location: Option<&'a LocationInfo>,
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#![feature(euclidean_division, bind_by_move_pattern_guards)]
|
#![feature(euclidean_division, bind_by_move_pattern_guards, option_flattening)]
|
||||||
|
|
||||||
mod all;
|
mod all;
|
||||||
mod block;
|
mod block;
|
||||||
|
@ -3,7 +3,11 @@ mod location;
|
|||||||
// Reexports
|
// Reexports
|
||||||
pub use self::location::Location;
|
pub use self::location::Location;
|
||||||
|
|
||||||
use crate::{all::ForestKind, util::StructureGen2d, CONFIG};
|
use crate::{
|
||||||
|
all::ForestKind,
|
||||||
|
util::{StructureGen2d, Sampler},
|
||||||
|
CONFIG,
|
||||||
|
};
|
||||||
use common::{
|
use common::{
|
||||||
terrain::{BiomeKind, TerrainChunkSize},
|
terrain::{BiomeKind, TerrainChunkSize},
|
||||||
vol::VolSize,
|
vol::VolSize,
|
||||||
@ -115,14 +119,80 @@ impl WorldSim {
|
|||||||
pub fn seed_elements(&mut self) {
|
pub fn seed_elements(&mut self) {
|
||||||
let mut rng = self.rng.clone();
|
let mut rng = self.rng.clone();
|
||||||
|
|
||||||
for _ in 0..250 {
|
let cell_size = 32;
|
||||||
let loc_center = Vec2::new(
|
let grid_size = WORLD_SIZE / cell_size;
|
||||||
self.rng.gen::<i32>() % WORLD_SIZE.x as i32,
|
let loc_count = 250;
|
||||||
self.rng.gen::<i32>() % WORLD_SIZE.y as i32,
|
|
||||||
);
|
|
||||||
|
|
||||||
if let Some(chunk) = self.get_mut(loc_center) {
|
let mut locations = vec![None; grid_size.product()];
|
||||||
chunk.location = Some(Location::generate(loc_center, &mut rng).into());
|
|
||||||
|
// Seed the world with some locations
|
||||||
|
for _ in 0..loc_count {
|
||||||
|
let cell_pos = Vec2::new(
|
||||||
|
self.rng.gen::<usize>() % grid_size.x,
|
||||||
|
self.rng.gen::<usize>() % grid_size.y,
|
||||||
|
);
|
||||||
|
let wpos = (cell_pos * cell_size)
|
||||||
|
.map2(
|
||||||
|
Vec2::from(TerrainChunkSize::SIZE),
|
||||||
|
|e, sz: u32| e as i32 * sz as i32,
|
||||||
|
);
|
||||||
|
|
||||||
|
locations[cell_pos.y * grid_size.x + cell_pos.x] = Some(Arc::new(Location::generate(wpos, &mut rng)));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Simulate invasion!
|
||||||
|
let invasion_cycles = 25;
|
||||||
|
for _ in 0..invasion_cycles {
|
||||||
|
for i in 0..grid_size.x {
|
||||||
|
for j in 0..grid_size.y {
|
||||||
|
if locations[j * grid_size.x + i].is_none() {
|
||||||
|
const R_COORDS: [i32; 5] = [-1, 0, 1, 0, -1];
|
||||||
|
let idx = self.rng.gen::<usize>() % 4;
|
||||||
|
let loc = Vec2::new(
|
||||||
|
i as i32 + R_COORDS[idx],
|
||||||
|
j as i32 + R_COORDS[idx + 1],
|
||||||
|
).map(|e| e as usize);
|
||||||
|
|
||||||
|
locations[j * grid_size.x + i] = locations
|
||||||
|
.get(loc.y * grid_size.x + loc.x)
|
||||||
|
.cloned()
|
||||||
|
.flatten();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Place the locations onto the world
|
||||||
|
let gen = StructureGen2d::new(self.seed, cell_size as u32, cell_size as u32 / 2);
|
||||||
|
for i in 0..WORLD_SIZE.x {
|
||||||
|
for j in 0..WORLD_SIZE.y {
|
||||||
|
let chunk_pos = Vec2::new(i as i32, j as i32);
|
||||||
|
let cell_pos = Vec2::new(i / cell_size, j / cell_size);
|
||||||
|
|
||||||
|
// Find the distance to each region
|
||||||
|
let near = gen.get(chunk_pos);
|
||||||
|
let mut near = near
|
||||||
|
.iter()
|
||||||
|
.map(|(pos, seed)| RegionInfo {
|
||||||
|
chunk_pos: *pos,
|
||||||
|
block_pos: pos.map2(Vec2::from(TerrainChunkSize::SIZE), |e, sz: u32| e * sz as i32),
|
||||||
|
dist: (pos - chunk_pos).map(|e| e as f32).magnitude(),
|
||||||
|
seed: *seed,
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
// Sort regions based on distance
|
||||||
|
near.sort_by(|a, b| a.dist.partial_cmp(&b.dist).unwrap());
|
||||||
|
|
||||||
|
let nearest_cell_pos = near[0].chunk_pos.map(|e| e as usize) / cell_size;
|
||||||
|
self.get_mut(chunk_pos).unwrap().location = locations
|
||||||
|
.get(nearest_cell_pos.y * grid_size.x + nearest_cell_pos.x)
|
||||||
|
.cloned()
|
||||||
|
.unwrap_or(None)
|
||||||
|
.map(|loc| LocationInfo {
|
||||||
|
loc,
|
||||||
|
near,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -242,7 +312,21 @@ pub struct SimChunk {
|
|||||||
pub near_cliffs: bool,
|
pub near_cliffs: bool,
|
||||||
pub tree_density: f32,
|
pub tree_density: f32,
|
||||||
pub forest_kind: ForestKind,
|
pub forest_kind: ForestKind,
|
||||||
pub location: Option<Arc<Location>>,
|
pub location: Option<LocationInfo>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Copy, Clone)]
|
||||||
|
pub struct RegionInfo {
|
||||||
|
pub chunk_pos: Vec2<i32>,
|
||||||
|
pub block_pos: Vec2<i32>,
|
||||||
|
pub dist: f32,
|
||||||
|
pub seed: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
pub struct LocationInfo {
|
||||||
|
pub loc: Arc<Location>,
|
||||||
|
pub near: Vec<RegionInfo>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SimChunk {
|
impl SimChunk {
|
||||||
@ -367,7 +451,7 @@ impl SimChunk {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_name(&self) -> Option<String> {
|
pub fn get_name(&self) -> Option<String> {
|
||||||
self.location.as_ref().map(|l| l.name().to_string())
|
self.location.as_ref().map(|l| l.loc.name().to_string())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_biome(&self) -> BiomeKind {
|
pub fn get_biome(&self) -> BiomeKind {
|
||||||
|
Loading…
Reference in New Issue
Block a user