using Syntriax.Engine.Core; using Syntriax.Engine.Physics2D.Abstract; namespace Syntriax.Engine.Physics2D; public class CollisionDetector : ICollisionDetector { public bool TryDetect(T1 left, T2 right, 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 DetectShapeCircle(shapeColliderRight, circleColliderLeft, out collisionInformation); else if (right is ICircleCollider2D circleColliderRight) return DetectCircleCircle(circleColliderLeft, circleColliderRight, out collisionInformation); } return false; } 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 leftToRightCenter = left.CircleWorld.Center.FromTo(right.CircleWorld.Center); float distanceCircleCenterSquared = leftToRightCenter.MagnitudeSquared; float radiusSumSquared = left.CircleWorld.RadiusSquared + right.CircleWorld.RadiusSquared; float circleSurfaceDistanceSquared = distanceCircleCenterSquared - radiusSumSquared; bool collision = circleSurfaceDistanceSquared <= 0f; if (collision) collisionInformation = new(left, right, leftToRightCenter.Normalized, Math.Sqrt(circleSurfaceDistanceSquared)); return collision; } }