Only draw chunks outside of fog boundary, reduce fog strength

This commit is contained in:
Joshua Barretto 2019-06-06 08:13:58 +01:00
parent 1b5d2d468b
commit 66cd8de0e1
3 changed files with 34 additions and 6 deletions

View File

@ -21,7 +21,7 @@ vec3 get_sky_color(vec3 dir, float time_of_day) {
float fog(vec2 f_pos, vec2 focus_pos) {
float dist = distance(f_pos, focus_pos) / view_distance.x;
float min_fog = 0.5;
float min_fog = 0.75;
float max_fog = 1.0;
return clamp((dist - min_fog) / (max_fog - min_fog), 0.0, 1.0);

View File

@ -166,7 +166,12 @@ impl Scene {
renderer.render_skybox(&self.skybox.model, &self.globals, &self.skybox.locals);
// Render terrain and figures.
self.terrain.render(renderer, &self.globals);
self.terrain.render(
renderer,
&self.globals,
self.camera.get_focus_pos(),
self.loaded_distance,
);
self.figure_mgr.render(renderer, client, &self.globals);
renderer.render_post_process(

View File

@ -3,7 +3,11 @@ use crate::{
render::{Consts, Globals, Mesh, Model, Renderer, TerrainLocals, TerrainPipeline},
};
use client::Client;
use common::{terrain::TerrainMap, vol::SampleVol, volumes::vol_map_2d::VolMap2dErr};
use common::{
terrain::{TerrainChunkSize, TerrainMap},
vol::{SampleVol, VolSize},
volumes::vol_map_2d::VolMap2dErr,
};
use std::{collections::HashMap, i32, sync::mpsc, time::Duration};
use vek::*;
@ -200,9 +204,28 @@ impl Terrain {
}
}
pub fn render(&self, renderer: &mut Renderer, globals: &Consts<Globals>) {
for (_, chunk) in &self.chunks {
renderer.render_terrain_chunk(&chunk.model, globals, &chunk.locals);
pub fn render(
&self,
renderer: &mut Renderer,
globals: &Consts<Globals>,
focus_pos: Vec3<f32>,
loaded_distance: f32,
) {
for (pos, chunk) in &self.chunks {
// Limit focus_pos to chunk bounds
let chunk_pos = pos.map2(TerrainChunkSize::SIZE.into(), |e, sz: u32| {
e as f32 * sz as f32
});
let nearest_in_chunk = Vec2::from(focus_pos).clamped(
chunk_pos,
chunk_pos + Vec2::from(TerrainChunkSize::SIZE).map(|e: u32| e as f32),
);
if Vec2::<f32>::from(focus_pos).distance_squared(nearest_in_chunk)
< loaded_distance.powf(2.0)
{
renderer.render_terrain_chunk(&chunk.model, globals, &chunk.locals);
}
}
}
}