Recast: small optimization for traverse link algorithm

Only calculate edge directions and normals when we are sure this is going to get used.
This commit is contained in:
Kawe Mazidjatari 2024-11-03 15:36:09 +01:00
parent 3e7c7cb7da
commit 065150158a

View File

@ -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;