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

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
using System.Numerics;
using XFEEDToolBox.Core.Galaxy;

namespace XFEEDToolBox.Controls;

public sealed partial class GalaxyMapView
{
    private readonly GalaxyOriginalFrameFadeState originalFrameFadeState=new();
    private Microsoft.UI.Dispatching.DispatcherQueueTimer? originalFrameFadeTimer;
    private double originalFrameFadeAt;
    private GalaxyOriginalFrameFade? originalFrameFade;
    private bool originalFrameFadeProbeManual;
    internal int FrameFadedStarsForProbe {get;private set;}
    internal float? FrameFadeTransitionForProbe=>originalFrameFadeState.CurrentTransition;

    private bool HasOriginalFrameFadeInputs=>loaded&&pageActive&&CatalogueSelection is{OriginalViewMode:not null} selection&&
        double.IsFinite(selection.Descriptor.InnerRadius)&&selection.Descriptor.InnerRadius<=float.MaxValue;

    private void PrepareOriginalFrameFade()
    {
        if(!HasOriginalFrameFadeInputs){StopOriginalFrameFade();return;}
        if(!originalFrameFadeState.IsActive)
        {originalFrameFadeState.Activate();originalFrameFadeAt=MonotonicMilliseconds;}
        if(originalFrameFadeTimer is null)
        {
            originalFrameFadeTimer=DispatcherQueue.CreateTimer();originalFrameFadeTimer.Interval=TimeSpan.FromMilliseconds(16);
            originalFrameFadeTimer.Tick+=(_,_)=>
            {
                if(!HasOriginalFrameFadeInputs){StopOriginalFrameFade();return;}
                var now=MonotonicMilliseconds;var elapsed=(now-originalFrameFadeAt)/1000;originalFrameFadeAt=now;
                AdvanceOriginalFrameFade(elapsed);
            };
        }
        if(!originalFrameFadeProbeManual&&!originalFrameFadeTimer.IsRunning)
        {originalFrameFadeAt=MonotonicMilliseconds;originalFrameFadeTimer.Start();}
        originalFrameFade=originalFrameFadeState.TryCreateForCamera(Camera,(float)CatalogueSelection!.Descriptor.InnerRadius,out var fade)?fade:null;
    }

    private void AdvanceOriginalFrameFade(double elapsedSeconds)
    {
        if(!HasOriginalFrameFadeInputs)return;
        var before=originalFrameFadeState.CurrentTransition;
        if(!GalaxyOriginalFrameFadeClock.TryFromElapsedSeconds(elapsedSeconds,out var frameValue)||
           !originalFrameFadeState.TryAdvanceForCamera(Camera,(float)CatalogueSelection!.Descriptor.InnerRadius,CatalogueSelection.OriginalViewMode,frameValue))
        {originalFrameFade=null;Invalidate();return;}
        originalFrameFade=originalFrameFadeState.TryCreateForCamera(Camera,(float)CatalogueSelection.Descriptor.InnerRadius,out var fade)?fade:null;
        if(before!=originalFrameFadeState.CurrentTransition)Invalidate();
        else originalFrameFadeTimer?.Stop();
    }

    private void StopOriginalFrameFade()
    {originalFrameFadeTimer?.Stop();originalFrameFadeState.Deactivate();originalFrameFade=null;originalFrameFadeAt=0;}

    private float PointFrameOpacity(Sample sample)
    {
        // Read the current profile's copied tables, never a cached cell row's
        // membership. D50 presence is independent of its consumed pending bit.
        if(originalFrameFade is not{} fade||CatalogueSelection is not{} selection||
           !selection.TryFrameFadeFlags(sample.System,out var bypass,out var far))return 1;
        var p=sample.System.Position;
        return fade.Alpha(new((float)p.X,(float)p.Y,(float)p.Z),bypass,far);
    }

    private float? CurrentOriginalSize(GalacticSystem system)=>CatalogueSelection is{} selection
        ?selection.OriginalSize(system):system.OriginalAppearance?.ActiveSize;

    internal void AdvanceOriginalFrameFadeForProbe(double elapsedSeconds,int ticks)
    {
        var args=Environment.GetCommandLineArgs();
        if(!args.Contains("--offline-preview")||!args.Contains("--probe-galaxy-rework")||ticks is <0 or >4096)
            throw new InvalidOperationException("仅允许独立离线星图验收推进原淡出时钟。");
        PrepareOriginalFrameFade();for(var i=0;i<ticks;i++)AdvanceOriginalFrameFade(elapsedSeconds);
        originalFrameFadeAt=MonotonicMilliseconds;
    }

    internal void UseManualOriginalFrameClockForProbe()
    {
        var args=Environment.GetCommandLineArgs();
        if(!args.Contains("--offline-preview")||!args.Contains("--probe-galaxy-rework"))
            throw new InvalidOperationException("仅允许独立离线星图验收控制原淡出时钟。");
        originalFrameFadeProbeManual=true;originalFrameFadeTimer?.Stop();
    }
}