XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
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)));
    }
}