using System; namespace AcDream.Core.Rendering; /// /// Runtime-tunable knobs for the retail-faithful chase camera. Mirrors /// the pattern: /// static fields seeded from env vars at process start, runtime-settable /// via property setters that the DebugPanel writes to. /// /// /// Spec: docs/superpowers/specs/2026-05-18-retail-chase-camera-design.md. /// /// public static class CameraDiagnostics { /// /// Master toggle. When true (default, after visual ship 2026-05-18) /// the retail-faithful AcDream.App.Rendering.RetailChaseCamera /// is the active chase camera; when false, the legacy /// AcDream.App.Rendering.ChaseCamera rigid-follow camera is. /// Initial state from ACDREAM_RETAIL_CHASE — default-on if /// unset, off only when explicitly set to "0". The legacy /// camera stays available via the DebugPanel toggle pending the /// follow-up deletion commit. /// public static bool UseRetailChaseCamera { get; set; } = Environment.GetEnvironmentVariable("ACDREAM_RETAIL_CHASE") != "0"; /// /// When true (default), the camera basis follows the player's /// 5-frame averaged velocity vector — tilts with the terrain on /// hills. When false, the basis is built from a flat (yaw, 0) vector /// and the camera stays horizontal even on slopes. Initial state /// from ACDREAM_CAMERA_ALIGN_SLOPE; default-on if unset. /// public static bool AlignToSlope { get; set; } = Environment.GetEnvironmentVariable("ACDREAM_CAMERA_ALIGN_SLOPE") != "0"; /// /// When true (default), the chase camera sweeps a 0.3 m collision /// sphere from the head-pivot to the desired eye and stops it at the /// first wall (retail SmartBox::update_viewer spring arm), so /// the eye never sits behind/inside geometry. Initial state from /// ACDREAM_CAMERA_COLLIDE; default-on if unset, off only when /// explicitly set to "0". /// public static bool CollideCamera { get; set; } = Environment.GetEnvironmentVariable("ACDREAM_CAMERA_COLLIDE") != "0"; /// /// Per-frame translation damping rate. Retail default 0.45. Higher /// (→ 1.0) snaps faster; lower (→ 0.0) lags more. Formula per frame: /// alpha = clamp(TranslationStiffness * dt * 10, 0, 1). /// public static float TranslationStiffness { get; set; } = 0.45f; /// /// Per-frame rotation damping rate. Independent of translation — /// can be tuned higher so the camera swings to look at you faster /// than it physically catches up. Retail default 0.45. /// public static float RotationStiffness { get; set; } = 0.45f; /// /// Mouse-delta low-pass window (seconds). Mouse deltas spaced /// closer than this are averaged with the previous delta before /// being fed to pitch/yaw adjustments. Smooths out jitter on /// high-DPI mice. Retail default 0.25. /// public static float MouseLowPassWindowSec { get; set; } = 0.25f; /// /// Per-second rate that held-key offset adjustments /// (CameraZoomIn/Out, CameraRaise/Lower) integrate into the /// camera's Distance / Pitch. Retail default 40.0. /// public static float CameraAdjustmentSpeed { get; set; } = 40.0f; }