mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Various fixes (to coloring and to soft shadows).
This commit is contained in:
parent
fbd084a94a
commit
13388ee6a4
@ -30,9 +30,6 @@ use common::{
|
||||
vol::RectVolSize,
|
||||
ChatType,
|
||||
};
|
||||
// TODO: remove CONFIG dependency by passing CONFIG.sea_level explicitly.
|
||||
// In general any WORLD dependencies need to go away ASAP... we should see if we
|
||||
// can pull out map drawing into common somehow.
|
||||
use hashbrown::HashMap;
|
||||
use image::DynamicImage;
|
||||
use log::{error, warn};
|
||||
@ -44,10 +41,9 @@ use std::{
|
||||
};
|
||||
use uvth::{ThreadPool, ThreadPoolBuilder};
|
||||
use vek::*;
|
||||
use world::{
|
||||
sim::{neighbors, Alt},
|
||||
CONFIG,
|
||||
};
|
||||
// TODO: remove world dependencies. We should see if we
|
||||
// can pull out map drawing into common somehow.
|
||||
use world::sim::{neighbors, Alt};
|
||||
|
||||
// The duration of network inactivity until the player is kicked
|
||||
// @TODO: in the future, this should be configurable on the server
|
||||
@ -135,9 +131,8 @@ impl Client {
|
||||
assert_eq!(rgba.len(), (map_size.x * map_size.y) as usize);
|
||||
let [west, east] = world_map.horizons;
|
||||
let scale_angle =
|
||||
|a: u8| (a as Alt / 255.0 / <Alt as FloatConst>::FRAC_2_PI()).tan();
|
||||
let scale_height =
|
||||
|h: u8| h as Alt * max_height as Alt / 255.0 + CONFIG.sea_level as Alt;
|
||||
|a: u8| (a as Alt / 255.0 * <Alt as FloatConst>::FRAC_PI_2()).tan();
|
||||
let scale_height = |h: u8| h as Alt / 255.0 * max_height as Alt;
|
||||
|
||||
log::debug!("Preparing image...");
|
||||
let unzip_horizons = |(angles, heights): (Vec<_>, Vec<_>)| {
|
||||
@ -154,8 +149,8 @@ impl Client {
|
||||
map_config.lgain = 1.0;
|
||||
map_config.gain = max_height;
|
||||
map_config.horizons = Some(&horizons);
|
||||
let rescale_height =
|
||||
|h: Alt| (h as f32 - map_config.focus.z as f32) / map_config.gain as f32;
|
||||
map_config.focus.z = 0.0;
|
||||
let rescale_height = |h: Alt| (h / max_height as Alt) as f32;
|
||||
let bounds_check = |pos: Vec2<i32>| {
|
||||
pos.reduce_partial_min() >= 0
|
||||
&& pos.x < map_size.x as i32
|
||||
@ -211,7 +206,7 @@ impl Client {
|
||||
let posi = pos.y as usize * map_size.x as usize + pos.x as usize;
|
||||
scale_height(rgba[posi].to_le_bytes()[3])
|
||||
} else {
|
||||
CONFIG.sea_level as Alt
|
||||
0.0
|
||||
})
|
||||
},
|
||||
|pos, (r, g, b, a)| {
|
||||
|
@ -273,6 +273,8 @@ impl<'a> MapConfig<'a> {
|
||||
})
|
||||
.map(|sample| {
|
||||
// TODO: Eliminate the redundancy between this and the block renderer.
|
||||
let alt = sample.alt;
|
||||
let basement = sample.basement;
|
||||
let grass_depth = (1.5 + 2.0 * sample.chaos).min(alt - basement);
|
||||
let wposz = if is_basement { basement } else { alt };
|
||||
if is_basement && wposz < alt - grass_depth {
|
||||
@ -615,7 +617,8 @@ impl<'a> MapConfig<'a> {
|
||||
})
|
||||
.map(|(angle, height)| {
|
||||
let w = 0.1;
|
||||
if angle != 0.0 && light_direction.x != 0.0 {
|
||||
let height = (height - alt as Alt * gain as Alt).max(0.0);
|
||||
if angle != 0.0 && light_direction.x != 0.0 && height != 0.0 {
|
||||
let deltax = height / angle;
|
||||
let lighty = (light_direction.y / light_direction.x * deltax).abs();
|
||||
let deltay = lighty - height;
|
||||
|
@ -1314,9 +1314,8 @@ impl WorldSim {
|
||||
// Build a horizon map.
|
||||
let scale_angle =
|
||||
|angle: Alt| (angle.atan() * <Alt as FloatConst>::FRAC_2_PI() * 255.0).floor() as u8;
|
||||
let scale_height = |height: Alt| {
|
||||
((height - CONFIG.sea_level as Alt) * 255.0 / self.max_height as Alt).floor() as u8
|
||||
};
|
||||
let scale_height =
|
||||
|height: Alt| (height as Alt * 255.0 / self.max_height as Alt).floor() as u8;
|
||||
let horizons = get_horizon_map(
|
||||
map_config.lgain,
|
||||
Aabr {
|
||||
|
@ -392,6 +392,10 @@ pub fn get_horizon_map<F: Float + Sync, A: Send, H: Send>(
|
||||
to_angle: impl Fn(F) -> A + Sync,
|
||||
to_height: impl Fn(F) -> H + Sync,
|
||||
) -> Result<[(Vec<A>, Vec<H>); 2], ()> {
|
||||
if maxh < minh {
|
||||
// maxh must be greater than minh
|
||||
return Err(());
|
||||
}
|
||||
let map_size = Vec2::<i32>::from(bounds.size()).map(|e| e as usize);
|
||||
let map_len = map_size.product();
|
||||
|
||||
@ -421,9 +425,11 @@ pub fn get_horizon_map<F: Float + Sync, A: Send, H: Send>(
|
||||
// March in the given direction.
|
||||
let maxdx = maxdx(wposi.x as isize);
|
||||
let mut slope = F::zero();
|
||||
let mut max_height = F::zero();
|
||||
let h0 = h(posi);
|
||||
if h0 >= minh {
|
||||
let h = if h0 < minh {
|
||||
F::zero()
|
||||
} else {
|
||||
let mut max_height = F::zero();
|
||||
let maxdz = maxh - h0;
|
||||
let posi = posi as isize;
|
||||
for deltax in 1..maxdx {
|
||||
@ -441,9 +447,9 @@ pub fn get_horizon_map<F: Float + Sync, A: Send, H: Send>(
|
||||
max_height = h_j_act;
|
||||
}
|
||||
}
|
||||
}
|
||||
h0 - minh + max_height
|
||||
};
|
||||
let a = slope * lgain;
|
||||
let h = h0 + max_height;
|
||||
(to_angle(a), to_height(h))
|
||||
})
|
||||
.unzip_into_vecs(&mut angles, &mut heights);
|
||||
|
Loading…
Reference in New Issue
Block a user