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