remove Detour.QueryResults.Result

This commit is contained in:
ikpil 2023-06-23 07:54:28 +09:00
parent 0d7cbb5502
commit 1d7c329f23
29 changed files with 75 additions and 143 deletions

View File

@ -25,7 +25,7 @@ using System.Collections.ObjectModel;
using System.Linq;
using DotRecast.Core;
using DotRecast.Detour.Crowd.Tracking;
using DotRecast.Detour.QueryResults;
namespace DotRecast.Detour.Crowd
{
@ -560,6 +560,7 @@ namespace DotRecast.Detour.Crowd
RcSortedQueue<DtCrowdAgent> queue = new RcSortedQueue<DtCrowdAgent>((a1, a2) => a2.targetReplanTime.CompareTo(a1.targetReplanTime));
// Fire off new requests.
List<long> reqPath = new List<long>();
foreach (DtCrowdAgent ag in agents)
{
if (ag.state == CrowdAgentState.DT_CROWDAGENT_STATE_INVALID)
@ -581,26 +582,26 @@ namespace DotRecast.Detour.Crowd
throw new ArgumentException("Empty path");
}
// Quick search towards the goal.
_navQuery.InitSlicedFindPath(path[0], ag.targetRef, ag.npos, ag.targetPos,
_filters[ag.option.queryFilterType], 0);
_navQuery.UpdateSlicedFindPath(_config.maxTargetFindPathIterations, out var _);
Result<List<long>> pathFound;
DtStatus status;
if (ag.targetReplan) // && npath > 10)
{
// Try to use existing steady path during replan if
// possible.
pathFound = _navQuery.FinalizeSlicedFindPathPartial(path);
// Try to use existing steady path during replan if possible.
status = _navQuery.FinalizeSlicedFindPathPartial(path, ref reqPath);
}
else
{
// Try to move towards target when goal changes.
pathFound = _navQuery.FinalizeSlicedFindPath();
status = _navQuery.FinalizeSlicedFindPath(ref reqPath);
}
List<long> reqPath = pathFound.result;
RcVec3f reqPos = new RcVec3f();
if (pathFound.Succeeded() && reqPath.Count > 0)
if (status.Succeeded() && reqPath.Count > 0)
{
// In progress or succeed.
if (reqPath[reqPath.Count - 1] != ag.targetRef)

View File

@ -21,7 +21,7 @@ freely, subject to the following restrictions:
using System;
using System.Collections.Generic;
using DotRecast.Core;
using DotRecast.Detour.QueryResults;
namespace DotRecast.Detour.Crowd
{

View File

@ -21,7 +21,7 @@ freely, subject to the following restrictions:
using System;
using System.Collections.Generic;
using DotRecast.Core;
using DotRecast.Detour.QueryResults;
namespace DotRecast.Detour.Crowd
{
@ -349,13 +349,14 @@ namespace DotRecast.Detour.Crowd
return false;
}
var res = new List<long>();
navquery.InitSlicedFindPath(m_path[0], m_path[m_path.Count - 1], m_pos, m_target, filter, 0);
navquery.UpdateSlicedFindPath(maxIterations, out var _);
Result<List<long>> fpr = navquery.FinalizeSlicedFindPathPartial(m_path);
var status = navquery.FinalizeSlicedFindPathPartial(m_path, ref res);
if (fpr.Succeeded() && fpr.result.Count > 0)
if (status.Succeeded() && res.Count > 0)
{
m_path = MergeCorridorStartShortcut(m_path, fpr.result);
m_path = MergeCorridorStartShortcut(m_path, res);
return true;
}

View File

@ -20,7 +20,7 @@ freely, subject to the following restrictions:
using System.Collections.Generic;
using DotRecast.Core;
using DotRecast.Detour.QueryResults;
namespace DotRecast.Detour.Crowd
{
@ -65,9 +65,7 @@ namespace DotRecast.Detour.Crowd
if (q.result.status.Succeeded())
{
Result<List<long>> path = q.navQuery.FinalizeSlicedFindPath();
q.result.status = path.status;
q.result.path = path.result;
q.result.status = q.navQuery.FinalizeSlicedFindPath(ref q.result.path);
}
if (!(q.result.status.Failed() || q.result.status.Succeeded()))

View File

@ -1,6 +1,6 @@
using System;
using DotRecast.Core;
using DotRecast.Detour.QueryResults;
using DotRecast.Recast;
namespace DotRecast.Detour.Extras.Jumplink

View File

@ -1,6 +1,5 @@
using System;
using DotRecast.Core;
using DotRecast.Detour.QueryResults;
namespace DotRecast.Detour
{

View File

@ -22,7 +22,6 @@ using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using DotRecast.Core;
using DotRecast.Detour.QueryResults;
namespace DotRecast.Detour
{

View File

@ -22,7 +22,6 @@ using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using DotRecast.Core;
using DotRecast.Detour.QueryResults;
namespace DotRecast.Detour
{
@ -1333,14 +1332,18 @@ namespace DotRecast.Detour
/// @param[out] path An ordered list of polygon references representing the path. (Start to end.)
/// [(polyRef) * @p pathCount]
/// @returns The status flags for the query.
public virtual Result<List<long>> FinalizeSlicedFindPath()
public virtual DtStatus FinalizeSlicedFindPath(ref List<long> path)
{
List<long> path = new List<long>(64);
if (null == path)
return DtStatus.DT_FAILURE | DtStatus.DT_INVALID_PARAM;
path.Clear();
if (m_query.status.Failed())
{
// Reset query.
m_query = new DtQueryData();
return Results.Failure(path);
return DtStatus.DT_FAILURE;
}
if (m_query.startRef == m_query.endRef)
@ -1364,7 +1367,7 @@ namespace DotRecast.Detour
// Reset query.
m_query = new DtQueryData();
return Results.Of(DtStatus.DT_SUCCSESS | details, path);
return DtStatus.DT_SUCCSESS | details;
}
/// Finalizes and returns the results of an incomplete sliced path query, returning the path to the furthest
@ -1374,19 +1377,23 @@ namespace DotRecast.Detour
/// @param[out] path An ordered list of polygon references representing the path. (Start to end.)
/// [(polyRef) * @p pathCount]
/// @returns The status flags for the query.
public virtual Result<List<long>> FinalizeSlicedFindPathPartial(List<long> existing)
public virtual DtStatus FinalizeSlicedFindPathPartial(List<long> existing, ref List<long> path)
{
List<long> path = new List<long>(64);
if (null == path)
return DtStatus.DT_FAILURE | DtStatus.DT_INVALID_PARAM;
path.Clear();
if (null == existing || existing.Count <= 0)
{
return Results.Failure(path);
return DtStatus.DT_FAILURE | DtStatus.DT_INVALID_PARAM;
}
if (m_query.status.Failed())
{
// Reset query.
m_query = new DtQueryData();
return Results.Failure(path);
return DtStatus.DT_FAILURE;
}
if (m_query.startRef == m_query.endRef)
@ -1409,18 +1416,19 @@ namespace DotRecast.Detour
if (node == null)
{
m_query.status = DtStatus.DT_PARTIAL_RESULT;
m_query.status |= DtStatus.DT_PARTIAL_RESULT;
node = m_query.lastBestNode;
}
GetPathToNode(node, ref path);
}
DtStatus status = m_query.status;
var details = m_query.status & DtStatus.DT_STATUS_DETAIL_MASK;
// Reset query.
m_query = new DtQueryData();
return Results.Of(status, path);
return DtStatus.DT_SUCCSESS | details;
}
protected DtStatus AppendVertex(RcVec3f pos, int flags, long refs, ref List<StraightPathItem> straightPath,
@ -3362,28 +3370,28 @@ namespace DotRecast.Detour
* @remarks The result of this function depends on the state of the query object. For that reason it should only be
* used immediately after one of the two Dijkstra searches, findPolysAroundCircle or findPolysAroundShape.
*/
public Result<List<long>> GetPathFromDijkstraSearch(long endRef)
public DtStatus GetPathFromDijkstraSearch(long endRef, ref List<long> path)
{
if (!m_nav.IsValidPolyRef(endRef))
if (!m_nav.IsValidPolyRef(endRef) || null == path)
{
return Results.InvalidParam<List<long>>("Invalid end ref");
return DtStatus.DT_FAILURE | DtStatus.DT_INVALID_PARAM;
}
path.Clear();
List<DtNode> nodes = m_nodePool.FindNodes(endRef);
if (nodes.Count != 1)
{
return Results.InvalidParam<List<long>>("Invalid end ref");
return DtStatus.DT_FAILURE | DtStatus.DT_INVALID_PARAM;
}
DtNode endNode = nodes[0];
if ((endNode.flags & DT_NODE_CLOSED) == 0)
{
return Results.InvalidParam<List<long>>("Invalid end ref");
return DtStatus.DT_FAILURE | DtStatus.DT_INVALID_PARAM;
}
var path = new List<long>();
GetPathToNode(endNode, ref path);
return Results.Success(path);
return GetPathToNode(endNode, ref path);
}
// Gets the path leading to the specified end node.

View File

@ -22,14 +22,15 @@ using DotRecast.Core;
namespace DotRecast.Detour
{
public class DtQueryData
public struct DtQueryData
{
public DtStatus status;
public DtNode lastBestNode;
public float lastBestNodeCost;
public long startRef, endRef;
public RcVec3f startPos = new RcVec3f();
public RcVec3f endPos = new RcVec3f();
public long startRef;
public long endRef;
public RcVec3f startPos;
public RcVec3f endPos;
public IDtQueryFilter filter;
public int options;
public float raycastLimitSqr;

View File

@ -21,7 +21,6 @@ freely, subject to the following restrictions:
using System;
using System.Collections.Generic;
using DotRecast.Core;
using DotRecast.Detour.QueryResults;
namespace DotRecast.Detour
{

View File

@ -1,75 +0,0 @@
/*
Copyright (c) 2009-2010 Mikko Mononen memon@inside.org
recast4j copyright (c) 2015-2019 Piotr Piastucki piotr@jtilia.org
DotRecast Copyright (c) 2023 Choi Ikpil ikpil@naver.com
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
namespace DotRecast.Detour.QueryResults
{
public static class Results
{
public static Result<T> Success<T>(T result)
{
return new Result<T>(result, DtStatus.DT_SUCCSESS, null);
}
public static Result<T> InvalidParam<T>()
{
return new Result<T>(default, DtStatus.DT_FAILURE | DtStatus.DT_INVALID_PARAM, null);
}
public static Result<T> InvalidParam<T>(string message)
{
return new Result<T>(default, DtStatus.DT_FAILURE | DtStatus.DT_INVALID_PARAM, message);
}
public static Result<T> Failure<T>(T result)
{
return new Result<T>(result, DtStatus.DT_FAILURE, null);
}
public static Result<T> Of<T>(DtStatus status, T result)
{
return new Result<T>(result, status, null);
}
}
public readonly struct Result<T>
{
public readonly T result;
public readonly DtStatus status;
public readonly string message;
internal Result(T result, DtStatus status, string message)
{
this.result = result;
this.status = status;
this.message = message;
}
public bool Failed()
{
return status.Failed();
}
public bool Succeeded()
{
return status.Succeeded();
}
}
}

View File

@ -23,7 +23,7 @@ using System.Collections.Generic;
using System.Numerics;
using DotRecast.Core;
using DotRecast.Detour;
using DotRecast.Detour.QueryResults;
using DotRecast.Recast.DemoTool.Builder;
using Silk.NET.OpenGL;

View File

@ -22,7 +22,7 @@ using System.Linq;
using DotRecast.Core;
using DotRecast.Detour;
using DotRecast.Detour.Crowd;
using DotRecast.Detour.QueryResults;
using DotRecast.Recast.DemoTool.Builder;
using DotRecast.Recast.Demo.Draw;
using DotRecast.Recast.DemoTool;

View File

@ -24,7 +24,7 @@ using DotRecast.Core;
using DotRecast.Detour;
using DotRecast.Detour.Crowd;
using DotRecast.Detour.Crowd.Tracking;
using DotRecast.Detour.QueryResults;
using DotRecast.Recast.DemoTool.Builder;
using DotRecast.Recast.Demo.Draw;
using DotRecast.Recast.DemoTool;

View File

@ -2,7 +2,7 @@ using System;
using System.Collections.Generic;
using DotRecast.Core;
using DotRecast.Detour;
using DotRecast.Detour.QueryResults;
using DotRecast.Recast.DemoTool.Builder;
using DotRecast.Recast.Demo.Draw;
using DotRecast.Recast.DemoTool;
@ -982,7 +982,7 @@ public class TestNavmeshTool : IRcTool
if (m_pathFindStatus.Succeeded())
{
m_polys = m_navQuery.FinalizeSlicedFindPath().result;
m_navQuery.FinalizeSlicedFindPath(ref m_polys);
m_straightPath = null;
if (m_polys != null)
{

View File

@ -21,7 +21,7 @@ freely, subject to the following restrictions:
using System;
using System.Collections.Generic;
using DotRecast.Core;
using DotRecast.Detour.QueryResults;
using NUnit.Framework;
namespace DotRecast.Detour.Crowd.Test;

View File

@ -18,7 +18,7 @@ freely, subject to the following restrictions:
using System.Collections.Generic;
using DotRecast.Core;
using DotRecast.Detour.QueryResults;
using Moq;
using NUnit.Framework;

View File

@ -4,7 +4,7 @@ using System.Threading.Tasks;
using DotRecast.Core;
using DotRecast.Detour.Dynamic.Colliders;
using DotRecast.Detour.Dynamic.Io;
using DotRecast.Detour.QueryResults;
using NUnit.Framework;
namespace DotRecast.Detour.Dynamic.Test;

View File

@ -22,7 +22,7 @@ using System.Linq;
using DotRecast.Core;
using DotRecast.Detour.Extras.Unity.Astar;
using DotRecast.Detour.Io;
using DotRecast.Detour.QueryResults;
using NUnit.Framework;
namespace DotRecast.Detour.Extras.Test.Unity.Astar;

View File

@ -17,7 +17,7 @@ freely, subject to the following restrictions:
*/
using DotRecast.Core;
using DotRecast.Detour.QueryResults;
using NUnit.Framework;
namespace DotRecast.Detour.Test;

View File

@ -17,7 +17,7 @@ freely, subject to the following restrictions:
*/
using DotRecast.Core;
using DotRecast.Detour.QueryResults;
using NUnit.Framework;
namespace DotRecast.Detour.Test;

View File

@ -18,7 +18,7 @@ freely, subject to the following restrictions:
using System.Collections.Generic;
using DotRecast.Core;
using DotRecast.Detour.QueryResults;
using NUnit.Framework;
namespace DotRecast.Detour.Test;
@ -156,6 +156,7 @@ public class FindPathTest : AbstractDetourTest
public void TestFindPathSliced()
{
IDtQueryFilter filter = new DtQueryDefaultFilter();
var path = new List<long>();
for (int i = 0; i < startRefs.Length; i++)
{
long startRef = startRefs[i];
@ -169,12 +170,12 @@ public class FindPathTest : AbstractDetourTest
status = query.UpdateSlicedFindPath(10, out var _);
}
Result<List<long>> path = query.FinalizeSlicedFindPath();
Assert.That(path.status, Is.EqualTo(STATUSES[i]), $"index({i})");
Assert.That(path.result.Count, Is.EqualTo(RESULTS[i].Length));
status = query.FinalizeSlicedFindPath(ref path);
Assert.That(status, Is.EqualTo(STATUSES[i]), $"index({i})");
Assert.That(path.Count, Is.EqualTo(RESULTS[i].Length));
for (int j = 0; j < RESULTS[i].Length; j++)
{
Assert.That(path.result[j], Is.EqualTo(RESULTS[i][j]));
Assert.That(path[j], Is.EqualTo(RESULTS[i][j]));
}
}
}

View File

@ -17,7 +17,7 @@ freely, subject to the following restrictions:
*/
using DotRecast.Core;
using DotRecast.Detour.QueryResults;
using NUnit.Framework;
namespace DotRecast.Detour.Test;

View File

@ -17,7 +17,7 @@ freely, subject to the following restrictions:
*/
using DotRecast.Core;
using DotRecast.Detour.QueryResults;
using NUnit.Framework;
namespace DotRecast.Detour.Test;

View File

@ -17,7 +17,7 @@ freely, subject to the following restrictions:
*/
using DotRecast.Core;
using DotRecast.Detour.QueryResults;
using NUnit.Framework;
namespace DotRecast.Detour.Test;

View File

@ -19,7 +19,7 @@ freely, subject to the following restrictions:
using System;
using System.Diagnostics;
using DotRecast.Core;
using DotRecast.Detour.QueryResults;
using NUnit.Framework;
using static DotRecast.Core.RcMath;

View File

@ -18,7 +18,7 @@ freely, subject to the following restrictions:
using System.Collections.Generic;
using DotRecast.Core;
using DotRecast.Detour.QueryResults;
using NUnit.Framework;
namespace DotRecast.Detour.Test;

View File

@ -21,7 +21,7 @@ freely, subject to the following restrictions:
using System.Collections.Generic;
using System.IO;
using DotRecast.Core;
using DotRecast.Detour.QueryResults;
using DotRecast.Detour.TileCache.Io;
using NUnit.Framework;

View File

@ -20,7 +20,7 @@ freely, subject to the following restrictions:
using System.Collections.Generic;
using DotRecast.Core;
using DotRecast.Detour.QueryResults;
using DotRecast.Recast;
using DotRecast.Recast.Geom;
using NUnit.Framework;