forked from mirror/DotRecast
remove GetPolyWallSegmentsResult
This commit is contained in:
parent
d146a57d62
commit
00713fa2b1
|
@ -104,17 +104,20 @@ namespace DotRecast.Detour.Crowd
|
||||||
var status = navquery.FindLocalNeighbourhood(startRef, pos, collisionQueryRange, filter, ref m_polys, ref m_parents);
|
var status = navquery.FindLocalNeighbourhood(startRef, pos, collisionQueryRange, filter, ref m_polys, ref m_parents);
|
||||||
if (status.Succeeded())
|
if (status.Succeeded())
|
||||||
{
|
{
|
||||||
m_segs.Clear();
|
|
||||||
// Secondly, store all polygon edges.
|
// Secondly, store all polygon edges.
|
||||||
|
m_segs.Clear();
|
||||||
|
|
||||||
|
var segmentVerts = new List<SegmentVert>();
|
||||||
|
var segmentRefs = new List<long>();
|
||||||
|
|
||||||
for (int j = 0; j < m_polys.Count; ++j)
|
for (int j = 0; j < m_polys.Count; ++j)
|
||||||
{
|
{
|
||||||
Result<GetPolyWallSegmentsResult> result = navquery.GetPolyWallSegments(m_polys[j], false, filter);
|
var result = navquery.GetPolyWallSegments(m_polys[j], false, filter, ref segmentVerts, ref segmentRefs);
|
||||||
if (result.Succeeded())
|
if (result.Succeeded())
|
||||||
{
|
{
|
||||||
GetPolyWallSegmentsResult gpws = result.result;
|
for (int k = 0; k < segmentRefs.Count; ++k)
|
||||||
for (int k = 0; k < gpws.CountSegmentRefs(); ++k)
|
|
||||||
{
|
{
|
||||||
SegmentVert s = gpws.GetSegmentVert(k);
|
SegmentVert s = segmentVerts[k];
|
||||||
var s0 = RcVec3f.Of(s[0], s[1], s[2]);
|
var s0 = RcVec3f.Of(s[0], s[1], s[2]);
|
||||||
var s3 = RcVec3f.Of(s[3], s[4], s[5]);
|
var s3 = RcVec3f.Of(s[3], s[4], s[5]);
|
||||||
|
|
||||||
|
|
|
@ -2984,23 +2984,24 @@ namespace DotRecast.Detour
|
||||||
/// @param[out] segmentCount The number of segments returned.
|
/// @param[out] segmentCount The number of segments returned.
|
||||||
/// @param[in] maxSegments The maximum number of segments the result arrays can hold.
|
/// @param[in] maxSegments The maximum number of segments the result arrays can hold.
|
||||||
/// @returns The status flags for the query.
|
/// @returns The status flags for the query.
|
||||||
public Result<GetPolyWallSegmentsResult> GetPolyWallSegments(long refs, bool storePortals, IDtQueryFilter filter)
|
public DtStatus GetPolyWallSegments(long refs, bool storePortals, IDtQueryFilter filter,
|
||||||
|
ref List<SegmentVert> segmentVerts, ref List<long> segmentRefs)
|
||||||
{
|
{
|
||||||
|
segmentVerts.Clear();
|
||||||
|
segmentRefs.Clear();
|
||||||
|
|
||||||
var status = m_nav.GetTileAndPolyByRef(refs, out var tile, out var poly);
|
var status = m_nav.GetTileAndPolyByRef(refs, out var tile, out var poly);
|
||||||
if (status.Failed())
|
if (status.Failed())
|
||||||
{
|
{
|
||||||
return Results.Of<GetPolyWallSegmentsResult>(status, "");
|
return DtStatus.DT_FAILURE | DtStatus.DT_INVALID_PARAM;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (null == filter)
|
if (null == filter)
|
||||||
{
|
{
|
||||||
return Results.InvalidParam<GetPolyWallSegmentsResult>();
|
return DtStatus.DT_FAILURE | DtStatus.DT_INVALID_PARAM;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<long> segmentRefs = new List<long>();
|
|
||||||
List<SegmentVert> segmentVerts = new List<SegmentVert>();
|
|
||||||
List<DtSegInterval> ints = new List<DtSegInterval>(16);
|
List<DtSegInterval> ints = new List<DtSegInterval>(16);
|
||||||
|
|
||||||
for (int i = 0, j = poly.vertCount - 1; i < poly.vertCount; j = i++)
|
for (int i = 0, j = poly.vertCount - 1; i < poly.vertCount; j = i++)
|
||||||
{
|
{
|
||||||
// Skip non-solid edges.
|
// Skip non-solid edges.
|
||||||
|
@ -3093,7 +3094,7 @@ namespace DotRecast.Detour
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Results.Success(new GetPolyWallSegmentsResult(segmentVerts, segmentRefs));
|
return DtStatus.DT_SUCCSESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @par
|
/// @par
|
||||||
|
|
|
@ -1,58 +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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using DotRecast.Core;
|
|
||||||
|
|
||||||
namespace DotRecast.Detour.QueryResults
|
|
||||||
{
|
|
||||||
public class GetPolyWallSegmentsResult
|
|
||||||
{
|
|
||||||
private readonly List<SegmentVert> _segmentVerts;
|
|
||||||
private readonly List<long> _segmentRefs;
|
|
||||||
|
|
||||||
public GetPolyWallSegmentsResult(List<SegmentVert> segmentVerts, List<long> segmentRefs)
|
|
||||||
{
|
|
||||||
_segmentVerts = segmentVerts;
|
|
||||||
_segmentRefs = segmentRefs;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int CountSegmentVerts()
|
|
||||||
{
|
|
||||||
return _segmentVerts.Count;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int CountSegmentRefs()
|
|
||||||
{
|
|
||||||
return _segmentRefs.Count;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public SegmentVert GetSegmentVert(int idx)
|
|
||||||
{
|
|
||||||
return _segmentVerts[idx];
|
|
||||||
}
|
|
||||||
|
|
||||||
public long GetSegmentRef(int idx)
|
|
||||||
{
|
|
||||||
return _segmentRefs[idx];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -816,6 +816,9 @@ public class TestNavmeshTool : IRcTool
|
||||||
{
|
{
|
||||||
if (m_polys != null)
|
if (m_polys != null)
|
||||||
{
|
{
|
||||||
|
var segmentVerts = new List<SegmentVert>();
|
||||||
|
var segmentRefs = new List<long>();
|
||||||
|
|
||||||
for (int i = 0; i < m_polys.Count; i++)
|
for (int i = 0; i < m_polys.Count; i++)
|
||||||
{
|
{
|
||||||
dd.DebugDrawNavMeshPoly(m_navMesh, m_polys[i], pathCol);
|
dd.DebugDrawNavMeshPoly(m_navMesh, m_polys[i], pathCol);
|
||||||
|
@ -833,15 +836,16 @@ public class TestNavmeshTool : IRcTool
|
||||||
dd.DepthMask(true);
|
dd.DepthMask(true);
|
||||||
if (_impl.GetSample().GetNavMeshQuery() != null)
|
if (_impl.GetSample().GetNavMeshQuery() != null)
|
||||||
{
|
{
|
||||||
Result<GetPolyWallSegmentsResult> result = _impl.GetSample().GetNavMeshQuery()
|
var result = _impl.GetSample()
|
||||||
.GetPolyWallSegments(m_polys[i], false, m_filter);
|
.GetNavMeshQuery()
|
||||||
|
.GetPolyWallSegments(m_polys[i], false, m_filter, ref segmentVerts, ref segmentRefs);
|
||||||
|
|
||||||
if (result.Succeeded())
|
if (result.Succeeded())
|
||||||
{
|
{
|
||||||
dd.Begin(LINES, 2.0f);
|
dd.Begin(LINES, 2.0f);
|
||||||
GetPolyWallSegmentsResult wallSegments = result.result;
|
for (int j = 0; j < segmentVerts.Count; ++j)
|
||||||
for (int j = 0; j < wallSegments.CountSegmentVerts(); ++j)
|
|
||||||
{
|
{
|
||||||
SegmentVert s = wallSegments.GetSegmentVert(j);
|
SegmentVert s = segmentVerts[j];
|
||||||
var v0 = RcVec3f.Of(s[0], s[1], s[2]);
|
var v0 = RcVec3f.Of(s[0], s[1], s[2]);
|
||||||
var s3 = RcVec3f.Of(s[3], s[4], s[5]);
|
var s3 = RcVec3f.Of(s[3], s[4], s[5]);
|
||||||
// Skip too distant segments.
|
// Skip too distant segments.
|
||||||
|
@ -857,7 +861,7 @@ public class TestNavmeshTool : IRcTool
|
||||||
norm.Normalize();
|
norm.Normalize();
|
||||||
RcVec3f p1 = RcVec3f.Mad(p0, norm, agentRadius * 0.5f);
|
RcVec3f p1 = RcVec3f.Mad(p0, norm, agentRadius * 0.5f);
|
||||||
// Skip backfacing segments.
|
// Skip backfacing segments.
|
||||||
if (wallSegments.GetSegmentRef(j) != 0)
|
if (segmentRefs[j] != 0)
|
||||||
{
|
{
|
||||||
int col = DuRGBA(255, 255, 255, 32);
|
int col = DuRGBA(255, 255, 255, 32);
|
||||||
dd.Vertex(s[0], s[1] + agentClimb, s[2], col);
|
dd.Vertex(s[0], s[1] + agentClimb, s[2], col);
|
||||||
|
|
|
@ -16,7 +16,8 @@ freely, subject to the following restrictions:
|
||||||
3. This notice may not be removed or altered from any source distribution.
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
using DotRecast.Detour.QueryResults;
|
using System.Collections.Generic;
|
||||||
|
using DotRecast.Core;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
|
|
||||||
namespace DotRecast.Detour.Test;
|
namespace DotRecast.Detour.Test;
|
||||||
|
@ -77,24 +78,26 @@ public class GetPolyWallSegmentsTest : AbstractDetourTest
|
||||||
[Test]
|
[Test]
|
||||||
public void TestFindDistanceToWall()
|
public void TestFindDistanceToWall()
|
||||||
{
|
{
|
||||||
|
var segmentVerts = new List<SegmentVert>();
|
||||||
|
var segmentRefs = new List<long>();
|
||||||
|
|
||||||
IDtQueryFilter filter = new DtQueryDefaultFilter();
|
IDtQueryFilter filter = new DtQueryDefaultFilter();
|
||||||
for (int i = 0; i < startRefs.Length; i++)
|
for (int i = 0; i < startRefs.Length; i++)
|
||||||
{
|
{
|
||||||
Result<GetPolyWallSegmentsResult> result = query.GetPolyWallSegments(startRefs[i], true, filter);
|
var result = query.GetPolyWallSegments(startRefs[i], true, filter, ref segmentVerts, ref segmentRefs);
|
||||||
GetPolyWallSegmentsResult segments = result.result;
|
Assert.That(segmentVerts.Count, Is.EqualTo(VERTICES[i].Length / 6));
|
||||||
Assert.That(segments.CountSegmentVerts(), Is.EqualTo(VERTICES[i].Length / 6));
|
Assert.That(segmentRefs.Count, Is.EqualTo(REFS[i].Length));
|
||||||
Assert.That(segments.CountSegmentRefs(), Is.EqualTo(REFS[i].Length));
|
|
||||||
for (int v = 0; v < VERTICES[i].Length / 6; v++)
|
for (int v = 0; v < VERTICES[i].Length / 6; v++)
|
||||||
{
|
{
|
||||||
for (int n = 0; n < 6; n++)
|
for (int n = 0; n < 6; n++)
|
||||||
{
|
{
|
||||||
Assert.That(segments.GetSegmentVert(v)[n], Is.EqualTo(VERTICES[i][v * 6 + n]).Within(0.001f));
|
Assert.That(segmentVerts[v][n], Is.EqualTo(VERTICES[i][v * 6 + n]).Within(0.001f));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int v = 0; v < REFS[i].Length; v++)
|
for (int v = 0; v < REFS[i].Length; v++)
|
||||||
{
|
{
|
||||||
Assert.That(segments.GetSegmentRef(v), Is.EqualTo(REFS[i][v]));
|
Assert.That(segmentRefs[v], Is.EqualTo(REFS[i][v]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue