Skip to content

Commit

Permalink
Reduce server FOV with forward speed
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
lhofhansl committed Oct 26, 2017
1 parent 166ded4 commit 0732bf7
Showing 1 changed file with 9 additions and 1 deletion.
10 changes: 9 additions & 1 deletion src/clientiface.cpp
Expand Up @@ -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);

Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 0732bf7

Please sign in to comment.