< Summary

Information
Class: Trailblazer.Pathing.TrailblazerPathingService
Assembly: Trailblazer
File(s): /home/runner/work/Trailblazer/Trailblazer/src/Trailblazer/Pathing/TrailblazerPathingService.cs
Line coverage
96%
Covered lines: 96
Uncovered lines: 3
Coverable lines: 99
Total lines: 248
Line coverage: 96.9%
Branch coverage
78%
Covered branches: 11
Total branches: 14
Branch coverage: 78.5%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

/home/runner/work/Trailblazer/Trailblazer/src/Trailblazer/Pathing/TrailblazerPathingService.cs

#LineLine coverage
 1using FixedMathSharp;
 2using GridForge.Grids;
 3using GridForge.Spatial;
 4using System;
 5using System.Collections.Generic;
 6
 7namespace Trailblazer.Pathing;
 8
 9/// <summary>
 10/// Context-owned pathing API for chart registration, live chart state, and local pathing queries.
 11/// </summary>
 12public sealed class TrailblazerPathingService
 13{
 14    private readonly TrailblazerWorldContext _context;
 15
 16    private bool _disposed;
 17
 96118    internal TrailblazerPathingService(TrailblazerWorldContext context)
 19    {
 96120        _context = context;
 96121        State = new PathingWorldState(context);
 96122    }
 23
 24    internal PathingWorldState State { get; }
 25
 26    /// <summary>
 27    /// Gets a snapshot of all charts registered to this context.
 28    /// </summary>
 29    public IEnumerable<NavigationChart> AllCharts
 30    {
 31        get
 32        {
 533            using (EnterUsableState())
 334                return PathManager.AllCharts;
 335        }
 36    }
 37
 38    /// <inheritdoc cref="PathManager.Register(NavigationChart,bool)"/>
 39    public bool Register(NavigationChart chart, bool initializeChart = true)
 40    {
 79541        using (EnterUsableState())
 79542            return PathManager.Register(_context.World, chart, initializeChart);
 79543    }
 44
 45    /// <inheritdoc cref="PathManager.Register(TraversalBuildResult,bool)"/>
 46    public bool Register(TraversalBuildResult buildResult, bool initializeChart = true)
 47    {
 448        using (EnterUsableState())
 449            return PathManager.Register(_context.World, buildResult, initializeChart);
 450    }
 51
 52    /// <inheritdoc cref="PathManager.IsChartRegistered(string)"/>
 53    public bool IsChartRegistered(string name)
 54    {
 955        using (EnterUsableState())
 956            return PathManager.IsChartRegistered(name);
 957    }
 58
 59    /// <inheritdoc cref="PathManager.TryGetNavigationChart(string,out NavigationChart)"/>
 60    public bool TryGetNavigationChart(string name, out NavigationChart chart)
 61    {
 162        using (EnterUsableState())
 163            return PathManager.TryGetNavigationChart(name, out chart);
 164    }
 65
 66    /// <inheritdoc cref="PathManager.TryGetNavigationChartRegistration(string,out NavigationChartRegistration)"/>
 67    public bool TryGetNavigationChartRegistration(string name, out NavigationChartRegistration registration)
 68    {
 169        using (EnterUsableState())
 170            return PathManager.TryGetNavigationChartRegistration(name, out registration);
 171    }
 72
 73    /// <inheritdoc cref="PathManager.IsChartInitialized(string)"/>
 74    public bool IsChartInitialized(string name)
 75    {
 476        using (EnterUsableState())
 477            return PathManager.IsChartInitialized(name);
 478    }
 79
 80    /// <inheritdoc cref="PathManager.IsChartInitialized(NavigationChart)"/>
 81    public bool IsChartInitialized(NavigationChart chart)
 82    {
 683        using (EnterUsableState())
 684            return PathManager.IsChartInitialized(chart);
 685    }
 86
 87    /// <inheritdoc cref="PathManager.InitializeAllCharts()"/>
 88    public void InitializeAllCharts()
 89    {
 190        using (EnterUsableState())
 191            PathManager.InitializeAllCharts(_context.World);
 192    }
 93
 94    /// <inheritdoc cref="PathManager.InitializeChart(string)"/>
 95    public void InitializeChart(string chartKey)
 96    {
 197        using (EnterUsableState())
 198            PathManager.InitializeChart(_context.World, chartKey);
 199    }
 100
 101    /// <inheritdoc cref="PathManager.UnloadChart(string)"/>
 102    public void UnloadChart(string chartKey)
 103    {
 3104        using (EnterUsableState())
 3105            PathManager.UnloadChart(_context.World, chartKey);
 3106    }
 107
 108    /// <inheritdoc cref="PathManager.UnloadChart(NavigationChart)"/>
 109    public void UnloadChart(NavigationChart chart)
 110    {
 2111        using (EnterUsableState())
 2112            PathManager.UnloadChart(_context.World, chart);
 2113    }
 114
 115    /// <inheritdoc cref="PathManager.TryGetEffectiveCell(GridWorld,Vector3d,out NavigationChartCell)"/>
 116    public bool TryGetEffectiveCell(Vector3d worldPosition, out NavigationChartCell cell)
 117    {
 10118        using (EnterUsableState())
 10119            return PathManager.TryGetEffectiveCell(_context.World, worldPosition, out cell);
 10120    }
 121
 122    /// <inheritdoc cref="PathManager.TryGetEffectiveCell(WorldVoxelIndex,out NavigationChartCell)"/>
 123    public bool TryGetEffectiveCell(WorldVoxelIndex voxelIndex, out NavigationChartCell cell)
 124    {
 1125        using (EnterUsableState())
 1126            return PathManager.TryGetEffectiveCell(voxelIndex, out cell);
 1127    }
 128
 129    /// <inheritdoc cref="PathManager.TryGetEffectiveChartOwner(GridWorld,Vector3d,out string?)"/>
 130    public bool TryGetEffectiveChartOwner(Vector3d worldPosition, out string? chartName)
 131    {
 4132        using (EnterUsableState())
 4133            return PathManager.TryGetEffectiveChartOwner(_context.World, worldPosition, out chartName);
 4134    }
 135
 136    /// <inheritdoc cref="PathManager.TryGetEffectiveChartOwner(WorldVoxelIndex,out string?)"/>
 137    public bool TryGetEffectiveChartOwner(WorldVoxelIndex voxelIndex, out string? chartName)
 138    {
 1139        using (EnterUsableState())
 1140            return PathManager.TryGetEffectiveChartOwner(voxelIndex, out chartName);
 1141    }
 142
 143    /// <inheritdoc cref="PathManager.TryUpdateChartCell(string,int,int,int,NavigationChartCell)"/>
 144    public bool TryUpdateChartCell(string chartName, int x, int y, int z, NavigationChartCell cell)
 145    {
 1146        using (EnterUsableState())
 1147            return PathManager.TryUpdateChartCell(_context.World, chartName, x, y, z, cell);
 1148    }
 149
 150    /// <inheritdoc cref="PathManager.TryUpdateChartCell(string,Vector3d,NavigationChartCell)"/>
 151    public bool TryUpdateChartCell(string chartName, Vector3d worldPosition, NavigationChartCell cell)
 152    {
 2153        using (EnterUsableState())
 2154            return PathManager.TryUpdateChartCell(_context.World, chartName, worldPosition, cell);
 2155    }
 156
 157    /// <inheritdoc cref="PathManager.ApplyChartUpdates(string,IReadOnlyList{NavigationChartCellUpdate})"/>
 158    public int ApplyChartUpdates(string chartName, IReadOnlyList<NavigationChartCellUpdate> updates)
 159    {
 1160        using (EnterUsableState())
 1161            return PathManager.ApplyChartUpdates(_context.World, chartName, updates);
 1162    }
 163
 164    /// <summary>
 165    /// Flushes pending grid event rebuild work for this context.
 166    /// </summary>
 167    public void FlushPendingGridChanges()
 168    {
 2300169        EnsureUsable();
 2300170        State.ExternalGridBridge.FlushPendingGridChanges();
 2300171    }
 172
 173    /// <summary>
 174    /// Gets diagnostics for this context's external-grid bridge.
 175    /// </summary>
 176    internal ExternalGridBridgeDiagnosticsSnapshot GetExternalGridBridgeDiagnosticsSnapshot()
 177    {
 2178        EnsureUsable();
 2179        return State.ExternalGridBridge.GetDiagnosticsSnapshot();
 180    }
 181
 182    internal bool TryGetMaxSearchSize(Voxel start, Voxel end, out int maxSearchSize)
 183    {
 1278184        EnsureUsable();
 1278185        GridWorld world = _context.World;
 1278186        if (!world.TryGetGrid(start.WorldIndex.GridIndex, out VoxelGrid? startGrid)
 1278187            || !world.TryGetGrid(end.WorldIndex.GridIndex, out VoxelGrid? endGrid))
 188        {
 0189            maxSearchSize = 0;
 0190            return false;
 191        }
 192
 1278193        maxSearchSize = startGrid == endGrid
 1278194            ? startGrid!.Size
 1278195            : startGrid!.Size + endGrid!.Size;
 1278196        return true;
 197    }
 198
 199    internal bool NeedsPath(
 200        Vector3d startPosition,
 201        Vector3d endPosition,
 202        Fixed64 unitSize,
 203        bool includeEnd = false)
 204    {
 85205        using (EnterUsableState())
 85206            return PathManager.NeedsPath(_context.World, startPosition, endPosition, unitSize, includeEnd);
 85207    }
 208
 209    internal void HandleGridChanged(GridEventInfo eventInfo)
 210    {
 1211        using (EnterUsableState())
 1212            PathManagerExternalGridBridge.HandleGridChanged(eventInfo);
 1213    }
 214
 215    /// <summary>
 216    /// Clears this context's registered charts, live partitions, transition registry, volume rules, and guide caches.
 217    /// </summary>
 218    public void Reset()
 219    {
 2220        EnsureUsable();
 2221        PathManager.ResetPathingState(State, resetScopedRegistries: true, flushGuideCache: true);
 2222    }
 223
 224    internal void Dispose()
 225    {
 961226        if (_disposed)
 0227            return;
 228
 961229        State.ExternalGridBridge.Dispose();
 961230        PathManager.ResetPathingState(State, resetScopedRegistries: true, flushGuideCache: true);
 961231        State.Dispose();
 961232        _disposed = true;
 961233    }
 234
 235    private IDisposable EnterUsableState()
 236    {
 938237        EnsureUsable();
 936238        return PathManager.EnterState(State);
 239    }
 240
 241    private void EnsureUsable()
 242    {
 4520243        if (_disposed || _context.IsDisposed)
 1244            throw new ObjectDisposedException(nameof(TrailblazerWorldContext));
 4519245        if (!_context.World.IsActive)
 1246            throw new InvalidOperationException("TrailblazerPathingService is bound to an inactive GridWorld.");
 4518247    }
 248}

