Syntriax.Engine/Engine.Physics2D/CollisionDetector.cs

66 lines
2.7 KiB
C#
Raw Normal View History

2024-01-25 18:32:13 +03:00
using System.Diagnostics.CodeAnalysis;
2024-01-25 18:21:52 +03:00
using Syntriax.Engine.Core;
using Syntriax.Engine.Physics2D.Abstract;
namespace Syntriax.Engine.Physics2D;
public class CollisionDetector : ICollisionDetector
{
2024-01-25 18:32:13 +03:00
public bool TryDetect<T1, T2>(T1 left, T2 right, [NotNullWhen(true)] out CollisionDetectionInformation? collisionInformation)
2024-01-25 18:21:52 +03:00
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)
2024-01-25 18:32:13 +03:00
return DetectCircleShape(circleColliderLeft, shapeColliderRight, out collisionInformation);
2024-01-25 18:21:52 +03:00
else if (right is ICircleCollider2D circleColliderRight)
return DetectCircleCircle(circleColliderLeft, circleColliderRight, out collisionInformation);
}
return false;
}
2024-01-25 18:32:13 +03:00
private bool DetectCircleShape(ICircleCollider2D circleCollider, IShapeCollider2D shapeCollider, out CollisionDetectionInformation? collisionInformation)
{
throw new System.NotImplementedException();
}
2024-01-25 18:21:52 +03:00
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;
}
}