forked from mirror/DotRecast
preparatory work to resolve the SOH issue during path merging.
This commit is contained in:
parent
19e358bdfc
commit
cfdcc1336c
|
@ -589,7 +589,7 @@ namespace DotRecast.Detour.Crowd
|
|||
if (ag.targetReplan) // && npath > 10)
|
||||
{
|
||||
// Try to use existing steady path during replan if possible.
|
||||
status = _navQuery.FinalizeSlicedFindPathPartial(path, ref reqPath);
|
||||
status = _navQuery.FinalizeSlicedFindPathPartial(path, path.Count, ref reqPath);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -137,7 +137,7 @@ namespace DotRecast.Detour.Crowd
|
|||
{
|
||||
const float MIN_TARGET_DIST = 0.01f;
|
||||
|
||||
var result = navquery.FindStraightPath(m_pos, m_target, m_path, ref corners, maxCorners, 0);
|
||||
var result = navquery.FindStraightPath(m_pos, m_target, m_path, m_npath, ref corners, maxCorners, 0);
|
||||
if (result.Succeeded())
|
||||
{
|
||||
// Prune points in the beginning of the path which are too close.
|
||||
|
@ -246,7 +246,7 @@ namespace DotRecast.Detour.Crowd
|
|||
var res = new List<long>();
|
||||
navquery.InitSlicedFindPath(m_path[0], m_path[^1], m_pos, m_target, filter, 0);
|
||||
navquery.UpdateSlicedFindPath(maxIterations, out var _);
|
||||
var status = navquery.FinalizeSlicedFindPathPartial(m_path, ref res);
|
||||
var status = navquery.FinalizeSlicedFindPathPartial(m_path, m_npath, ref res);
|
||||
|
||||
if (status.Succeeded() && res.Count > 0)
|
||||
{
|
||||
|
|
|
@ -1367,15 +1367,17 @@ namespace DotRecast.Detour
|
|||
/// @param[in] existingSize The number of polygon in the @p existing array.
|
||||
/// @param[out] path An ordered list of polygon references representing the path. (Start to end.)
|
||||
/// [(polyRef) * @p pathCount]
|
||||
/// @param[out] pathCount The number of polygons returned in the @p path array.
|
||||
/// @param[in] maxPath The max number of polygons the @p path array can hold. [Limit: >= 1]
|
||||
/// @returns The status flags for the query.
|
||||
public virtual DtStatus FinalizeSlicedFindPathPartial(List<long> existing, ref List<long> path)
|
||||
public virtual DtStatus FinalizeSlicedFindPathPartial(List<long> existing, int existingSize, ref List<long> path)
|
||||
{
|
||||
if (null == path)
|
||||
return DtStatus.DT_FAILURE | DtStatus.DT_INVALID_PARAM;
|
||||
|
||||
path.Clear();
|
||||
|
||||
if (null == existing || existing.Count <= 0)
|
||||
if (null == existing || existingSize <= 0)
|
||||
{
|
||||
return DtStatus.DT_FAILURE | DtStatus.DT_INVALID_PARAM;
|
||||
}
|
||||
|
@ -1396,7 +1398,7 @@ namespace DotRecast.Detour
|
|||
{
|
||||
// Find furthest existing node that was visited.
|
||||
DtNode node = null;
|
||||
for (int i = existing.Count - 1; i >= 0; --i)
|
||||
for (int i = existingSize - 1; i >= 0; --i)
|
||||
{
|
||||
node = m_nodePool.FindNode(existing[i]);
|
||||
if (node != null)
|
||||
|
@ -1527,12 +1529,12 @@ namespace DotRecast.Detour
|
|||
/// @param[in] maxStraightPath The maximum number of points the straight path arrays can hold. [Limit: > 0]
|
||||
/// @param[in] options Query options. (see: #dtStraightPathOptions)
|
||||
/// @returns The status flags for the query.
|
||||
public virtual DtStatus FindStraightPath(RcVec3f startPos, RcVec3f endPos, List<long> path,
|
||||
public virtual DtStatus FindStraightPath(RcVec3f startPos, RcVec3f endPos, List<long> path, int pathSize,
|
||||
ref List<DtStraightPath> straightPath,
|
||||
int maxStraightPath, int options)
|
||||
{
|
||||
if (!startPos.IsFinite() || !endPos.IsFinite() || null == straightPath
|
||||
|| null == path || 0 == path.Count || path[0] == 0 || maxStraightPath <= 0)
|
||||
|| null == path || pathSize <= 0 || path[0] == 0 || maxStraightPath <= 0)
|
||||
{
|
||||
return DtStatus.DT_FAILURE | DtStatus.DT_INVALID_PARAM;
|
||||
}
|
||||
|
@ -1546,7 +1548,7 @@ namespace DotRecast.Detour
|
|||
return DtStatus.DT_FAILURE | DtStatus.DT_INVALID_PARAM;
|
||||
}
|
||||
|
||||
var closestEndPosRes = ClosestPointOnPolyBoundary(path[path.Count - 1], endPos, out var closestEndPos);
|
||||
var closestEndPosRes = ClosestPointOnPolyBoundary(path[pathSize - 1], endPos, out var closestEndPos);
|
||||
if (closestEndPosRes.Failed())
|
||||
{
|
||||
return DtStatus.DT_FAILURE | DtStatus.DT_INVALID_PARAM;
|
||||
|
@ -1559,7 +1561,7 @@ namespace DotRecast.Detour
|
|||
return stat;
|
||||
}
|
||||
|
||||
if (path.Count > 1)
|
||||
if (pathSize > 1)
|
||||
{
|
||||
RcVec3f portalApex = closestStartPos;
|
||||
RcVec3f portalLeft = portalApex;
|
||||
|
@ -1574,13 +1576,13 @@ namespace DotRecast.Detour
|
|||
long leftPolyRef = path[0];
|
||||
long rightPolyRef = path[0];
|
||||
|
||||
for (int i = 0; i < path.Count; ++i)
|
||||
for (int i = 0; i < pathSize; ++i)
|
||||
{
|
||||
RcVec3f left;
|
||||
RcVec3f right;
|
||||
int toType;
|
||||
|
||||
if (i + 1 < path.Count)
|
||||
if (i + 1 < pathSize)
|
||||
{
|
||||
int fromType; // // fromType is ignored.
|
||||
|
||||
|
@ -1633,7 +1635,7 @@ namespace DotRecast.Detour
|
|||
if (DtUtils.VEqual(portalApex, portalRight) || DtUtils.TriArea2D(portalApex, portalLeft, right) > 0.0f)
|
||||
{
|
||||
portalRight = right;
|
||||
rightPolyRef = (i + 1 < path.Count) ? path[i + 1] : 0;
|
||||
rightPolyRef = (i + 1 < pathSize) ? path[i + 1] : 0;
|
||||
rightPolyType = toType;
|
||||
rightIndex = i;
|
||||
}
|
||||
|
@ -1689,7 +1691,7 @@ namespace DotRecast.Detour
|
|||
if (DtUtils.VEqual(portalApex, portalLeft) || DtUtils.TriArea2D(portalApex, portalRight, left) < 0.0f)
|
||||
{
|
||||
portalLeft = left;
|
||||
leftPolyRef = (i + 1 < path.Count) ? path[i + 1] : 0;
|
||||
leftPolyRef = (i + 1 < pathSize) ? path[i + 1] : 0;
|
||||
leftPolyType = toType;
|
||||
leftIndex = i;
|
||||
}
|
||||
|
@ -1743,7 +1745,7 @@ namespace DotRecast.Detour
|
|||
// Append portals along the current straight path segment.
|
||||
if ((options & (DtStraightPathOptions.DT_STRAIGHTPATH_AREA_CROSSINGS | DtStraightPathOptions.DT_STRAIGHTPATH_ALL_CROSSINGS)) != 0)
|
||||
{
|
||||
stat = AppendPortals(apexIndex, path.Count - 1, closestEndPos, path, ref straightPath, maxStraightPath, options);
|
||||
stat = AppendPortals(apexIndex, pathSize - 1, closestEndPos, path, ref straightPath, maxStraightPath, options);
|
||||
if (!stat.InProgress())
|
||||
{
|
||||
return stat;
|
||||
|
|
|
@ -31,7 +31,7 @@ namespace DotRecast.Detour
|
|||
|
||||
public static bool GetSteerTarget(DtNavMeshQuery navQuery, RcVec3f startPos, RcVec3f endPos,
|
||||
float minTargetDist,
|
||||
List<long> path,
|
||||
List<long> path, int pathSize,
|
||||
out RcVec3f steerPos, out int steerPosFlag, out long steerPosRef)
|
||||
{
|
||||
steerPos = RcVec3f.Zero;
|
||||
|
@ -40,7 +40,7 @@ namespace DotRecast.Detour
|
|||
|
||||
// Find steer target.
|
||||
var straightPath = new List<DtStraightPath>(MAX_STEER_POINTS);
|
||||
var result = navQuery.FindStraightPath(startPos, endPos, path, ref straightPath, MAX_STEER_POINTS, 0);
|
||||
var result = navQuery.FindStraightPath(startPos, endPos, path, pathSize, ref straightPath, MAX_STEER_POINTS, 0);
|
||||
if (result.Failed())
|
||||
{
|
||||
return false;
|
||||
|
|
|
@ -65,7 +65,7 @@ namespace DotRecast.Recast.Toolset.Tools
|
|||
{
|
||||
// Find location to steer towards.
|
||||
if (!DtPathUtils.GetSteerTarget(navQuery, iterPos, targetPos, SLOP,
|
||||
pathIterPolys, out var steerPos, out var steerPosFlag, out var steerPosRef))
|
||||
pathIterPolys, pathIterPolyCount, out var steerPos, out var steerPosFlag, out var steerPosRef))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
@ -200,7 +200,7 @@ namespace DotRecast.Recast.Toolset.Tools
|
|||
}
|
||||
}
|
||||
|
||||
navQuery.FindStraightPath(startPt, epos, polys, ref straightPath, MAX_POLYS, straightPathOptions);
|
||||
navQuery.FindStraightPath(startPt, epos, polys, polys.Count, ref straightPath, MAX_POLYS, straightPathOptions);
|
||||
|
||||
return DtStatus.DT_SUCCESS;
|
||||
}
|
||||
|
@ -245,7 +245,7 @@ namespace DotRecast.Recast.Toolset.Tools
|
|||
}
|
||||
|
||||
straightPath = new List<DtStraightPath>(MAX_POLYS);
|
||||
navQuery.FindStraightPath(startPos, epos, path, ref straightPath, MAX_POLYS, DtStraightPathOptions.DT_STRAIGHTPATH_ALL_CROSSINGS);
|
||||
navQuery.FindStraightPath(startPos, epos, path, path.Count, ref straightPath, MAX_POLYS, DtStraightPathOptions.DT_STRAIGHTPATH_ALL_CROSSINGS);
|
||||
}
|
||||
|
||||
return DtStatus.DT_SUCCESS;
|
||||
|
|
|
@ -51,11 +51,12 @@ public class PathCorridorTest
|
|||
It.IsAny<RcVec3f>(),
|
||||
It.IsAny<RcVec3f>(),
|
||||
It.IsAny<List<long>>(),
|
||||
It.IsAny<int>(),
|
||||
ref It.Ref<List<DtStraightPath>>.IsAny,
|
||||
It.IsAny<int>(),
|
||||
It.IsAny<int>())
|
||||
)
|
||||
.Callback((RcVec3f startPos, RcVec3f endPos, List<long> path,
|
||||
.Callback((RcVec3f startPos, RcVec3f endPos, List<long> path, int pathSize,
|
||||
ref List<DtStraightPath> refStraightPath, int maxStraightPath, int options) =>
|
||||
{
|
||||
refStraightPath = straightPath;
|
||||
|
@ -83,10 +84,11 @@ public class PathCorridorTest
|
|||
It.IsAny<RcVec3f>(),
|
||||
It.IsAny<RcVec3f>(),
|
||||
It.IsAny<List<long>>(),
|
||||
It.IsAny<int>(),
|
||||
ref It.Ref<List<DtStraightPath>>.IsAny,
|
||||
It.IsAny<int>(),
|
||||
It.IsAny<int>())
|
||||
).Callback((RcVec3f startPos, RcVec3f endPos, List<long> path,
|
||||
).Callback((RcVec3f startPos, RcVec3f endPos, List<long> path, int pathSize,
|
||||
ref List<DtStraightPath> refStraightPath, int maxStraightPath, int options) =>
|
||||
{
|
||||
refStraightPath = straightPath;
|
||||
|
|
|
@ -193,7 +193,7 @@ public class FindPathTest : AbstractDetourTest
|
|||
var endPos = endPoss[i];
|
||||
var status = query.FindPath(startRef, endRef, startPos, endPos, filter, ref path, DtFindPathOption.NoOption);
|
||||
var straightPath = new List<DtStraightPath>();
|
||||
query.FindStraightPath(startPos, endPos, path, ref straightPath, int.MaxValue, 0);
|
||||
query.FindStraightPath(startPos, endPos, path, path.Count, ref straightPath, int.MaxValue, 0);
|
||||
Assert.That(straightPath.Count, Is.EqualTo(STRAIGHT_PATHS[i].Length));
|
||||
for (int j = 0; j < STRAIGHT_PATHS[i].Length; j++)
|
||||
{
|
||||
|
|
|
@ -60,7 +60,7 @@ public class TileCacheFindPathTest : AbstractTileCacheTest
|
|||
int options = 0;
|
||||
|
||||
var pathStr = new List<DtStraightPath>();
|
||||
query.FindStraightPath(startPos, endPos, path, ref pathStr, maxStraightPath, options);
|
||||
query.FindStraightPath(startPos, endPos, path, path.Count, ref pathStr, maxStraightPath, options);
|
||||
Assert.That(pathStr.Count, Is.EqualTo(8));
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue