From 77a3b47bdace578849715649fdb18984de40704e Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Thu, 6 Jun 2019 08:13:58 +0100 Subject: [PATCH] Only draw chunks outside of fog boundary, reduce fog strength --- voxygen/shaders/include/sky.glsl | 2 +- voxygen/src/scene/mod.rs | 7 ++++++- voxygen/src/scene/terrain.rs | 31 +++++++++++++++++++++++++++---- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/voxygen/shaders/include/sky.glsl b/voxygen/shaders/include/sky.glsl index b7fe28d4ca..6ee29fb132 100644 --- a/voxygen/shaders/include/sky.glsl +++ b/voxygen/shaders/include/sky.glsl @@ -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); diff --git a/voxygen/src/scene/mod.rs b/voxygen/src/scene/mod.rs index 305fbca348..4f74fae068 100644 --- a/voxygen/src/scene/mod.rs +++ b/voxygen/src/scene/mod.rs @@ -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( diff --git a/voxygen/src/scene/terrain.rs b/voxygen/src/scene/terrain.rs index 8e1a39d57c..dfa13703a5 100644 --- a/voxygen/src/scene/terrain.rs +++ b/voxygen/src/scene/terrain.rs @@ -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) { - for (_, chunk) in &self.chunks { - renderer.render_terrain_chunk(&chunk.model, globals, &chunk.locals); + pub fn render( + &self, + renderer: &mut Renderer, + globals: &Consts, + focus_pos: Vec3, + 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::::from(focus_pos).distance_squared(nearest_in_chunk) + < loaded_distance.powf(2.0) + { + renderer.render_terrain_chunk(&chunk.model, globals, &chunk.locals); + } } } }