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

XFEEDToolBox

【WinUI】XFE精英危险工具箱

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

namespace XFEEDToolBox.Controls;

public sealed partial class GalaxyMapView
{
    /// <summary>
    /// Optional real original navigation-centre snapshot, supplied by the owner
    /// and cleared with its source lifetime. Null uses the known current-system
    /// catalogue position as an explicit application fallback.
    /// </summary>
    public Coordinates? OriginalHomeCentre { get; set; }

    // Explicit host calibration: original PhysicalValue units versus WinUI
    // DIP/wheel delta have not been observed live. Native graph gains follow.
    public double MouseRawUnitsPerDip { get; set; }=1;
    public double MouseRawUnitsPerWheelDelta { get; set; }=1;
    internal bool LastHomeUsedOriginalCentreForProbe { get; private set; }

    public bool ReturnCameraHome()
    {
        if(!IsInteractive||!pageActive)return false;
        var centre=OriginalHomeCentre;
        LastHomeUsedOriginalCentreForProbe=centre is{IsValid:true};
        if(centre is not{IsValid:true})
            centre=Systems?.FirstOrDefault(system=>system.Name.Equals(CurrentSystem,StringComparison.OrdinalIgnoreCase)&&system.Position.IsValid)?.Position;
        if(centre is not{IsValid:true})return false;
        var target=cameraTarget??ActualCameraPose;
        CancelCameraInput();
        var home=GalaxyOriginalCameraInput.Home(target,centre);
        // Original Home has a separate cinematic easing phase. Until that
        // timing source is ported, retain the proved target with ordinary
        // smoothing, preserving independent actual pose and cancellation.
        SetCameraTarget(home,cameraCraning:true,craneInput:1);
        return true;
    }

    private void ApplyOriginalKeyboardInput(double seconds,IReadOnlySet<VirtualKey> keys)
    {
        static double Axis(IReadOnlySet<VirtualKey> values,VirtualKey positive,VirtualKey negative)
            =>(values.Contains(positive)?1:0)-(values.Contains(negative)?1:0);
        // Application timer/stall bounds; the original input float's full
        // upstream clock and clamp policy remain separately documented.
        seconds=Math.Clamp(seconds,0,.1);
        if(!IsInteractive||!pageActive)return;
        var input=GalaxyOriginalCameraInput.Keyboard(Axis(keys,VirtualKey.T,VirtualKey.G),
            Axis(keys,VirtualKey.E,VirtualKey.Q),Axis(keys,VirtualKey.D,VirtualKey.A),
            Axis(keys,VirtualKey.W,VirtualKey.S),Axis(keys,VirtualKey.R,VirtualKey.F),
            Axis(keys,VirtualKey.X,VirtualKey.Z),seconds);
        var target=GalaxyOriginalCameraInput.Apply(ActualCameraPose,EnsureCameraTarget(),input);
        SetCameraTarget(target,input.Crane!=0,input.Crane);
    }

    private void ApplyOriginalMouseInput(double dx,double dy,GalaxyMouseButtons buttons)
    {
        if(!IsInteractive||!pageActive)return;
        if(!double.IsFinite(MouseRawUnitsPerDip)||MouseRawUnitsPerDip<=0)return;
        var input=GalaxyOriginalCameraInput.Mouse(buttons,dx*MouseRawUnitsPerDip,dy*MouseRawUnitsPerDip,reverseCrane:ReverseMouseCrane);
        if(input==default)return;
        var craning=GalaxyMouseControls.Gesture(buttons)==GalaxyMouseGesture.Crane;
        var target=GalaxyOriginalCameraInput.Apply(ActualCameraPose,EnsureCameraTarget(),input,craning);
        SetCameraTarget(target,craning,input.Crane);
    }

    private void ApplyOriginalWheelInput(double wheelDelta)
    {
        if(!IsInteractive||!pageActive)return;
        if(!double.IsFinite(MouseRawUnitsPerWheelDelta)||MouseRawUnitsPerWheelDelta<=0)return;
        var input=GalaxyOriginalCameraInput.Mouse(GalaxyMouseButtons.None,0,0,wheelDelta*MouseRawUnitsPerWheelDelta);
        var target=GalaxyOriginalCameraInput.Apply(ActualCameraPose,EnsureCameraTarget(),input,CameraCraneActive);
        SetCameraTarget(target,CameraCraneActive,CameraCraneActive?1:0);
    }
}