Fix incorrect distance computation for visible blocks (#4765)
authorRogier-5 <rogier777@gmail.com>
Fri, 11 Nov 2016 08:30:37 +0000 (09:30 +0100)
committerZeno- <kde.psych@gmail.com>
Fri, 11 Nov 2016 08:30:37 +0000 (18:30 +1000)
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.

src/clientiface.cpp
src/util/numeric.cpp

index 7e75c69a48656fbe87f27f016041eaa5b0f70ec2..bdc16f31cae700a5ec63b9d44a666da3323099fe 100644 (file)
@@ -175,7 +175,7 @@ void RemoteClient::GetNextBlocks (
 
        const s16 full_d_max = g_settings->getS16("max_block_send_distance");
        const s16 d_opt = g_settings->getS16("block_send_optimize_distance");
-       const s16 d_blocks_in_sight = (full_d_max + 1) * BS * MAP_BLOCKSIZE;
+       const s16 d_blocks_in_sight = full_d_max * BS * MAP_BLOCKSIZE;
 
        s16 d_max = full_d_max;
        s16 d_max_gen = g_settings->getS16("max_block_generate_distance");
index 6a7bfcac91dad9bc52d78757cc014ec462e9418c..a9e7ae5840be0849dc09569fb976aecc07237a1d 100644 (file)
@@ -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,