using System.Collections.Generic;
using Syntriax.Engine.Core;
namespace Syntriax.Engine.Physics2D;
///
/// Represents a 2D physics engine.
///
public interface IPhysicsEngine2D
{
///
/// Event triggered when the has done a single physics iteration.
///
Event OnPhysicsIteration { get; }
///
/// Event triggered when the has done a full physics step/>.
///
Event OnPhysicsStep { get; }
///
/// The number of iterations the performs per step.
///
int IterationPerStep { get; set; }
///
/// Advances the physics simulation by the specified time.
///
/// The time step.
void Step(float deltaTime);
///
/// Advances the physics simulation by the specified time on a single .
///
/// The to be progressed individually.
/// The time step.
void StepIndividual(IRigidBody2D rigidBody, float deltaTime);
///
/// Casts a into the scene and returns the closest it hits, if any.
///
/// The to cast.
/// The maximum distance to check for intersections. Defaults to .
///
/// A containing information about the hit, or if no hit was detected.
///
RaycastResult? Raycast(Ray2D ray, float length = float.MaxValue);
///
/// Casts a into the scene and stores all hit results in the provided list.
///
/// The to cast.
///
/// A list to which all s will be added. The list will be populated with zero or more objects.
///
/// The maximum distance to check for intersections. Defaults to .
void Raycast(Ray2D ray, IList results, float length = float.MaxValue);
readonly record struct PhysicsIterationArguments(IPhysicsEngine2D Sender, float IterationDeltaTime);
readonly record struct PhysicsStepArguments(IPhysicsEngine2D Sender, float StepDeltaTime);
}