< Summary

Information
Class: Trailblazer.Pathing.PathManagerExternalGridBridge
Assembly: Trailblazer
File(s): /home/runner/work/Trailblazer/Trailblazer/src/Trailblazer/Pathing/GridBridge/PathManagerExternalGridBridge.cs
Line coverage
100%
Covered lines: 196
Uncovered lines: 0
Coverable lines: 196
Total lines: 417
Line coverage: 100%
Branch coverage
93%
Covered branches: 62
Total branches: 66
Branch coverage: 93.9%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get__eventObservationsByGridIndex()100%11100%
get__pendingGridChangesByGridIndex()100%11100%
get__pendingGridChangeOrder()100%11100%
get__gridEventsReceived()100%11100%
set__gridEventsReceived(...)100%11100%
get__gridAddEventsReceived()100%11100%
set__gridAddEventsReceived(...)100%11100%
get__gridRemoveEventsReceived()100%11100%
set__gridRemoveEventsReceived(...)100%11100%
get__gridChangeEventsReceived()100%11100%
set__gridChangeEventsReceived(...)100%11100%
get__distinctObservedGridSlots()100%11100%
set__distinctObservedGridSlots(...)100%11100%
get__duplicateGridEventSignaturesObserved()100%11100%
set__duplicateGridEventSignaturesObserved(...)100%11100%
get__duplicateGridAddEventSignaturesObserved()100%11100%
set__duplicateGridAddEventSignaturesObserved(...)100%11100%
get__duplicateGridRemoveEventSignaturesObserved()100%11100%
set__duplicateGridRemoveEventSignaturesObserved(...)100%11100%
get__duplicateGridChangeEventSignaturesObserved()100%11100%
set__duplicateGridChangeEventSignaturesObserved(...)100%11100%
get__maxGridEventStreak()100%11100%
set__maxGridEventStreak(...)100%11100%
get__gridRebuildPassesExecuted()100%11100%
set__gridRebuildPassesExecuted(...)100%11100%
get__gridEventsIgnoredForNoIntersectingCharts()100%11100%
set__gridEventsIgnoredForNoIntersectingCharts(...)100%11100%
get__totalChartsSelectedForGridRebuild()100%11100%
set__totalChartsSelectedForGridRebuild(...)100%11100%
get__maxChartsSelectedForSingleGridEvent()100%11100%
set__maxChartsSelectedForSingleGridEvent(...)100%11100%
GetDiagnosticsSnapshot()100%11100%
ResetDiagnostics()100%11100%
HandleGridAdded(...)100%11100%
HandleGridRemoved(...)100%11100%
HandleGridChanged(...)100%11100%
FlushPendingGridChanges()81.25%1616100%
HandleGridReset()100%11100%
HandleGridChange(...)100%22100%
RecordGridEvent(...)93.75%1616100%
RecordGridRebuildSelection(...)100%44100%
QueuePendingGridChange(...)100%22100%
CreatePendingGridChange(...)100%11100%
MergePendingGridChange(...)100%22100%
MergePendingGridChangeAcrossSpawnTokens(...)100%11100%
MergePendingGridChangeForSameSpawnToken(...)100%1212100%
ClearPendingGridChanges()100%11100%
MinBounds(...)100%66100%
MaxBounds(...)100%66100%

File(s)

/home/runner/work/Trailblazer/Trailblazer/src/Trailblazer/Pathing/GridBridge/PathManagerExternalGridBridge.cs

