Reduce server FOV with forward speed
authorLars Hofhansl <larsh@apache.org>
Thu, 26 Oct 2017 06:10:33 +0000 (23:10 -0700)
committerLars Hofhansl <larsh@apache.org>
Thu, 26 Oct 2017 06:13:06 +0000 (23:13 -0700)
This causes blocks in front of the player to be rendered sooner and
blocks in the periphal view (that would soon be out of view) a bit later.
Overall this leads to smoother rendering as the player is moving around.

src/clientiface.cpp

index 404ce0d4ed020339c7f1eba0ad676bebc4b97040..bf0bdade081fbd9fdd0bada25163885c4feba03a 100644 (file)
@@ -125,7 +125,7 @@ void RemoteClient::GetNextBlocks (
        if (playerspeed.getLength() > 1.0f * BS)
                playerspeeddir = playerspeed / playerspeed.getLength();
        // Predict to next block
-       v3f playerpos_predicted = playerpos + playerspeeddir*MAP_BLOCKSIZE*BS;
+       v3f playerpos_predicted = playerpos + playerspeeddir * (MAP_BLOCKSIZE * BS);
 
        v3s16 center_nodepos = floatToInt(playerpos_predicted, BS);
 
@@ -196,6 +196,14 @@ void RemoteClient::GetNextBlocks (
        s16 wanted_range = sao->getWantedRange() + 1;
        float camera_fov = sao->getFov();
 
+       // cos(angle between velocity and camera) * |velocity|
+       // Limit to 0.0f in case player moves backwards.
+       f32 dot = rangelim(camera_dir.dotProduct(playerspeed), 0.0f, 300.0f);
+
+       // Reduce the field of view when a player moves and looks forward.
+       // limit max fov effect to 50%, 60% at 20n/s fly speed
+       camera_fov = camera_fov / (1 + dot / 300.0f);
+
        const s16 full_d_max = std::min(m_max_send_distance, wanted_range);
        const s16 d_opt = std::min(m_block_optimize_distance, wanted_range);
        const s16 d_blocks_in_sight = full_d_max * BS * MAP_BLOCKSIZE;