summaryrefslogtreecommitdiffstats
path: root/servers/rendering/renderer_scene_occlusion_cull.h
diff options
context:
space:
mode:
Diffstat (limited to 'servers/rendering/renderer_scene_occlusion_cull.h')
-rw-r--r--servers/rendering/renderer_scene_occlusion_cull.h50
1 files changed, 43 insertions, 7 deletions
diff --git a/servers/rendering/renderer_scene_occlusion_cull.h b/servers/rendering/renderer_scene_occlusion_cull.h
index 149d7b1cdb..5adba5dc6a 100644
--- a/servers/rendering/renderer_scene_occlusion_cull.h
+++ b/servers/rendering/renderer_scene_occlusion_cull.h
@@ -53,14 +53,10 @@ public:
PackedByteArray debug_data;
float debug_tex_range = 0.0f;
- public:
- bool is_empty() const;
- virtual void clear();
- virtual void resize(const Size2i &p_size);
-
- void update_mips();
+ uint64_t occlusion_frame = 0;
+ Size2i occlusion_buffer_size;
- _FORCE_INLINE_ bool is_occluded(const real_t p_bounds[6], const Vector3 &p_cam_position, const Transform3D &p_cam_inv_transform, const Projection &p_cam_projection, real_t p_near) const {
+ _FORCE_INLINE_ bool _is_occluded(const real_t p_bounds[6], const Vector3 &p_cam_position, const Transform3D &p_cam_inv_transform, const Projection &p_cam_projection, real_t p_near) const {
if (is_empty()) {
return false;
}
@@ -154,7 +150,47 @@ public:
return !visible;
}
+ public:
+ static bool occlusion_jitter_enabled;
+
+ bool is_empty() const;
+ virtual void clear();
+ virtual void resize(const Size2i &p_size);
+
+ void update_mips();
+
+ // Thin wrapper around _is_occluded(),
+ // allowing occlusion timers to delay the disappearance
+ // of objects to prevent flickering when using jittering.
+ _FORCE_INLINE_ bool is_occluded(const real_t p_bounds[6], const Vector3 &p_cam_position, const Transform3D &p_cam_inv_transform, const Projection &p_cam_projection, real_t p_near, uint64_t &r_occlusion_timeout) const {
+ bool occluded = _is_occluded(p_bounds, p_cam_position, p_cam_inv_transform, p_cam_projection, p_near);
+
+ // Special case, temporal jitter disabled,
+ // so we don't use occlusion timers.
+ if (!occlusion_jitter_enabled) {
+ return occluded;
+ }
+
+ if (!occluded) {
+//#define DEBUG_RASTER_OCCLUSION_JITTER
+#ifdef DEBUG_RASTER_OCCLUSION_JITTER
+ r_occlusion_timeout = occlusion_frame + 1;
+#else
+ r_occlusion_timeout = occlusion_frame + 9;
+#endif
+ } else if (r_occlusion_timeout) {
+ // Regular timeout, allow occlusion culling
+ // to proceed as normal after the delay.
+ if (occlusion_frame >= r_occlusion_timeout) {
+ r_occlusion_timeout = 0;
+ }
+ }
+
+ return occluded && !r_occlusion_timeout;
+ }
+
RID get_debug_texture();
+ const Size2i &get_occlusion_buffer_size() const { return occlusion_buffer_size; }
virtual ~HZBuffer(){};
};