mirror of
https://github.com/Mauler125/r5sdk.git
synced 2025-02-09 19:15:03 +01:00
Recast: skip overlapping traverse links
If a traverse type can't overlap, but does overlap with a polygon, then don't add it. This fixes the issue where the jump links run flat over the navmesh surface.
This commit is contained in:
parent
66b493b6b7
commit
3090634cbd
@ -613,6 +613,12 @@ TraverseType_e GetBestTraverseType(const float slopeAngle, const unsigned char t
|
||||
return bestTraverseType;
|
||||
}
|
||||
|
||||
bool CanOverlapPoly(const TraverseType_e traverseType)
|
||||
{
|
||||
// todo(amos): find the best threshold...
|
||||
return s_traverseTypes[traverseType].minSlope > 5.0f;
|
||||
}
|
||||
|
||||
// TODO: create lookup table and look for distance + slope to determine the
|
||||
// correct jumpType.
|
||||
// TODO: make sure we don't generate duplicate pairs of jump types between
|
||||
@ -683,6 +689,33 @@ static void connectTileTraverseLinks(dtNavMesh* const nav, dtMeshTile* const til
|
||||
|
||||
const TraverseType_e traverseType = GetBestTraverseType(slopeAngle, distance, samePolyGroup);
|
||||
|
||||
if (!CanOverlapPoly(traverseType))
|
||||
{
|
||||
bool overlaps = false;
|
||||
|
||||
float linkMidPoint[3];
|
||||
rdVsad(linkMidPoint, startPolyEdgeMid, endPolyEdgeMid, 0.5f);
|
||||
|
||||
for (int e = 0; e < tile->header->polyCount; e++)
|
||||
{
|
||||
const dtPoly* posTestPoly = &tile->polys[e];
|
||||
float polyVerts[DT_VERTS_PER_POLYGON*3];
|
||||
|
||||
const int nverts = posTestPoly->vertCount;
|
||||
for (int o = 0; o < nverts; ++o)
|
||||
rdVcopy(&polyVerts[o * 3], &tile->verts[posTestPoly->verts[o] * 3]);
|
||||
|
||||
if (rdPointInPolygon(linkMidPoint, polyVerts, nverts))
|
||||
{
|
||||
overlaps = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (overlaps)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (traverseType != DT_NULL_TRAVERSE_TYPE)
|
||||
{
|
||||
// Need at least 2 links
|
||||
|
Loading…
x
Reference in New Issue
Block a user