< Summary

Information
Class: Trailblazer.Pathing.NavigationSearchFinalizationRules
Assembly: Trailblazer
File(s): /home/runner/work/Trailblazer/Trailblazer/src/Trailblazer/Pathing/Search/AStar/NavigationSearchFinalizationRules.cs
Line coverage
100%
Covered lines: 98
Uncovered lines: 0
Coverable lines: 98
Total lines: 229
Line coverage: 100%
Branch coverage
100%
Covered branches: 49
Total branches: 49
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

/home/runner/work/Trailblazer/Trailblazer/src/Trailblazer/Pathing/Search/AStar/NavigationSearchFinalizationRules.cs

#LineLine coverage
 1//=======================================================================
 2// NavigationSearchFinalizationRules.cs
 3//=======================================================================
 4// MIT License, Copyright (c) 2024-present David Oravsky (mrdav30)
 5// See LICENSE file in the project root for full license information.
 6//=======================================================================
 7
 8using System;
 9using FixedMathSharp;
 10
 11namespace Trailblazer.Pathing;
 12
 13internal static class NavigationSearchFinalizationRules
 14{
 15    internal static bool IsEpochCurrent(
 16        bool epochRequired,
 17        ulong expectedEpoch,
 18        ulong currentEpoch) =>
 2406119        !epochRequired || currentEpoch == expectedEpoch;
 20
 21    internal static NavigationEndpointResolutionStatus ResolveEndpointStatus(
 22        NavigationEndpointResolutionStatus status,
 23        bool dependenciesWereRead,
 24        bool dependenciesAreCurrent,
 25        bool epochIsCurrent) =>
 133726        !epochIsCurrent || (dependenciesWereRead && !dependenciesAreCurrent)
 133727            ? NavigationEndpointResolutionStatus.Stale
 133728            : status;
 29
 30    internal static NavigationEndpointResolutionStatus ResolveEndpointCursorStatus(
 31        bool hasResult) =>
 131532        hasResult
 131533            ? NavigationEndpointResolutionStatus.Success
 131534            : NavigationEndpointResolutionStatus.InvalidEndpoint;
 35
 36    internal static bool TryResolveTraversalTerminalStatus(
 37        NavigationTraversalEdgeAdvanceStatus traversalStatus,
 38        out NavigationSurfaceAStarStatus terminalStatus)
 39    {
 40        switch (traversalStatus)
 41        {
 42            case NavigationTraversalEdgeAdvanceStatus.BudgetExceeded:
 743                terminalStatus = NavigationSurfaceAStarStatus.BudgetExceeded;
 744                return true;
 45            case NavigationTraversalEdgeAdvanceStatus.CapacityExceeded:
 446                terminalStatus = NavigationSurfaceAStarStatus.CapacityExceeded;
 447                return true;
 48            case NavigationTraversalEdgeAdvanceStatus.CostOverflow:
 349                terminalStatus = NavigationSurfaceAStarStatus.CostOverflow;
 350                return true;
 51            case NavigationTraversalEdgeAdvanceStatus.Stale:
 152                terminalStatus = NavigationSurfaceAStarStatus.Stale;
 153                return true;
 54            default:
 988055                terminalStatus = NavigationSurfaceAStarStatus.Pending;
 988056                return false;
 57        }
 58    }
 59
 60    internal static NavigationTraversalEdgeAdvanceStatus ResolveTraversalEpochStatus(
 61        NavigationTraversalEdgeAdvanceStatus traversalStatus,
 62        bool epochIsCurrent) =>
 1888463        epochIsCurrent
 1888464            ? traversalStatus
 1888465            : NavigationTraversalEdgeAdvanceStatus.Stale;
 66
 67    internal static NavigationSurfaceAStarStatus ResolveAStarEpochStatus(
 68        NavigationSurfaceAStarStatus status,
 69        bool epochIsCurrent) =>
 125870        epochIsCurrent
 125871            ? status
 125872            : NavigationSurfaceAStarStatus.Stale;
 73
 74    internal static NavigationSurfaceAStarStatus ResolveBlockedTraversalStatus(
 75        bool requiresConnectionProgress,
 76        int remainingConnectionLegs,
 77        int remainingEvaluatedEdges) =>
 16678        (requiresConnectionProgress
 16679            ? remainingConnectionLegs
 16680            : remainingEvaluatedEdges) == 0
 16681                ? NavigationSurfaceAStarStatus.BudgetExceeded
 16682                : NavigationSurfaceAStarStatus.Pending;
 83
 84    internal static NavigationSurfaceAStarStatus ResolveIncompleteLookupStatus(
 85        int remainingLookupProbes) =>
 1386        remainingLookupProbes == 0
 1387            ? NavigationSurfaceAStarStatus.BudgetExceeded
 1388            : NavigationSurfaceAStarStatus.Pending;
 89
 90    internal static bool ShouldConsumeTraversalSurfacePoint(
 91        bool hasSurfacePoint,
 92        NavigationTraversalEdgeAdvanceStatus traversalStatus) =>
 385893        hasSurfacePoint
 385894        && traversalStatus != NavigationTraversalEdgeAdvanceStatus.Stale;
 95
 96    internal static bool TryGetEuclideanHeuristic(
 97        bool hasFootAnchor,
 98        Vector3d footAnchor,
 99        Vector3d targetFootAnchor,
 100        out Fixed64 heuristic)
 101    {
 873102        if (hasFootAnchor
 873103            && NavigationDistanceMath.TryFloor(
 873104                footAnchor,
 873105                targetFootAnchor,
 873106                out heuristic))
 107        {
 871108            return true;
 109        }
 2110        heuristic = Fixed64.Zero;
 2111        return false;
 112    }
 113
 114    internal static bool ShouldAcceptSimplificationRay(
 115        NavigationCellAddress actualEnd,
 116        NavigationCellAddress candidateEnd,
 117        Fixed64 traversalCost,
 118        Fixed64 rawCost) =>
 26119        actualEnd == candidateEnd
 26120        && traversalCost <= rawCost;
 121
 122    internal static bool TryAdmitSimplification(
 123        int pathNodeCount,
 124        int remainingSimplificationRays,
 125        int componentCount,
 126        int pageCount,
 127        NavigationWorkMeter meter,
 128        out int lookupReservation)
 129    {
 205130        lookupReservation = 0;
 205131        if (pathNodeCount < 2)
 2132            return false;
 203133        if (remainingSimplificationRays == 0)
 121134            return false;
 82135        return TrySetFinalizationLookupReservation(
 82136            componentCount,
 82137            pageCount,
 82138            meter,
 82139            out lookupReservation);
 140    }
 141
 142    internal static bool TryPrepareDependencyMerge(
 143        bool epochIsCurrent,
 144        NavigationDependencyWorkspace target,
 145        NavigationDependencyWorkspace source,
 146        NavigationWorkMeter meter,
 147        int priorLookupReservation,
 148        out int enlargedLookupReservation)
 149    {
 33150        enlargedLookupReservation = 0;
 33151        if (!epochIsCurrent)
 1152            return false;
 32153        if (!target.TryCountMissing(
 32154                source,
 32155                meter,
 32156                out int missingComponents,
 32157                out int missingPages))
 158        {
 1159            return false;
 160        }
 31161        if (!target.CanFit(missingComponents, missingPages))
 1162            return false;
 30163        if (!TrySetFinalizationLookupReservation(
 30164                target.ComponentCount + missingComponents,
 30165                target.PageCount + missingPages,
 30166                meter,
 30167                out enlargedLookupReservation))
 168        {
 1169            return false;
 170        }
 29171        int appendProbeCount = source.ComponentCount + source.PageCount;
 29172        if (meter.TryConsumeLookupProbes(appendProbeCount))
 27173            return true;
 2174        meter.TrySetLookupReservationFloor(priorLookupReservation);
 2175        return false;
 176    }
 177
 178    internal static bool TryCombineLookupReservation(
 179        int comparisonCount,
 180        int componentCount,
 181        int pageCount,
 182        out int reservation)
 183    {
 184        try
 185        {
 120186            reservation = checked(comparisonCount + componentCount + pageCount);
 118187            return true;
 188        }
 2189        catch (OverflowException)
 190        {
 2191            reservation = 0;
 2192            return false;
 193        }
 120194    }
 195
 196    internal static bool TryGetFinalizationLookupReservation(
 197        int componentCount,
 198        int pageCount,
 199        out int reservation)
 200    {
 201        try
 202        {
 118203            int comparisonCount = NavigationDependencySortWork.GetMaximumComparisonCount(
 118204                componentCount,
 118205                pageCount);
 115206            return TryCombineLookupReservation(
 115207                comparisonCount,
 115208                componentCount,
 115209                pageCount,
 115210                out reservation);
 211        }
 3212        catch (OverflowException)
 213        {
 3214            reservation = 0;
 3215            return false;
 216        }
 118217    }
 218
 219    private static bool TrySetFinalizationLookupReservation(
 220        int componentCount,
 221        int pageCount,
 222        NavigationWorkMeter meter,
 223        out int reservation) =>
 112224        TryGetFinalizationLookupReservation(
 112225            componentCount,
 112226            pageCount,
 112227            out reservation)
 112228        && meter.TrySetLookupReservationFloor(reservation);
 229}

