// src/AcDream.App/Rendering/CameraController.cs namespace AcDream.App.Rendering; public sealed class CameraController { public OrbitCamera Orbit { get; } public FlyCamera Fly { get; } public ChaseCamera? Chase { get; private set; } public ICamera Active { get; private set; } public bool IsFlyMode => Active == Fly; public bool IsChaseMode => Chase is not null && Active == Chase; public event Action? ModeChanged; public CameraController(OrbitCamera orbit, FlyCamera fly) { Orbit = orbit; Fly = fly; Active = orbit; } public void ToggleFly() { Active = IsFlyMode ? (ICamera)Orbit : Fly; ModeChanged?.Invoke(IsFlyMode); } public void EnterChaseMode(ChaseCamera chase) { Chase = chase; Active = chase; ModeChanged?.Invoke(IsChaseMode); } public void ExitChaseMode() { Active = Fly; Chase = null; ModeChanged?.Invoke(IsFlyMode); } public void SetAspect(float aspect) { Orbit.Aspect = aspect; Fly.Aspect = aspect; } }