diff --git a/assets/voxygen/shaders/fluid-frag.glsl b/assets/voxygen/shaders/fluid-frag.glsl index 1a75375929..effe5116de 100644 --- a/assets/voxygen/shaders/fluid-frag.glsl +++ b/assets/voxygen/shaders/fluid-frag.glsl @@ -11,6 +11,7 @@ in float f_light; layout (std140) uniform u_locals { vec3 model_offs; + float load_time; }; out vec4 tgt_color; diff --git a/assets/voxygen/shaders/fluid-vert.glsl b/assets/voxygen/shaders/fluid-vert.glsl index d09305e9e7..f7582cca07 100644 --- a/assets/voxygen/shaders/fluid-vert.glsl +++ b/assets/voxygen/shaders/fluid-vert.glsl @@ -8,6 +8,7 @@ in uint v_col_light; layout (std140) uniform u_locals { vec3 model_offs; + float load_time; }; out vec3 f_pos; diff --git a/assets/voxygen/shaders/terrain-frag.glsl b/assets/voxygen/shaders/terrain-frag.glsl index 72500c34ca..65881aa85d 100644 --- a/assets/voxygen/shaders/terrain-frag.glsl +++ b/assets/voxygen/shaders/terrain-frag.glsl @@ -10,6 +10,7 @@ in float f_light; layout (std140) uniform u_locals { vec3 model_offs; + float load_time; }; out vec4 tgt_color; diff --git a/assets/voxygen/shaders/terrain-vert.glsl b/assets/voxygen/shaders/terrain-vert.glsl index bbfe953324..4ce800cba1 100644 --- a/assets/voxygen/shaders/terrain-vert.glsl +++ b/assets/voxygen/shaders/terrain-vert.glsl @@ -9,6 +9,7 @@ in uint v_col_light; layout (std140) uniform u_locals { vec3 model_offs; + float load_time; }; out vec3 f_pos; @@ -26,6 +27,8 @@ void main() { float((v_pos_norm >> 16) & 0x1FFFu) ) + model_offs; + f_pos.z *= min(1.0001 - 0.02 / pow(tick.x - load_time, 10.0), 1.0); + // TODO: last 3 bits in v_pos_norm should be a number between 0 and 5, rather than 0-2 and a direction. uint norm_axis = (v_pos_norm >> 30) & 0x3u; diff --git a/voxygen/src/render/pipelines/terrain.rs b/voxygen/src/render/pipelines/terrain.rs index d28aa3acbf..32c1b36c0c 100644 --- a/voxygen/src/render/pipelines/terrain.rs +++ b/voxygen/src/render/pipelines/terrain.rs @@ -23,6 +23,7 @@ gfx_defines! { constant Locals { model_offs: [f32; 3] = "model_offs", + load_time: f32 = "load_time", } pipeline pipe { @@ -66,6 +67,7 @@ impl Locals { pub fn default() -> Self { Self { model_offs: [0.0; 3], + load_time: 0.0, } } } diff --git a/voxygen/src/scene/terrain.rs b/voxygen/src/scene/terrain.rs index 647314c7d3..e83d95403d 100644 --- a/voxygen/src/scene/terrain.rs +++ b/voxygen/src/scene/terrain.rs @@ -23,6 +23,7 @@ use vek::*; struct TerrainChunk { // GPU data + load_time: f32, opaque_model: Model, fluid_model: Model, sprite_instances: HashMap<(BlockKind, usize), Instances>, @@ -613,6 +614,7 @@ impl Terrain { proj_mat: Mat4, ) { let current_tick = client.get_tick(); + let current_time = client.state().get_time(); // Add any recently created or changed chunks to the list of chunks to be meshed. for (modified, pos) in client @@ -796,9 +798,15 @@ impl Terrain { // It's the mesh we want, insert the newly finished model into the terrain model // data structure (convert the mesh to a model first of course). Some(todo) if response.started_tick <= todo.started_tick => { + let load_time = self + .chunks + .get(&response.pos) + .map(|chunk| chunk.load_time) + .unwrap_or(current_time as f32); self.chunks.insert( response.pos, TerrainChunk { + load_time, opaque_model: renderer .create_model(&response.opaque_mesh) .expect("Failed to upload chunk mesh to the GPU!"), @@ -825,6 +833,7 @@ impl Terrain { }), ) .into_array(), + load_time, }]) .expect("Failed to upload chunk locals to the GPU!"), visible: false,