From bd42cc2c773f81d6c635de79cb9576d1ac811b32 Mon Sep 17 00:00:00 2001 From: lhofhansl Date: Sat, 6 Jan 2024 18:43:46 -0800 Subject: [PATCH] Ensure deterministic client occlusion culling and minor improvements (#14212) * Ensure deterministic client occlusion culling * Increase culling optimize distance slightly * More accurate culling when sampling --- builtin/settingtypes.txt | 2 +- src/defaultsettings.cpp | 2 +- src/map.cpp | 15 ++++++++------- src/map.h | 4 ++-- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/builtin/settingtypes.txt b/builtin/settingtypes.txt index 09bde2a4e7c4..784035e3cfb7 100644 --- a/builtin/settingtypes.txt +++ b/builtin/settingtypes.txt @@ -2103,7 +2103,7 @@ server_side_occlusion_culling (Server-side occlusion culling) bool true # rendering glitches (missing blocks). # This is especially useful for very large viewing range (upwards of 500). # Stated in MapBlocks (16 nodes). -block_cull_optimize_distance (Block cull optimize distance) int 20 2 2047 +block_cull_optimize_distance (Block cull optimize distance) int 25 2 2047 [**Mapgen] diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 48bc76fdb4c6..66b05811583a 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -397,7 +397,7 @@ void set_default_settings() // This causes frametime jitter on client side, or does it? settings->setDefault("max_block_send_distance", "12"); settings->setDefault("block_send_optimize_distance", "4"); - settings->setDefault("block_cull_optimize_distance", "20"); + settings->setDefault("block_cull_optimize_distance", "25"); settings->setDefault("server_side_occlusion_culling", "true"); settings->setDefault("csm_restriction_flags", "62"); settings->setDefault("csm_restriction_noderange", "0"); diff --git a/src/map.cpp b/src/map.cpp index 2402b971c98c..9d9737832314 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -1193,13 +1193,14 @@ bool Map::isBlockOccluded(v3s16 pos_relative, v3s16 cam_pos_nodes, bool simple_c // this is a HACK, we should think of a more precise algorithm u32 needed_count = 2; - v3s16 random_point(myrand_range(-bs2, bs2), myrand_range(-bs2, bs2), myrand_range(-bs2, bs2)); - if (!isOccluded(cam_pos_nodes, pos_blockcenter + random_point, step, stepfac, - start_offset, end_offset, needed_count)) - return false; - - if (simple_check) - return true; + // This should be only used in server occlusion cullung. + // The client recalculates the complete drawlist periodically, + // and random sampling could lead to visible flicker. + if (simple_check) { + v3s16 random_point(myrand_range(-bs2, bs2), myrand_range(-bs2, bs2), myrand_range(-bs2, bs2)); + return isOccluded(cam_pos_nodes, pos_blockcenter + random_point, step, stepfac, + start_offset, end_offset, 1); + } // Additional occlusion check, see comments in that function v3s16 check; diff --git a/src/map.h b/src/map.h index 4133bc4a5253..6f1730d60502 100644 --- a/src/map.h +++ b/src/map.h @@ -305,9 +305,9 @@ class Map /*: public NodeContainer*/ } } - bool isBlockOccluded(MapBlock *block, v3s16 cam_pos_nodes, bool simple_check = false) + bool isBlockOccluded(MapBlock *block, v3s16 cam_pos_nodes) { - return isBlockOccluded(block->getPosRelative(), cam_pos_nodes, simple_check); + return isBlockOccluded(block->getPosRelative(), cam_pos_nodes, false); } bool isBlockOccluded(v3s16 pos_relative, v3s16 cam_pos_nodes, bool simple_check = false);