Methods/Properties

IsEpochCurrent(System.Boolean,System.UInt64,System.UInt64)
ResolveEndpointStatus(Trailblazer.Pathing.NavigationEndpointResolutionStatus,System.Boolean,System.Boolean,System.Boolean)
ResolveEndpointCursorStatus(System.Boolean)
TryResolveTraversalTerminalStatus(Trailblazer.Pathing.NavigationTraversalEdgeAdvanceStatus,Trailblazer.Pathing.NavigationSurfaceAStarStatus&)
ResolveTraversalEpochStatus(Trailblazer.Pathing.NavigationTraversalEdgeAdvanceStatus,System.Boolean)
ResolveAStarEpochStatus(Trailblazer.Pathing.NavigationSurfaceAStarStatus,System.Boolean)
ResolveBlockedTraversalStatus(System.Boolean,System.Int32,System.Int32)
ResolveIncompleteLookupStatus(System.Int32)
ShouldConsumeTraversalSurfacePoint(System.Boolean,Trailblazer.Pathing.NavigationTraversalEdgeAdvanceStatus)
TryGetEuclideanHeuristic(System.Boolean,FixedMathSharp.Vector3d,FixedMathSharp.Vector3d,FixedMathSharp.Fixed64&)
ShouldAcceptSimplificationRay(Trailblazer.Pathing.NavigationCellAddress,Trailblazer.Pathing.NavigationCellAddress,FixedMathSharp.Fixed64,FixedMathSharp.Fixed64)
TryAdmitSimplification(System.Int32,System.Int32,System.Int32,System.Int32,Trailblazer.Pathing.NavigationWorkMeter,System.Int32&)
TryPrepareDependencyMerge(System.Boolean,Trailblazer.Pathing.NavigationDependencyWorkspace,Trailblazer.Pathing.NavigationDependencyWorkspace,Trailblazer.Pathing.NavigationWorkMeter,System.Int32,System.Int32&)
TryCombineLookupReservation(System.Int32,System.Int32,System.Int32,System.Int32&)
TryGetFinalizationLookupReservation(System.Int32,System.Int32,System.Int32&)
TrySetFinalizationLookupReservation(System.Int32,System.Int32,Trailblazer.Pathing.NavigationWorkMeter,System.Int32&)