From 7960e6ea6d4454c121d46b0f26f1d5781fa7a5e2 Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Mon, 19 Aug 2019 22:54:16 +0100 Subject: [PATCH] Sprite distance fading, grass --- assets/voxygen/shaders/sprite-frag.glsl | 5 ++- assets/voxygen/voxel/sprite/grass-0.vox | 3 ++ assets/voxygen/voxel/sprite/grass-1.vox | 3 ++ assets/voxygen/voxel/sprite/grass-2.vox | 3 ++ assets/voxygen/voxel/sprite/grass-3.vox | 3 ++ assets/voxygen/voxel/sprite/grass-4.vox | 3 ++ assets/voxygen/voxel/sprite/grass-5.vox | 3 ++ voxygen/src/render/instances.rs | 4 ++ voxygen/src/render/model.rs | 22 ++++------ voxygen/src/render/pipelines/sprite.rs | 3 +- voxygen/src/render/renderer.rs | 56 +++++++++++++++++++++---- voxygen/src/scene/mod.rs | 7 +++- voxygen/src/scene/terrain.rs | 27 ++++++++---- world/src/block/mod.rs | 5 ++- 14 files changed, 112 insertions(+), 35 deletions(-) create mode 100644 assets/voxygen/voxel/sprite/grass-0.vox create mode 100644 assets/voxygen/voxel/sprite/grass-1.vox create mode 100644 assets/voxygen/voxel/sprite/grass-2.vox create mode 100644 assets/voxygen/voxel/sprite/grass-3.vox create mode 100644 assets/voxygen/voxel/sprite/grass-4.vox create mode 100644 assets/voxygen/voxel/sprite/grass-5.vox diff --git a/assets/voxygen/shaders/sprite-frag.glsl b/assets/voxygen/shaders/sprite-frag.glsl index c0eb1fce79..45e40a9a98 100644 --- a/assets/voxygen/shaders/sprite-frag.glsl +++ b/assets/voxygen/shaders/sprite-frag.glsl @@ -12,6 +12,9 @@ out vec4 tgt_color; #include #include +const float RENDER_DIST = 128.0; +const float FADE_DIST = 32.0; + void main() { vec3 light = get_sun_diffuse(f_norm, time_of_day.x) * f_light + light_at(f_pos, f_norm); vec3 surf_color = f_col * light; @@ -20,5 +23,5 @@ void main() { vec3 fog_color = get_sky_color(normalize(f_pos - cam_pos.xyz), time_of_day.x); vec3 color = mix(surf_color, fog_color, fog_level); - tgt_color = vec4(color, 1.0); + tgt_color = vec4(color, 1.0 - clamp((distance(focus_pos.xy, f_pos.xy) - (RENDER_DIST - FADE_DIST)) / FADE_DIST, 0, 1)); } diff --git a/assets/voxygen/voxel/sprite/grass-0.vox b/assets/voxygen/voxel/sprite/grass-0.vox new file mode 100644 index 0000000000..d2fd41f26d --- /dev/null +++ b/assets/voxygen/voxel/sprite/grass-0.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80f4a94736f621d6dab850cccdba47f205773f37b6115bfe329f95cc5b64cb8e +size 1388 diff --git a/assets/voxygen/voxel/sprite/grass-1.vox b/assets/voxygen/voxel/sprite/grass-1.vox new file mode 100644 index 0000000000..380c8bc95c --- /dev/null +++ b/assets/voxygen/voxel/sprite/grass-1.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3bd133756c5bfe8662912b3854762d47080eff515a7916dde3d7db41de0fdc3f +size 1332 diff --git a/assets/voxygen/voxel/sprite/grass-2.vox b/assets/voxygen/voxel/sprite/grass-2.vox new file mode 100644 index 0000000000..37cc85536c --- /dev/null +++ b/assets/voxygen/voxel/sprite/grass-2.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d9bbe9886d673c48ff6fabd7e28cba834d9cf7a910c144f2fc2299b97c836de2 +size 1284 diff --git a/assets/voxygen/voxel/sprite/grass-3.vox b/assets/voxygen/voxel/sprite/grass-3.vox new file mode 100644 index 0000000000..37cc85536c --- /dev/null +++ b/assets/voxygen/voxel/sprite/grass-3.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d9bbe9886d673c48ff6fabd7e28cba834d9cf7a910c144f2fc2299b97c836de2 +size 1284 diff --git a/assets/voxygen/voxel/sprite/grass-4.vox b/assets/voxygen/voxel/sprite/grass-4.vox new file mode 100644 index 0000000000..4d59d04f9f --- /dev/null +++ b/assets/voxygen/voxel/sprite/grass-4.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de38dc486690aaa613c60634580e9254da1dcef603bfc9e214ad1bcb36745162 +size 1272 diff --git a/assets/voxygen/voxel/sprite/grass-5.vox b/assets/voxygen/voxel/sprite/grass-5.vox new file mode 100644 index 0000000000..33ac25006a --- /dev/null +++ b/assets/voxygen/voxel/sprite/grass-5.vox @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a2b1eabea26ac364598fc591070b3bfa457a258cc85404e7fe0b5e7c5ceb8f41 +size 1224 diff --git a/voxygen/src/render/instances.rs b/voxygen/src/render/instances.rs index ae18216bbb..ba73968b23 100644 --- a/voxygen/src/render/instances.rs +++ b/voxygen/src/render/instances.rs @@ -20,6 +20,10 @@ impl Instances { }) } + pub fn count(&self) -> usize { + self.ibuf.len() + } + pub fn update( &mut self, encoder: &mut gfx::Encoder, diff --git a/voxygen/src/render/model.rs b/voxygen/src/render/model.rs index 420d505507..ece02ef913 100644 --- a/voxygen/src/render/model.rs +++ b/voxygen/src/render/model.rs @@ -10,22 +10,20 @@ use std::ops::Range; /// Represents a mesh that has been sent to the GPU. pub struct Model { pub vbuf: gfx::handle::Buffer, - pub slice: gfx::Slice, + pub vertex_range: Range, } impl Model

