Browse Source

Merge pull request #88282 from rburing/concave_motion_2d

`GodotCollisionSolver2D::solve_concave`: Fix culling in case of motion
Rémi Verschelde 1 year ago
parent
commit
e0c24eb554
1 changed files with 7 additions and 2 deletions
  1. 7 2
      servers/physics_2d/godot_collision_solver_2d.cpp

+ 7 - 2
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);