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