diff --git a/player/CameraController.cs b/player/CameraController.cs index 62fcdd7..aca0b83 100644 --- a/player/CameraController.cs +++ b/player/CameraController.cs @@ -1,12 +1,15 @@ public partial class CameraController : SpringArm3D { - [Export] public Vector2 MouseSensitivity { get; set; } = new(0.2f, 0.2f); // Degrees per pixel. [Export] public float MovementSmoothing { get; set; } = 8.0f; - [Export] public float PitchMinimum { get; set; } = -85; - [Export] public float PitchMaximum { get; set; } = -25; + + [Export] public Vector2 MouseSensitivity { get; set; } = new(0.2f, 0.2f); // Degrees per pixel. + + [Export] public float PitchMinimum { get; set; } = 30; + [Export] public float PitchMaximum { get; set; } = 65; + [Export] public float PitchSmoothing { get; set; } = 12.0f; // FIXME: Fix the "snappyness" when moving slowly. - // TODO: Add a "soft" minimum / maximum for pitch. + // FIXME: Fix spring arm clipping through terrain and similar. // TODO: Gradually return to maximum spring length. // TODO: Turn player transparent as the camera moves closer. @@ -47,16 +50,20 @@ public partial class CameraController : SpringArm3D void ApplyRotation(Vector2 delta) { - delta *= Tau / 360; // degrees to radians - var (pitch, yaw, _) = Rotation; - yaw += delta.X; + var (pitch, yaw, _) = RotationDegrees; pitch += delta.Y; - pitch = Clamp(pitch, DegToRad(PitchMinimum), DegToRad(PitchMaximum)); - Rotation = new(pitch, yaw, 0); + yaw += delta.X; + RotationDegrees = new(pitch, yaw, 0); } public override void _Process(double delta) { Position = Position.Damp(_offset + _player.GlobalPosition, MovementSmoothing, delta); + + var pitch = RotationDegrees.X; + var (min, max) = (-PitchMaximum, -PitchMinimum); + if (pitch < min) pitch = pitch.Damp(min, PitchSmoothing, delta); + if (pitch > max) pitch = pitch.Damp(max, PitchSmoothing, delta); + RotationDegrees = RotationDegrees with { X = pitch }; } }