Recast: add options for traverse ray offsets

This commit is contained in:
Kawe Mazidjatari 2024-08-20 10:56:21 +02:00
parent 513f4a5297
commit d2c287bef7
4 changed files with 27 additions and 5 deletions

View File

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

View File

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

View File

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

View File

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