feat: added raycasting support for physics engine 2D

This commit is contained in:
2025-06-09 18:11:20 +03:00
parent adfa6c6ba0
commit 6a41407005
6 changed files with 226 additions and 2 deletions

View File

@@ -15,6 +15,7 @@ public class PhysicsEngine2D : Behaviour, IPreUpdate, IPhysicsEngine2D
protected readonly ICollisionDetector2D collisionDetector = null!;
protected readonly ICollisionResolver2D collisionResolver = null!;
protected readonly IRaycastResolver2D raycastResolver = null!;
private static Comparer<IBehaviour> SortByPriority() => Comparer<IBehaviour>.Create((x, y) => y.Priority.CompareTo(x.Priority));
protected ActiveBehaviourCollectorSorted<IPrePhysicsUpdate> physicsPreUpdateCollector = new() { SortBy = SortByPriority() };
@@ -27,6 +28,35 @@ public class PhysicsEngine2D : Behaviour, IPreUpdate, IPhysicsEngine2D
public int IterationPerStep { get => _iterationPerStep; set => _iterationPerStep = value < 1 ? 1 : value; }
public float IterationPeriod { get => _iterationPeriod; set => _iterationPeriod = value.Max(0.0001f); }
public RaycastResult? Raycast(Ray2D ray, float length = float.MaxValue)
{
RaycastResult? closestResult = null;
float closestDistance = float.MaxValue;
for (int i = 0; i < colliderCollector.Count; i++)
if (raycastResolver.RaycastAgainst(colliderCollector[i], ray, length) is RaycastResult raycastResult)
{
float magnitudeSquared = raycastResult.Position.FromTo(ray.Origin).MagnitudeSquared;
if (magnitudeSquared > closestDistance)
continue;
closestDistance = magnitudeSquared;
closestResult = raycastResult;
}
return closestResult;
}
public void Raycast(Ray2D ray, IList<RaycastResult> results, float length = float.MaxValue)
{
results.Clear();
for (int i = 0; i < colliderCollector.Count; i++)
if (raycastResolver.RaycastAgainst(colliderCollector[i], ray, length) is RaycastResult raycastResult)
results.Add(raycastResult);
}
public void Step(float deltaTime)
{
float intervalDeltaTime = deltaTime / IterationPerStep;
@@ -216,13 +246,15 @@ public class PhysicsEngine2D : Behaviour, IPreUpdate, IPhysicsEngine2D
{
collisionDetector = new CollisionDetector2D();
collisionResolver = new CollisionResolver2D();
raycastResolver = new RaycastResolver2D();
Priority = int.MaxValue;
}
public PhysicsEngine2D(ICollisionDetector2D collisionDetector, ICollisionResolver2D collisionResolver)
public PhysicsEngine2D(ICollisionDetector2D collisionDetector, ICollisionResolver2D collisionResolver, IRaycastResolver2D raycastResolver)
{
this.collisionDetector = collisionDetector;
this.collisionResolver = collisionResolver;
this.raycastResolver = raycastResolver;
Priority = int.MaxValue;
}
}