From 87446fd9b3174a6b1c1b088ec3b9e1b14e109eb0 Mon Sep 17 00:00:00 2001 From: Ricardo Buring Date: Tue, 13 Feb 2024 14:42:09 +0100 Subject: [PATCH] GodotCollisionSolver2D::solve_concave: fix culling in case of motion --- servers/physics_2d/godot_collision_solver_2d.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/servers/physics_2d/godot_collision_solver_2d.cpp b/servers/physics_2d/godot_collision_solver_2d.cpp index 64f1cc8362b..a1acbe9cf0e 100644 --- a/servers/physics_2d/godot_collision_solver_2d.cpp +++ b/servers/physics_2d/godot_collision_solver_2d.cpp @@ -189,8 +189,7 @@ bool GodotCollisionSolver2D::solve_concave(const GodotShape2D *p_shape_A, const Transform2D rel_transform = p_transform_A; rel_transform.columns[2] -= p_transform_B.get_origin(); - //quickly compute a local Rect2 - + // Quickly compute a local Rect2. Rect2 local_aabb; for (int i = 0; i < 2; i++) { Vector2 axis(p_transform_B.columns[i]); @@ -205,6 +204,12 @@ bool GodotCollisionSolver2D::solve_concave(const GodotShape2D *p_shape_A, const local_aabb.position[i] = smin; local_aabb.size[i] = smax - smin; } + // In case of motion, expand the Rect2 in the motion direction. + if (p_motion_A != Vector2()) { + Rect2 moved_aabb = local_aabb; + moved_aabb.position += p_motion_A; + local_aabb = local_aabb.merge(moved_aabb); + } concave_B->cull(local_aabb, concave_callback, &cinfo);