using System.Numerics;
using System.Runtime.InteropServices;
using XFEEDToolBox.Core.Galaxy;
namespace XFEEDToolBox.Core.Rendering;
/// <summary>Original3AE7600's staged64-byte record. This is not the final
/// StarMapLine input; material conversion remains a separate consumer.</summary>
[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;
}
}
}
using System.Numerics;
using System.Runtime.InteropServices;
using XFEEDToolBox.Core.Galaxy;
namespace XFEEDToolBox.Core.Rendering;
/// <summary>Original3AE7600's staged64-byte record. This is not the final
/// StarMapLine input; material conversion remains a separate consumer.</summary>
[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;
}
}
}