From c6d2bad23ecf8ffbaa47c48078c72cc8def74d90 Mon Sep 17 00:00:00 2001 From: Syntriax Date: Fri, 26 Jan 2024 18:56:31 +0300 Subject: [PATCH] feat: Basic Shape to Shape Collision Detection --- Engine.Physics2D/CollisionDetector.cs | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/Engine.Physics2D/CollisionDetector.cs b/Engine.Physics2D/CollisionDetector.cs index 9a8f109..b8a4953 100644 --- a/Engine.Physics2D/CollisionDetector.cs +++ b/Engine.Physics2D/CollisionDetector.cs @@ -38,7 +38,26 @@ public class CollisionDetector : ICollisionDetector private static bool DetectShapeShape(IShapeCollider2D left, IShapeCollider2D right, out CollisionDetectionInformation? collisionInformation) { - throw new System.NotImplementedException(); + collisionInformation = default; + + var vertices = left.ShapeWorld.Vertices; + int count = vertices.Count; + + for (int indexProjection = 0; indexProjection < count; indexProjection++) + { + Vector2D projectionVector = vertices[indexProjection].FromTo(vertices[(indexProjection + 1) % count]).Perpendicular().Normalized; + + Projection leftProjection = left.ShapeWorld.ToProjection(projectionVector); + Projection rightProjection = right.ShapeWorld.ToProjection(projectionVector); + + if (!leftProjection.Overlaps(rightProjection, out float depth)) + return false; + + if (collisionInformation == default || Math.Abs(collisionInformation.Penetration) > Math.Abs(depth)) + collisionInformation = new(left, right, projectionVector, depth); + } + + return true; } private static bool DetectShapeCircle(IShapeCollider2D shapeCollider, ICircleCollider2D circleCollider, out CollisionDetectionInformation? collisionInformation)