From fc1f0d76e713ae49d253dd3934ea79599a70b94a Mon Sep 17 00:00:00 2001 From: Marcel Admiraal Date: Sun, 5 Jan 2020 17:15:51 +0100 Subject: [PATCH] Don't update the floor_velocity with the current linear_velocity. Updating the floor velocity with the body's current linear velocity discards the velocity component provided by the body's angular rotation. Without the current contact point there is no way to calculate the current velocity component provided by the body's angular rotation therefore we need to use the velocity calculated at the time of the collision. Fixes #34807. --- scene/3d/physics_body.cpp | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/scene/3d/physics_body.cpp b/scene/3d/physics_body.cpp index 44dc3d0c260..c2860c25d8f 100644 --- a/scene/3d/physics_body.cpp +++ b/scene/3d/physics_body.cpp @@ -1151,17 +1151,8 @@ Vector3 KinematicBody::move_and_slide(const Vector3 &p_linear_velocity, const Ve } } - Vector3 current_floor_velocity = floor_velocity; - if (on_floor && on_floor_body.is_valid()) { - //this approach makes sure there is less delay between the actual body velocity and the one we saved - PhysicsDirectBodyState *bs = PhysicsServer::get_singleton()->body_get_direct_state(on_floor_body); - if (bs) { - current_floor_velocity = bs->get_linear_velocity(); - } - } - // Hack in order to work with calling from _process as well as from _physics_process; calling from thread is risky - Vector3 motion = (current_floor_velocity + body_velocity) * (Engine::get_singleton()->is_in_physics_frame() ? get_physics_process_delta_time() : get_process_delta_time()); + Vector3 motion = (floor_velocity + body_velocity) * (Engine::get_singleton()->is_in_physics_frame() ? get_physics_process_delta_time() : get_process_delta_time()); on_floor = false; on_floor_body = RID();