From d2c287bef7c999e9df0e79e45927aa815f843de5 Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Tue, 20 Aug 2024 10:56:21 +0200 Subject: [PATCH] Recast: add options for traverse ray offsets --- src/naveditor/Editor.cpp | 15 +++++++++++++-- src/naveditor/include/Editor.h | 2 ++ .../recast/DebugUtils/Include/DetourDebugDraw.h | 7 ++++++- .../recast/DebugUtils/Source/DetourDebugDraw.cpp | 8 ++++++-- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/naveditor/Editor.cpp b/src/naveditor/Editor.cpp index 55b8d3ac..e506890a 100644 --- a/src/naveditor/Editor.cpp +++ b/src/naveditor/Editor.cpp @@ -134,6 +134,7 @@ Editor::Editor() : m_filterLowHangingObstacles(true), m_filterLedgeSpans(true), m_filterWalkableLowHeightSpans(true), + m_traverseRayDynamicOffset(true), m_selectedNavMeshType(NAVMESH_SMALL), m_loadedNavMeshType(NAVMESH_SMALL), m_navmeshName(NavMesh_GetNameForType(NAVMESH_SMALL)), @@ -268,6 +269,8 @@ void Editor::resetCommonSettings() // https://developer.valvesoftware.com/wiki/Pl/Dimensions m_agentMaxSlope = 45.573f; + m_traverseRayExtraOffset = 0.0f; + m_regionMinSize = 8; m_regionMergeSize = 20; m_edgeMaxLen = 12; @@ -552,6 +555,12 @@ void Editor::handleCommonSettings() if (ImGui::Button("Reset Traverse Table Masks")) initTraverseMasks(); + if (ImGui::Checkbox("Dynamic Traverse Ray Offset", &m_traverseRayDynamicOffset)) + m_traverseLinkParams.dynamicOffset = m_traverseRayDynamicOffset; + + if (ImGui::SliderFloat("Extra Offset", &m_traverseRayExtraOffset, 0, 128)) + m_traverseLinkParams.extraOffset = m_traverseRayExtraOffset; + ImGui::Separator(); } @@ -801,7 +810,7 @@ void Editor::connectTileTraverseLinks(dtMeshTile* const baseTile, const bool lin neis[0] = baseTile; } - for (int k = 0; k < nneis; ++k) + for (int k = nneis-1; k >= 0; --k) { dtMeshTile* landTile = neis[k]; const bool sameTile = baseTile == landTile; @@ -921,7 +930,9 @@ void Editor::connectTileTraverseLinks(dtMeshTile* const baseTile, const bool lin const float slopeAngle = rdMathFabsf(rdCalcSlopeAngle(basePolyEdgeMid, landPolyEdgeMid)); const float maxAngle = rdCalcMaxLOSAngle(walkableRadius, m_cellHeight); - const float offsetAmount = rdCalcLedgeSpanOffsetAmount(walkableRadius, slopeAngle, maxAngle); + const float offsetAmount = m_traverseRayDynamicOffset + ? rdCalcLedgeSpanOffsetAmount(walkableRadius, slopeAngle, maxAngle) + m_traverseRayExtraOffset + : walkableRadius + m_traverseRayExtraOffset; if (!traverseLinkInLOS(m_geom, lowerEdgeMid, higherEdgeMid, lowerEdgeDir, higherEdgeDir, offsetAmount)) continue; diff --git a/src/naveditor/include/Editor.h b/src/naveditor/include/Editor.h index 6e43821c..91d3ee67 100644 --- a/src/naveditor/include/Editor.h +++ b/src/naveditor/include/Editor.h @@ -240,6 +240,7 @@ protected: bool m_filterLowHangingObstacles; bool m_filterLedgeSpans; bool m_filterWalkableLowHeightSpans; + bool m_traverseRayDynamicOffset; int m_minTileBits; int m_maxTileBits; @@ -250,6 +251,7 @@ protected: float m_agentRadius; float m_agentMaxClimb; float m_agentMaxSlope; + float m_traverseRayExtraOffset; int m_regionMinSize; int m_regionMergeSize; int m_edgeMaxLen; diff --git a/src/thirdparty/recast/DebugUtils/Include/DetourDebugDraw.h b/src/thirdparty/recast/DebugUtils/Include/DetourDebugDraw.h index 1927b33a..d0dfab90 100644 --- a/src/thirdparty/recast/DebugUtils/Include/DetourDebugDraw.h +++ b/src/thirdparty/recast/DebugUtils/Include/DetourDebugDraw.h @@ -50,7 +50,9 @@ struct duDrawTraverseLinkParams traverseLinkType(-1), traverseLinkDistance(-1), traverseAnimType(-2), - cellHeight(0.0f) + cellHeight(0.0f), + extraOffset(0.0f), + dynamicOffset(false) {} int traverseLinkType; @@ -63,6 +65,9 @@ struct duDrawTraverseLinkParams // Used to determine the max LOS angle, this information is lost after // the mesh tile has been build so we have to cache it from the editor. float cellHeight; + + float extraOffset; + bool dynamicOffset; }; void duDebugDrawNavMesh(struct duDebugDraw* dd, const dtNavMesh& mesh, const float* offset, unsigned int flags, const duDrawTraverseLinkParams& traverseLinkParams); diff --git a/src/thirdparty/recast/DebugUtils/Source/DetourDebugDraw.cpp b/src/thirdparty/recast/DebugUtils/Source/DetourDebugDraw.cpp index 274e82f4..49bfd846 100644 --- a/src/thirdparty/recast/DebugUtils/Source/DetourDebugDraw.cpp +++ b/src/thirdparty/recast/DebugUtils/Source/DetourDebugDraw.cpp @@ -212,9 +212,13 @@ static void drawTraverseLinks(duDebugDraw* dd, const dtNavMesh& mesh, const dtNa query->getEdgeMidPoint(basePolyRef, link->ref, startPos); query->getEdgeMidPoint(link->ref, basePolyRef, endPos); + const float walkableRadius = tile->header->walkableRadius; + const float slopeAngle = rdMathFabsf(rdCalcSlopeAngle(startPos, endPos)); - const float offsetAmount = rdCalcLedgeSpanOffsetAmount(tile->header->walkableRadius, - slopeAngle, rdCalcMaxLOSAngle(tile->header->walkableRadius, traverseLinkParams.cellHeight)); + const float offsetAmount = traverseLinkParams.dynamicOffset + ? rdCalcLedgeSpanOffsetAmount(walkableRadius, slopeAngle, + rdCalcMaxLOSAngle(walkableRadius, traverseLinkParams.cellHeight)) + traverseLinkParams.extraOffset + : walkableRadius + traverseLinkParams.extraOffset; const bool startPointHighest = startPos[2] > endPos[2]; float* highestPos = startPointHighest ? startPos : endPos;