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;
|
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
|
// TODO: create lookup table and look for distance + slope to determine the
|
||||||
// correct jumpType.
|
// correct jumpType.
|
||||||
// TODO: make sure we don't generate duplicate pairs of jump types between
|
// 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);
|
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)
|
if (traverseType != DT_NULL_TRAVERSE_TYPE)
|
||||||
{
|
{
|
||||||
// Need at least 2 links
|
// Need at least 2 links
|
||||||
|
Loading…
x
Reference in New Issue
Block a user