diff options
author | Thaddeus Crews <repiteo@outlook.com> | 2024-11-10 12:12:43 -0600 |
---|---|---|
committer | Thaddeus Crews <repiteo@outlook.com> | 2024-11-10 12:12:43 -0600 |
commit | 3444611507d1c0e85e85227dda6f3eea7226419f (patch) | |
tree | 41fa5f2b59616c057ec64b47be821823d46bc694 /modules/raycast/raycast_occlusion_cull.cpp | |
parent | bbde4ed32462269a757ad442329e3cefa7f47ccb (diff) | |
parent | 0f0e24016ceb11b2503447bb70bce723322dcb7c (diff) | |
download | redot-engine-3444611507d1c0e85e85227dda6f3eea7226419f.tar.gz |
Merge pull request #98758 from Rudolph-B/Issue-98756
Fix Occlusion Culling Buffer occasionally getting corrupted.
Diffstat (limited to 'modules/raycast/raycast_occlusion_cull.cpp')
-rw-r--r-- | modules/raycast/raycast_occlusion_cull.cpp | 17 |
1 files changed, 5 insertions, 12 deletions
diff --git a/modules/raycast/raycast_occlusion_cull.cpp b/modules/raycast/raycast_occlusion_cull.cpp index 634c370b05..3609f5a554 100644 --- a/modules/raycast/raycast_occlusion_cull.cpp +++ b/modules/raycast/raycast_occlusion_cull.cpp @@ -90,18 +90,11 @@ void RaycastOcclusionCull::RaycastHZBuffer::update_camera_rays(const Transform3D td.camera_dir = -p_cam_transform.basis.get_column(2); td.camera_orthogonal = p_cam_orthogonal; - Projection inv_camera_matrix = p_cam_projection.inverse(); - Vector3 camera_corner_proj = Vector3(-1.0f, -1.0f, -1.0f); - Vector3 camera_corner_view = inv_camera_matrix.xform(camera_corner_proj); - td.pixel_corner = p_cam_transform.xform(camera_corner_view); - - Vector3 top_corner_proj = Vector3(-1.0f, 1.0f, -1.0f); - Vector3 top_corner_view = inv_camera_matrix.xform(top_corner_proj); - Vector3 top_corner_world = p_cam_transform.xform(top_corner_view); - - Vector3 left_corner_proj = Vector3(1.0f, -1.0f, -1.0f); - Vector3 left_corner_view = inv_camera_matrix.xform(left_corner_proj); - Vector3 left_corner_world = p_cam_transform.xform(left_corner_view); + // Calculate the world coordinates of the viewport. + Vector2 viewport_half = p_cam_projection.get_viewport_half_extents(); + td.pixel_corner = p_cam_transform.xform(Vector3(-viewport_half.x, -viewport_half.y, -p_cam_projection.get_z_near())); + Vector3 top_corner_world = p_cam_transform.xform(Vector3(-viewport_half.x, viewport_half.y, -p_cam_projection.get_z_near())); + Vector3 left_corner_world = p_cam_transform.xform(Vector3(viewport_half.x, -viewport_half.y, -p_cam_projection.get_z_near())); td.pixel_u_interp = left_corner_world - td.pixel_corner; td.pixel_v_interp = top_corner_world - td.pixel_corner; |