XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
namespace XFEEDToolBox.Core.Galaxy;

/// <summary>
/// Recovered ordinary flat-view lens, separate from catalogue query bounds.
/// This is the original GalaxyMapView root-stack configuration and projection
/// path, not a claim about runtime HMD, capture, lens-shift or parent overrides.
/// See research/galaxy-original-camera-evidence.md for the pinned source chain.
/// </summary>
public static class GalaxyOriginalProjection
{
    public const double StackFieldOfViewDegrees = 56.249000549316406;
    public const double DegreesToRadians = .01745329238474369;
    public const double ReferenceAspectRatio = 1.7777777910232544;
    public const double NearPlane = .10000000149011612;
    public const double StoredFarPlane = 500000;

    // 10866E0 multiplies the two original float fields before inheritance.
    public static readonly double StackFieldOfViewRadians = (float)((float)StackFieldOfViewDegrees * (float)DegreesToRadians);

    /// <summary>
    /// 2840320 preserves vertical FOV above16:9 and expands it below16:9.
    /// The original bypasses compensation for HMD or view-flagbit6; callers
    /// representing those paths must explicitly pass false. Double arithmetic
    /// ports the formula without claiming native float bit identity.
    /// </summary>
    public static double VerticalFieldOfView(double aspectRatio, bool compensateNarrowViewport = true)
    {
        if (!double.IsFinite(aspectRatio) || aspectRatio <= 0)
            throw new ArgumentOutOfRangeException(nameof(aspectRatio));
        var ratio = compensateNarrowViewport ? Math.Max(1, ReferenceAspectRatio / aspectRatio) : 1;
        return 2 * Math.Atan(Math.Tan(StackFieldOfViewRadians / 2) * ratio);
    }

    /// <summary>4F3150: m11=cot(verticalFov/2), m00=m11/aspect.</summary>
    public static double FocalLength(double width, double height, bool compensateNarrowViewport = true)
    {
        if (!double.IsFinite(width) || width <= 0) throw new ArgumentOutOfRangeException(nameof(width));
        if (!double.IsFinite(height) || height <= 0) throw new ArgumentOutOfRangeException(nameof(height));
        return height / (2 * Math.Tan(VerticalFieldOfView(width / height, compensateNarrowViewport) / 2));
    }

    /// <summary>
    /// Root flagC=1 becomes Camera mode3: infinite reverse depth, near/z.
    /// StoredFarPlane remains available to other original consumers; it is
    /// not a finite far clip in this matrix. This method never expands a
    /// catalogue query or applies a catalogue far clip.
    /// </summary>
    public static double ReverseDepth(double positiveCameraDepth)
    {
        if (!double.IsFinite(positiveCameraDepth) || positiveCameraDepth <= 0)
            throw new ArgumentOutOfRangeException(nameof(positiveCameraDepth));
        return NearPlane / positiveCameraDepth;
    }
}