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);
}