Methods/Properties

.ctor(Trailblazer.TrailblazerWorldContext)
get_AllCharts()
Register(Trailblazer.Pathing.NavigationChart,System.Boolean)
Register(Trailblazer.Pathing.TraversalBuildResult,System.Boolean)
IsChartRegistered(System.String)
TryGetNavigationChart(System.String,Trailblazer.Pathing.NavigationChart&)
TryGetNavigationChartRegistration(System.String,Trailblazer.Pathing.NavigationChartRegistration&)
IsChartInitialized(System.String)
IsChartInitialized(Trailblazer.Pathing.NavigationChart)
InitializeAllCharts()
InitializeChart(System.String)
UnloadChart(System.String)
UnloadChart(Trailblazer.Pathing.NavigationChart)
TryGetEffectiveCell(FixedMathSharp.Vector3d,Trailblazer.Pathing.NavigationChartCell&)
TryGetEffectiveCell(GridForge.Spatial.WorldVoxelIndex,Trailblazer.Pathing.NavigationChartCell&)
TryGetEffectiveChartOwner(FixedMathSharp.Vector3d,System.String&)
TryGetEffectiveChartOwner(GridForge.Spatial.WorldVoxelIndex,System.String&)
TryUpdateChartCell(System.String,System.Int32,System.Int32,System.Int32,Trailblazer.Pathing.NavigationChartCell)
TryUpdateChartCell(System.String,FixedMathSharp.Vector3d,Trailblazer.Pathing.NavigationChartCell)
ApplyChartUpdates(System.String,System.Collections.Generic.IReadOnlyList`1<Trailblazer.Pathing.NavigationChartCellUpdate>)
FlushPendingGridChanges()
GetExternalGridBridgeDiagnosticsSnapshot()
TryGetMaxSearchSize(GridForge.Grids.Voxel,GridForge.Grids.Voxel,System.Int32&)
NeedsPath(FixedMathSharp.Vector3d,FixedMathSharp.Vector3d,FixedMathSharp.Fixed64,System.Boolean)
HandleGridChanged(GridForge.Grids.GridEventInfo)
Reset()
Dispose()
EnterUsableState()
EnsureUsable()