From 065150158a49317cce94b9dd97414dbddf4aeea3 Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Sun, 3 Nov 2024 15:36:09 +0100 Subject: [PATCH] Recast: small optimization for traverse link algorithm Only calculate edge directions and normals when we are sure this is going to get used. --- .../recast/Detour/Source/DetourNavMesh.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/thirdparty/recast/Detour/Source/DetourNavMesh.cpp b/src/thirdparty/recast/Detour/Source/DetourNavMesh.cpp index 0f080184..1faf3169 100644 --- a/src/thirdparty/recast/Detour/Source/DetourNavMesh.cpp +++ b/src/thirdparty/recast/Detour/Source/DetourNavMesh.cpp @@ -865,11 +865,6 @@ dtStatus dtNavMesh::connectTraverseLinks(const dtTileRef tileRef, const dtTraver float baseTmax; rdCalcSubEdgeArea2D(basePolySpos, basePolyEpos, baseDetailPolyEdgeSpos, baseDetailPolyEdgeEpos, baseTmin, baseTmax); - float baseEdgeDir[3]; - rdVsub(baseEdgeDir, baseDetailPolyEdgeEpos, baseDetailPolyEdgeSpos); - - float baseEdgeNorm[3]; - rdCalcEdgeNormal2D(baseEdgeDir, baseEdgeNorm); float basePolyEdgeMid[3]; rdVsad(basePolyEdgeMid, baseDetailPolyEdgeSpos, baseDetailPolyEdgeEpos, 0.5f); @@ -917,6 +912,11 @@ dtStatus dtNavMesh::connectTraverseLinks(const dtTileRef tileRef, const dtTraver neis[0] = baseTile; } + float baseEdgeDir[3]; + rdVsub(baseEdgeDir, baseDetailPolyEdgeEpos, baseDetailPolyEdgeSpos); + + float baseEdgeNorm[3]; + rdCalcEdgeNormal2D(baseEdgeDir, baseEdgeNorm); for (int n = nneis - 1; n >= 0; --n) { @@ -1028,9 +1028,6 @@ dtStatus dtNavMesh::connectTraverseLinks(const dtTileRef tileRef, const dtTraver float landEdgeDir[3]; rdVsub(landEdgeDir, landDetailPolyEdgeEpos, landDetailPolyEdgeSpos); - float landEdgeNorm[3]; - rdCalcEdgeNormal2D(landEdgeDir, landEdgeNorm); - const float elevation = rdMathFabsf(basePolyEdgeMid[2] - landPolyEdgeMid[2]); const float slopeAngle = rdMathFabsf(rdCalcSlopeAngle(basePolyEdgeMid, landPolyEdgeMid)); const bool baseOverlaps = rdCalcEdgeOverlap2D(baseDetailPolyEdgeSpos, baseDetailPolyEdgeEpos, landDetailPolyEdgeSpos, landDetailPolyEdgeEpos, baseEdgeDir) > params.minEdgeOverlap; @@ -1050,6 +1047,9 @@ dtStatus dtNavMesh::connectTraverseLinks(const dtTileRef tileRef, const dtTraver if (linkedTraverseType && (rdBitCellBit(traverseType) & *linkedTraverseType)) continue; + float landEdgeNorm[3]; + rdCalcEdgeNormal2D(landEdgeDir, landEdgeNorm); + const bool basePolyHigher = basePolyEdgeMid[2] > landPolyEdgeMid[2]; const float* const lowerEdgeMid = basePolyHigher ? landPolyEdgeMid : basePolyEdgeMid; const float* const higherEdgeMid = basePolyHigher ? basePolyEdgeMid : landPolyEdgeMid;