Fix CharacterController::SimpleMove gravity displacement handling
This commit is contained in:
@@ -19,6 +19,7 @@ CharacterController::CharacterController(const SpawnParams& params)
|
|||||||
, _minMoveDistance(0.0f)
|
, _minMoveDistance(0.0f)
|
||||||
, _isUpdatingTransform(false)
|
, _isUpdatingTransform(false)
|
||||||
, _upDirection(Vector3::Up)
|
, _upDirection(Vector3::Up)
|
||||||
|
, _gravityDisplacement(Vector3::Zero)
|
||||||
, _nonWalkableMode(NonWalkableModes::PreventClimbing)
|
, _nonWalkableMode(NonWalkableModes::PreventClimbing)
|
||||||
, _lastFlags(CollisionFlags::None)
|
, _lastFlags(CollisionFlags::None)
|
||||||
{
|
{
|
||||||
@@ -148,10 +149,16 @@ CharacterController::CollisionFlags CharacterController::GetFlags() const
|
|||||||
CharacterController::CollisionFlags CharacterController::SimpleMove(const Vector3& speed)
|
CharacterController::CollisionFlags CharacterController::SimpleMove(const Vector3& speed)
|
||||||
{
|
{
|
||||||
const float deltaTime = Time::GetCurrentSafe()->DeltaTime.GetTotalSeconds();
|
const float deltaTime = Time::GetCurrentSafe()->DeltaTime.GetTotalSeconds();
|
||||||
Vector3 displacement = speed;
|
Vector3 displacement = speed + _gravityDisplacement;
|
||||||
displacement += GetPhysicsScene()->GetGravity() * deltaTime;
|
CollisionFlags result = Move(displacement * deltaTime);
|
||||||
displacement *= deltaTime;
|
if ((static_cast<int>(result) & static_cast<int>(CollisionFlags::Below)) != 0)
|
||||||
return Move(displacement);
|
{
|
||||||
|
// 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)
|
CharacterController::CollisionFlags CharacterController::Move(const Vector3& displacement)
|
||||||
|
|||||||
@@ -66,6 +66,7 @@ private:
|
|||||||
float _minMoveDistance;
|
float _minMoveDistance;
|
||||||
bool _isUpdatingTransform;
|
bool _isUpdatingTransform;
|
||||||
Vector3 _upDirection;
|
Vector3 _upDirection;
|
||||||
|
Vector3 _gravityDisplacement;
|
||||||
NonWalkableModes _nonWalkableMode;
|
NonWalkableModes _nonWalkableMode;
|
||||||
CollisionFlags _lastFlags;
|
CollisionFlags _lastFlags;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user