From f7467a62ee56e7ad4d4f268cba0c0e133bb1ea9c Mon Sep 17 00:00:00 2001 From: Syntriax Date: Thu, 25 Jan 2024 18:21:52 +0300 Subject: [PATCH] feat: Collision Detector Circles --- Engine.Physics2D/CollisionDetector.cs | 58 ++++++++++++++++++++++++++ Engine.Physics2D/ICollisionDetector.cs | 8 ++++ 2 files changed, 66 insertions(+) create mode 100644 Engine.Physics2D/CollisionDetector.cs create mode 100644 Engine.Physics2D/ICollisionDetector.cs diff --git a/Engine.Physics2D/CollisionDetector.cs b/Engine.Physics2D/CollisionDetector.cs new file mode 100644 index 0000000..78cae49 --- /dev/null +++ b/Engine.Physics2D/CollisionDetector.cs @@ -0,0 +1,58 @@ +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; + } +} diff --git a/Engine.Physics2D/ICollisionDetector.cs b/Engine.Physics2D/ICollisionDetector.cs new file mode 100644 index 0000000..3180126 --- /dev/null +++ b/Engine.Physics2D/ICollisionDetector.cs @@ -0,0 +1,8 @@ +using Syntriax.Engine.Physics2D.Abstract; + +namespace Syntriax.Engine.Physics2D; + +public interface ICollisionDetector +{ + bool TryDetect(T1 left, T2 right, out CollisionDetectionInformation? collisionInformation) where T1 : ICollider2D where T2 : ICollider2D; +}