aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Hofhansl <larsh@apache.org>2018-05-15 18:49:11 -0700
committerLars Hofhansl <larsh@apache.org>2018-05-15 18:49:11 -0700
commita1868e8f6ca191edc03da342fd7c3088732e1b00 (patch)
tree16d8bc42e6e34b927a7f5d68d071e16868cfa585
parent935f11a6024a12955517036db0dbee72990faf4c (diff)
downloadminetest-a1868e8f6ca191edc03da342fd7c3088732e1b00.tar.gz
minetest-a1868e8f6ca191edc03da342fd7c3088732e1b00.tar.bz2
minetest-a1868e8f6ca191edc03da342fd7c3088732e1b00.zip
Use server's zoom fov for distant world loading.
-rw-r--r--src/clientiface.cpp21
-rw-r--r--src/util/numeric.cpp2
2 files changed, 6 insertions, 17 deletions
diff --git a/src/clientiface.cpp b/src/clientiface.cpp
index 8c429976b..cc52d1fbc 100644
--- a/src/clientiface.cpp
+++ b/src/clientiface.cpp
@@ -196,30 +196,19 @@ void RemoteClient::GetNextBlocks (
s16 wanted_range = sao->getWantedRange() + 1;
float camera_fov = sao->getFov();
- // If below the heuristic zoom threshold (see adjustDist() in numeric.cpp)
- // distrust client-sent FOV and get server-set player object property
+ // Distrust client-sent FOV and get server-set player object property
// zoom FOV (degrees) as a check to avoid hacked clients using FOV to load
// distant world.
- // 0.888 radians is slightly larger than the zoom threshold of 1.775 / 2
- // radians.
- if (camera_fov < 0.888f) {
- float prop_zoom_fov = sao->getZoomFOV();
- // If zoom is disabled by value 0
- if (prop_zoom_fov < 0.001f)
- camera_fov = 0.888f;
- else
- // Degrees -> radians
- camera_fov = prop_zoom_fov * core::DEGTORAD;
- }
+ float prop_zoom_fov = sao->getZoomFOV() * core::DEGTORAD;
- const s16 full_d_max = std::min(adjustDist(m_max_send_distance, camera_fov),
+ const s16 full_d_max = std::min(adjustDist(m_max_send_distance, prop_zoom_fov),
wanted_range);
- const s16 d_opt = std::min(adjustDist(m_block_optimize_distance, camera_fov),
+ const s16 d_opt = std::min(adjustDist(m_block_optimize_distance, prop_zoom_fov),
wanted_range);
const s16 d_blocks_in_sight = full_d_max * BS * MAP_BLOCKSIZE;
s16 d_max = full_d_max;
- s16 d_max_gen = std::min(adjustDist(m_max_gen_distance, camera_fov),
+ s16 d_max_gen = std::min(adjustDist(m_max_gen_distance, prop_zoom_fov),
wanted_range);
// Don't loop very much at a time, adjust with distance,
diff --git a/src/util/numeric.cpp b/src/util/numeric.cpp
index 7264e5f89..d878a3f60 100644
--- a/src/util/numeric.cpp
+++ b/src/util/numeric.cpp
@@ -168,7 +168,7 @@ s16 adjustDist(s16 dist, float zoom_fov)
// 1.775 ~= 72 * PI / 180 * 1.4, the default FOV on the client.
// The heuristic threshold for zooming is half of that.
static constexpr const float threshold_fov = 1.775f / 2.0f;
- if (zoom_fov > threshold_fov)
+ if (zoom_fov < 0.001f || zoom_fov > threshold_fov)
return dist;
return std::round(dist * std::cbrt((1.0f - std::cos(threshold_fov)) /