{ pub fn new(factory: &mut gfx_backend::Factory, mesh: &Mesh

) -> Self { Self { vbuf: factory.create_vertex_buffer(mesh.vertices()), - slice: gfx::Slice { - start: 0, - end: mesh.vertices().len() as u32, - base_vertex: 0, - instances: None, - buffer: gfx::IndexBuffer::Auto, - }, + vertex_range: 0..mesh.vertices().len() as u32, } } + + pub fn vertex_range(&self) -> Range { + self.vertex_range.clone() + } } /// Represents a mesh on the GPU which can be updated dynamically. @@ -46,13 +44,7 @@ impl DynamicModel

{ pub fn submodel(&self, range: Range) -> Model

{ Model { vbuf: self.vbuf.clone(), - slice: gfx::Slice { - start: range.start as u32, - end: range.end as u32, - base_vertex: 0, - instances: None, - buffer: gfx::IndexBuffer::Auto, - }, + vertex_range: range.start as u32..range.end as u32, } } diff --git a/voxygen/src/render/pipelines/sprite.rs b/voxygen/src/render/pipelines/sprite.rs index 5133b45f3c..4a6a94b30a 100644 --- a/voxygen/src/render/pipelines/sprite.rs +++ b/voxygen/src/render/pipelines/sprite.rs @@ -10,6 +10,7 @@ use gfx::{ gfx_pipeline, gfx_pipeline_inner, gfx_vertex_struct_meta, + state::ColorMask, }; use vek::*; @@ -32,7 +33,7 @@ gfx_defines! { globals: gfx::ConstantBuffer = "u_globals", lights: gfx::ConstantBuffer = "u_lights", - tgt_color: gfx::RenderTarget = "tgt_color", + tgt_color: gfx::BlendTarget = ("tgt_color", ColorMask::all(), gfx::preset::blend::ALPHA), tgt_depth: gfx::DepthTarget = gfx::preset::depth::LESS_EQUAL_WRITE, } } diff --git a/voxygen/src/render/renderer.rs b/voxygen/src/render/renderer.rs index 81c2ef4695..347b4a6cdb 100644 --- a/voxygen/src/render/renderer.rs +++ b/voxygen/src/render/renderer.rs @@ -366,7 +366,13 @@ impl Renderer { locals: &Consts, ) { self.encoder.draw( - &model.slice, + &gfx::Slice { + start: model.vertex_range().start, + end: model.vertex_range().end, + base_vertex: 0, + instances: None, + buffer: gfx::IndexBuffer::Auto, + }, &self.skybox_pipeline.pso, &skybox::pipe::Data { vbuf: model.vbuf.clone(), @@ -388,7 +394,13 @@ impl Renderer { lights: &Consts, ) { self.encoder.draw( - &model.slice, + &gfx::Slice { + start: model.vertex_range().start, + end: model.vertex_range().end, + base_vertex: 0, + instances: None, + buffer: gfx::IndexBuffer::Auto, + }, &self.figure_pipeline.pso, &figure::pipe::Data { vbuf: model.vbuf.clone(), @@ -411,7 +423,13 @@ impl Renderer { lights: &Consts, ) { self.encoder.draw( - &model.slice, + &gfx::Slice { + start: model.vertex_range().start, + end: model.vertex_range().end, + base_vertex: 0, + instances: None, + buffer: gfx::IndexBuffer::Auto, + }, &self.terrain_pipeline.pso, &terrain::pipe::Data { vbuf: model.vbuf.clone(), @@ -433,7 +451,13 @@ impl Renderer { lights: &Consts, ) { self.encoder.draw( - &model.slice, + &gfx::Slice { + start: model.vertex_range().start, + end: model.vertex_range().end, + base_vertex: 0, + instances: None, + buffer: gfx::IndexBuffer::Auto, + }, &self.fluid_pipeline.pso, &fluid::pipe::Data { vbuf: model.vbuf.clone(), @@ -455,7 +479,13 @@ impl Renderer { lights: &Consts, ) { self.encoder.draw( - &model.slice, + &gfx::Slice { + start: model.vertex_range().start, + end: model.vertex_range().end, + base_vertex: 0, + instances: Some((instances.count() as u32, 0)), + buffer: gfx::IndexBuffer::Auto, + }, &self.sprite_pipeline.pso, &sprite::pipe::Data { vbuf: model.vbuf.clone(), @@ -479,7 +509,13 @@ impl Renderer { ) { let Aabr { min, max } = scissor; self.encoder.draw( - &model.slice, + &gfx::Slice { + start: model.vertex_range().start, + end: model.vertex_range().end, + base_vertex: 0, + instances: None, + buffer: gfx::IndexBuffer::Auto, + }, &self.ui_pipeline.pso, &ui::pipe::Data { vbuf: model.vbuf.clone(), @@ -505,7 +541,13 @@ impl Renderer { locals: &Consts, ) { self.encoder.draw( - &model.slice, + &gfx::Slice { + start: model.vertex_range().start, + end: model.vertex_range().end, + base_vertex: 0, + instances: None, + buffer: gfx::IndexBuffer::Auto, + }, &self.postprocess_pipeline.pso, &postprocess::pipe::Data { vbuf: model.vbuf.clone(), diff --git a/voxygen/src/scene/mod.rs b/voxygen/src/scene/mod.rs index d5562066f3..96518f516b 100644 --- a/voxygen/src/scene/mod.rs +++ b/voxygen/src/scene/mod.rs @@ -229,7 +229,12 @@ impl Scene { // Render terrain and figures. self.figure_mgr .render(renderer, client, &self.globals, &self.lights, &self.camera); - self.terrain.render(renderer, &self.globals, &self.lights); + self.terrain.render( + renderer, + &self.globals, + &self.lights, + self.camera.get_focus_pos(), + ); renderer.render_post_process( &self.postprocess.model, diff --git a/voxygen/src/scene/terrain.rs b/voxygen/src/scene/terrain.rs index b5bfc7bad2..89c5422197 100644 --- a/voxygen/src/scene/terrain.rs +++ b/voxygen/src/scene/terrain.rs @@ -74,7 +74,7 @@ fn mesh_worker( match volume.get(wpos).unwrap_or(&Block::empty()).kind() { BlockKind::Wheat => instances.push(SpriteInstance::new( - wpos.map(|e| e as f32), + wpos.map(|e| e as f32) + Vec3::new(0.5, 0.5, 0.0), Rgb::broadcast(1.0), )), _ => {} @@ -110,7 +110,7 @@ impl Terrain { let wheat_mesh = Meshable::::generate_mesh( &Segment::from( - assets::load_expect::("voxygen.voxel.sprite.wheat").as_ref(), + assets::load_expect::("voxygen.voxel.sprite.grass-0").as_ref(), ), Vec3::new(6.0, 6.0, 0.0), ) @@ -388,17 +388,26 @@ impl Terrain { renderer: &mut Renderer, globals: &Consts, lights: &Consts, + focus_pos: Vec3, ) { // Opaque - for (_pos, chunk) in &self.chunks { + for (pos, chunk) in &self.chunks { if chunk.visible { renderer.render_terrain_chunk(&chunk.opaque_model, globals, &chunk.locals, lights); - renderer.render_sprites( - &self.wheat_model, - globals, - &chunk.sprite_instances, - lights, - ); + + const SPRITE_RENDER_DISTANCE: f32 = 128.0; + + let chunk_center = pos.map2(Vec2::from(TerrainChunkSize::SIZE), |e, sz: u32| { + (e as f32 + 0.5) * sz as f32 + }); + if Vec2::from(focus_pos).distance(chunk_center) < SPRITE_RENDER_DISTANCE { + renderer.render_sprites( + &self.wheat_model, + globals, + &chunk.sprite_instances, + lights, + ); + } } } diff --git a/world/src/block/mod.rs b/world/src/block/mod.rs index 06b0f173b5..776a765c7a 100644 --- a/world/src/block/mod.rs +++ b/world/src/block/mod.rs @@ -254,7 +254,10 @@ impl<'a> BlockGen<'a> { BlockKind::Normal, saturate_srgb(col, 0.45).map(|e| (e * 255.0) as u8), )) - } else if (wposf.z as f32) < height + 0.02 { + } else if (wposf.z as f32) < height + 1.0 + && (wposf.z as f32 > water_height + 3.0) + && (chaos * 4096.0).fract() < 0.025 + { Some(Block::new(BlockKind::Wheat, Rgb::broadcast(0))) } else { None