using System.Numerics;
using System.Runtime.InteropServices;
using XFEEDToolBox.Core.Galaxy;
using XFEEDToolBox.Core.Rendering;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public sealed class GalaxyOriginalPowerActivityRingTests
{
[Test] public void SharedRangeGeometryUsesActualCachedCentreAndDistanceScaledOriginalWidth()
{
var bound=new GalaxyNativePowerOuter(false,9007199254740993,new(100,20,30),20);
Check.That(GalaxyOriginalPowerActivityRingGeometry.TryCreate(bound,new(100,20,30),out var near));
Check.Equal(new Vector4(100,20,30,1),near.Position);
Check.That(Math.Abs(near.UAxisInner.W-19.95f)<1e-5&&Math.Abs(near.VAxisOuter.W-20.05f)<1e-5);
Check.That(GalaxyOriginalPowerActivityRingGeometry.TryCreate(bound,new(160,20,30),out var middle));
Check.That(Math.Abs(middle.UAxisInner.W-19.85f)<1e-5);
Check.That(GalaxyOriginalPowerActivityRingGeometry.TryCreate(bound,new(10000,20,30),out var far));
Check.That(Math.Abs(far.UAxisInner.W-19.7f)<1e-5&&Math.Abs(far.VAxisOuter.W-20.3f)<1e-5);
Check.That(near.UAxisInner.X==1&&near.VAxisOuter.Z==1&&near.Colour==new Vector4(1,1,1,0));
}
[Test] public void ActualPrimitiveCountConversionProducesSeventeenPairsAndClosesSixteenQuads()
{
Check.Equal(64,Marshal.SizeOf<GalaxyOriginalPowerActivityRing>());
Check.That(GalaxyOriginalPowerActivityRingGeometry.TryCreate(new(true,1,new(0,0,0),20),new(0,10,0),out var ring));
var first=GalaxyOriginalPowerActivityRingGeometry.Vertex(ring,0);var last=GalaxyOriginalPowerActivityRingGeometry.Vertex(ring,32);
Check.That(Vector3.Distance(first.World,last.World)<1e-5);
Check.That(Vector3.Distance(GalaxyOriginalPowerActivityRingGeometry.Vertex(ring,1).World,GalaxyOriginalPowerActivityRingGeometry.Vertex(ring,33).World)<1e-5);
Check.That(first.AnnulusRadii.Z>ring.VAxisOuter.W);
Check.Throws<ArgumentOutOfRangeException>(()=>GalaxyOriginalPowerActivityRingGeometry.Vertex(ring,34));
}
[Test] public void MissingBoundsDoNotBorrowPlayerCentreOrInventARadius()
{
Check.That(!GalaxyOriginalPowerActivityRingGeometry.TryCreate(null,new(0,0,0),out _));
Check.That(!GalaxyOriginalPowerActivityRingGeometry.TryCreate(new(true,1,null,20),new(0,0,0),out _));
Check.That(!GalaxyOriginalPowerActivityRingGeometry.TryCreate(new(true,1,new(0,0,0),null),new(0,0,0),out _));
Check.That(!GalaxyOriginalPowerActivityRingGeometry.TryCreate(new(true,1,new(0,0,0),float.NaN),new(0,0,0),out _));
}
[Test] public void OriginalRingClipsItsInteriorAndExteriorAndKeepsSourceAlphaSeparateFromLight()
{
Check.Equal(0f,GalaxyOriginalPowerActivityRingGeometry.Coverage(new(7,10,6,0)));
Check.Equal(0f,GalaxyOriginalPowerActivityRingGeometry.Coverage(new(7,10,11,0)));
var bright=GalaxyOriginalPowerActivityRingGeometry.Shade(new(7,10,8.5f,0),new(2,1,.5f,0),1,.5f);
Check.That(bright.X>.9f&&Math.Abs(bright.X-2*bright.Y)<1e-6&&bright.W==0);
Check.Equal(Vector4.Zero,GalaxyOriginalPowerActivityRingGeometry.Shade(new(7,10,8.5f,0),new(2,1,.5f,0),0));
}
}
using System.Numerics;
using System.Runtime.InteropServices;
using XFEEDToolBox.Core.Galaxy;
using XFEEDToolBox.Core.Rendering;
using XFEExtension.NetCore.XUnit.Attributes;
namespace XFEEDToolBox.Test;
[TestFixture]
public sealed class GalaxyOriginalPowerActivityRingTests
{
[Test] public void SharedRangeGeometryUsesActualCachedCentreAndDistanceScaledOriginalWidth()
{
var bound=new GalaxyNativePowerOuter(false,9007199254740993,new(100,20,30),20);
Check.That(GalaxyOriginalPowerActivityRingGeometry.TryCreate(bound,new(100,20,30),out var near));
Check.Equal(new Vector4(100,20,30,1),near.Position);
Check.That(Math.Abs(near.UAxisInner.W-19.95f)<1e-5&&Math.Abs(near.VAxisOuter.W-20.05f)<1e-5);
Check.That(GalaxyOriginalPowerActivityRingGeometry.TryCreate(bound,new(160,20,30),out var middle));
Check.That(Math.Abs(middle.UAxisInner.W-19.85f)<1e-5);
Check.That(GalaxyOriginalPowerActivityRingGeometry.TryCreate(bound,new(10000,20,30),out var far));
Check.That(Math.Abs(far.UAxisInner.W-19.7f)<1e-5&&Math.Abs(far.VAxisOuter.W-20.3f)<1e-5);
Check.That(near.UAxisInner.X==1&&near.VAxisOuter.Z==1&&near.Colour==new Vector4(1,1,1,0));
}
[Test] public void ActualPrimitiveCountConversionProducesSeventeenPairsAndClosesSixteenQuads()
{
Check.Equal(64,Marshal.SizeOf<GalaxyOriginalPowerActivityRing>());
Check.That(GalaxyOriginalPowerActivityRingGeometry.TryCreate(new(true,1,new(0,0,0),20),new(0,10,0),out var ring));
var first=GalaxyOriginalPowerActivityRingGeometry.Vertex(ring,0);var last=GalaxyOriginalPowerActivityRingGeometry.Vertex(ring,32);
Check.That(Vector3.Distance(first.World,last.World)<1e-5);
Check.That(Vector3.Distance(GalaxyOriginalPowerActivityRingGeometry.Vertex(ring,1).World,GalaxyOriginalPowerActivityRingGeometry.Vertex(ring,33).World)<1e-5);
Check.That(first.AnnulusRadii.Z>ring.VAxisOuter.W);
Check.Throws<ArgumentOutOfRangeException>(()=>GalaxyOriginalPowerActivityRingGeometry.Vertex(ring,34));
}
[Test] public void MissingBoundsDoNotBorrowPlayerCentreOrInventARadius()
{
Check.That(!GalaxyOriginalPowerActivityRingGeometry.TryCreate(null,new(0,0,0),out _));
Check.That(!GalaxyOriginalPowerActivityRingGeometry.TryCreate(new(true,1,null,20),new(0,0,0),out _));
Check.That(!GalaxyOriginalPowerActivityRingGeometry.TryCreate(new(true,1,new(0,0,0),null),new(0,0,0),out _));
Check.That(!GalaxyOriginalPowerActivityRingGeometry.TryCreate(new(true,1,new(0,0,0),float.NaN),new(0,0,0),out _));
}
[Test] public void OriginalRingClipsItsInteriorAndExteriorAndKeepsSourceAlphaSeparateFromLight()
{
Check.Equal(0f,GalaxyOriginalPowerActivityRingGeometry.Coverage(new(7,10,6,0)));
Check.Equal(0f,GalaxyOriginalPowerActivityRingGeometry.Coverage(new(7,10,11,0)));
var bright=GalaxyOriginalPowerActivityRingGeometry.Shade(new(7,10,8.5f,0),new(2,1,.5f,0),1,.5f);
Check.That(bright.X>.9f&&Math.Abs(bright.X-2*bright.Y)<1e-6&&bright.W==0);
Check.Equal(Vector4.Zero,GalaxyOriginalPowerActivityRingGeometry.Shade(new(7,10,8.5f,0),new(2,1,.5f,0),0));
}
}