onepathDocs
onepath docs
Everything about OnePath: getting started, grids and graphs, building and querying navigation meshes, crowds, saved state, moving from Recast, Detour or Unity, and how it is checked.
Start
Getting startedInstall OnePath for .NET 10, find a path on a grid, build a navigation mesh from level geometry and query it, and walk an agent across it in a crowd, with results that are the same bits on every platform.OverviewFrom Recast, Detour or UnityFor code that uses Recast and Detour (C++), DotRecast (C#) or Unity's built-in navigation. It maps concepts and types, and calls out the places where a number means something different. The mapping comes from the three projects' published API documentation; where you depend…Path resultsEvery one-call path query reports through the same vocabulary, whatever the world is made of.
Grids and graphs
GridsNormative. A port must reproduce the same expansion order, costs and paths from this text. Code lives in src/OnePath/Grids/. The tier-1 types (Grid, HexGrid, VoxelGrid, their options and results, Cell, WorldPoint, VoxelCell, VoxelPoint, GridSpace, VoxelSpace, AreaCosts…GraphsThe tier-1 types (Graph, PointGraph, GraphOptions, GraphPath, Landmarks, LandmarkOptions, GraphEdge, Point3) live in the root namespace RecursiveAI.OnePath; the CSR form, searches and heuristics (tiers 2 and 3) live in RecursiveAI.OnePath.Graphs. Graphs are their own family…Saved search stateA host that rolls back (lockstep with prediction, rollback netcode, replays) needs to put the mutable pathfinding state back exactly and get the results it would have got had it never left. This document is the normative description of what is saved, the byte format, what is…
Navigation meshes
Navmesh queriesNormative behaviour of NavMeshQuery (namespace RecursiveAI.OnePath.Mesh.Queries) over a TiledNavMesh (docs/navmesh-format.md). Everything here is deterministic: results depend only on the mesh, the inputs and the options, never on platform, thread count or time. All…Navmesh formatStatus: frozen at version 2. Header flag bit 0 (the draft marker) is always 0. The reader accepts version 2 only: version 1 (the draft layout) and every unknown version are rejected with NavMeshVersionException, whose message and Found/Expected properties name the version…Navmesh snapshotsStatus: follows the frozen mesh format, version 2 (navmesh-format.md); the snapshot header carries the same version as the mesh format. Its parameter block includes the settings digest, so a snapshot carries the build fingerprint: restoring it into a mesh with a different…
Building meshes
2D builderNormative description of TileSlicer, Mesh2DPipeline and NavMesh.Build2D: a walkable Region (see build2d-geometry.md) becomes a stitched TiledNavMesh (see navmesh-format.md). A later port that follows this text produces the same tiles, bit for bit.2D builder geometryNormative description of RecursiveAI.OnePath.Mesh.Build2D: outlines and tile maps → regions → boolean operations and offsetting → constrained Delaunay triangulation → convex polygons with adjacency. A later port that follows this text produces the same output, bit for bit.3D builder: spansNormative. This describes what RecursiveAI.OnePath.Mesh.Build3D computes up to the compact open-span heightfield, which is the hand-off to the region stage. A port must reproduce the same spans from these rules. Everything is IEEE-754 float32 (+ − × ÷ sqrt only) unless a type…3D builder: regionsNormative. Continues build3d-spans.md: what RecursiveAI.OnePath.Mesh.Build3D computes from the compact heightfield up to contours, which are the hand-off to the polygon stage. Integer arithmetic only (cell and corner coordinates are int, products long); nothing here uses…3D builder: polygonsNormative text for the last stages of the voxel pipeline and for NavMesh.Build. Earlier stages: build3d-spans.md (voxelization, filters, compaction, erosion) and build3d-regions.md (regions, contours). The mesh format is in navmesh-format.md. Everything is integer arithmetic…glTF inputGltfReader.Read(bytes) turns a glTF 2.0 file into world-space triangles for the 3D builder (NavMesh.BuildGltf). The same file gives the same triangles on every platform: node transforms are composed in double with + − × only (no trigonometry, no square roots).Tile cache and obstaclesStatus: follows the frozen mesh format (navmesh-format.md). Written so a port reproduces the same tiles bit for bit.
Crowds
Corridors and followingNormative behaviour of PathCorridor, CorridorReplan, PathFollower and FollowerOptions (namespace RecursiveAI.OnePath.Crowds.Corridors) over a TiledNavMesh (navmesh-format.md) and a NavMeshQuery (navmesh-queries.md). Everything here is deterministic: results depend only on the…ORCA solverNormative description of RecursiveAI.OnePath.Crowds.Orca. A port that follows this text reproduces the same bits. Source: van den Berg, Guy, Lin and Manocha, Reciprocal n-body collision avoidance, ISRR 2011 (sections 4, 5.1, 5.3, 5.4), plus the choices listed under "Where the…
How it is checked
Hash matrixResults must be bit-identical on every platform, runtime mode and thread count. The hash matrix checks that: a runner executes registered scenarios (deterministic functions of the library), hashes the bytes each one writes, and prints a manifest. Equal manifests across…BenchmarkingThe bar compares our code with a reference on the same machine, in the same session, on the same inputs and settings. This page is normative: a later port of the bar runner must produce comparable rows from it.
Reference
Docs mapThe documents here are normative: where a paper leaves a choice open (tie-breaks, open-list order, rounding, byte layouts, budget units, preset values) the choice is written down so that a port to another language can reproduce the same bits from the text alone. API reference…ChangelogAll notable changes are listed here. The format follows Keep a Changelog and the project follows Semantic Versioning.