diff options
author | RĂ©mi Verschelde <remi@verschelde.fr> | 2021-11-10 20:38:49 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-10 20:38:49 +0100 |
commit | 3668312e786d0e06fee627e5255edef88710cc9b (patch) | |
tree | 5a00b84d90a4d34309ee3ce524ebd667781acae5 /scene/3d/physics_body_3d.cpp | |
parent | a6412e132a7fa1a80f32a44e97a2a8dcb1111658 (diff) | |
parent | 5da057adaf2127deaf1455641ccbe024f29f1ebd (diff) |
Merge pull request #54847 from nekomatata/fix-test-move-regression
Diffstat (limited to 'scene/3d/physics_body_3d.cpp')
-rw-r--r-- | scene/3d/physics_body_3d.cpp | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/scene/3d/physics_body_3d.cpp b/scene/3d/physics_body_3d.cpp index ea881b6d54..5cb7f431e3 100644 --- a/scene/3d/physics_body_3d.cpp +++ b/scene/3d/physics_body_3d.cpp @@ -174,9 +174,12 @@ bool PhysicsBody3D::test_move(const Transform3D &p_from, const Vector3 &p_linear ERR_FAIL_COND_V(!is_inside_tree(), false); PhysicsServer3D::MotionResult *r = nullptr; + PhysicsServer3D::MotionResult temp_result; if (r_collision.is_valid()) { // Needs const_cast because method bindings don't support non-const Ref. r = const_cast<PhysicsServer3D::MotionResult *>(&r_collision->result); + } else { + r = &temp_result; } // Hack in order to work with calling from _process as well as from _physics_process; calling from thread is risky @@ -184,7 +187,14 @@ bool PhysicsBody3D::test_move(const Transform3D &p_from, const Vector3 &p_linear PhysicsServer3D::MotionParameters parameters(p_from, p_linear_velocity * delta, p_margin); - return PhysicsServer3D::get_singleton()->body_test_motion(get_rid(), parameters, r); + bool colliding = PhysicsServer3D::get_singleton()->body_test_motion(get_rid(), parameters, r); + + if (colliding) { + // Don't report collision when the whole motion is done. + return (r->collision_safe_fraction < 1.0); + } else { + return false; + } } void PhysicsBody3D::set_axis_lock(PhysicsServer3D::BodyAxis p_axis, bool p_lock) { |