feat: added raycasting support for physics engine 2D
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user