From 43f0f740c9b1f732f67ba19ed317ba7ab1b90dd0 Mon Sep 17 00:00:00 2001 From: Dmitry Stepanov Date: Sat, 31 Aug 2024 22:42:08 +0300 Subject: [PATCH] fixed frame desync in occlusion culling --- fyrox-impl/src/renderer/gbuffer/mod.rs | 9 ++++----- fyrox-impl/src/renderer/visibility.rs | 26 +++++++++++++++++++------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/fyrox-impl/src/renderer/gbuffer/mod.rs b/fyrox-impl/src/renderer/gbuffer/mod.rs index a6ae7ca63..a3b726530 100644 --- a/fyrox-impl/src/renderer/gbuffer/mod.rs +++ b/fyrox-impl/src/renderer/gbuffer/mod.rs @@ -427,17 +427,16 @@ impl GBuffer { } } - self.occlusion_tester.upload_data( + self.occlusion_tester.try_run_visibility_test( state, graph, + None, + unit_quad, objects.iter(), &self.framebuffer, camera.global_position(), initial_view_projection, - ); - - self.occlusion_tester - .run_visibility_test(state, graph, None, unit_quad)?; + )?; } let inv_view_proj = initial_view_projection.try_inverse().unwrap_or_default(); diff --git a/fyrox-impl/src/renderer/visibility.rs b/fyrox-impl/src/renderer/visibility.rs index 19193a306..00e41a5f4 100644 --- a/fyrox-impl/src/renderer/visibility.rs +++ b/fyrox-impl/src/renderer/visibility.rs @@ -754,7 +754,7 @@ impl OcclusionTester { Ok(()) } - pub fn upload_data<'a>( + fn upload_data<'a>( &mut self, state: &PipelineState, graph: &Graph, @@ -793,22 +793,34 @@ impl OcclusionTester { self.observer_position = observer_position; } - pub fn run_visibility_test( + pub fn try_run_visibility_test<'a>( &mut self, state: &PipelineState, graph: &Graph, debug_renderer: Option<&mut DebugRenderer>, unit_quad: &GeometryBuffer, + objects_to_test: impl Iterator>, + prev_framebuffer: &FrameBuffer, + observer_position: Vector3, + view_projection: Matrix4, ) -> Result<(), FrameworkError> { - if self.objects_to_test.is_empty() - || self - .visibility_buffer_optimizer - .pixel_buffer - .is_request_running() + if self + .visibility_buffer_optimizer + .pixel_buffer + .is_request_running() { return Ok(()); } + self.upload_data( + state, + graph, + objects_to_test, + prev_framebuffer, + observer_position, + view_projection, + ); + let w = self.frame_size.x as i32; let h = self.frame_size.y as i32; let viewport = Rect::new(0, 0, w, h);