using System.Numerics; using System.Runtime.InteropServices; using XFEEDToolBox.Core.Galaxy; namespace XFEEDToolBox.Core.Rendering; /// Original3AE7600's staged64-byte record. This is not the final /// StarMapLine input; material conversion remains a separate consumer. [StructLayout(LayoutKind.Sequential)] public readonly record struct GalaxyOriginalPowerInfluence(Vector4 From,Vector4 To,Vector4 Colour,Vector4 Pattern); public static class GalaxyOriginalPowerInfluenceGeometry { public static bool TryCreate(GalaxyNativePowerInfluence? source,out GalaxyOriginalPowerInfluence record) { record=default; if(source is not{Eligible:true,FromSystemAddress:>0,ToSystemAddress:>0,FromPosition:{} a,ToPosition:{} b,LinearRgb.Count:3}|| source.FromSystemAddress==source.ToSystemAddress||!a.IsValid||!b.IsValid||a==b||source.Kind is <0 or >1|| !float.IsFinite(source.Phase)||source.LinearRgb.Any(v=>!float.IsFinite(v)||v<0))return false; record=new(new((float)a.X,(float)a.Y,(float)a.Z,0),new((float)b.X,(float)b.Y,(float)b.Z,0), new(source.LinearRgb[0],source.LinearRgb[1],source.LinearRgb[2],1),new(source.Phase,0,0,0)); return true; } public static float InitialPhase(ulong candidateAddress) { unchecked { var hash=candidateAddress*0x40000+~candidateAddress;hash=(hash>>31^hash)*21;hash=(hash>>11^hash)*65; return (float)((uint)((hash>>22)^hash)&255u)*.00390625f; } } }