Apply camera smoothing to 'air stepheight' (#10025)

Recent changes to collision code have changed the behaviour of the 'touching_ground'
bool in movement code. This had the effect of disabling camera smoothing when
'air stepheight' occurred when jumping onto a node while pressing forwards against
the node, causing an unpleasant sharp camera movement.

Rewrite the conditions for camera smoothing such that it is applied when jumping.
This commit is contained in:
Paramat 2020-07-05 23:45:21 +01:00 committed by GitHub
parent da71313e1d
commit dc6318b84a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 9 additions and 8 deletions

View File

@ -342,9 +342,13 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime, f32 tool_r
if (player->getParent())
player_position = player->getParent()->getPosition();
if(player->touching_ground &&
player_position.Y > old_player_position.Y)
{
// Smooth the camera movement when the player instantly moves upward due to stepheight.
// To smooth the 'not touching_ground' stepheight, smoothing is necessary when jumping
// or swimming (for when moving from liquid to land).
// Disable smoothing if climbing or flying, to avoid upwards offset of player model
// when seen in 3rd person view.
bool flying = g_settings->getBool("free_move") && m_client->checkLocalPrivilege("fly");
if (player_position.Y > old_player_position.Y && !player->is_climbing && !flying) {
f32 oldy = old_player_position.Y;
f32 newy = player_position.Y;
f32 t = std::exp(-23 * frametime);
@ -607,14 +611,11 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime, f32 tool_r
const bool walking = movement_XZ && player->touching_ground;
const bool swimming = (movement_XZ || player->swimming_vertical) && player->in_liquid;
const bool climbing = movement_Y && player->is_climbing;
if ((walking || swimming || climbing) &&
(!g_settings->getBool("free_move") || !m_client->checkLocalPrivilege("fly"))) {
if ((walking || swimming || climbing) && !flying) {
// Start animation
m_view_bobbing_state = 1;
m_view_bobbing_speed = MYMIN(speed.getLength(), 70);
}
else if (m_view_bobbing_state == 1)
{
} else if (m_view_bobbing_state == 1) {
// Stop animation
m_view_bobbing_state = 2;
m_view_bobbing_speed = 60;