aboutsummaryrefslogtreecommitdiff
path: root/src/util/numeric.cpp
diff options
context:
space:
mode:
authorRogier-5 <rogier777@gmail.com>2016-11-11 09:30:37 +0100
committerZeno- <kde.psych@gmail.com>2016-11-11 18:30:37 +1000
commitb98f98b367f2c55d5a0bff4bafaaa183b3746403 (patch)
treec76817eb29ffc8ec633888a834cfeeef5f890c84 /src/util/numeric.cpp
parent7e17eaedb2e697581ace1bd038781f908e19a985 (diff)
downloadminetest-b98f98b367f2c55d5a0bff4bafaaa183b3746403.tar.gz
minetest-b98f98b367f2c55d5a0bff4bafaaa183b3746403.tar.bz2
minetest-b98f98b367f2c55d5a0bff4bafaaa183b3746403.zip
Fix incorrect distance computation for visible blocks (#4765)
The client would not compute the distance from the camera to to a mapblock correctly. The result was that blocks that were in view (i.e. not beyond the fog limit) would not be rendered. With the improved distance computation, a range adjustment that existed in clientiface.cpp is no longer required.
Diffstat (limited to 'src/util/numeric.cpp')
-rw-r--r--src/util/numeric.cpp15
1 files changed, 8 insertions, 7 deletions
diff --git a/src/util/numeric.cpp b/src/util/numeric.cpp
index 6a7bfcac9..a9e7ae584 100644
--- a/src/util/numeric.cpp
+++ b/src/util/numeric.cpp
@@ -188,14 +188,19 @@ u64 murmur_hash_64_ua(const void *key, int len, unsigned int seed)
}
/*
- blockpos: position of block in block coordinates
+ blockpos_b: position of block in block coordinates
camera_pos: position of camera in nodes
camera_dir: an unit vector pointing to camera direction
range: viewing range
+ distance_ptr: return location for distance from the camera
*/
bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir,
f32 camera_fov, f32 range, f32 *distance_ptr)
{
+ // Maximum radius of a block. The magic number is
+ // sqrt(3.0) / 2.0 in literal form.
+ const f32 block_max_radius = 0.866025403784 * MAP_BLOCKSIZE * BS;
+
v3s16 blockpos_nodes = blockpos_b * MAP_BLOCKSIZE;
// Block center position
@@ -209,7 +214,7 @@ bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir,
v3f blockpos_relative = blockpos - camera_pos;
// Total distance
- f32 d = blockpos_relative.getLength();
+ f32 d = MYMAX(0, blockpos_relative.getLength() - block_max_radius);
if(distance_ptr)
*distance_ptr = d;
@@ -218,13 +223,9 @@ bool isBlockInSight(v3s16 blockpos_b, v3f camera_pos, v3f camera_dir,
if(d > range)
return false;
- // Maximum radius of a block. The magic number is
- // sqrt(3.0) / 2.0 in literal form.
- f32 block_max_radius = 0.866025403784 * MAP_BLOCKSIZE * BS;
-
// If block is (nearly) touching the camera, don't
// bother validating further (that is, render it anyway)
- if(d < block_max_radius)
+ if(d == 0)
return true;
// Adjust camera position, for purposes of computing the angle,