#LineLine coverage
 1using FixedMathSharp;
 2using GridForge.Grids;
 3using SwiftCollections;
 4
 5namespace Trailblazer.Pathing;
 6
 7/// <summary>
 8/// Routes external-grid bridge diagnostics and event-signature tracking through the active pathing context.
 9/// </summary>
 10internal static class PathManagerExternalGridBridge
 11{
 12    private static SwiftDictionary<ushort, ExternalGridEventObservation> _eventObservationsByGridIndex =>
 568013        PathManager.ActiveState.ExternalGridEventObservationsByGridIndex;
 14
 15    private static SwiftDictionary<ushort, PendingExternalGridChange> _pendingGridChangesByGridIndex =>
 709516        PathManager.ActiveState.PendingGridChangesByGridIndex;
 17
 18    private static SwiftList<ushort> _pendingGridChangeOrder =>
 898419        PathManager.ActiveState.PendingGridChangeOrder;
 20
 21    private static int _gridEventsReceived
 22    {
 203523        get => PathManager.ActiveState.GridEventsReceived;
 366124        set => PathManager.ActiveState.GridEventsReceived = value;
 25    }
 26
 27    private static int _gridAddEventsReceived
 28    {
 74329        get => PathManager.ActiveState.GridAddEventsReceived;
 236930        set => PathManager.ActiveState.GridAddEventsReceived = value;
 31    }
 32
 33    private static int _gridRemoveEventsReceived
 34    {
 2535        get => PathManager.ActiveState.GridRemoveEventsReceived;
 165136        set => PathManager.ActiveState.GridRemoveEventsReceived = value;
 37    }
 38
 39    private static int _gridChangeEventsReceived
 40    {
 129941        get => PathManager.ActiveState.GridChangeEventsReceived;
 292542        set => PathManager.ActiveState.GridChangeEventsReceived = value;
 43    }
 44
 45    private static int _distinctObservedGridSlots
 46    {
 74547        get => PathManager.ActiveState.DistinctObservedGridSlots;
 237148        set => PathManager.ActiveState.DistinctObservedGridSlots = value;
 49    }
 50
 51    private static int _duplicateGridEventSignaturesObserved
 52    {
 1953        get => PathManager.ActiveState.DuplicateGridEventSignaturesObserved;
 164554        set => PathManager.ActiveState.DuplicateGridEventSignaturesObserved = value;
 55    }
 56
 57    private static int _duplicateGridAddEventSignaturesObserved
 58    {
 1759        get => PathManager.ActiveState.DuplicateGridAddEventSignaturesObserved;
 164360        set => PathManager.ActiveState.DuplicateGridAddEventSignaturesObserved = value;
 61    }
 62
 63    private static int _duplicateGridRemoveEventSignaturesObserved
 64    {
 1765        get => PathManager.ActiveState.DuplicateGridRemoveEventSignaturesObserved;
 164366        set => PathManager.ActiveState.DuplicateGridRemoveEventSignaturesObserved = value;
 67    }
 68
 69    private static int _duplicateGridChangeEventSignaturesObserved
 70    {
 1771        get => PathManager.ActiveState.DuplicateGridChangeEventSignaturesObserved;
 164372        set => PathManager.ActiveState.DuplicateGridChangeEventSignaturesObserved = value;
 73    }
 74
 75    private static int _maxGridEventStreak
 76    {
 203577        get => PathManager.ActiveState.MaxGridEventStreak;
 236078        set => PathManager.ActiveState.MaxGridEventStreak = value;
 79    }
 80
 81    private static int _gridRebuildPassesExecuted
 82    {
 3883        get => PathManager.ActiveState.GridRebuildPassesExecuted;
 166484        set => PathManager.ActiveState.GridRebuildPassesExecuted = value;
 85    }
 86
 87    private static int _gridEventsIgnoredForNoIntersectingCharts
 88    {
 46089        get => PathManager.ActiveState.GridEventsIgnoredForNoIntersectingCharts;
 208690        set => PathManager.ActiveState.GridEventsIgnoredForNoIntersectingCharts = value;
 91    }
 92
 93    private static int _totalChartsSelectedForGridRebuild
 94    {
 3895        get => PathManager.ActiveState.TotalChartsSelectedForGridRebuild;
 166496        set => PathManager.ActiveState.TotalChartsSelectedForGridRebuild = value;
 97    }
 98
 99    private static int _maxChartsSelectedForSingleGridEvent
 100    {
 38101        get => PathManager.ActiveState.MaxChartsSelectedForSingleGridEvent;
 1661102        set => PathManager.ActiveState.MaxChartsSelectedForSingleGridEvent = value;
 103    }
 104
 105    internal static ExternalGridBridgeDiagnosticsSnapshot GetDiagnosticsSnapshot()
 106    {
 16107        return new ExternalGridBridgeDiagnosticsSnapshot(
 16108            totalGridEventsReceived: _gridEventsReceived,
 16109            addedEventsReceived: _gridAddEventsReceived,
 16110            removedEventsReceived: _gridRemoveEventsReceived,
 16111            changedEventsReceived: _gridChangeEventsReceived,
 16112            distinctGridSlotsObserved: _distinctObservedGridSlots,
 16113            duplicateEventSignaturesObserved: _duplicateGridEventSignaturesObserved,
 16114            duplicateAddEventSignaturesObserved: _duplicateGridAddEventSignaturesObserved,
 16115            duplicateRemoveEventSignaturesObserved: _duplicateGridRemoveEventSignaturesObserved,
 16116            duplicateChangeEventSignaturesObserved: _duplicateGridChangeEventSignaturesObserved,
 16117            maxIdenticalEventStreak: _maxGridEventStreak,
 16118            rebuildPassesExecuted: _gridRebuildPassesExecuted,
 16119            eventsIgnoredForNoIntersectingCharts: _gridEventsIgnoredForNoIntersectingCharts,
 16120            totalChartsSelectedForRebuild: _totalChartsSelectedForGridRebuild,
 16121            maxChartsSelectedForSingleEvent: _maxChartsSelectedForSingleGridEvent);
 122    }
 123
 124    internal static void ResetDiagnostics()
 125    {
 1642126        _eventObservationsByGridIndex.Clear();
 1642127        _pendingGridChangesByGridIndex.Clear();
 1642128        _pendingGridChangeOrder.Clear();
 1642129        _gridEventsReceived = 0;
 1642130        _gridAddEventsReceived = 0;
 1642131        _gridRemoveEventsReceived = 0;
 1642132        _gridChangeEventsReceived = 0;
 1642133        _distinctObservedGridSlots = 0;
 1642134        _duplicateGridEventSignaturesObserved = 0;
 1642135        _duplicateGridAddEventSignaturesObserved = 0;
 1642136        _duplicateGridRemoveEventSignaturesObserved = 0;
 1642137        _duplicateGridChangeEventSignaturesObserved = 0;
 1642138        _maxGridEventStreak = 0;
 1642139        _gridRebuildPassesExecuted = 0;
 1642140        _gridEventsIgnoredForNoIntersectingCharts = 0;
 1642141        _totalChartsSelectedForGridRebuild = 0;
 1642142        _maxChartsSelectedForSingleGridEvent = 0;
 1642143    }
 144
 145    internal static void HandleGridAdded(GridEventInfo eventInfo)
 146    {
 727147        HandleGridChange(eventInfo, ExternalGridEventKind.Added);
 727148    }
 149
 150    internal static void HandleGridRemoved(GridEventInfo eventInfo)
 151    {
 9152        HandleGridChange(eventInfo, ExternalGridEventKind.Removed);
 9153    }
 154
 155    internal static void HandleGridChanged(GridEventInfo eventInfo)
 156    {
 1283157        HandleGridChange(eventInfo, ExternalGridEventKind.Changed);
 1283158    }
 159
 160    internal static void FlushPendingGridChanges()
 161    {
 3266162        if (_pendingGridChangeOrder.Count == 0)
 2799163            return;
 164
 467165        int requestCount = 0;
 1890166        for (int i = 0; i < _pendingGridChangeOrder.Count; i++)
 167        {
 478168            ushort gridIndex = _pendingGridChangeOrder[i];
 478169            if (_pendingGridChangesByGridIndex.TryGetValue(gridIndex, out PendingExternalGridChange pendingChange)
 478170                && pendingChange.HasSelectionCriteria)
 171            {
 476172                requestCount++;
 173            }
 174        }
 175
 467176        if (requestCount == 0)
 177        {
 1178            ClearPendingGridChanges();
 1179            return;
 180        }
 181
 466182        ExternalGridChartRebuildRequest[] rebuildRequests = new ExternalGridChartRebuildRequest[requestCount];
 466183        int requestIndex = 0;
 1884184        for (int i = 0; i < _pendingGridChangeOrder.Count; i++)
 185        {
 476186            ushort gridIndex = _pendingGridChangeOrder[i];
 476187            if (!_pendingGridChangesByGridIndex.TryGetValue(gridIndex, out PendingExternalGridChange pendingChange)
 476188                || !pendingChange.HasSelectionCriteria)
 189            {
 190                continue;
 191            }
 192
 476193            rebuildRequests[requestIndex++] = pendingChange.ToRebuildRequest(gridIndex);
 194        }
 195
 466196        ClearPendingGridChanges();
 466197        RecordGridRebuildSelection(PathManager.RebuildInitializedChartsAgainstExternalGridRequests(rebuildRequests));
 466198    }
 199
 200    private static void HandleGridReset()
 201    {
 1202        PathManager.Reset();
 1203    }
 204
 205    private static void HandleGridChange(GridEventInfo eventInfo, ExternalGridEventKind eventKind)
 206    {
 2019207        if (RecordGridEvent(eventInfo, eventKind))
 3208            return;
 209
 2016210        QueuePendingGridChange(eventInfo, eventKind);
 2016211    }
 212
 213    private static bool RecordGridEvent(GridEventInfo eventInfo, ExternalGridEventKind eventKind)
 214    {
 2019215        _gridEventsReceived++;
 216
 217        switch (eventKind)
 218        {
 219            case ExternalGridEventKind.Added:
 727220                _gridAddEventsReceived++;
 727221                break;
 222            case ExternalGridEventKind.Removed:
 9223                _gridRemoveEventsReceived++;
 9224                break;
 225            default:
 1283226                _gridChangeEventsReceived++;
 227                break;
 228        }
 229
 2019230        ExternalGridEventSignature signature = new(
 2019231            eventKind,
 2019232            eventInfo.GridSpawnToken,
 2019233            eventInfo.GridVersion,
 2019234            eventInfo.Configuration,
 2019235            eventInfo.BoundsMin,
 2019236            eventInfo.BoundsMax);
 237
 2019238        if (_eventObservationsByGridIndex.TryGetValue(eventInfo.GridIndex, out ExternalGridEventObservation observation)
 239        {
 1290240            if (observation.Signature.Equals(signature))
 241            {
 3242                _duplicateGridEventSignaturesObserved++;
 243                switch (eventKind)
 244                {
 245                    case ExternalGridEventKind.Added:
 1246                        _duplicateGridAddEventSignaturesObserved++;
 1247                        break;
 248                    case ExternalGridEventKind.Removed:
 1249                        _duplicateGridRemoveEventSignaturesObserved++;
 1250                        break;
 251                    default:
 1252                        _duplicateGridChangeEventSignaturesObserved++;
 253                        break;
 254                }
 255
 3256                observation = new ExternalGridEventObservation(signature, observation.IdenticalEventStreak + 1);
 3257                _eventObservationsByGridIndex[eventInfo.GridIndex] = observation;
 3258                if (observation.IdenticalEventStreak > _maxGridEventStreak)
 3259                    _maxGridEventStreak = observation.IdenticalEventStreak;
 260
 3261                return true;
 262            }
 263            else
 264            {
 1287265                observation = new ExternalGridEventObservation(signature, identicalEventStreak: 1);
 266            }
 267        }
 268        else
 269        {
 729270            _distinctObservedGridSlots++;
 729271            observation = new ExternalGridEventObservation(signature, identicalEventStreak: 1);
 272        }
 273
 2016274        _eventObservationsByGridIndex[eventInfo.GridIndex] = observation;
 2016275        if (observation.IdenticalEventStreak > _maxGridEventStreak)
 715276            _maxGridEventStreak = observation.IdenticalEventStreak;
 277
 2016278        return false;
 279    }
 280
 281    private static void RecordGridRebuildSelection(int chartCount)
 282    {
 466283        if (chartCount <= 0)
 284        {
 444285            _gridEventsIgnoredForNoIntersectingCharts++;
 444286            return;
 287        }
 288
 22289        _gridRebuildPassesExecuted++;
 22290        _totalChartsSelectedForGridRebuild += chartCount;
 22291        if (chartCount > _maxChartsSelectedForSingleGridEvent)
 19292            _maxChartsSelectedForSingleGridEvent = chartCount;
 22293    }
 294
 295    private static void QueuePendingGridChange(GridEventInfo eventInfo, ExternalGridEventKind eventKind)
 296    {
 2016297        ushort gridIndex = eventInfo.GridIndex;
 2016298        if (_pendingGridChangesByGridIndex.TryGetValue(gridIndex, out PendingExternalGridChange pendingChange))
 299        {
 1248300            _pendingGridChangesByGridIndex[gridIndex] = MergePendingGridChange(pendingChange, eventInfo, eventKind);
 1248301            return;
 302        }
 303
 768304        _pendingGridChangesByGridIndex[gridIndex] = CreatePendingGridChange(eventInfo, eventKind);
 768305        _pendingGridChangeOrder.Add(gridIndex);
 768306    }
 307
 308    private static PendingExternalGridChange CreatePendingGridChange(
 309        GridEventInfo eventInfo,
 310        ExternalGridEventKind eventKind)
 311    {
 768312        return new PendingExternalGridChange(
 768313            eventInfo.GridSpawnToken,
 768314            eventInfo.GridVersion,
 768315            eventInfo.BoundsMin,
 768316            eventInfo.BoundsMax,
 768317            requiresLiveGridTouchSelection: eventKind != ExternalGridEventKind.Added,
 768318            requiresAuthoredCellBoundsSelection: eventKind == ExternalGridEventKind.Added);
 319    }
 320
 321    private static PendingExternalGridChange MergePendingGridChange(
 322        PendingExternalGridChange pendingChange,
 323        GridEventInfo eventInfo,
 324        ExternalGridEventKind eventKind)
 325    {
 1248326        if (pendingChange.GridSpawnToken != eventInfo.GridSpawnToken)
 2327            return MergePendingGridChangeAcrossSpawnTokens(pendingChange, eventInfo, eventKind);
 328
 1246329        return MergePendingGridChangeForSameSpawnToken(pendingChange, eventInfo, eventKind);
 330    }
 331
 332    private static PendingExternalGridChange MergePendingGridChangeAcrossSpawnTokens(
 333        PendingExternalGridChange pendingChange,
 334        GridEventInfo eventInfo,
 335        ExternalGridEventKind eventKind)
 336    {
 2337        return new PendingExternalGridChange(
 2338            eventInfo.GridSpawnToken,
 2339            eventInfo.GridVersion,
 2340            eventInfo.BoundsMin,
 2341            eventInfo.BoundsMax,
 2342            requiresLiveGridTouchSelection: pendingChange.RequiresLiveGridTouchSelection,
 2343            requiresAuthoredCellBoundsSelection: eventKind != ExternalGridEventKind.Removed);
 344    }
 345
 346    private static PendingExternalGridChange MergePendingGridChangeForSameSpawnToken(
 347        PendingExternalGridChange pendingChange,
 348        GridEventInfo eventInfo,
 349        ExternalGridEventKind eventKind)
 350    {
 1248351        bool requiresLiveGridTouchSelection = pendingChange.RequiresLiveGridTouchSelection;
 1248352        bool requiresAuthoredCellBoundsSelection = pendingChange.RequiresAuthoredCellBoundsSelection;
 353
 354        switch (eventKind)
 355        {
 356            case ExternalGridEventKind.Added:
 1357                requiresAuthoredCellBoundsSelection = true;
 1358                break;
 359
 360            case ExternalGridEventKind.Changed:
 1245361                if (!requiresAuthoredCellBoundsSelection)
 1205362                    requiresLiveGridTouchSelection = true;
 363
 1205364                break;
 365
 366            case ExternalGridEventKind.Removed:
 2367                if (requiresAuthoredCellBoundsSelection && !requiresLiveGridTouchSelection)
 1368                    requiresAuthoredCellBoundsSelection = false;
 369                else
 370                {
 1371                    requiresLiveGridTouchSelection = true;
 1372                    requiresAuthoredCellBoundsSelection = false;
 373                }
 374
 375                break;
 376        }
 377
 1248378        Vector3d boundsMin = eventInfo.BoundsMin;
 1248379        Vector3d boundsMax = eventInfo.BoundsMax;
 1248380        if (requiresAuthoredCellBoundsSelection)
 381        {
 41382            boundsMin = MinBounds(pendingChange.BoundsMin, eventInfo.BoundsMin);
 41383            boundsMax = MaxBounds(pendingChange.BoundsMax, eventInfo.BoundsMax);
 384        }
 385
 1248386        return new PendingExternalGridChange(
 1248387            eventInfo.GridSpawnToken,
 1248388            eventInfo.GridVersion,
 1248389            boundsMin,
 1248390            boundsMax,
 1248391            requiresLiveGridTouchSelection,
 1248392            requiresAuthoredCellBoundsSelection);
 393    }
 394
 395    private static void ClearPendingGridChanges()
 396    {
 467397        _pendingGridChangesByGridIndex.Clear();
 467398        _pendingGridChangeOrder.Clear();
 467399    }
 400
 401    private static Vector3d MinBounds(Vector3d left, Vector3d right)
 402    {
 41403        return new Vector3d(
 41404            left.x <= right.x ? left.x : right.x,
 41405            left.y <= right.y ? left.y : right.y,
 41406            left.z <= right.z ? left.z : right.z);
 407    }
 408
 409    private static Vector3d MaxBounds(Vector3d left, Vector3d right)
 410    {
 41411        return new Vector3d(
 41412            left.x >= right.x ? left.x : right.x,
 41413            left.y >= right.y ? left.y : right.y,
 41414            left.z >= right.z ? left.z : right.z);
 415    }
 416
 417}

Methods/Properties

get__eventObservationsByGridIndex()
get__pendingGridChangesByGridIndex()
get__pendingGridChangeOrder()
get__gridEventsReceived()
set__gridEventsReceived(System.Int32)
get__gridAddEventsReceived()
set__gridAddEventsReceived(System.Int32)
get__gridRemoveEventsReceived()
set__gridRemoveEventsReceived(System.Int32)
get__gridChangeEventsReceived()
set__gridChangeEventsReceived(System.Int32)
get__distinctObservedGridSlots()
set__distinctObservedGridSlots(System.Int32)
get__duplicateGridEventSignaturesObserved()
set__duplicateGridEventSignaturesObserved(System.Int32)
get__duplicateGridAddEventSignaturesObserved()
set__duplicateGridAddEventSignaturesObserved(System.Int32)
get__duplicateGridRemoveEventSignaturesObserved()
set__duplicateGridRemoveEventSignaturesObserved(System.Int32)
get__duplicateGridChangeEventSignaturesObserved()
set__duplicateGridChangeEventSignaturesObserved(System.Int32)
get__maxGridEventStreak()
set__maxGridEventStreak(System.Int32)
get__gridRebuildPassesExecuted()
set__gridRebuildPassesExecuted(System.Int32)
get__gridEventsIgnoredForNoIntersectingCharts()
set__gridEventsIgnoredForNoIntersectingCharts(System.Int32)
get__totalChartsSelectedForGridRebuild()
set__totalChartsSelectedForGridRebuild(System.Int32)
get__maxChartsSelectedForSingleGridEvent()
set__maxChartsSelectedForSingleGridEvent(System.Int32)
GetDiagnosticsSnapshot()
ResetDiagnostics()
HandleGridAdded(GridForge.Grids.GridEventInfo)
HandleGridRemoved(GridForge.Grids.GridEventInfo)
HandleGridChanged(GridForge.Grids.GridEventInfo)
FlushPendingGridChanges()
HandleGridReset()
HandleGridChange(GridForge.Grids.GridEventInfo,Trailblazer.Pathing.ExternalGridEventKind)
RecordGridEvent(GridForge.Grids.GridEventInfo,Trailblazer.Pathing.ExternalGridEventKind)
RecordGridRebuildSelection(System.Int32)
QueuePendingGridChange(GridForge.Grids.GridEventInfo,Trailblazer.Pathing.ExternalGridEventKind)
CreatePendingGridChange(GridForge.Grids.GridEventInfo,Trailblazer.Pathing.ExternalGridEventKind)
MergePendingGridChange(Trailblazer.Pathing.PendingExternalGridChange,GridForge.Grids.GridEventInfo,Trailblazer.Pathing.ExternalGridEventKind)
MergePendingGridChangeAcrossSpawnTokens(Trailblazer.Pathing.PendingExternalGridChange,GridForge.Grids.GridEventInfo,Trailblazer.Pathing.ExternalGridEventKind)
MergePendingGridChangeForSameSpawnToken(Trailblazer.Pathing.PendingExternalGridChange,GridForge.Grids.GridEventInfo,Trailblazer.Pathing.ExternalGridEventKind)
ClearPendingGridChanges()
MinBounds(FixedMathSharp.Vector3d,FixedMathSharp.Vector3d)
MaxBounds(FixedMathSharp.Vector3d,FixedMathSharp.Vector3d)