83 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 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, T2>(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;
 | |
|     // }
 | |
| }
 |