feat: added raycasting support for physics engine 2D
This commit is contained in:
@@ -19,6 +19,7 @@ public class PhysicsEngine2DStandalone : IPhysicsEngine2D
|
||||
|
||||
private readonly ICollisionDetector2D collisionDetector = null!;
|
||||
private readonly ICollisionResolver2D collisionResolver = null!;
|
||||
private readonly IRaycastResolver2D raycastResolver = null!;
|
||||
|
||||
public int IterationPerStep { get => _iterationCount; set => _iterationCount = value < 1 ? 1 : value; }
|
||||
|
||||
@@ -43,6 +44,34 @@ public class PhysicsEngine2DStandalone : IPhysicsEngine2D
|
||||
rigidBody.BehaviourController.OnBehaviourAdded.RemoveListener(delegateOnBehaviourAdded);
|
||||
rigidBody.BehaviourController.OnBehaviourRemoved.RemoveListener(delegateOnBehaviourRemoved);
|
||||
}
|
||||
public RaycastResult? Raycast(Ray2D ray, float length = float.MaxValue)
|
||||
{
|
||||
RaycastResult? closestResult = null;
|
||||
float closestDistance = float.MaxValue;
|
||||
|
||||
for (int i = 0; i < colliders.Count; i++)
|
||||
if (raycastResolver.RaycastAgainst(colliders[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 < colliders.Count; i++)
|
||||
if (raycastResolver.RaycastAgainst(colliders[i], ray, length) is RaycastResult raycastResult)
|
||||
results.Add(raycastResult);
|
||||
}
|
||||
|
||||
public void Step(float deltaTime)
|
||||
{
|
||||
@@ -203,15 +232,17 @@ public class PhysicsEngine2DStandalone : IPhysicsEngine2D
|
||||
{
|
||||
collisionDetector = new CollisionDetector2D();
|
||||
collisionResolver = new CollisionResolver2D();
|
||||
raycastResolver = new RaycastResolver2D();
|
||||
|
||||
delegateOnBehaviourAdded = OnBehaviourAdded;
|
||||
delegateOnBehaviourRemoved = OnBehaviourRemoved;
|
||||
}
|
||||
|
||||
public PhysicsEngine2DStandalone(ICollisionDetector2D collisionDetector, ICollisionResolver2D collisionResolver)
|
||||
public PhysicsEngine2DStandalone(ICollisionDetector2D collisionDetector, ICollisionResolver2D collisionResolver, IRaycastResolver2D raycastResolver)
|
||||
{
|
||||
this.collisionDetector = collisionDetector;
|
||||
this.collisionResolver = collisionResolver;
|
||||
this.raycastResolver = raycastResolver;
|
||||
|
||||
delegateOnBehaviourAdded = OnBehaviourAdded;
|
||||
delegateOnBehaviourRemoved = OnBehaviourRemoved;
|
||||
|
Reference in New Issue
Block a user