From 65b3200a163388088cce9f373fd986b515cff341 Mon Sep 17 00:00:00 2001 From: fabriceci Date: Wed, 23 Mar 2022 11:22:38 +0100 Subject: [PATCH] Fix wrong collision reported on move_and_collide --- scene/2d/physics_body_2d.cpp | 6 +++++- scene/2d/physics_body_2d.h | 1 + scene/3d/physics_body.cpp | 7 ++++++- scene/3d/physics_body.h | 1 + 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/scene/2d/physics_body_2d.cpp b/scene/2d/physics_body_2d.cpp index 7fff0d37f6dc..c32aa37f4b4a 100644 --- a/scene/2d/physics_body_2d.cpp +++ b/scene/2d/physics_body_2d.cpp @@ -991,7 +991,10 @@ void RigidBody2D::_reload_physics_characteristics() { Ref KinematicBody2D::_move(const Vector2 &p_motion, bool p_infinite_inertia, bool p_exclude_raycast_shapes, bool p_test_only) { Collision col; - if (move_and_collide(p_motion, p_infinite_inertia, col, p_exclude_raycast_shapes, p_test_only)) { + bool collided = move_and_collide(p_motion, p_infinite_inertia, col, p_exclude_raycast_shapes, p_test_only); + + // Don't report collision when the whole motion is done. + if (collided && col.collision_safe_fraction < 1) { // Create a new instance when the cached reference is invalid or still in use in script. if (motion_cache.is_null() || motion_cache->reference_get_count() > 1) { motion_cache.instance(); @@ -1101,6 +1104,7 @@ bool KinematicBody2D::move_and_collide(const Vector2 &p_motion, bool p_infinite_ r_collision.travel = result.motion; r_collision.remainder = result.remainder; r_collision.local_shape = result.collision_local_shape; + r_collision.collision_safe_fraction = result.collision_safe_fraction; } if (!p_test_only) { diff --git a/scene/2d/physics_body_2d.h b/scene/2d/physics_body_2d.h index 2b858b8d1046..0b3dfb07d8be 100644 --- a/scene/2d/physics_body_2d.h +++ b/scene/2d/physics_body_2d.h @@ -283,6 +283,7 @@ class KinematicBody2D : public PhysicsBody2D { Vector2 remainder; Vector2 travel; int local_shape; + real_t collision_safe_fraction; real_t get_angle(const Vector2 &p_up_direction) const { return Math::acos(normal.dot(p_up_direction)); diff --git a/scene/3d/physics_body.cpp b/scene/3d/physics_body.cpp index af85d4d2743a..44fd28494b5f 100644 --- a/scene/3d/physics_body.cpp +++ b/scene/3d/physics_body.cpp @@ -959,7 +959,11 @@ void RigidBody::_reload_physics_characteristics() { Ref KinematicBody::_move(const Vector3 &p_motion, bool p_infinite_inertia, bool p_exclude_raycast_shapes, bool p_test_only) { Collision col; - if (move_and_collide(p_motion, p_infinite_inertia, col, p_exclude_raycast_shapes, p_test_only)) { + + bool collided = move_and_collide(p_motion, p_infinite_inertia, col, p_exclude_raycast_shapes, p_test_only); + + // Don't report collision when the whole motion is done. + if (collided && col.collision_safe_fraction < 1) { // Create a new instance when the cached reference is invalid or still in use in script. if (motion_cache.is_null() || motion_cache->reference_get_count() > 1) { motion_cache.instance(); @@ -1032,6 +1036,7 @@ bool KinematicBody::move_and_collide(const Vector3 &p_motion, bool p_infinite_in r_collision.travel = result.motion; r_collision.remainder = result.remainder; r_collision.local_shape = result.collision_local_shape; + r_collision.collision_safe_fraction = result.collision_safe_fraction; } for (int i = 0; i < 3; i++) { diff --git a/scene/3d/physics_body.h b/scene/3d/physics_body.h index c72f2c165db0..f35cd5ccc2d2 100644 --- a/scene/3d/physics_body.h +++ b/scene/3d/physics_body.h @@ -278,6 +278,7 @@ class KinematicBody : public PhysicsBody { Vector3 remainder; Vector3 travel; int local_shape; + real_t collision_safe_fraction; real_t get_angle(const Vector3 &p_up_direction) const { return Math::acos(normal.dot(p_up_direction));