mirror of
https://github.com/Mauler125/r5sdk.git
synced 2025-02-09 19:15:03 +01:00
Recast: add options for traverse ray offsets
This commit is contained in:
parent
513f4a5297
commit
d2c287bef7
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user