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