@@ -525,14 +525,14 @@ void RaycastOcclusionCull::buffer_set_size(RID p_buffer, const Vector2i &p_size)
525
525
buffers[p_buffer].resize (p_size);
526
526
}
527
527
528
- Vector2 RaycastOcclusionCull::_jitter_half_extents (const Vector2 &p_half_extents , const Size2i &p_viewport_size ) {
528
+ Vector2 RaycastOcclusionCull::_get_jitter (const Rect2 &p_viewport_rect , const Size2i &p_buffer_size ) {
529
529
if (!_jitter_enabled) {
530
- return p_half_extents ;
530
+ return Vector2 () ;
531
531
}
532
532
533
533
// Prevent divide by zero when using NULL viewport.
534
- if ((p_viewport_size .x <= 0 ) || (p_viewport_size .y <= 0 )) {
535
- return p_half_extents ;
534
+ if ((p_buffer_size .x <= 0 ) || (p_buffer_size .y <= 0 )) {
535
+ return Vector2 () ;
536
536
}
537
537
538
538
int32_t frame = Engine::get_singleton ()->get_frames_drawn ();
@@ -568,8 +568,8 @@ Vector2 RaycastOcclusionCull::_jitter_half_extents(const Vector2 &p_half_extents
568
568
jitter = Vector2 (0 .5f , 0 .5f );
569
569
} break ;
570
570
}
571
-
572
- jitter *= Vector2 (p_half_extents .x / (float )p_viewport_size .x , p_half_extents .y / (float )p_viewport_size .y );
571
+ Vector2 half_extents = p_viewport_rect. get_size () * 0.5 ;
572
+ jitter *= Vector2 (half_extents .x / (float )p_buffer_size .x , half_extents .y / (float )p_buffer_size .y );
573
573
574
574
// The multiplier here determines the jitter magnitude in pixels.
575
575
// It seems like a value of 0.66 matches well the above jittering pattern as it generates subpixel samples at 0, 1/3 and 2/3
@@ -578,7 +578,16 @@ Vector2 RaycastOcclusionCull::_jitter_half_extents(const Vector2 &p_half_extents
578
578
// False shown can lower percentage that are occluded, and therefore performance.
579
579
jitter *= 0 .66f ;
580
580
581
- return p_half_extents + jitter;
581
+ return jitter;
582
+ }
583
+
584
+ Rect2 _get_viewport_rect (const Projection &p_cam_projection) {
585
+ // NOTE: This assumes a rectangular projection plane, i.e. that:
586
+ // - the matrix is a projection across z-axis (i.e. is invertible and columns[0][1], [0][3], [1][0] and [1][3] == 0)
587
+ // - the projection plane is rectangular (i.e. columns[0][2] and [1][2] == 0 if columns[2][3] != 0)
588
+ Size2 half_extents = p_cam_projection.get_viewport_half_extents ();
589
+ Point2 bottom_left = -half_extents * Vector2 (p_cam_projection.columns [3 ][0 ] * p_cam_projection.columns [3 ][3 ] + p_cam_projection.columns [2 ][0 ] * p_cam_projection.columns [2 ][3 ] + 1 , p_cam_projection.columns [3 ][1 ] * p_cam_projection.columns [3 ][3 ] + p_cam_projection.columns [2 ][1 ] * p_cam_projection.columns [2 ][3 ] + 1 );
590
+ return Rect2 (bottom_left, 2 * half_extents);
582
591
}
583
592
584
593
void RaycastOcclusionCull::buffer_update (RID p_buffer, const Transform3D &p_cam_transform, const Projection &p_cam_projection, bool p_cam_orthogonal) {
@@ -595,11 +604,12 @@ void RaycastOcclusionCull::buffer_update(RID p_buffer, const Transform3D &p_cam_
595
604
Scenario &scenario = scenarios[buffer.scenario_rid ];
596
605
scenario.update ();
597
606
598
- Vector2 viewport_half = p_cam_projection.get_viewport_half_extents ();
599
- Vector2 jitter_viewport_half = _jitter_half_extents (viewport_half, buffer.get_occlusion_buffer_size ());
600
- Vector3 near_bottom_left = Vector3 (-jitter_viewport_half.x , -jitter_viewport_half.y , -p_cam_projection.get_z_near ());
607
+ Rect2 vp_rect = _get_viewport_rect (p_cam_projection);
608
+ Vector2 bottom_left = vp_rect.position ;
609
+ bottom_left += _get_jitter (vp_rect, buffer.get_occlusion_buffer_size ());
610
+ Vector3 near_bottom_left = Vector3 (bottom_left.x , bottom_left.y , -p_cam_projection.get_z_near ());
601
611
602
- buffer.update_camera_rays (p_cam_transform, near_bottom_left, 2 * viewport_half , p_cam_projection.get_z_far (), p_cam_orthogonal);
612
+ buffer.update_camera_rays (p_cam_transform, near_bottom_left, vp_rect. get_size () , p_cam_projection.get_z_far (), p_cam_orthogonal);
603
613
604
614
scenario.raycast (buffer.camera_rays , buffer.camera_ray_masks .ptr (), buffer.camera_rays_tile_count );
605
615
buffer.sort_rays (-p_cam_transform.basis .get_column (2 ), p_cam_orthogonal);
0 commit comments