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