refactor: DtFindPathOptions, DtRaycastOptions

This commit is contained in:
ikpil 2023-10-08 14:28:56 +09:00
parent 533afe49e2
commit 31734246b6
7 changed files with 31 additions and 24 deletions

View File

@ -4,7 +4,7 @@
{ {
public static readonly DtFindPathOption NoOption = new DtFindPathOption(DtDefaultQueryHeuristic.Default, 0, 0); public static readonly DtFindPathOption NoOption = new DtFindPathOption(DtDefaultQueryHeuristic.Default, 0, 0);
public static readonly DtFindPathOption AnyAngle = new DtFindPathOption(DtDefaultQueryHeuristic.Default, DtNavMeshQuery.DT_FINDPATH_ANY_ANGLE, float.MaxValue); public static readonly DtFindPathOption AnyAngle = new DtFindPathOption(DtDefaultQueryHeuristic.Default, DtFindPathOptions.DT_FINDPATH_ANY_ANGLE, float.MaxValue);
public static readonly DtFindPathOption ZeroScale = new DtFindPathOption(new DtDefaultQueryHeuristic(0.0f), 0, 0); public static readonly DtFindPathOption ZeroScale = new DtFindPathOption(new DtDefaultQueryHeuristic(0.0f), 0, 0);
public readonly IDtQueryHeuristic heuristic; public readonly IDtQueryHeuristic heuristic;

View File

@ -0,0 +1,8 @@
namespace DotRecast.Detour
{
/// Options for dtNavMeshQuery::initSlicedFindPath and updateSlicedFindPath
public static class DtFindPathOptions
{
public const int DT_FINDPATH_ANY_ANGLE = 0x02; //< use raycasts during pathfind to "shortcut" (raycast still consider costs)
}
}

View File

@ -24,20 +24,10 @@ using DotRecast.Core;
namespace DotRecast.Detour namespace DotRecast.Detour
{ {
using static DtNode; using static DtNode;
public class DtNavMeshQuery public class DtNavMeshQuery
{ {
/**
* Use raycasts during pathfind to "shortcut" (raycast still consider costs) Options for
* NavMeshQuery::initSlicedFindPath and updateSlicedFindPath
*/
public const int DT_FINDPATH_ANY_ANGLE = 0x02;
/** Raycast should calculate movement cost along the ray and fill RaycastHit::cost */
public const int DT_RAYCAST_USE_COSTS = 0x01;
/// < Add a vertex at every polygon edge crossing. /// < Add a vertex at every polygon edge crossing.
protected readonly DtNavMesh m_nav; protected readonly DtNavMesh m_nav;
@ -766,7 +756,7 @@ namespace DotRecast.Detour
float raycastLimitSqr = RcMath.Sqr(raycastLimit); float raycastLimitSqr = RcMath.Sqr(raycastLimit);
// trade quality with performance? // trade quality with performance?
if ((options & DT_FINDPATH_ANY_ANGLE) != 0 && raycastLimit < 0f) if ((options & DtFindPathOptions.DT_FINDPATH_ANY_ANGLE) != 0 && raycastLimit < 0f)
{ {
// limiting to several times the character radius yields nice results. It is not sensitive // limiting to several times the character radius yields nice results. It is not sensitive
// so it is enough to compute it from the first tile. // so it is enough to compute it from the first tile.
@ -838,7 +828,7 @@ namespace DotRecast.Detour
// decide whether to test raycast to previous nodes // decide whether to test raycast to previous nodes
bool tryLOS = false; bool tryLOS = false;
if ((options & DT_FINDPATH_ANY_ANGLE) != 0) if ((options & DtFindPathOptions.DT_FINDPATH_ANY_ANGLE) != 0)
{ {
if ((parentRef != 0) && (raycastLimitSqr >= float.MaxValue if ((parentRef != 0) && (raycastLimitSqr >= float.MaxValue
|| RcVec3f.DistSqr(parentNode.pos, bestNode.pos) < raycastLimitSqr)) || RcVec3f.DistSqr(parentNode.pos, bestNode.pos) < raycastLimitSqr))
@ -896,7 +886,7 @@ namespace DotRecast.Detour
if (tryLOS) if (tryLOS)
{ {
var rayStatus = Raycast(parentRef, parentNode.pos, neighbourPos, filter, var rayStatus = Raycast(parentRef, parentNode.pos, neighbourPos, filter,
DT_RAYCAST_USE_COSTS, grandpaRef, out var rayHit); DtRaycastOptions.DT_RAYCAST_USE_COSTS, grandpaRef, out var rayHit);
if (rayStatus.Succeeded()) if (rayStatus.Succeeded())
{ {
foundShortCut = rayHit.t >= 1.0f; foundShortCut = rayHit.t >= 1.0f;
@ -1036,7 +1026,7 @@ namespace DotRecast.Detour
} }
// trade quality with performance? // trade quality with performance?
if ((options & DT_FINDPATH_ANY_ANGLE) != 0 && raycastLimit < 0f) if ((options & DtFindPathOptions.DT_FINDPATH_ANY_ANGLE) != 0 && raycastLimit < 0f)
{ {
// limiting to several times the character radius yields nice results. It is not sensitive // limiting to several times the character radius yields nice results. It is not sensitive
// so it is enough to compute it from the first tile. // so it is enough to compute it from the first tile.
@ -1156,7 +1146,7 @@ namespace DotRecast.Detour
// decide whether to test raycast to previous nodes // decide whether to test raycast to previous nodes
bool tryLOS = false; bool tryLOS = false;
if ((m_query.options & DT_FINDPATH_ANY_ANGLE) != 0) if ((m_query.options & DtFindPathOptions.DT_FINDPATH_ANY_ANGLE) != 0)
{ {
if ((parentRef != 0) && (m_query.raycastLimitSqr >= float.MaxValue if ((parentRef != 0) && (m_query.raycastLimitSqr >= float.MaxValue
|| RcVec3f.DistSqr(parentNode.pos, bestNode.pos) < m_query.raycastLimitSqr)) || RcVec3f.DistSqr(parentNode.pos, bestNode.pos) < m_query.raycastLimitSqr))
@ -1216,7 +1206,8 @@ namespace DotRecast.Detour
List<long> shortcut = null; List<long> shortcut = null;
if (tryLOS) if (tryLOS)
{ {
status = Raycast(parentRef, parentNode.pos, neighbourPos, m_query.filter, DT_RAYCAST_USE_COSTS, grandpaRef, out var rayHit); status = Raycast(parentRef, parentNode.pos, neighbourPos, m_query.filter,
DtRaycastOptions.DT_RAYCAST_USE_COSTS, grandpaRef, out var rayHit);
if (status.Succeeded()) if (status.Succeeded())
{ {
foundShortCut = rayHit.t >= 1.0f; foundShortCut = rayHit.t >= 1.0f;
@ -2239,7 +2230,7 @@ namespace DotRecast.Detour
hit.t = float.MaxValue; hit.t = float.MaxValue;
// add the cost // add the cost
if ((options & DT_RAYCAST_USE_COSTS) != 0) if ((options & DtRaycastOptions.DT_RAYCAST_USE_COSTS) != 0)
{ {
hit.pathCost += filter.GetCost(curPos, endPos, prevRef, prevTile, prevPoly, curRef, tile, poly, hit.pathCost += filter.GetCost(curPos, endPos, prevRef, prevTile, prevPoly, curRef, tile, poly,
curRef, tile, poly); curRef, tile, poly);
@ -2344,7 +2335,7 @@ namespace DotRecast.Detour
} }
// add the cost // add the cost
if ((options & DT_RAYCAST_USE_COSTS) != 0) if ((options & DtRaycastOptions.DT_RAYCAST_USE_COSTS) != 0)
{ {
// compute the intersection point at the furthest end of the polygon // compute the intersection point at the furthest end of the polygon
// and correct the height (since the raycast moves in 2d) // and correct the height (since the raycast moves in 2d)

View File

@ -0,0 +1,8 @@
namespace DotRecast.Detour
{
/// Options for dtNavMeshQuery::raycast
public static class DtRaycastOptions
{
public const int DT_RAYCAST_USE_COSTS = 0x01; //< Raycast should calculate movement cost along the ray and fill RaycastHit::cost
}
}

View File

@ -1,7 +1,7 @@
namespace DotRecast.Detour namespace DotRecast.Detour
{ {
/// Options for dtNavMeshQuery::findStraightPath. /// Options for dtNavMeshQuery::findStraightPath.
public class DtStraightPathOptions public static class DtStraightPathOptions
{ {
public const int DT_STRAIGHTPATH_AREA_CROSSINGS = 0x01; //< Add a vertex at every polygon edge crossing where area changes. public const int DT_STRAIGHTPATH_AREA_CROSSINGS = 0x01; //< Add a vertex at every polygon edge crossing where area changes.
public const int DT_STRAIGHTPATH_ALL_CROSSINGS = 0x02; //< Add a vertex at every polygon edge crossing. public const int DT_STRAIGHTPATH_ALL_CROSSINGS = 0x02; //< Add a vertex at every polygon edge crossing.

View File

@ -37,7 +37,7 @@ namespace DotRecast.Recast.Toolset.Tools
polys.Clear(); polys.Clear();
smoothPath.Clear(); smoothPath.Clear();
var opt = new DtFindPathOption(enableRaycast ? DtNavMeshQuery.DT_FINDPATH_ANY_ANGLE : 0, float.MaxValue); var opt = new DtFindPathOption(enableRaycast ? DtFindPathOptions.DT_FINDPATH_ANY_ANGLE : 0, float.MaxValue);
navQuery.FindPath(startRef, endRef, startPt, endPt, filter, ref polys, opt); navQuery.FindPath(startRef, endRef, startPt, endPt, filter, ref polys, opt);
if (0 >= polys.Count) if (0 >= polys.Count)
return DtStatus.DT_FAILURE; return DtStatus.DT_FAILURE;
@ -176,7 +176,7 @@ namespace DotRecast.Recast.Toolset.Tools
polys.Clear(); polys.Clear();
straightPath.Clear(); straightPath.Clear();
var opt = new DtFindPathOption(enableRaycast ? DtNavMeshQuery.DT_FINDPATH_ANY_ANGLE : 0, float.MaxValue); var opt = new DtFindPathOption(enableRaycast ? DtFindPathOptions.DT_FINDPATH_ANY_ANGLE : 0, float.MaxValue);
navQuery.FindPath(startRef, endRef, startPt, endPt, filter, ref polys, opt); navQuery.FindPath(startRef, endRef, startPt, endPt, filter, ref polys, opt);
if (0 >= polys.Count) if (0 >= polys.Count)
@ -206,7 +206,7 @@ namespace DotRecast.Recast.Toolset.Tools
} }
return navQuery.InitSlicedFindPath(startRef, endRef, startPos, endPos, filter, return navQuery.InitSlicedFindPath(startRef, endRef, startPos, endPos, filter,
enableRaycast ? DtNavMeshQuery.DT_FINDPATH_ANY_ANGLE : 0, enableRaycast ? DtFindPathOptions.DT_FINDPATH_ANY_ANGLE : 0,
float.MaxValue float.MaxValue
); );
} }

View File

@ -163,7 +163,7 @@ public class FindPathTest : AbstractDetourTest
long endRef = endRefs[i]; long endRef = endRefs[i];
var startPos = startPoss[i]; var startPos = startPoss[i];
var endPos = endPoss[i]; var endPos = endPoss[i];
query.InitSlicedFindPath(startRef, endRef, startPos, endPos, filter, DtNavMeshQuery.DT_FINDPATH_ANY_ANGLE); query.InitSlicedFindPath(startRef, endRef, startPos, endPos, filter, DtFindPathOptions.DT_FINDPATH_ANY_ANGLE);
DtStatus status = DtStatus.DT_IN_PROGRESS; DtStatus status = DtStatus.DT_IN_PROGRESS;
while (status.InProgress()) while (status.InProgress())
{ {