< Summary

Information
Class: Trailblazer.Pathing.NavigationNativeSurfaceEdgeEnumerator
Assembly: Trailblazer
File(s): /home/runner/work/Trailblazer/Trailblazer/src/Trailblazer/Pathing/Graph/NavigationNativeSurfaceEdgeEnumerator.cs
Line coverage
100%
Covered lines: 62
Uncovered lines: 0
Coverable lines: 62
Total lines: 116
Line coverage: 100%
Branch coverage
100%
Covered branches: 36
Total branches: 36
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%11100%
MoveNext()100%1616100%
AdvanceOne(...)100%2020100%

File(s)

/home/runner/work/Trailblazer/Trailblazer/src/Trailblazer/Pathing/Graph/NavigationNativeSurfaceEdgeEnumerator.cs

#LineLine coverage
 1//=======================================================================
 2// NavigationNativeSurfaceEdgeEnumerator.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 GridForge.Grids.Topology;
 9using GridForge.Spatial;
 10
 11namespace Trailblazer.Pathing;
 12
 13/// <summary>Enumerates physically present native surface neighbors in canonical address order.</summary>
 14internal struct NavigationNativeSurfaceEdgeEnumerator
 15{
 16    private readonly NavigationWorldGraph? _graph;
 17    private readonly NavigationMapInstance? _instance;
 18    private readonly int _mapOrdinal;
 19    private readonly VoxelIndex _sourceIndex;
 20    private readonly bool _structural;
 21    private int _directionIndex;
 22
 23    internal NavigationNativeSurfaceEdgeEnumerator(
 24        NavigationWorldGraph graph,
 25        int mapOrdinal,
 26        NavigationMapInstance instance,
 27        VoxelIndex sourceIndex,
 28        bool structural = false)
 29    {
 54114830        _graph = graph;
 54114831        _instance = instance;
 54114832        _mapOrdinal = mapOrdinal;
 54114833        _sourceIndex = sourceIndex;
 54114834        _structural = structural;
 54114835        _directionIndex = 0;
 54114836        Current = default;
 54114837    }
 38
 39    internal NavigationGraphEdge Current { get; private set; }
 40
 41    internal bool MoveNext()
 42    {
 30790343        if (_graph == null || _instance == null)
 144            return false;
 45
 30790246        GridTopologyKind topology = _instance.Map.GridBinding.Configuration.TopologyKind;
 30790247        int directionCount = NavigationMap.GetNativeSurfaceDirectionCount(topology);
 81927348        while (_directionIndex < directionCount)
 49        {
 66979550            int directionIndex = _directionIndex++;
 66979551            VoxelIndex offset = NavigationMap.GetNativeSurfaceOffset(topology, directionIndex);
 66979552            var targetIndex = new VoxelIndex(
 66979553                _sourceIndex.x + offset.x,
 66979554                _sourceIndex.y + offset.y,
 66979555                _sourceIndex.z + offset.z);
 66979556            if (!_instance.Map.GridBinding.IsValidIndex(targetIndex)
 66979557                || !_graph.TryGetNodeRef(_mapOrdinal, targetIndex, out NavigationNodeRef target)
 66979558                || (_structural
 66979559                    ? !_instance.TryGetEffectiveCell(target.CellSlot, out _)
 66979560                    : !_graph.TryGetNodeState(target, out NavigationNodeState state)
 66979561                        || !state.IsPresent))
 62            {
 63                continue;
 64            }
 65
 15842466            Current = new NavigationGraphEdge(
 15842467                target,
 15842468                NavigationGraphEdgeKind.Native,
 15842469                _instance.Map.GetNativePortalTemplate(directionIndex),
 15842470                directionIndex);
 15842471            return true;
 72        }
 73
 14947874        Current = default;
 14947875        return false;
 76    }
 77
 78    internal NavigationSurfaceEdgeAdvanceStatus AdvanceOne(
 79        MaintenanceWorkMeter meter,
 80        ref int edgeStepRemaining)
 81    {
 135875182        if (_graph == null || _instance == null)
 283            return NavigationSurfaceEdgeAdvanceStatus.Complete;
 135874984        GridTopologyKind topology = _instance.Map.GridBinding.Configuration.TopologyKind;
 135874985        int directionCount = NavigationMap.GetNativeSurfaceDirectionCount(topology);
 135874986        if (_directionIndex >= directionCount)
 87        {
 18469388            Current = default;
 18469389            return NavigationSurfaceEdgeAdvanceStatus.Complete;
 90        }
 117405691        if (edgeStepRemaining == 0 || !meter.TryConsumeSurfaceComponentEdges(1))
 21392            return NavigationSurfaceEdgeAdvanceStatus.Blocked;
 117384393        edgeStepRemaining--;
 117384394        int directionIndex = _directionIndex++;
 117384395        VoxelIndex offset = NavigationMap.GetNativeSurfaceOffset(topology, directionIndex);
 117384396        var targetIndex = new VoxelIndex(
 117384397            _sourceIndex.x + offset.x,
 117384398            _sourceIndex.y + offset.y,
 117384399            _sourceIndex.z + offset.z);
 1173843100        if (!_instance.Map.GridBinding.IsValidIndex(targetIndex)
 1173843101            || !_graph.TryGetNodeRef(_mapOrdinal, targetIndex, out NavigationNodeRef target)
 1173843102            || (_structural
 1173843103                ? !_instance.TryGetEffectiveCell(target.CellSlot, out _)
 1173843104                : !_graph.TryGetNodeState(target, out NavigationNodeState state)
 1173843105                    || !state.IsPresent))
 106        {
 543330107            return NavigationSurfaceEdgeAdvanceStatus.Pending;
 108        }
 630513109        Current = new NavigationGraphEdge(
 630513110            target,
 630513111            NavigationGraphEdgeKind.Native,
 630513112            _instance.Map.GetNativePortalTemplate(directionIndex),
 630513113            directionIndex);
 630513114        return NavigationSurfaceEdgeAdvanceStatus.Edge;
 115    }
 116}