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

XFEEDToolBox

【WinUI】XFE精英危险工具箱

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

namespace XFEEDToolBox.Controls;

public sealed partial class GalaxyMapView
{
    public static readonly DependencyProperty HistoricalTradeFlowsProperty=DependencyProperty.Register(nameof(HistoricalTradeFlows),typeof(IReadOnlyList<GalaxyHistoricalTradeFlow>),typeof(GalaxyMapView),new PropertyMetadata(null,Changed));
    public IReadOnlyList<GalaxyHistoricalTradeFlow>? HistoricalTradeFlows {get=>(IReadOnlyList<GalaxyHistoricalTradeFlow>?)GetValue(HistoricalTradeFlowsProperty);set=>SetValue(HistoricalTradeFlowsProperty,value);}
    internal int VisibleHistoricalTradeSegments {get;private set;}
    private void DrawHistoricalTradeFlows(GalaxyCamera camera,ref int count)
    {
        VisibleHistoricalTradeSegments=0;
        if(graphics is null||Filter is not{ShowHistoricalTradeFlows:true} filter)return;
        var colour=filter.HistoricalTradeSource switch{GalaxyTradeFlowSource.Players=>new Vector4(1,.55f,.12f,.65f),GalaxyTradeFlowSource.Npc=>new Vector4(.2f,.65f,1,.4f),_=>new Vector4(.12f,.75f,.7f,.55f)};
        foreach(var flow in HistoricalTradeFlows??[])
        {
            var edge=flow.Edge;var amount=edge.Amount(filter.HistoricalTradeSource);
            if(!double.IsFinite(amount)||amount<=0||filter.HistoricalTradeCommodities is {} commodities&&!commodities.Contains(GalaxyMapFilter.Normalize(edge.Commodity))||
               flow.From.SystemAddress!=edge.FromSystemAddress||flow.To.SystemAddress!=edge.ToSystemAddress||!flow.From.Position.IsValid||!flow.To.Position.IsValid)continue;
            if(count+6>lineVertices.Length)break;
            if(!GalaxyMapGeometry.TryProjectSegment(camera,flow.From.Position,flow.To.Position,out var line))continue;
            var from=new Point(line.X1,line.Y1);var to=new Point(line.X2,line.Y2);var dx=to.X-from.X;var dy=to.Y-from.Y;var length=Math.Sqrt(dx*dx+dy*dy);if(length<2)continue;
            AppendHistoricalLine(from,to,colour,ref count);VisibleHistoricalTradeSegments++;
            if(length<16)continue;
            var tip=new Point(from.X+dx*.67,from.Y+dy*.67);var ux=dx/length;var uy=dy/length;
            AppendHistoricalLine(tip,new(tip.X-ux*6+uy*3,tip.Y-uy*6-ux*3),colour,ref count);
            AppendHistoricalLine(tip,new(tip.X-ux*6-uy*3,tip.Y-uy*6+ux*3),colour,ref count);
        }
    }
    private void AppendHistoricalLine(Point from,Point to,Vector4 colour,ref int count)
    {
        var length=(float)Math.Sqrt((to.X-from.X)*(to.X-from.X)+(to.Y-from.Y)*(to.Y-from.Y));
        lineVertices[count++]=new(new((float)from.X,(float)from.Y),0,0,colour);
        lineVertices[count++]=new(new((float)to.X,(float)to.Y),length,0,colour);
    }
}