From 02dd796e2e1369e13aaa7079191c7ffc35b60b70 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Sun, 8 Feb 2026 18:39:45 -0800 Subject: [PATCH] =?UTF-8?q?Fix:=20make=20grace=20=E2=80=9Chold=E2=80=9D=20?= =?UTF-8?q?instead=20of=20=E2=80=9Cpull=20down=E2=80=9D=20don't=20yank=20u?= =?UTF-8?q?s=20down=20in=20jumps?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/rendering/camera_controller.cpp | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/rendering/camera_controller.cpp b/src/rendering/camera_controller.cpp index 56f0c0b0..4548c0ce 100644 --- a/src/rendering/camera_controller.cpp +++ b/src/rendering/camera_controller.cpp @@ -544,18 +544,27 @@ void CameraController::update(float deltaTime) { grounded = false; lastGroundZ = *groundH; } - } else { - hasRealGround_ = false; - noGroundTimer_ += deltaTime; - if (noGroundTimer_ < NO_GROUND_GRACE) { - targetPos.z = lastGroundZ; - verticalVelocity = 0.0f; - grounded = true; } else { - grounded = false; + hasRealGround_ = false; + noGroundTimer_ += deltaTime; + + if (noGroundTimer_ < NO_GROUND_GRACE) { + // Grace should prevent instant falling at seams, + // but should NEVER pull you down or cancel a jump. + targetPos.z = std::max(targetPos.z, lastGroundZ); + + // Only zero velocity if we're not moving upward. + if (verticalVelocity <= 0.0f) { + verticalVelocity = 0.0f; + grounded = true; + } else { + grounded = false; // jumping upward: don't "stick" to ghost ground + } + } else { + grounded = false; + } } } - } // Update follow target position *followTarget = targetPos;