diff --git a/voxygen/src/render/renderer/drawer.rs b/voxygen/src/render/renderer/drawer.rs index 569f6bdcc0..0a5ebab6e2 100644 --- a/voxygen/src/render/renderer/drawer.rs +++ b/voxygen/src/render/renderer/drawer.rs @@ -794,11 +794,24 @@ impl<'pass_ref, 'pass: 'pass_ref> TerrainShadowDrawer<'pass_ref, 'pass> { &mut self, model: &'data Model, locals: &'data terrain::BoundLocals, + alt_indices: &'data crate::scene::terrain::AltIndices, + is_underground: bool, ) { + // Don't render anything if there's nothing to render! + if is_underground || alt_indices.deep_end == model.len() { + return; + } + + let submodel = if is_underground { + model.submodel(0..alt_indices.underground_end as u32) + } else { + model.submodel(alt_indices.deep_end as u32..model.len() as u32) + }; + self.render_pass.set_bind_group(1, &locals.bind_group, &[]); - self.render_pass.set_vertex_buffer(0, model.buf().slice(..)); + self.render_pass.set_vertex_buffer(0, submodel.buf()); self.render_pass - .draw_indexed(0..model.len() as u32 / 4 * 6, 0, 0..1); + .draw_indexed(0..submodel.len() / 4 * 6, 0, 0..1); } } diff --git a/voxygen/src/scene/mod.rs b/voxygen/src/scene/mod.rs index 8024d1645e..02bbe67952 100644 --- a/voxygen/src/scene/mod.rs +++ b/voxygen/src/scene/mod.rs @@ -1262,8 +1262,11 @@ impl Scene { prof_span!("directed shadows"); if let Some(mut shadow_pass) = drawer.shadow_pass() { // Render terrain directed shadows. - self.terrain - .render_shadows(&mut shadow_pass.draw_terrain_shadows(), focus_pos); + self.terrain.render_shadows( + &mut shadow_pass.draw_terrain_shadows(), + focus_pos, + is_underground, + ); // Render figure directed shadows. self.figure_mgr.render_shadows( diff --git a/voxygen/src/scene/terrain.rs b/voxygen/src/scene/terrain.rs index 41a6160e9d..b29141d383 100644 --- a/voxygen/src/scene/terrain.rs +++ b/voxygen/src/scene/terrain.rs @@ -1536,6 +1536,7 @@ impl Terrain { &'a self, drawer: &mut TerrainShadowDrawer<'_, 'a>, focus_pos: Vec3, + is_underground: bool, ) { span!(_guard, "render_shadows", "Terrain::render_shadows"); let focus_chunk = Vec2::from(focus_pos).map2(TerrainChunk::RECT_SIZE, |e: f32, sz| { @@ -1558,12 +1559,15 @@ impl Terrain { .filter(|chunk| chunk.can_shadow_sun()) .chain(self.shadow_chunks.iter().map(|(_, chunk)| chunk)) .filter_map(|chunk| { - chunk - .opaque_model - .as_ref() - .map(|model| (model, &chunk.locals)) + Some(( + chunk.opaque_model.as_ref()?, + &chunk.locals, + &chunk.alt_indices, + )) }) - .for_each(|(model, locals)| drawer.draw(model, locals)); + .for_each(|(model, locals, alt_indices)| { + drawer.draw(model, locals, alt_indices, is_underground) + }); } pub fn render_rain_occlusion<'a>( @@ -1585,13 +1589,14 @@ impl Terrain { chunk_iter // Find a way to keep this? // .filter(|chunk| chunk.can_shadow_sun()) - .filter_map(|chunk| { + .filter_map(|chunk| Some(( chunk .opaque_model - .as_ref() - .map(|model| (model, &chunk.locals)) - }) - .for_each(|(model, locals)| drawer.draw(model, locals)); + .as_ref()?, + &chunk.locals, + &chunk.alt_indices, + ))) + .for_each(|(model, locals, alt_indices)| drawer.draw(model, locals, alt_indices, false)); } pub fn chunks_for_point_shadows(