using System.Diagnostics.CodeAnalysis; using Syntriax.Engine.Core; using Syntriax.Engine.Physics2D.Abstract; namespace Syntriax.Engine.Physics2D; public class CollisionDetector : ICollisionDetector { public bool TryDetect(T1 left, T2 right, [NotNullWhen(true)] out CollisionDetectionInformation? collisionInformation) where T1 : ICollider2D where T2 : ICollider2D { collisionInformation = default; if (left is IShapeCollider2D shapeColliderLeft) { if (right is IShapeCollider2D shapeColliderRight) return DetectShapeShape(shapeColliderLeft, shapeColliderRight, out collisionInformation); else if (right is ICircleCollider2D circleColliderRight) return DetectShapeCircle(shapeColliderLeft, circleColliderRight, out collisionInformation); } else if (left is ICircleCollider2D circleColliderLeft) { if (right is IShapeCollider2D shapeColliderRight) return DetectCircleShape(circleColliderLeft, shapeColliderRight, out collisionInformation); else if (right is ICircleCollider2D circleColliderRight) return DetectCircleCircle(circleColliderLeft, circleColliderRight, out collisionInformation); } return false; } private bool DetectCircleShape(ICircleCollider2D circleCollider, IShapeCollider2D shapeCollider, out CollisionDetectionInformation? collisionInformation) { throw new System.NotImplementedException(); } private static bool DetectShapeShape(IShapeCollider2D left, IShapeCollider2D right, out CollisionDetectionInformation? collisionInformation) { throw new System.NotImplementedException(); } private static bool DetectShapeCircle(IShapeCollider2D shapeCollider, ICircleCollider2D circleCollider, out CollisionDetectionInformation? collisionInformation) { throw new System.NotImplementedException(); } private static bool DetectCircleCircle(ICircleCollider2D left, ICircleCollider2D right, out CollisionDetectionInformation? collisionInformation) { collisionInformation = default; Vector2D leftToRightCenterProjectionVector = left.CircleWorld.Center.FromTo(right.CircleWorld.Center).Normalized; Projection leftProjection = left.CircleWorld.ToProjection(leftToRightCenterProjectionVector); Projection rightProjection = right.CircleWorld.ToProjection(leftToRightCenterProjectionVector); bool collision = leftProjection.Overlaps(rightProjection, out float depth); if (collision) collisionInformation = new(left, right, leftToRightCenterProjectionVector, depth); return collision; } // private static bool DetectCircleCircle(ICircleCollider2D left, ICircleCollider2D right, out CollisionDetectionInformation? collisionInformation) // { // collisionInformation = default; // Vector2D leftToRightCenter = left.CircleWorld.Center.FromTo(right.CircleWorld.Center); // float distanceCircleCenter = leftToRightCenter.Magnitude; // float radiusSum = left.CircleWorld.Radius + right.CircleWorld.Radius; // float circleSurfaceDistance = distanceCircleCenter - radiusSum; // bool collision = circleSurfaceDistance <= 0f; // if (collision) // collisionInformation = new(left, right, leftToRightCenter.Normalized, -circleSurfaceDistance); // return collision; // } }