wow-navmesh 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- wow_navmesh-0.1.0/.gitattributes +6 -0
- wow_navmesh-0.1.0/.github/workflows/ci.yml +30 -0
- wow_navmesh-0.1.0/.github/workflows/release.yml +58 -0
- wow_navmesh-0.1.0/.gitignore +47 -0
- wow_navmesh-0.1.0/.gitmodules +3 -0
- wow_navmesh-0.1.0/.python-version +1 -0
- wow_navmesh-0.1.0/CHANGELOG.md +18 -0
- wow_navmesh-0.1.0/CLAUDE.md +92 -0
- wow_navmesh-0.1.0/CMakeLists.txt +76 -0
- wow_navmesh-0.1.0/PKG-INFO +146 -0
- wow_navmesh-0.1.0/README.md +123 -0
- wow_navmesh-0.1.0/extern/recastnavigation/.editorconfig +12 -0
- wow_navmesh-0.1.0/extern/recastnavigation/.git +1 -0
- wow_navmesh-0.1.0/extern/recastnavigation/.github/workflows/Build.yaml +221 -0
- wow_navmesh-0.1.0/extern/recastnavigation/.github/workflows/Docs.yaml +29 -0
- wow_navmesh-0.1.0/extern/recastnavigation/.github/workflows/Tests.yaml +109 -0
- wow_navmesh-0.1.0/extern/recastnavigation/.gitignore +55 -0
- wow_navmesh-0.1.0/extern/recastnavigation/CHANGELOG.md +59 -0
- wow_navmesh-0.1.0/extern/recastnavigation/CMakeLists.txt +96 -0
- wow_navmesh-0.1.0/extern/recastnavigation/CODE_OF_CONDUCT.md +132 -0
- wow_navmesh-0.1.0/extern/recastnavigation/CONTRIBUTING.md +181 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DebugUtils/CMakeLists.txt +39 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DebugUtils/Include/DebugDraw.h +225 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DebugUtils/Include/DetourDebugDraw.h +48 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DebugUtils/Include/RecastDebugDraw.h +42 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DebugUtils/Include/RecastDump.h +42 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DebugUtils/Source/DebugDraw.cpp +611 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DebugUtils/Source/DetourDebugDraw.cpp +864 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DebugUtils/Source/RecastDebugDraw.cpp +1063 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DebugUtils/Source/RecastDump.cpp +449 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Detour/CMakeLists.txt +40 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Detour/Include/DetourAlloc.h +61 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Detour/Include/DetourAssert.h +56 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Detour/Include/DetourCommon.h +571 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Detour/Include/DetourMath.h +21 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Detour/Include/DetourNavMesh.h +784 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Detour/Include/DetourNavMeshBuilder.h +149 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Detour/Include/DetourNavMeshQuery.h +590 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Detour/Include/DetourNode.h +168 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Detour/Include/DetourStatus.h +65 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Detour/Source/DetourAlloc.cpp +50 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Detour/Source/DetourAssert.cpp +35 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Detour/Source/DetourCommon.cpp +387 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Detour/Source/DetourNavMesh.cpp +1591 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Detour/Source/DetourNavMeshBuilder.cpp +802 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Detour/Source/DetourNavMeshQuery.cpp +3690 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Detour/Source/DetourNode.cpp +200 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DetourCrowd/CMakeLists.txt +37 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DetourCrowd/Include/DetourCrowd.h +460 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DetourCrowd/Include/DetourLocalBoundary.h +66 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DetourCrowd/Include/DetourObstacleAvoidance.h +159 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DetourCrowd/Include/DetourPathCorridor.h +151 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DetourCrowd/Include/DetourPathQueue.h +79 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DetourCrowd/Include/DetourProximityGrid.h +74 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DetourCrowd/Source/DetourCrowd.cpp +1449 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DetourCrowd/Source/DetourLocalBoundary.cpp +137 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DetourCrowd/Source/DetourObstacleAvoidance.cpp +619 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DetourCrowd/Source/DetourPathCorridor.cpp +597 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DetourCrowd/Source/DetourPathQueue.cpp +200 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DetourCrowd/Source/DetourProximityGrid.cpp +194 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DetourTileCache/CMakeLists.txt +38 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DetourTileCache/Include/DetourTileCache.h +256 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DetourTileCache/Include/DetourTileCacheBuilder.h +156 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DetourTileCache/Source/DetourTileCache.cpp +825 -0
- wow_navmesh-0.1.0/extern/recastnavigation/DetourTileCache/Source/DetourTileCacheBuilder.cpp +2257 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Docs/DoxygenLayout.xml +194 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Docs/Extern/Recast_api.txt +682 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Docs/Images/screenshot.png +0 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Docs/Readme.txt +59 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Docs/doxygen-awesome-css/LICENSE +21 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Docs/doxygen-awesome-css/README.md +124 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-darkmode-toggle.js +157 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-fragment-copy-button.js +85 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-interactive-toc.js +81 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-paragraph-link.js +51 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-sidebar-only-darkmode-toggle.css +40 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome-sidebar-only.css +115 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Docs/doxygen-awesome-css/doxygen-awesome.css +2405 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Docs/doxygen-awesome-css/doxygen-custom/custom-alternative.css +54 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Docs/doxygen-awesome-css/doxygen-custom/custom.css +101 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Docs/doxygen-awesome-css/doxygen-custom/header.html +88 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Docs/doxygen-awesome-css/doxygen-custom/toggle-alternative-theme.js +12 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Docs/footer.html +21 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Docs/header.html +55 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Doxyfile +2699 -0
- wow_navmesh-0.1.0/extern/recastnavigation/License.txt +18 -0
- wow_navmesh-0.1.0/extern/recastnavigation/README.md +90 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Recast/CMakeLists.txt +33 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Recast/Include/Recast.h +1336 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Recast/Include/RecastAlloc.h +372 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Recast/Include/RecastAssert.h +53 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Recast/Source/Recast.cpp +542 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Recast/Source/RecastAlloc.cpp +51 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Recast/Source/RecastArea.cpp +590 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Recast/Source/RecastAssert.cpp +35 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Recast/Source/RecastContour.cpp +1104 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Recast/Source/RecastFilter.cpp +184 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Recast/Source/RecastLayers.cpp +656 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Recast/Source/RecastMesh.cpp +1549 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Recast/Source/RecastMeshDetail.cpp +1463 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Recast/Source/RecastRasterization.cpp +556 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Recast/Source/RecastRegion.cpp +1811 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Bin/.gitignore +2 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Bin/DroidSans.ttf +0 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Bin/Meshes/dungeon.obj +15234 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Bin/Meshes/nav_test.obj +3506 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Bin/Meshes/undulating.obj +8002 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Bin/TestCases/movement_test.txt +15 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Bin/TestCases/nav_mesh_test.txt +23 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Bin/TestCases/raycast_test.txt +6 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/CMakeLists.txt +87 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Contrib/fastlz/README.TXT +75 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Contrib/fastlz/fastlz.c +556 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Contrib/fastlz/fastlz.h +100 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Contrib/readme-sdl.txt +6 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Contrib/stb_truetype.h +3252 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Include/ChunkyTriMesh.h +59 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Include/ConvexVolumeTool.h +55 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Include/CrowdTool.h +144 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Include/Filelist.h +28 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Include/InputGeom.h +150 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Include/MeshLoaderObj.h +56 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Include/NavMeshPruneTool.h +56 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Include/NavMeshTesterTool.h +114 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Include/OffMeshConnectionTool.h +50 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Include/PerfTimer.h +33 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Include/Sample.h +190 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Include/SampleInterfaces.h +99 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Include/Sample_Debug.h +63 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Include/Sample_SoloMesh.h +86 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Include/Sample_TempObstacles.h +98 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Include/Sample_TileMesh.h +112 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Include/TestCase.h +114 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Include/ValueHistory.h +51 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Include/imgui.h +108 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Include/imguiRenderGL.h +27 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Source/ChunkyTriMesh.cpp +315 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Source/ConvexVolumeTool.cpp +296 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Source/CrowdTool.cpp +1106 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Source/Filelist.cpp +78 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Source/InputGeom.cpp +613 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Source/MeshLoaderObj.cpp +244 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Source/NavMeshPruneTool.cpp +322 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Source/NavMeshTesterTool.cpp +1419 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Source/OffMeshConnectionTool.cpp +176 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Source/PerfTimer.cpp +59 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Source/Sample.cpp +458 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Source/SampleInterfaces.cpp +316 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Source/Sample_Debug.cpp +386 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Source/Sample_SoloMesh.cpp +754 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Source/Sample_TempObstacles.cpp +1544 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Source/Sample_TileMesh.cpp +1172 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Source/TestCase.cpp +462 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Source/ValueHistory.cpp +115 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Source/imgui.cpp +675 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Source/imguiRenderGL.cpp +499 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/Source/main.cpp +925 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/cmake/FindSDL2.cmake +249 -0
- wow_navmesh-0.1.0/extern/recastnavigation/RecastDemo/premake5.lua +278 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Roadmap.md +74 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Tests/CMakeLists.txt +21 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Tests/Contrib/catch2/catch_all.hpp +12260 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Tests/Contrib/catch2/catch_amalgamated.cpp +10395 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Tests/Detour/Tests_Detour.cpp +33 -0
- wow_navmesh-0.1.0/extern/recastnavigation/Tests/Recast/Tests_Recast.cpp +1349 -0
- wow_navmesh-0.1.0/extern/recastnavigation/recastnavigation-config.cmake.in +3 -0
- wow_navmesh-0.1.0/extern/recastnavigation/recastnavigation.pc.in +10 -0
- wow_navmesh-0.1.0/extern/recastnavigation/version.h.in +3 -0
- wow_navmesh-0.1.0/pyproject.toml +46 -0
- wow_navmesh-0.1.0/src/bindings.cpp +366 -0
- wow_navmesh-0.1.0/src/wow_navmesh/__init__.py +10 -0
- wow_navmesh-0.1.0/src/wow_navmesh/__init__.pyi +48 -0
- wow_navmesh-0.1.0/src/wow_navmesh/py.typed +0 -0
- wow_navmesh-0.1.0/tests/test_navmesh.py +103 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
test:
|
|
10
|
+
strategy:
|
|
11
|
+
fail-fast: false
|
|
12
|
+
matrix:
|
|
13
|
+
python-version: ["3.10", "3.11", "3.12", "3.13"]
|
|
14
|
+
|
|
15
|
+
runs-on: windows-latest
|
|
16
|
+
|
|
17
|
+
steps:
|
|
18
|
+
- uses: actions/checkout@v4
|
|
19
|
+
with:
|
|
20
|
+
submodules: recursive
|
|
21
|
+
|
|
22
|
+
- uses: actions/setup-python@v5
|
|
23
|
+
with:
|
|
24
|
+
python-version: ${{ matrix.python-version }}
|
|
25
|
+
|
|
26
|
+
- name: Install wow-navmesh and test dependencies
|
|
27
|
+
run: pip install . pytest
|
|
28
|
+
|
|
29
|
+
- name: Run tests
|
|
30
|
+
run: pytest -v
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags: ["v*"]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
build_wheels:
|
|
9
|
+
runs-on: windows-latest
|
|
10
|
+
|
|
11
|
+
steps:
|
|
12
|
+
- uses: actions/checkout@v4
|
|
13
|
+
with:
|
|
14
|
+
submodules: recursive
|
|
15
|
+
|
|
16
|
+
- name: Build wheels
|
|
17
|
+
uses: pypa/cibuildwheel@v2.21
|
|
18
|
+
|
|
19
|
+
- uses: actions/upload-artifact@v4
|
|
20
|
+
with:
|
|
21
|
+
name: wheels-windows
|
|
22
|
+
path: ./wheelhouse/*.whl
|
|
23
|
+
|
|
24
|
+
build_sdist:
|
|
25
|
+
runs-on: windows-latest
|
|
26
|
+
steps:
|
|
27
|
+
- uses: actions/checkout@v4
|
|
28
|
+
with:
|
|
29
|
+
submodules: recursive
|
|
30
|
+
|
|
31
|
+
- name: Build sdist
|
|
32
|
+
run: pipx run build --sdist
|
|
33
|
+
|
|
34
|
+
- uses: actions/upload-artifact@v4
|
|
35
|
+
with:
|
|
36
|
+
name: sdist
|
|
37
|
+
path: dist/*.tar.gz
|
|
38
|
+
|
|
39
|
+
publish:
|
|
40
|
+
needs: [build_wheels, build_sdist]
|
|
41
|
+
runs-on: ubuntu-latest
|
|
42
|
+
environment: pypi
|
|
43
|
+
permissions:
|
|
44
|
+
id-token: write # required for PyPI Trusted Publishing (OIDC)
|
|
45
|
+
steps:
|
|
46
|
+
- uses: actions/download-artifact@v4
|
|
47
|
+
with:
|
|
48
|
+
pattern: wheels-*
|
|
49
|
+
path: dist
|
|
50
|
+
merge-multiple: true
|
|
51
|
+
|
|
52
|
+
- uses: actions/download-artifact@v4
|
|
53
|
+
with:
|
|
54
|
+
name: sdist
|
|
55
|
+
path: dist
|
|
56
|
+
|
|
57
|
+
- name: Publish to PyPI
|
|
58
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.egg-info/
|
|
5
|
+
.eggs/
|
|
6
|
+
build/
|
|
7
|
+
dist/
|
|
8
|
+
wheelhouse/
|
|
9
|
+
.venv/
|
|
10
|
+
venv/
|
|
11
|
+
.build-venv/
|
|
12
|
+
.pytest_cache/
|
|
13
|
+
.mypy_cache/
|
|
14
|
+
.ruff_cache/
|
|
15
|
+
|
|
16
|
+
# Compiled extension modules
|
|
17
|
+
*.so
|
|
18
|
+
*.pyd
|
|
19
|
+
*.dll
|
|
20
|
+
|
|
21
|
+
# CMake / native build output
|
|
22
|
+
cmake-build-*/
|
|
23
|
+
CMakeFiles/
|
|
24
|
+
CMakeCache.txt
|
|
25
|
+
cmake_install.cmake
|
|
26
|
+
CTestTestfile.cmake
|
|
27
|
+
_deps/
|
|
28
|
+
out/
|
|
29
|
+
*.obj
|
|
30
|
+
*.o
|
|
31
|
+
*.lib
|
|
32
|
+
*.exp
|
|
33
|
+
*.pdb
|
|
34
|
+
*.ilk
|
|
35
|
+
|
|
36
|
+
# Visual Studio
|
|
37
|
+
.vs/
|
|
38
|
+
*.vcxproj.user
|
|
39
|
+
Debug/
|
|
40
|
+
Release/
|
|
41
|
+
x64/
|
|
42
|
+
x86/
|
|
43
|
+
out/
|
|
44
|
+
|
|
45
|
+
# OS cruft
|
|
46
|
+
.DS_Store
|
|
47
|
+
Thumbs.db
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.12.9
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented in this file.
|
|
4
|
+
|
|
5
|
+
## [0.1.0] - Unreleased
|
|
6
|
+
|
|
7
|
+
Initial public release.
|
|
8
|
+
|
|
9
|
+
- `NavMesh` binding (nanobind) over Detour's `dtNavMesh`/`dtNavMeshQuery`, for loading
|
|
10
|
+
TrinityCore/AzerothCore `.mmap`/`.mmtile` files and running `find_path()`.
|
|
11
|
+
- Detour sources vendored as a git submodule against upstream recastnavigation `v1.6.0`,
|
|
12
|
+
built with `DT_POLYREF64` to match TrinityCore/AzerothCore's mmap layout (configurable
|
|
13
|
+
via the `WOW_NAVMESH_POLYREF64` CMake option / environment variable).
|
|
14
|
+
- Tile layout validation: `load_map()` raises a clear `RuntimeError` when a tile's
|
|
15
|
+
on-disk size doesn't match the dtPolyRef width this build targets, instead of silently
|
|
16
|
+
misreading it.
|
|
17
|
+
- Type stubs (`__init__.pyi`, `py.typed`) and a pytest suite (real-mmaps tests gated by
|
|
18
|
+
`WOW_NAVMESH_TEST_MMAPS`).
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# CLAUDE.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
|
4
|
+
|
|
5
|
+
## What this is
|
|
6
|
+
|
|
7
|
+
Python bindings (via nanobind) around Detour's `dtNavMesh`/`dtNavMeshQuery` from
|
|
8
|
+
recastnavigation, scoped specifically to reading and pathfinding over the
|
|
9
|
+
`.mmap`/`.mmtile` navmesh files produced by TrinityCore/AzerothCore for WoW 3.3.5a. It
|
|
10
|
+
only wraps Detour's *query* engine — it does not build navmeshes (that's Recast/the
|
|
11
|
+
core's own mmap generator).
|
|
12
|
+
|
|
13
|
+
Windows x64 only. Non-Windows and 32-bit builds are rejected at CMake configure time
|
|
14
|
+
(`CMakeLists.txt`).
|
|
15
|
+
|
|
16
|
+
## Build system
|
|
17
|
+
|
|
18
|
+
- `scikit-build-core` + `nanobind`, driven from `pyproject.toml`/`CMakeLists.txt`.
|
|
19
|
+
- Detour's sources are vendored as a git submodule at `extern/recastnavigation/`
|
|
20
|
+
(pinned to `v1.6.0`) — must be initialized (`git submodule update --init --recursive`,
|
|
21
|
+
or clone with `--recursive`) before any build works.
|
|
22
|
+
- Requires MSVC ("Desktop development with C++" workload). CMake/Ninja come from pip.
|
|
23
|
+
|
|
24
|
+
Common commands (PowerShell):
|
|
25
|
+
|
|
26
|
+
```powershell
|
|
27
|
+
pip install . # build + install the extension
|
|
28
|
+
pip install -e . --no-build-isolation # editable install for iterative dev
|
|
29
|
+
pip install pytest
|
|
30
|
+
pytest # run the test suite
|
|
31
|
+
pytest tests/test_navmesh.py::test_repr_and_initial_state # single test
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Building against a plain (non-TrinityCore/AzerothCore) Detour navmesh: set
|
|
35
|
+
`WOW_NAVMESH_POLYREF64=OFF` before installing (`$env:WOW_NAVMESH_POLYREF64 = "OFF"`).
|
|
36
|
+
This is a CMake option that toggles a compile define (`DT_POLYREF64`) — it changes the
|
|
37
|
+
binary's expected on-disk tile layout, not just a runtime flag, so it requires a rebuild.
|
|
38
|
+
|
|
39
|
+
## Architecture
|
|
40
|
+
|
|
41
|
+
Everything lives in one file: `src/bindings.cpp`. It defines a single C++ `NavMesh`
|
|
42
|
+
class exposed to Python as `_wow_navmesh.NavMesh`, then re-exported as
|
|
43
|
+
`wow_navmesh.NavMesh` in `src/wow_navmesh/__init__.py`.
|
|
44
|
+
|
|
45
|
+
Key mechanics inside `NavMesh`:
|
|
46
|
+
|
|
47
|
+
- **`load_map(map_id)`**: reads `{map_id:03}.mmap` for the `dtNavMeshParams` header,
|
|
48
|
+
then scans a sparse 64x64 grid of `{map_id:03}{x:02}{y:02}.mmtile` files, validating
|
|
49
|
+
each one's own `MmapTileHeader` (magic/version) before handing its payload to
|
|
50
|
+
`dtNavMesh::addTile()`.
|
|
51
|
+
- **The `DT_POLYREF64` layout check (`checkTileLayout`)**: TrinityCore/AzerothCore build
|
|
52
|
+
their mmap generator with `DT_POLYREF64`, widening `dtPolyRef` from 32 to 64 bits.
|
|
53
|
+
That changes the size of `dtLink` (which embeds a `dtPolyRef`), and thus the byte
|
|
54
|
+
offset of every tile section after it — but doesn't change the magic/version Detour
|
|
55
|
+
itself checks, so a mismatched build would otherwise silently misread tiles instead of
|
|
56
|
+
failing loudly. `expectedTileSize()` recomputes a tile's expected serialized size from
|
|
57
|
+
its `dtMeshHeader` counts (mirroring `DetourNavMeshBuilder`'s own section-size math)
|
|
58
|
+
under both possible `dtLink` sizes, and `checkTileLayout()` compares that against the
|
|
59
|
+
file's actual size to detect and name a layout mismatch before it corrupts anything.
|
|
60
|
+
If you touch this logic, keep it in sync with upstream `DetourNavMeshBuilder.cpp`.
|
|
61
|
+
- **Coordinate swap**: `.mmap`/`.mmtile` files store coordinates as `(y, z, x)`; the
|
|
62
|
+
public API always uses WoW's `(x, y, z)` order. The swap happens only at the
|
|
63
|
+
`find_path()` boundary (both on the way in for start/end points and on the way out for
|
|
64
|
+
result points) — nowhere else in the codebase needs to think about it.
|
|
65
|
+
- **RAII ownership**: `DtNavMeshPtr`/`DtBuffer` (custom deleters over `dtFreeNavMesh`/
|
|
66
|
+
`dtFree`) ensure a throw partway through `load_map()` can't leak the in-progress mesh
|
|
67
|
+
or a tile buffer that `addTile()` didn't take ownership of. `load_map()` calls
|
|
68
|
+
`free_map()` first, so a failed load leaves the previous map's state, not a partial one.
|
|
69
|
+
- Nearest-poly search extents (50 units/axis) and the internal path-poly buffer (512
|
|
70
|
+
polys) inside `find_path()` are fixed constants, not exposed as parameters.
|
|
71
|
+
|
|
72
|
+
Python-side surface is thin: `src/wow_navmesh/__init__.py` just re-exports `NavMesh` and
|
|
73
|
+
resolves `__version__` via `importlib.metadata`. Type stubs live in
|
|
74
|
+
`src/wow_navmesh/__init__.pyi` (kept in sync manually with the nanobind bindings) and the
|
|
75
|
+
package ships `py.typed`.
|
|
76
|
+
|
|
77
|
+
## Tests
|
|
78
|
+
|
|
79
|
+
`tests/test_navmesh.py` has two tiers:
|
|
80
|
+
|
|
81
|
+
- No-mmap-data tests (construction, error paths, context manager) run in CI as-is.
|
|
82
|
+
- A second tier exercises real `find_path()` behavior against an actual
|
|
83
|
+
TrinityCore/AzerothCore mmaps directory, gated behind the `WOW_NAVMESH_TEST_MMAPS`
|
|
84
|
+
env var (skipped otherwise). Point it at a directory containing e.g. `000.mmap` +
|
|
85
|
+
`0002239.mmtile` for Eastern Kingdoms to enable that tier locally.
|
|
86
|
+
|
|
87
|
+
## CI/release
|
|
88
|
+
|
|
89
|
+
- `.github/workflows/ci.yml`: runs the test suite on `windows-latest` across Python
|
|
90
|
+
3.10–3.13 on every push/PR to `main`.
|
|
91
|
+
- `.github/workflows/release.yml`: on `v*` tags, builds `win_amd64` wheels via
|
|
92
|
+
`cibuildwheel` and an sdist, then publishes to PyPI via Trusted Publishing (OIDC).
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
cmake_minimum_required(VERSION 3.15...3.27)
|
|
2
|
+
project(wow_navmesh LANGUAGES CXX)
|
|
3
|
+
|
|
4
|
+
set(CMAKE_CXX_STANDARD 17)
|
|
5
|
+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
6
|
+
|
|
7
|
+
if (NOT SKBUILD)
|
|
8
|
+
message(WARNING "This CMakeLists.txt is meant to be driven by scikit-build-core (pip install).")
|
|
9
|
+
endif()
|
|
10
|
+
|
|
11
|
+
if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
|
12
|
+
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
|
|
13
|
+
endif()
|
|
14
|
+
|
|
15
|
+
# wow-navmesh only targets 64-bit Windows (matching TrinityCore/AzerothCore's own
|
|
16
|
+
# mmap tooling and the only platform prebuilt wheels are published for).
|
|
17
|
+
if (NOT WIN32)
|
|
18
|
+
message(FATAL_ERROR
|
|
19
|
+
"wow-navmesh only supports Windows. Building on '${CMAKE_SYSTEM_NAME}' is not supported.")
|
|
20
|
+
endif()
|
|
21
|
+
|
|
22
|
+
if (CMAKE_SIZEOF_VOID_P EQUAL 4)
|
|
23
|
+
message(FATAL_ERROR
|
|
24
|
+
"wow-navmesh only supports 64-bit Python interpreters. "
|
|
25
|
+
"A 32-bit build was detected (CMAKE_SIZEOF_VOID_P=4); reconfigure with a 64-bit toolchain/interpreter.")
|
|
26
|
+
endif()
|
|
27
|
+
|
|
28
|
+
set(DETOUR_SOURCE_DIR
|
|
29
|
+
"${PROJECT_SOURCE_DIR}/extern/recastnavigation/Detour"
|
|
30
|
+
CACHE PATH "Path to the Detour library source tree (Include/ and Source/)")
|
|
31
|
+
|
|
32
|
+
if (NOT EXISTS "${DETOUR_SOURCE_DIR}/Include/DetourNavMesh.h")
|
|
33
|
+
message(FATAL_ERROR
|
|
34
|
+
"Detour sources not found at '${DETOUR_SOURCE_DIR}'. "
|
|
35
|
+
"The recastnavigation submodule looks uninitialized. Run:\n"
|
|
36
|
+
" git submodule update --init --recursive\n"
|
|
37
|
+
"or point DETOUR_SOURCE_DIR at an existing Detour/ checkout (Include/ and Source/).")
|
|
38
|
+
endif()
|
|
39
|
+
|
|
40
|
+
# TrinityCore/AzerothCore mmap tiles are generated with DT_POLYREF64 enabled (a wider
|
|
41
|
+
# dtPolyRef changes the on-disk size of dtLink, and therefore every tile's byte layout).
|
|
42
|
+
# Keep this ON to read those tiles; turning it OFF targets a plain Detour navmesh built
|
|
43
|
+
# without that define instead. See src/bindings.cpp for the layout mismatch this guards.
|
|
44
|
+
option(WOW_NAVMESH_POLYREF64
|
|
45
|
+
"Build against the DT_POLYREF64 tile layout used by TrinityCore/AzerothCore mmaps" ON)
|
|
46
|
+
|
|
47
|
+
find_package(Python 3.10
|
|
48
|
+
REQUIRED COMPONENTS Interpreter Development.Module)
|
|
49
|
+
|
|
50
|
+
execute_process(
|
|
51
|
+
COMMAND "${Python_EXECUTABLE}" -c "import nanobind; print(nanobind.cmake_dir())"
|
|
52
|
+
OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE NB_DIR)
|
|
53
|
+
list(APPEND CMAKE_PREFIX_PATH "${NB_DIR}")
|
|
54
|
+
find_package(nanobind CONFIG REQUIRED)
|
|
55
|
+
|
|
56
|
+
nanobind_add_module(
|
|
57
|
+
_wow_navmesh
|
|
58
|
+
src/bindings.cpp
|
|
59
|
+
"${DETOUR_SOURCE_DIR}/Source/DetourAlloc.cpp"
|
|
60
|
+
"${DETOUR_SOURCE_DIR}/Source/DetourAssert.cpp"
|
|
61
|
+
"${DETOUR_SOURCE_DIR}/Source/DetourCommon.cpp"
|
|
62
|
+
"${DETOUR_SOURCE_DIR}/Source/DetourNavMesh.cpp"
|
|
63
|
+
"${DETOUR_SOURCE_DIR}/Source/DetourNavMeshBuilder.cpp"
|
|
64
|
+
"${DETOUR_SOURCE_DIR}/Source/DetourNavMeshQuery.cpp"
|
|
65
|
+
"${DETOUR_SOURCE_DIR}/Source/DetourNode.cpp"
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
target_include_directories(_wow_navmesh PRIVATE "${DETOUR_SOURCE_DIR}/Include")
|
|
69
|
+
|
|
70
|
+
if (WOW_NAVMESH_POLYREF64)
|
|
71
|
+
target_compile_definitions(_wow_navmesh PRIVATE DT_POLYREF64 WOW_NAVMESH_POLYREF64=1)
|
|
72
|
+
else()
|
|
73
|
+
target_compile_definitions(_wow_navmesh PRIVATE WOW_NAVMESH_POLYREF64=0)
|
|
74
|
+
endif()
|
|
75
|
+
|
|
76
|
+
install(TARGETS _wow_navmesh LIBRARY DESTINATION wow_navmesh)
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: wow-navmesh
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Python bindings for Detour (recastnavigation) navmesh pathfinding over TrinityCore/AzerothCore mmaps
|
|
5
|
+
Keywords: recastnavigation,detour,navmesh,pathfinding,trinitycore,azerothcore,wow
|
|
6
|
+
Author: srounet
|
|
7
|
+
Classifier: Development Status :: 3 - Alpha
|
|
8
|
+
Classifier: Intended Audience :: Developers
|
|
9
|
+
Classifier: Programming Language :: C++
|
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
|
11
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
15
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
16
|
+
Classifier: Topic :: Games/Entertainment
|
|
17
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
18
|
+
Project-URL: Homepage, https://github.com/srounet/wow-navmesh
|
|
19
|
+
Project-URL: Repository, https://github.com/srounet/wow-navmesh
|
|
20
|
+
Project-URL: Issues, https://github.com/srounet/wow-navmesh/issues
|
|
21
|
+
Requires-Python: >=3.10
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
|
|
24
|
+
# wow-navmesh
|
|
25
|
+
|
|
26
|
+
Python bindings (via [nanobind](https://github.com/wjakob/nanobind)) for
|
|
27
|
+
[Detour](https://github.com/recastnavigation/recastnavigation), the navmesh query engine
|
|
28
|
+
from recastnavigation — scoped to pathfinding over the `.mmap`/`.mmtile` navmesh files
|
|
29
|
+
generated by TrinityCore/AzerothCore for World of Warcraft 3.3.5a.
|
|
30
|
+
|
|
31
|
+
This wraps Detour's *query* engine (`dtNavMesh` / `dtNavMeshQuery`) only. It does not
|
|
32
|
+
build navmeshes — that's Recast, and TrinityCore/AzerothCore's own mmap generator tools
|
|
33
|
+
already produce the `.mmap`/`.mmtile` files this library reads.
|
|
34
|
+
|
|
35
|
+
## Install
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
pip install wow-navmesh
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Prebuilt wheels are published for 64-bit CPython 3.10–3.13 on Windows (x64) only. No
|
|
42
|
+
compiler needed for a normal install. Linux and macOS are not supported.
|
|
43
|
+
|
|
44
|
+
## Quickstart
|
|
45
|
+
|
|
46
|
+
```python
|
|
47
|
+
import wow_navmesh as wn
|
|
48
|
+
|
|
49
|
+
nm = wn.NavMesh(r"C:\path\to\mmaps")
|
|
50
|
+
nm.load_map(0) # 0 = Eastern Kingdoms
|
|
51
|
+
|
|
52
|
+
path = nm.find_path((x1, y1, z1), (x2, y2, z2))
|
|
53
|
+
for x, y, z in path:
|
|
54
|
+
print(x, y, z)
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
`NavMesh` also works as a context manager, freeing the loaded map on exit:
|
|
58
|
+
|
|
59
|
+
```python
|
|
60
|
+
with wn.NavMesh(r"C:\path\to\mmaps") as nm:
|
|
61
|
+
nm.load_map(0)
|
|
62
|
+
...
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Coordinates are `(x, y, z)` in WoW world-coordinate order everywhere in this API. The
|
|
66
|
+
`.mmap`/`.mmtile` files store them as `(y, z, x)`; the swap happens internally at the
|
|
67
|
+
`find_path()` boundary, so callers never need to think about it.
|
|
68
|
+
|
|
69
|
+
## API
|
|
70
|
+
|
|
71
|
+
- `NavMesh(mmaps_path: str)` — bind to a directory of `.mmap`/`.mmtile` files.
|
|
72
|
+
- `.load_map(map_id: int)` — load the navmesh for a map id, replacing any map currently
|
|
73
|
+
loaded. Raises `RuntimeError` if the files are missing, truncated, or were built for a
|
|
74
|
+
different `dtPolyRef` layout than this build targets (see below).
|
|
75
|
+
- `.free_map()` — release the currently loaded map.
|
|
76
|
+
- `.find_path(start, end, max_points=256) -> list[(x, y, z)]` — the straight path
|
|
77
|
+
between two points, or `[]` if none was found. Raises `RuntimeError` if no map is
|
|
78
|
+
loaded, `ValueError` if `max_points <= 0`.
|
|
79
|
+
- `.is_loaded`, `.map_id`, `.mmaps_path` — read-only properties.
|
|
80
|
+
|
|
81
|
+
Full type stubs ship with the package (`py.typed`).
|
|
82
|
+
|
|
83
|
+
## A note on `DT_POLYREF64`
|
|
84
|
+
|
|
85
|
+
TrinityCore/AzerothCore build their mmap generator with Detour's `DT_POLYREF64` option
|
|
86
|
+
enabled, which widens `dtPolyRef` from 32 to 64 bits. That changes the on-disk byte
|
|
87
|
+
layout of every tile (`dtLink`, which embeds a `dtPolyRef`, changes size — and every
|
|
88
|
+
section of a tile after it shifts as a result). Published wheels are built with
|
|
89
|
+
`DT_POLYREF64` on, matching TrinityCore/AzerothCore's own tools; `load_map()` checks
|
|
90
|
+
each tile's layout against what it expects and raises a clear `RuntimeError` (naming the
|
|
91
|
+
mismatch) rather than silently misreading a tile built the other way.
|
|
92
|
+
|
|
93
|
+
Building from source against a plain Detour navmesh (not TrinityCore/AzerothCore's)?
|
|
94
|
+
Set `WOW_NAVMESH_POLYREF64=OFF` before installing:
|
|
95
|
+
|
|
96
|
+
```powershell
|
|
97
|
+
$env:WOW_NAVMESH_POLYREF64 = "OFF"
|
|
98
|
+
pip install --no-binary wow-navmesh wow-navmesh
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
wow-navmesh only supports 64-bit Windows Python interpreters; 32-bit builds and
|
|
102
|
+
non-Windows platforms are rejected at configure time.
|
|
103
|
+
|
|
104
|
+
## Building from source
|
|
105
|
+
|
|
106
|
+
Requirements:
|
|
107
|
+
|
|
108
|
+
- Windows, 64-bit CPython 3.10–3.13.
|
|
109
|
+
- A C++ compiler with MSVC support — the
|
|
110
|
+
[Visual Studio Build Tools](https://visualstudio.microsoft.com/downloads/) (or full
|
|
111
|
+
Visual Studio) "Desktop development with C++" workload. CMake and Ninja are pulled in
|
|
112
|
+
automatically by `pip` and don't need to be installed separately.
|
|
113
|
+
|
|
114
|
+
```powershell
|
|
115
|
+
git clone --recursive https://github.com/srounet/wow-navmesh
|
|
116
|
+
cd wow-navmesh
|
|
117
|
+
pip install .
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
The `--recursive` clone (or a `git submodule update --init --recursive` afterwards) is
|
|
121
|
+
required — Detour's sources are vendored as a git submodule under
|
|
122
|
+
`extern/recastnavigation/`, pinned to upstream tag `v1.6.0`.
|
|
123
|
+
|
|
124
|
+
Run the tests with `pip install pytest && pytest`. A second tier of tests exercises
|
|
125
|
+
`find_path()` against a real mmaps directory; point `WOW_NAVMESH_TEST_MMAPS` at one to
|
|
126
|
+
enable it:
|
|
127
|
+
|
|
128
|
+
```powershell
|
|
129
|
+
$env:WOW_NAVMESH_TEST_MMAPS = "C:\path\to\mmaps"
|
|
130
|
+
pytest
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Known limitations
|
|
134
|
+
|
|
135
|
+
- Only verified against TrinityCore/AzerothCore mmaps for WoW 3.3.5a. The mmap format
|
|
136
|
+
may differ across core versions or forks; nothing here has been tested against those.
|
|
137
|
+
- The nearest-poly search extents (50 units on each axis) and the internal path-buffer
|
|
138
|
+
size (512 polygons) used by `find_path()` are currently fixed, not configurable.
|
|
139
|
+
- License: TBD (recastnavigation/Detour itself is zlib-licensed; its notice is included
|
|
140
|
+
under `extern/recastnavigation/`).
|
|
141
|
+
|
|
142
|
+
## Acknowledgments
|
|
143
|
+
|
|
144
|
+
- [recastnavigation](https://github.com/recastnavigation/recastnavigation) by Mikko
|
|
145
|
+
Mononen and contributors.
|
|
146
|
+
- [nanobind](https://github.com/wjakob/nanobind) by Wenzel Jakob.
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# wow-navmesh
|
|
2
|
+
|
|
3
|
+
Python bindings (via [nanobind](https://github.com/wjakob/nanobind)) for
|
|
4
|
+
[Detour](https://github.com/recastnavigation/recastnavigation), the navmesh query engine
|
|
5
|
+
from recastnavigation — scoped to pathfinding over the `.mmap`/`.mmtile` navmesh files
|
|
6
|
+
generated by TrinityCore/AzerothCore for World of Warcraft 3.3.5a.
|
|
7
|
+
|
|
8
|
+
This wraps Detour's *query* engine (`dtNavMesh` / `dtNavMeshQuery`) only. It does not
|
|
9
|
+
build navmeshes — that's Recast, and TrinityCore/AzerothCore's own mmap generator tools
|
|
10
|
+
already produce the `.mmap`/`.mmtile` files this library reads.
|
|
11
|
+
|
|
12
|
+
## Install
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
pip install wow-navmesh
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Prebuilt wheels are published for 64-bit CPython 3.10–3.13 on Windows (x64) only. No
|
|
19
|
+
compiler needed for a normal install. Linux and macOS are not supported.
|
|
20
|
+
|
|
21
|
+
## Quickstart
|
|
22
|
+
|
|
23
|
+
```python
|
|
24
|
+
import wow_navmesh as wn
|
|
25
|
+
|
|
26
|
+
nm = wn.NavMesh(r"C:\path\to\mmaps")
|
|
27
|
+
nm.load_map(0) # 0 = Eastern Kingdoms
|
|
28
|
+
|
|
29
|
+
path = nm.find_path((x1, y1, z1), (x2, y2, z2))
|
|
30
|
+
for x, y, z in path:
|
|
31
|
+
print(x, y, z)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
`NavMesh` also works as a context manager, freeing the loaded map on exit:
|
|
35
|
+
|
|
36
|
+
```python
|
|
37
|
+
with wn.NavMesh(r"C:\path\to\mmaps") as nm:
|
|
38
|
+
nm.load_map(0)
|
|
39
|
+
...
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Coordinates are `(x, y, z)` in WoW world-coordinate order everywhere in this API. The
|
|
43
|
+
`.mmap`/`.mmtile` files store them as `(y, z, x)`; the swap happens internally at the
|
|
44
|
+
`find_path()` boundary, so callers never need to think about it.
|
|
45
|
+
|
|
46
|
+
## API
|
|
47
|
+
|
|
48
|
+
- `NavMesh(mmaps_path: str)` — bind to a directory of `.mmap`/`.mmtile` files.
|
|
49
|
+
- `.load_map(map_id: int)` — load the navmesh for a map id, replacing any map currently
|
|
50
|
+
loaded. Raises `RuntimeError` if the files are missing, truncated, or were built for a
|
|
51
|
+
different `dtPolyRef` layout than this build targets (see below).
|
|
52
|
+
- `.free_map()` — release the currently loaded map.
|
|
53
|
+
- `.find_path(start, end, max_points=256) -> list[(x, y, z)]` — the straight path
|
|
54
|
+
between two points, or `[]` if none was found. Raises `RuntimeError` if no map is
|
|
55
|
+
loaded, `ValueError` if `max_points <= 0`.
|
|
56
|
+
- `.is_loaded`, `.map_id`, `.mmaps_path` — read-only properties.
|
|
57
|
+
|
|
58
|
+
Full type stubs ship with the package (`py.typed`).
|
|
59
|
+
|
|
60
|
+
## A note on `DT_POLYREF64`
|
|
61
|
+
|
|
62
|
+
TrinityCore/AzerothCore build their mmap generator with Detour's `DT_POLYREF64` option
|
|
63
|
+
enabled, which widens `dtPolyRef` from 32 to 64 bits. That changes the on-disk byte
|
|
64
|
+
layout of every tile (`dtLink`, which embeds a `dtPolyRef`, changes size — and every
|
|
65
|
+
section of a tile after it shifts as a result). Published wheels are built with
|
|
66
|
+
`DT_POLYREF64` on, matching TrinityCore/AzerothCore's own tools; `load_map()` checks
|
|
67
|
+
each tile's layout against what it expects and raises a clear `RuntimeError` (naming the
|
|
68
|
+
mismatch) rather than silently misreading a tile built the other way.
|
|
69
|
+
|
|
70
|
+
Building from source against a plain Detour navmesh (not TrinityCore/AzerothCore's)?
|
|
71
|
+
Set `WOW_NAVMESH_POLYREF64=OFF` before installing:
|
|
72
|
+
|
|
73
|
+
```powershell
|
|
74
|
+
$env:WOW_NAVMESH_POLYREF64 = "OFF"
|
|
75
|
+
pip install --no-binary wow-navmesh wow-navmesh
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
wow-navmesh only supports 64-bit Windows Python interpreters; 32-bit builds and
|
|
79
|
+
non-Windows platforms are rejected at configure time.
|
|
80
|
+
|
|
81
|
+
## Building from source
|
|
82
|
+
|
|
83
|
+
Requirements:
|
|
84
|
+
|
|
85
|
+
- Windows, 64-bit CPython 3.10–3.13.
|
|
86
|
+
- A C++ compiler with MSVC support — the
|
|
87
|
+
[Visual Studio Build Tools](https://visualstudio.microsoft.com/downloads/) (or full
|
|
88
|
+
Visual Studio) "Desktop development with C++" workload. CMake and Ninja are pulled in
|
|
89
|
+
automatically by `pip` and don't need to be installed separately.
|
|
90
|
+
|
|
91
|
+
```powershell
|
|
92
|
+
git clone --recursive https://github.com/srounet/wow-navmesh
|
|
93
|
+
cd wow-navmesh
|
|
94
|
+
pip install .
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
The `--recursive` clone (or a `git submodule update --init --recursive` afterwards) is
|
|
98
|
+
required — Detour's sources are vendored as a git submodule under
|
|
99
|
+
`extern/recastnavigation/`, pinned to upstream tag `v1.6.0`.
|
|
100
|
+
|
|
101
|
+
Run the tests with `pip install pytest && pytest`. A second tier of tests exercises
|
|
102
|
+
`find_path()` against a real mmaps directory; point `WOW_NAVMESH_TEST_MMAPS` at one to
|
|
103
|
+
enable it:
|
|
104
|
+
|
|
105
|
+
```powershell
|
|
106
|
+
$env:WOW_NAVMESH_TEST_MMAPS = "C:\path\to\mmaps"
|
|
107
|
+
pytest
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Known limitations
|
|
111
|
+
|
|
112
|
+
- Only verified against TrinityCore/AzerothCore mmaps for WoW 3.3.5a. The mmap format
|
|
113
|
+
may differ across core versions or forks; nothing here has been tested against those.
|
|
114
|
+
- The nearest-poly search extents (50 units on each axis) and the internal path-buffer
|
|
115
|
+
size (512 polygons) used by `find_path()` are currently fixed, not configurable.
|
|
116
|
+
- License: TBD (recastnavigation/Detour itself is zlib-licensed; its notice is included
|
|
117
|
+
under `extern/recastnavigation/`).
|
|
118
|
+
|
|
119
|
+
## Acknowledgments
|
|
120
|
+
|
|
121
|
+
- [recastnavigation](https://github.com/recastnavigation/recastnavigation) by Mikko
|
|
122
|
+
Mononen and contributors.
|
|
123
|
+
- [nanobind](https://github.com/wjakob/nanobind) by Wenzel Jakob.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
gitdir: ../../.git/modules/extern/recastnavigation
|