using System.Numerics; using XFEEDToolBox.Core.Galaxy; using XFEExtension.NetCore.XUnit.Attributes; namespace XFEEDToolBox.Test; [TestFixture] public sealed class GalaxyOriginalFrameFadeTests { [Test] public void UnknownRadiusOrTransitionNeverBecomesConstructorFifty() { Check.That(!GalaxyOriginalFrameFade.TryCreate(default,default,Vector3.UnitZ,default,null,0,out _)); Check.That(!GalaxyOriginalFrameFade.TryCreate(default,default,Vector3.UnitZ,default,50,null,out _)); Check.That(!GalaxyOriginalFrameFade.TryCreate(default,default,Vector3.UnitZ,default,float.NaN,0,out _)); } [Test] public void OriginalVerticalEllipsoidAndMinimumBypassAreIndependent() { Check.That(GalaxyOriginalFrameFade.TryCreate(default,default,Vector3.UnitZ,new(0,0,10),50,0,out var flat)); Check.That(flat.Alpha(new(0,4,10))>.99f); Check.Equal(0f,flat.Alpha(new(0,5,10))); Check.That(flat.Alpha(new(30,0,10))>.99f); Check.That(GalaxyOriginalFrameFade.TryCreate(default,default,Vector3.UnitZ,new(0,0,10),50,.5f,out var transition)); Check.Equal(0f,transition.Alpha(new(200,0,10))); Check.Equal(.5f,transition.Alpha(new(200,0,10),false)); } [Test] public void TerritoryNearAndFarFadeKeepTheirOriginalSeparateSwitches() { Check.That(GalaxyOriginalFrameFade.TryCreate(default,default,Vector3.UnitZ,default,50,1.01f,out var range)); Check.That(!range.EllipsoidEnabled); Check.Equal(0f,range.Alpha(new(0,0,1))); Check.Equal(0f,range.Alpha(new(0,0,1.5f))); Check.Equal(1f/3,range.Alpha(new(0,0,2))); Check.Equal(.5f,range.Alpha(new(0,0,2.25f))); Check.Equal(1f,range.Alpha(new(0,0,3))); Check.Equal(1f,range.Alpha(new(0,0,600))); Check.Equal(.5f,range.Alpha(new(0,0,650))); Check.Equal(0f,range.Alpha(new(0,0,700))); Check.Equal(1f,range.Alpha(new(0,0,800),farFade:false)); } [Test] public void PreparedPlaneAndEllipsoidUseTheirActualIndependentOrigins() { Check.That(GalaxyOriginalFrameFade.TryCreate(new(0,0,5),new(0,0,100),Vector3.UnitZ,new(0,0,97),50,0,out var source)); Check.Equal(1f/3,source.Alpha(new(0,0,97))); Check.Equal(1f,source.Alpha(new(0,0,98))); Check.That(GalaxyOriginalFrameFade.TryCreate(new(0,0,5),new(1000,-800,600),Vector3.UnitZ,new(1000,-800,597),50,0,out var moved)); Check.Equal(source.Alpha(new(0,0,97)),moved.Alpha(new(1000,-800,597))); } [Test] public void FrameCallBindingRequiresAllActualInputs() { Check.That(!GalaxyOriginalFrameFade.TryCreateFromFrame(null,new(0,0,-100),Vector3.Zero,50,0,out _)); Check.That(!GalaxyOriginalFrameFade.TryCreateFromFrame(Vector3.UnitZ,null,Vector3.Zero,50,0,out _)); Check.That(!GalaxyOriginalFrameFade.TryCreateFromFrame(Vector3.UnitZ,new(0,0,-100),null,50,0,out _)); Check.That(!GalaxyOriginalFrameFade.TryCreateFromFrame(Vector3.Zero,new(0,0,-100),Vector3.Zero,50,0,out _)); Check.That(GalaxyOriginalFrameFade.TryCreateFromFrame(Vector3.UnitZ,new(0,0,-100),Vector3.Zero,50,0,out var fade)); Check.Equal(1f,fade.Alpha(Vector3.Zero)); Check.Equal(0f,fade.Alpha(new(40,0,0))); Check.Equal(0f,fade.Alpha(new(0,0,-99))); } [Test] public void TransitionTargetDoesNotStandInForTheCurrentSmoothedValue() { Check.That(!GalaxyOriginalFrameFade.TryTargetTransition(10,null,0,out _)); Check.That(GalaxyOriginalFrameFade.TryTargetTransition(25,100,null,out var start)); Check.Equal(0f,start); Check.That(GalaxyOriginalFrameFade.TryTargetTransition(62.5f,100,null,out var middle)); Check.Equal(.5f,middle); Check.That(!GalaxyOriginalFrameFade.TryTargetTransition(100,100,null,out _)); Check.That(GalaxyOriginalFrameFade.TryTargetTransition(100,100,0,out var beyond)); Check.Equal(GalaxyOriginalFrameFade.TransitionUpperLimit,beyond); Check.That(GalaxyOriginalFrameFade.TryTargetTransition(100,100,1,out var map)); Check.Equal(1f,map); Check.That(GalaxyOriginalFrameFade.TryCreateFromFrame(Vector3.UnitZ,new(0,0,-100),Vector3.Zero,50,0,out var current)); Check.That(GalaxyOriginalFrameFade.TryCreateFromFrame(Vector3.UnitZ,new(0,0,-100),Vector3.Zero,50,beyond,out var target)); Check.Equal(0f,current.Alpha(new(0,20,0))); Check.Equal(1f,target.Alpha(new(0,20,0))); } [Test] public void OriginalTransitionKeepsItsSnapAndDirectionalClamps() { Check.That(!GalaxyOriginalFrameFade.TryAdvanceTransition(null,1,.1f,out _)); Check.That(!GalaxyOriginalFrameFade.TryAdvanceTransition(0,1,null,out _)); Check.That(GalaxyOriginalFrameFade.TryAdvanceTransition(GalaxyOriginalFrameFade.TransitionUpperLimit,1,0,out var snapped)); Check.Equal(1f,snapped); // The original decreasing-to1 branch ignores the frame float. Check.That(GalaxyOriginalFrameFade.TryAdvanceTransition(0,1,.1f,out var increasing)); Check.That(Math.Abs(increasing-.3f)<.000001f); Check.That(GalaxyOriginalFrameFade.TryAdvanceTransition(.8f,0,.1f,out var decreasing)); Check.That(Math.Abs(decreasing-.56f)<.000001f); Check.That(GalaxyOriginalFrameFade.TryAdvanceTransition(.8f,0,2,out var clampedDown)); Check.Equal(0f,clampedDown); Check.That(GalaxyOriginalFrameFade.TryAdvanceTransition(0,1,2,out var clampedUp)); Check.Equal(1f,clampedUp); } [Test] public void VerifiedZeroRangeRetainsTheOriginalDegenerateCentreRule() { // DD4's actual range modifier can be0. It is known, not unavailable. Check.That(GalaxyOriginalFrameFade.TryCreateFromFrame(Vector3.UnitZ,new(0,0,-10),Vector3.Zero,0,0,out var fade)); Check.Equal(0f,fade.InnerRadius);Check.Equal(0f,fade.OuterRadius); Check.Equal(1f,fade.Alpha(Vector3.Zero)); Check.Equal(0f,fade.Alpha(new(.001f,0,0))); } [Test] public void ActualCameraBindingUsesForwardDepthAndDoesNotUseQueryFar() { var camera=GalaxyCamera.Create(new(50,20,-30),1600,900,.3,.45,10); Check.That(!GalaxyOriginalFrameFade.TryCreateForCamera(camera,null,1.01f,out _)); Check.That(!GalaxyOriginalFrameFade.TryCreateForCamera(camera,50,null,out _)); Check.That(GalaxyOriginalFrameFade.TryCreateForCamera(camera,50,1.01f,out var fade)); Vector3 Point(float depth)=>new((float)(camera.Eye.X+camera.Forward.X*depth), (float)(camera.Eye.Y+camera.Forward.Y*depth),(float)(camera.Eye.Z+camera.Forward.Z*depth)); Check.That(Math.Abs(fade.Alpha(Point(2))-1f/3)<.0001f); Check.That(Math.Abs(fade.Alpha(Point(650))-.5f)<.0001f); var fartherQuery=camera.WithCatalogueQueryFar(100000); Check.That(GalaxyOriginalFrameFade.TryCreateForCamera(fartherQuery,50,1.01f,out var same)); Check.Equal(fade.Alpha(Point(650)),same.Alpha(Point(650))); Check.Equal(0f,fade.Alpha(Point(701))); } }