mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-11-04 09:15:29 +01:00 
			
		
		
		
	Ensure deterministic client occlusion culling and minor improvements (#14212)
* Ensure deterministic client occlusion culling * Increase culling optimize distance slightly * More accurate culling when sampling
This commit is contained in:
		@@ -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]
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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");
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										15
									
								
								src/map.cpp
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								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;
 | 
			
		||||
 
 | 
			
		||||
@@ -305,9 +305,9 @@ public:
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user