forked from mirror/DotRecast
remove Detour.QueryResults.Result
This commit is contained in:
parent
0d7cbb5502
commit
1d7c329f23
|
@ -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)
|
||||
|
@ -580,27 +581,27 @@ 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)
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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()))
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
using System;
|
||||
using DotRecast.Core;
|
||||
using DotRecast.Detour.QueryResults;
|
||||
|
||||
using DotRecast.Recast;
|
||||
|
||||
namespace DotRecast.Detour.Extras.Jumplink
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
using System;
|
||||
using DotRecast.Core;
|
||||
using DotRecast.Detour.QueryResults;
|
||||
|
||||
namespace DotRecast.Detour
|
||||
{
|
||||
|
|
|
@ -22,7 +22,6 @@ using System;
|
|||
using System.Collections.Generic;
|
||||
using System.Collections.Immutable;
|
||||
using DotRecast.Core;
|
||||
using DotRecast.Detour.QueryResults;
|
||||
|
||||
namespace DotRecast.Detour
|
||||
{
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -17,7 +17,7 @@ freely, subject to the following restrictions:
|
|||
*/
|
||||
|
||||
using DotRecast.Core;
|
||||
using DotRecast.Detour.QueryResults;
|
||||
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace DotRecast.Detour.Test;
|
||||
|
|
|
@ -17,7 +17,7 @@ freely, subject to the following restrictions:
|
|||
*/
|
||||
|
||||
using DotRecast.Core;
|
||||
using DotRecast.Detour.QueryResults;
|
||||
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace DotRecast.Detour.Test;
|
||||
|
|
|
@ -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]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@ freely, subject to the following restrictions:
|
|||
*/
|
||||
|
||||
using DotRecast.Core;
|
||||
using DotRecast.Detour.QueryResults;
|
||||
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace DotRecast.Detour.Test;
|
||||
|
|
|
@ -17,7 +17,7 @@ freely, subject to the following restrictions:
|
|||
*/
|
||||
|
||||
using DotRecast.Core;
|
||||
using DotRecast.Detour.QueryResults;
|
||||
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace DotRecast.Detour.Test;
|
||||
|
|
|
@ -17,7 +17,7 @@ freely, subject to the following restrictions:
|
|||
*/
|
||||
|
||||
using DotRecast.Core;
|
||||
using DotRecast.Detour.QueryResults;
|
||||
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace DotRecast.Detour.Test;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue