@@ -21,6 +21,7 @@ 3. This notice may not be removed or altered from any source distribution.
21
21
using System ;
22
22
using System . Collections . Generic ;
23
23
using DotRecast . Core ;
24
+ using DotRecast . Core . Buffers ;
24
25
using DotRecast . Core . Collections ;
25
26
using DotRecast . Core . Numerics ;
26
27
@@ -41,9 +42,9 @@ public class DtNavMeshQuery
41
42
public DtNavMeshQuery ( DtNavMesh nav )
42
43
{
43
44
m_nav = nav ;
44
- m_tinyNodePool = new DtNodePool ( ) ;
45
45
m_nodePool = new DtNodePool ( ) ;
46
46
m_openList = new DtNodeQueue ( ) ;
47
+ m_tinyNodePool = new DtNodePool ( ) ;
47
48
}
48
49
49
50
/// Returns random location on navmesh.
@@ -137,18 +138,18 @@ public DtStatus FindRandomPoint(IDtQueryFilter filter, IRcRand frand, out long r
137
138
}
138
139
139
140
// Randomly pick point on polygon.
140
- float [ ] verts = new float [ 3 * m_nav . GetMaxVertsPerPoly ( ) ] ;
141
- float [ ] areas = new float [ m_nav . GetMaxVertsPerPoly ( ) ] ;
142
- RcArrays . Copy ( tile . data . verts , poly . verts [ 0 ] * 3 , verts , 0 , 3 ) ;
141
+ using var verts = RcRentedArray . Rent < float > ( 3 * m_nav . GetMaxVertsPerPoly ( ) ) ;
142
+ using var areas = RcRentedArray . Rent < float > ( m_nav . GetMaxVertsPerPoly ( ) ) ;
143
+ RcArrays . Copy ( tile . data . verts , poly . verts [ 0 ] * 3 , verts . AsArray ( ) , 0 , 3 ) ;
143
144
for ( int j = 1 ; j < poly . vertCount ; ++ j )
144
145
{
145
- RcArrays . Copy ( tile . data . verts , poly . verts [ j ] * 3 , verts , j * 3 , 3 ) ;
146
+ RcArrays . Copy ( tile . data . verts , poly . verts [ j ] * 3 , verts . AsArray ( ) , j * 3 , 3 ) ;
146
147
}
147
148
148
149
float s = frand . Next ( ) ;
149
150
float t = frand . Next ( ) ;
150
151
151
- var pt = DtUtils . RandomPointInConvexPoly ( verts , poly . vertCount , areas , s , t ) ;
152
+ var pt = DtUtils . RandomPointInConvexPoly ( verts . AsArray ( ) , poly . vertCount , areas . AsArray ( ) , s , t ) ;
152
153
ClosestPointOnPoly ( polyRef , pt , out var closest , out var _ ) ;
153
154
154
155
randomRef = polyRef ;
@@ -386,8 +387,8 @@ public DtStatus FindRandomPointAroundCircle(long startRef, RcVec3f centerPos, fl
386
387
float s = frand . Next ( ) ;
387
388
float t = frand . Next ( ) ;
388
389
389
- float [ ] areas = new float [ randomPolyVerts . Length / 3 ] ;
390
- RcVec3f pt = DtUtils . RandomPointInConvexPoly ( randomPolyVerts , randomPolyVerts . Length / 3 , areas , s , t ) ;
390
+ using var areas = RcRentedArray . Rent < float > ( randomPolyVerts . Length / 3 ) ;
391
+ RcVec3f pt = DtUtils . RandomPointInConvexPoly ( randomPolyVerts , randomPolyVerts . Length / 3 , areas . AsArray ( ) , s , t ) ;
391
392
ClosestPointOnPoly ( randomPolyRef , pt , out var closest , out var _ ) ;
392
393
393
394
randomRef = randomPolyRef ;
@@ -457,16 +458,16 @@ public DtStatus ClosestPointOnPolyBoundary(long refs, RcVec3f pos, out RcVec3f c
457
458
}
458
459
459
460
// Collect vertices.
460
- float [ ] verts = new float [ m_nav . GetMaxVertsPerPoly ( ) * 3 ] ;
461
- float [ ] edged = new float [ m_nav . GetMaxVertsPerPoly ( ) ] ;
462
- float [ ] edget = new float [ m_nav . GetMaxVertsPerPoly ( ) ] ;
461
+ using var verts = RcRentedArray . Rent < float > ( m_nav . GetMaxVertsPerPoly ( ) * 3 ) ;
462
+ using var edged = RcRentedArray . Rent < float > ( m_nav . GetMaxVertsPerPoly ( ) ) ;
463
+ using var edget = RcRentedArray . Rent < float > ( m_nav . GetMaxVertsPerPoly ( ) ) ;
463
464
int nv = poly . vertCount ;
464
465
for ( int i = 0 ; i < nv ; ++ i )
465
466
{
466
- RcArrays . Copy ( tile . data . verts , poly . verts [ i ] * 3 , verts , i * 3 , 3 ) ;
467
+ RcArrays . Copy ( tile . data . verts , poly . verts [ i ] * 3 , verts . AsArray ( ) , i * 3 , 3 ) ;
467
468
}
468
469
469
- if ( DtUtils . DistancePtPolyEdgesSqr ( pos , verts , nv , edged , edget ) )
470
+ if ( DtUtils . DistancePtPolyEdgesSqr ( pos , verts . AsArray ( ) , nv , edged . AsArray ( ) , edget . AsArray ( ) ) )
470
471
{
471
472
closest = pos ;
472
473
}
@@ -486,7 +487,7 @@ public DtStatus ClosestPointOnPolyBoundary(long refs, RcVec3f pos, out RcVec3f c
486
487
487
488
int va = imin * 3 ;
488
489
int vb = ( ( imin + 1 ) % nv ) * 3 ;
489
- closest = RcVecUtils . Lerp ( verts , va , vb , edget [ imin ] ) ;
490
+ closest = RcVecUtils . Lerp ( verts . AsArray ( ) , va , vb , edget [ imin ] ) ;
490
491
}
491
492
492
493
return DtStatus . DT_SUCCESS ;
@@ -1793,7 +1794,9 @@ public DtStatus MoveAlongSurface(long startRef, RcVec3f startPos, RcVec3f endPos
1793
1794
resultPos = RcVec3f . Zero ;
1794
1795
1795
1796
if ( null != visited )
1797
+ {
1796
1798
visited . Clear ( ) ;
1799
+ }
1797
1800
1798
1801
// Validate input
1799
1802
if ( ! m_nav . IsValidPolyRef ( startRef ) || ! startPos . IsFinite ( )
@@ -1822,7 +1825,7 @@ public DtStatus MoveAlongSurface(long startRef, RcVec3f startPos, RcVec3f endPos
1822
1825
var searchPos = RcVec3f . Lerp ( startPos , endPos , 0.5f ) ;
1823
1826
float searchRadSqr = RcMath . Sqr ( RcVec3f . Distance ( startPos , endPos ) / 2.0f + 0.001f ) ;
1824
1827
1825
- float [ ] verts = new float [ m_nav . GetMaxVertsPerPoly ( ) * 3 ] ;
1828
+ using var verts = RcRentedArray . Rent < float > ( m_nav . GetMaxVertsPerPoly ( ) * 3 ) ;
1826
1829
1827
1830
const int MAX_NEIS = 8 ;
1828
1831
Span < long > neis = stackalloc long [ MAX_NEIS ] ;
@@ -1842,11 +1845,11 @@ public DtStatus MoveAlongSurface(long startRef, RcVec3f startPos, RcVec3f endPos
1842
1845
int nverts = curPoly . vertCount ;
1843
1846
for ( int i = 0 ; i < nverts ; ++ i )
1844
1847
{
1845
- RcArrays . Copy ( curTile . data . verts , curPoly . verts [ i ] * 3 , verts , i * 3 , 3 ) ;
1848
+ RcArrays . Copy ( curTile . data . verts , curPoly . verts [ i ] * 3 , verts . AsArray ( ) , i * 3 , 3 ) ;
1846
1849
}
1847
1850
1848
1851
// If target is inside the poly, stop search.
1849
- if ( DtUtils . PointInPolygon ( endPos , verts , nverts ) )
1852
+ if ( DtUtils . PointInPolygon ( endPos , verts . AsArray ( ) , nverts ) )
1850
1853
{
1851
1854
bestNode = curNode ;
1852
1855
bestPos = endPos ;
@@ -1897,11 +1900,11 @@ public DtStatus MoveAlongSurface(long startRef, RcVec3f startPos, RcVec3f endPos
1897
1900
// Wall edge, calc distance.
1898
1901
int vj = j * 3 ;
1899
1902
int vi = i * 3 ;
1900
- var distSqr = DtUtils . DistancePtSegSqr2D ( endPos , verts , vj , vi , out var tseg ) ;
1903
+ var distSqr = DtUtils . DistancePtSegSqr2D ( endPos , verts . AsArray ( ) , vj , vi , out var tseg ) ;
1901
1904
if ( distSqr < bestDist )
1902
1905
{
1903
1906
// Update nearest distance.
1904
- bestPos = RcVecUtils . Lerp ( verts , vj , vi , tseg ) ;
1907
+ bestPos = RcVecUtils . Lerp ( verts . AsArray ( ) , vj , vi , tseg ) ;
1905
1908
bestDist = distSqr ;
1906
1909
bestNode = curNode ;
1907
1910
}
@@ -1921,7 +1924,7 @@ public DtStatus MoveAlongSurface(long startRef, RcVec3f startPos, RcVec3f endPos
1921
1924
// TODO: Maybe should use GetPortalPoints(), but this one is way faster.
1922
1925
int vj = j * 3 ;
1923
1926
int vi = i * 3 ;
1924
- var distSqr = DtUtils . DistancePtSegSqr2D ( searchPos , verts , vj , vi , out var _ ) ;
1927
+ var distSqr = DtUtils . DistancePtSegSqr2D ( searchPos , verts . AsArray ( ) , vj , vi , out var _ ) ;
1925
1928
if ( distSqr > searchRadSqr )
1926
1929
{
1927
1930
continue ;
@@ -2245,7 +2248,7 @@ public DtStatus Raycast(long startRef, RcVec3f startPos, RcVec3f endPos,
2245
2248
hit . path . Clear ( ) ;
2246
2249
hit . pathCost = 0 ;
2247
2250
2248
- RcVec3f [ ] verts = new RcVec3f [ m_nav . GetMaxVertsPerPoly ( ) + 1 ] ;
2251
+ using var verts = RcRentedArray . Rent < RcVec3f > ( m_nav . GetMaxVertsPerPoly ( ) + 1 ) ;
2249
2252
2250
2253
RcVec3f curPos = RcVec3f . Zero ;
2251
2254
RcVec3f lastPos = RcVec3f . Zero ;
@@ -2279,7 +2282,7 @@ public DtStatus Raycast(long startRef, RcVec3f startPos, RcVec3f endPos,
2279
2282
nv ++ ;
2280
2283
}
2281
2284
2282
- bool intersects = DtUtils . IntersectSegmentPoly2D ( startPos , endPos , verts , nv , out var tmin , out var tmax , out var segMin , out var segMax ) ;
2285
+ bool intersects = DtUtils . IntersectSegmentPoly2D ( startPos , endPos , verts . AsArray ( ) , nv , out var tmin , out var tmax , out var segMin , out var segMax ) ;
2283
2286
if ( ! intersects )
2284
2287
{
2285
2288
// Could not hit the polygon, keep the old t and report hit.
@@ -2874,8 +2877,8 @@ public DtStatus FindLocalNeighbourhood(long startRef, RcVec3f centerPos, float r
2874
2877
2875
2878
float radiusSqr = RcMath . Sqr ( radius ) ;
2876
2879
2877
- float [ ] pa = new float [ m_nav . GetMaxVertsPerPoly ( ) * 3 ] ;
2878
- float [ ] pb = new float [ m_nav . GetMaxVertsPerPoly ( ) * 3 ] ;
2880
+ using var pa = RcRentedArray . Rent < float > ( m_nav . GetMaxVertsPerPoly ( ) * 3 ) ;
2881
+ using var pb = RcRentedArray . Rent < float > ( m_nav . GetMaxVertsPerPoly ( ) * 3 ) ;
2879
2882
2880
2883
while ( 0 < stack . Count )
2881
2884
{
@@ -2946,7 +2949,7 @@ public DtStatus FindLocalNeighbourhood(long startRef, RcVec3f centerPos, float r
2946
2949
int npa = neighbourPoly . vertCount ;
2947
2950
for ( int k = 0 ; k < npa ; ++ k )
2948
2951
{
2949
- RcArrays . Copy ( neighbourTile . data . verts , neighbourPoly . verts [ k ] * 3 , pa , k * 3 , 3 ) ;
2952
+ RcArrays . Copy ( neighbourTile . data . verts , neighbourPoly . verts [ k ] * 3 , pa . AsArray ( ) , k * 3 , 3 ) ;
2950
2953
}
2951
2954
2952
2955
bool overlap = false ;
@@ -2977,10 +2980,10 @@ public DtStatus FindLocalNeighbourhood(long startRef, RcVec3f centerPos, float r
2977
2980
int npb = pastPoly . vertCount ;
2978
2981
for ( int k = 0 ; k < npb ; ++ k )
2979
2982
{
2980
- RcArrays . Copy ( pastTile . data . verts , pastPoly . verts [ k ] * 3 , pb , k * 3 , 3 ) ;
2983
+ RcArrays . Copy ( pastTile . data . verts , pastPoly . verts [ k ] * 3 , pb . AsArray ( ) , k * 3 , 3 ) ;
2981
2984
}
2982
2985
2983
- if ( DtUtils . OverlapPolyPoly2D ( pa , npa , pb , npb ) )
2986
+ if ( DtUtils . OverlapPolyPoly2D ( pa . AsArray ( ) , npa , pb . AsArray ( ) , npb ) )
2984
2987
{
2985
2988
overlap = true ;
2986
2989
break ;
0 commit comments