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,
|
vol::RectVolSize,
|
||||||
ChatType,
|
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 hashbrown::HashMap;
|
||||||
use image::DynamicImage;
|
use image::DynamicImage;
|
||||||
use log::{error, warn};
|
use log::{error, warn};
|
||||||
@ -44,10 +41,9 @@ use std::{
|
|||||||
};
|
};
|
||||||
use uvth::{ThreadPool, ThreadPoolBuilder};
|
use uvth::{ThreadPool, ThreadPoolBuilder};
|
||||||
use vek::*;
|
use vek::*;
|
||||||
use world::{
|
// TODO: remove world dependencies. We should see if we
|
||||||
sim::{neighbors, Alt},
|
// can pull out map drawing into common somehow.
|
||||||
CONFIG,
|
use world::sim::{neighbors, Alt};
|
||||||
};
|
|
||||||
|
|
||||||
// The duration of network inactivity until the player is kicked
|
// The duration of network inactivity until the player is kicked
|
||||||
// @TODO: in the future, this should be configurable on the server
|
// @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);
|
assert_eq!(rgba.len(), (map_size.x * map_size.y) as usize);
|
||||||
let [west, east] = world_map.horizons;
|
let [west, east] = world_map.horizons;
|
||||||
let scale_angle =
|
let scale_angle =
|
||||||
|a: u8| (a as Alt / 255.0 / <Alt as FloatConst>::FRAC_2_PI()).tan();
|
|a: u8| (a as Alt / 255.0 * <Alt as FloatConst>::FRAC_PI_2()).tan();
|
||||||
let scale_height =
|
let scale_height = |h: u8| h as Alt / 255.0 * max_height as Alt;
|
||||||
|h: u8| h as Alt * max_height as Alt / 255.0 + CONFIG.sea_level as Alt;
|
|
||||||
|
|
||||||
log::debug!("Preparing image...");
|
log::debug!("Preparing image...");
|
||||||
let unzip_horizons = |(angles, heights): (Vec<_>, Vec<_>)| {
|
let unzip_horizons = |(angles, heights): (Vec<_>, Vec<_>)| {
|
||||||
@ -154,8 +149,8 @@ impl Client {
|
|||||||
map_config.lgain = 1.0;
|
map_config.lgain = 1.0;
|
||||||
map_config.gain = max_height;
|
map_config.gain = max_height;
|
||||||
map_config.horizons = Some(&horizons);
|
map_config.horizons = Some(&horizons);
|
||||||
let rescale_height =
|
map_config.focus.z = 0.0;
|
||||||
|h: Alt| (h as f32 - map_config.focus.z as f32) / map_config.gain as f32;
|
let rescale_height = |h: Alt| (h / max_height as Alt) as f32;
|
||||||
let bounds_check = |pos: Vec2<i32>| {
|
let bounds_check = |pos: Vec2<i32>| {
|
||||||
pos.reduce_partial_min() >= 0
|
pos.reduce_partial_min() >= 0
|
||||||
&& pos.x < map_size.x as i32
|
&& 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;
|
let posi = pos.y as usize * map_size.x as usize + pos.x as usize;
|
||||||
scale_height(rgba[posi].to_le_bytes()[3])
|
scale_height(rgba[posi].to_le_bytes()[3])
|
||||||
} else {
|
} else {
|
||||||
CONFIG.sea_level as Alt
|
0.0
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|pos, (r, g, b, a)| {
|
|pos, (r, g, b, a)| {
|
||||||
|
@ -273,6 +273,8 @@ impl<'a> MapConfig<'a> {
|
|||||||
})
|
})
|
||||||
.map(|sample| {
|
.map(|sample| {
|
||||||
// TODO: Eliminate the redundancy between this and the block renderer.
|
// 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 grass_depth = (1.5 + 2.0 * sample.chaos).min(alt - basement);
|
||||||
let wposz = if is_basement { basement } else { alt };
|
let wposz = if is_basement { basement } else { alt };
|
||||||
if is_basement && wposz < alt - grass_depth {
|
if is_basement && wposz < alt - grass_depth {
|
||||||
@ -615,7 +617,8 @@ impl<'a> MapConfig<'a> {
|
|||||||
})
|
})
|
||||||
.map(|(angle, height)| {
|
.map(|(angle, height)| {
|
||||||
let w = 0.1;
|
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 deltax = height / angle;
|
||||||
let lighty = (light_direction.y / light_direction.x * deltax).abs();
|
let lighty = (light_direction.y / light_direction.x * deltax).abs();
|
||||||
let deltay = lighty - height;
|
let deltay = lighty - height;
|
||||||
|
@ -1314,9 +1314,8 @@ impl WorldSim {
|
|||||||
// Build a horizon map.
|
// Build a horizon map.
|
||||||
let scale_angle =
|
let scale_angle =
|
||||||
|angle: Alt| (angle.atan() * <Alt as FloatConst>::FRAC_2_PI() * 255.0).floor() as u8;
|
|angle: Alt| (angle.atan() * <Alt as FloatConst>::FRAC_2_PI() * 255.0).floor() as u8;
|
||||||
let scale_height = |height: Alt| {
|
let scale_height =
|
||||||
((height - CONFIG.sea_level as Alt) * 255.0 / self.max_height as Alt).floor() as u8
|
|height: Alt| (height as Alt * 255.0 / self.max_height as Alt).floor() as u8;
|
||||||
};
|
|
||||||
let horizons = get_horizon_map(
|
let horizons = get_horizon_map(
|
||||||
map_config.lgain,
|
map_config.lgain,
|
||||||
Aabr {
|
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_angle: impl Fn(F) -> A + Sync,
|
||||||
to_height: impl Fn(F) -> H + Sync,
|
to_height: impl Fn(F) -> H + Sync,
|
||||||
) -> Result<[(Vec<A>, Vec<H>); 2], ()> {
|
) -> 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_size = Vec2::<i32>::from(bounds.size()).map(|e| e as usize);
|
||||||
let map_len = map_size.product();
|
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.
|
// March in the given direction.
|
||||||
let maxdx = maxdx(wposi.x as isize);
|
let maxdx = maxdx(wposi.x as isize);
|
||||||
let mut slope = F::zero();
|
let mut slope = F::zero();
|
||||||
let mut max_height = F::zero();
|
|
||||||
let h0 = h(posi);
|
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 maxdz = maxh - h0;
|
||||||
let posi = posi as isize;
|
let posi = posi as isize;
|
||||||
for deltax in 1..maxdx {
|
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;
|
max_height = h_j_act;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
h0 - minh + max_height
|
||||||
|
};
|
||||||
let a = slope * lgain;
|
let a = slope * lgain;
|
||||||
let h = h0 + max_height;
|
|
||||||
(to_angle(a), to_height(h))
|
(to_angle(a), to_height(h))
|
||||||
})
|
})
|
||||||
.unzip_into_vecs(&mut angles, &mut heights);
|
.unzip_into_vecs(&mut angles, &mut heights);
|
||||||
|
Loading…
Reference in New Issue
Block a user