]> git.lizzy.rs Git - minetest.git/commitdiff
Limit stepheight smoothing to the stepheight and stop smoothing during jumps (#11705)
authorJude Melton-Houghton <jwmhjwmh@gmail.com>
Mon, 25 Oct 2021 18:31:14 +0000 (14:31 -0400)
committerGitHub <noreply@github.com>
Mon, 25 Oct 2021 18:31:14 +0000 (20:31 +0200)
src/client/camera.cpp
src/client/camera.h

index 7adcf2376daf3ce73a65b721282c1207b37d678e..1ce92f196dac6aedcafebce52596657754fbb233 100644 (file)
@@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "player.h"
 #include <cmath>
 #include "client/renderingengine.h"
+#include "client/content_cao.h"
 #include "settings.h"
 #include "wieldmesh.h"
 #include "noise.h"         // easeCurve
@@ -341,13 +342,16 @@ void Camera::update(LocalPlayer* player, f32 frametime, f32 busytime, f32 tool_r
        if (player->getParent())
                player_position = player->getParent()->getPosition();
 
-       // 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) {
+       // Smooth the camera movement after the player instantly moves upward due to stepheight.
+       // The smoothing usually continues until the camera position reaches the player position.
+       float player_stepheight = player->getCAO() ? player->getCAO()->getStepHeight() : HUGE_VALF;
+       float upward_movement = player_position.Y - old_player_position.Y;
+       if (upward_movement < 0.01f || upward_movement > player_stepheight) {
+               m_stepheight_smooth_active = false;
+       } else if (player->touching_ground) {
+               m_stepheight_smooth_active = true;
+       }
+       if (m_stepheight_smooth_active) {
                f32 oldy = old_player_position.Y;
                f32 newy = player_position.Y;
                f32 t = std::exp(-23 * frametime);
@@ -587,6 +591,8 @@ 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;
+       const bool flying = g_settings->getBool("free_move")
+               && m_client->checkLocalPrivilege("fly");
        if ((walking || swimming || climbing) && !flying) {
                // Start animation
                m_view_bobbing_state = 1;
index 593a97d80588b2167a1781d46287b7f929483a7a..bea9ab3330083771ea77cf632c37b07fafb8869a 100644 (file)
@@ -218,6 +218,8 @@ class Camera
        // Camera offset
        v3s16 m_camera_offset;
 
+       bool m_stepheight_smooth_active = false;
+
        // Server-sent FOV variables
        bool m_server_sent_fov = false;
        f32 m_curr_fov_degrees, m_old_fov_degrees, m_target_fov_degrees;