Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ensure deterministic client occlusion culling and minor improvements #14212

Merged
merged 2 commits into from
Jan 7, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion builtin/settingtypes.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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]

Expand Down
2 changes: 1 addition & 1 deletion src/defaultsettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down
15 changes: 8 additions & 7 deletions src/map.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
lhofhansl marked this conversation as resolved.
Show resolved Hide resolved
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;
Expand Down
4 changes: 2 additions & 2 deletions src/map.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down