From 35d46e23a82b221d0427b33e47c8fb610a947d82 Mon Sep 17 00:00:00 2001 From: Ari Vuollet Date: Sat, 13 Jul 2024 15:52:57 +0300 Subject: [PATCH] Fix `CharacterController::SimpleMove` gravity displacement handling --- .../Physics/Colliders/CharacterController.cpp | 15 +++++++++++---- .../Physics/Colliders/CharacterController.h | 1 + 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Source/Engine/Physics/Colliders/CharacterController.cpp b/Source/Engine/Physics/Colliders/CharacterController.cpp index 3561da8f2..4a4452fc2 100644 --- a/Source/Engine/Physics/Colliders/CharacterController.cpp +++ b/Source/Engine/Physics/Colliders/CharacterController.cpp @@ -19,6 +19,7 @@ CharacterController::CharacterController(const SpawnParams& params) , _minMoveDistance(0.0f) , _isUpdatingTransform(false) , _upDirection(Vector3::Up) + , _gravityDisplacement(Vector3::Zero) , _nonWalkableMode(NonWalkableModes::PreventClimbing) , _lastFlags(CollisionFlags::None) { @@ -148,10 +149,16 @@ CharacterController::CollisionFlags CharacterController::GetFlags() const CharacterController::CollisionFlags CharacterController::SimpleMove(const Vector3& speed) { const float deltaTime = Time::GetCurrentSafe()->DeltaTime.GetTotalSeconds(); - Vector3 displacement = speed; - displacement += GetPhysicsScene()->GetGravity() * deltaTime; - displacement *= deltaTime; - return Move(displacement); + Vector3 displacement = speed + _gravityDisplacement; + CollisionFlags result = Move(displacement * deltaTime); + if ((static_cast(result) & static_cast(CollisionFlags::Below)) != 0) + { + // Reset accumulated gravity acceleration when we touch the ground + _gravityDisplacement = Vector3::Zero; + } + else + _gravityDisplacement += GetPhysicsScene()->GetGravity() * deltaTime; + return result; } CharacterController::CollisionFlags CharacterController::Move(const Vector3& displacement) diff --git a/Source/Engine/Physics/Colliders/CharacterController.h b/Source/Engine/Physics/Colliders/CharacterController.h index 545f4e9d9..540adc5c9 100644 --- a/Source/Engine/Physics/Colliders/CharacterController.h +++ b/Source/Engine/Physics/Colliders/CharacterController.h @@ -66,6 +66,7 @@ private: float _minMoveDistance; bool _isUpdatingTransform; Vector3 _upDirection; + Vector3 _gravityDisplacement; NonWalkableModes _nonWalkableMode; CollisionFlags _lastFlags;