< Summary

Information
Class: Trailblazer.Pathing.NavigationRayRequest
Assembly: Trailblazer
File(s): /home/runner/work/Trailblazer/Trailblazer/src/Trailblazer/Pathing/Search/Ray/NavigationRayStatus.cs
Line coverage
100%
Covered lines: 19
Uncovered lines: 0
Coverable lines: 19
Total lines: 171
Line coverage: 100%
Branch coverage
100%
Covered branches: 6
Total branches: 6
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%66100%

File(s)

/home/runner/work/Trailblazer/Trailblazer/src/Trailblazer/Pathing/Search/Ray/NavigationRayStatus.cs

#LineLine coverage
 1//=======================================================================
 2// NavigationRayStatus.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;
 10using GridForge.Grids;
 11
 12namespace Trailblazer.Pathing;
 13
 14internal enum NavigationRayStatus : byte
 15{
 16    Pending,
 17    Success,
 18    Blocked,
 19    BudgetExceeded,
 20    CostOverflow,
 21    CapacityExceeded,
 22    Stale
 23}
 24
 25internal enum NavigationRayEndpointAllowance : byte
 26{
 27    None,
 28    StartPrefix,
 29    DestinationSuffix
 30}
 31
 32internal enum NavigationRayChainConstraintKind : byte
 33{
 34    Unrestricted,
 35    SourceAddress,
 36    SelectedEdge,
 37    SeedAddress,
 38    FinishAddress
 39}
 40
 41internal readonly struct NavigationRayChainConstraint
 42{
 43    private NavigationRayChainConstraint(
 44        NavigationRayChainConstraintKind kind,
 45        NavigationCellAddress sourceAddress,
 46        NavigationCellAddress targetAddress,
 47        int edgeOrdinal)
 48    {
 49        Kind = kind;
 50        SourceAddress = sourceAddress;
 51        TargetAddress = targetAddress;
 52        EdgeOrdinal = edgeOrdinal;
 53    }
 54
 55    internal NavigationRayChainConstraintKind Kind { get; }
 56
 57    internal NavigationCellAddress SourceAddress { get; }
 58
 59    internal NavigationCellAddress TargetAddress { get; }
 60
 61    internal int EdgeOrdinal { get; }
 62
 63    internal static NavigationRayChainConstraint SourceOnly(
 64        NavigationCellAddress sourceAddress) =>
 65        new(NavigationRayChainConstraintKind.SourceAddress, sourceAddress, default, -1);
 66
 67    internal static NavigationRayChainConstraint SelectedEdge(
 68        NavigationCellAddress sourceAddress,
 69        NavigationCellAddress targetAddress,
 70        int edgeOrdinal)
 71    {
 72        SwiftThrowHelper.ThrowIfNegative(edgeOrdinal, nameof(edgeOrdinal));
 73        return new(
 74            NavigationRayChainConstraintKind.SelectedEdge,
 75            sourceAddress,
 76            targetAddress,
 77            edgeOrdinal);
 78    }
 79
 80    internal static NavigationRayChainConstraint SeedAt(
 81        NavigationCellAddress sourceAddress) =>
 82        new(NavigationRayChainConstraintKind.SeedAddress, sourceAddress, default, -1);
 83
 84    internal static NavigationRayChainConstraint FinishAt(
 85        NavigationCellAddress targetAddress) =>
 86        new(NavigationRayChainConstraintKind.FinishAddress, default, targetAddress, -1);
 87}
 88
 89internal readonly struct NavigationRayRequest
 90{
 91    internal NavigationRayRequest(
 92        GridWorld world,
 93        NavigationWorldGraphStore store,
 94        NavigationWorldGraph expectedGraph,
 95        NavigationAgentProfile profile,
 96        NavigationAreaPolicy areaPolicy,
 97        TraversalMedium medium,
 98        Vector3d start,
 99        Vector3d end,
 100        NavigationRayEndpointAllowance endpointAllowance,
 101        NavigationRayChainConstraint chainConstraint = default)
 102    {
 1221103        SwiftThrowHelper.ThrowIfNull(world, nameof(world));
 1221104        SwiftThrowHelper.ThrowIfNull(store, nameof(store));
 1221105        SwiftThrowHelper.ThrowIfNull(expectedGraph, nameof(expectedGraph));
 1221106        SwiftThrowHelper.ThrowIfNull(areaPolicy, nameof(areaPolicy));
 1221107        if (medium is not TraversalMedium.Solid
 1221108            and not TraversalMedium.Gas
 1221109            and not TraversalMedium.Liquid)
 110        {
 1111            throw new ArgumentOutOfRangeException(nameof(medium));
 112        }
 1220113        World = world;
 1220114        Store = store;
 1220115        ExpectedGraph = expectedGraph;
 1220116        Profile = profile;
 1220117        AreaPolicy = areaPolicy;
 1220118        Medium = medium;
 1220119        Start = start;
 1220120        End = end;
 1220121        EndpointAllowance = endpointAllowance;
 1220122        ChainConstraint = chainConstraint;
 1220123    }
 124
 125    internal GridWorld World { get; }
 126
 127    internal NavigationWorldGraphStore Store { get; }
 128
 129    internal NavigationWorldGraph ExpectedGraph { get; }
 130
 131    internal NavigationAgentProfile Profile { get; }
 132
 133    internal NavigationAreaPolicy AreaPolicy { get; }
 134
 135    internal TraversalMedium Medium { get; }
 136
 137    internal Vector3d Start { get; }
 138
 139    internal Vector3d End { get; }
 140
 141    internal NavigationRayEndpointAllowance EndpointAllowance { get; }
 142
 143    internal NavigationRayChainConstraint ChainConstraint { get; }
 144}
 145
 146internal readonly struct NavigationRayResult
 147{
 148    internal NavigationRayResult(
 149        NavigationRayStatus status,
 150        NavigationCellAddress startAddress,
 151        NavigationCellAddress endAddress,
 152        Fixed64 traversalCost,
 153        bool isSemanticCostNeutral)
 154    {
 155        Status = status;
 156        StartAddress = startAddress;
 157        EndAddress = endAddress;
 158        TraversalCost = traversalCost;
 159        IsSemanticCostNeutral = isSemanticCostNeutral;
 160    }
 161
 162    internal NavigationRayStatus Status { get; }
 163
 164    internal NavigationCellAddress StartAddress { get; }
 165
 166    internal NavigationCellAddress EndAddress { get; }
 167
 168    internal Fixed64 TraversalCost { get; }
 169
 170    internal bool IsSemanticCostNeutral { get; }
 171}