namespace Engine.Core;
///
/// Represents a 3D camera in the engine.
///
public interface ICamera3D : IBehaviour3D
{
///
/// Event triggered when the near plane of the changes.
///
Event OnNearPlaneChanged { get; }
///
/// Event triggered when the far plane of the changes.
///
Event OnFarPlaneChanged { get; }
///
/// Event triggered when the field of view of the changes.
///
Event OnFieldOfViewChanged { get; }
///
/// Near plane distance of the camera.
///
float NearPlane { get; set; }
///
/// Far plane distance of the camera.
///
float FarPlane { get; set; }
///
/// Field of View (FOV) value of the camera in degrees.
///
float FieldOfView { get; set; }
///
/// Converts a position from screen coordinates to a .
///
/// The position in screen coordinates.
/// The originating from the camera to the screen position in world coordinates.
Ray3D ScreenToWorldRay(Vector2D screenPosition);
///
/// Converts a position from world coordinates to screen coordinates.
///
/// The position in world coordinates.
/// The position in screen coordinates.
Vector2D WorldToScreenPosition(Vector3D worldPosition);
readonly record struct NearPlaneChangedArguments(float PreviousNearPlane);
readonly record struct FarPlaneChangedArguments(float PreviousFarPlane);
readonly record struct FieldOfViewChangedArguments(float PreviousFieldOfView);
}