forked from mirror/DotRecast
Changed to efficiently stack nearby DtCrowdAgents in `DtCrowd.GetNeighbours()`
This commit is contained in:
parent
828b9644cc
commit
1894a56889
|
@ -23,6 +23,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
- Changed vertCount and triCount to byte in `DtPolyDetail`
|
- Changed vertCount and triCount to byte in `DtPolyDetail`
|
||||||
- Changed `new float[]` to `stackalloc float[]` in `DtConvexConvexIntersections.Intersect()`
|
- Changed `new float[]` to `stackalloc float[]` in `DtConvexConvexIntersections.Intersect()`
|
||||||
- Changed agents management from list to dictionary in `DtCrowd`
|
- Changed agents management from list to dictionary in `DtCrowd`
|
||||||
|
- Changed to efficiently stack nearby DtCrowdAgents in `DtCrowd.GetNeighbours()`
|
||||||
|
|
||||||
### Removed
|
### Removed
|
||||||
- Removed RcMeshDetails.VdistSq2(float[], float[])
|
- Removed RcMeshDetails.VdistSq2(float[], float[])
|
||||||
|
|
|
@ -280,6 +280,11 @@ namespace DotRecast.Detour.Crowd
|
||||||
return ag;
|
return ag;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public DtCrowdAgent GetAgent(int idx)
|
||||||
|
{
|
||||||
|
return _agents.GetValueOrDefault(idx);
|
||||||
|
}
|
||||||
|
|
||||||
// Add the agent from the crowd.
|
// Add the agent from the crowd.
|
||||||
public void AddAgent(DtCrowdAgent agent)
|
public void AddAgent(DtCrowdAgent agent)
|
||||||
{
|
{
|
||||||
|
@ -901,12 +906,15 @@ namespace DotRecast.Detour.Crowd
|
||||||
{
|
{
|
||||||
result.Clear();
|
result.Clear();
|
||||||
|
|
||||||
int MAX_NEIS = 32;
|
const int MAX_NEIS = 32;
|
||||||
var ids = new DtCrowdAgent[MAX_NEIS];
|
Span<int> ids = stackalloc int[MAX_NEIS];
|
||||||
int nids = grid.QueryItems(pos.X - range, pos.Z - range, pos.X + range, pos.Z + range, ids, ids.Length);
|
int nids = grid.QueryItems(pos.X - range, pos.Z - range,
|
||||||
|
pos.X + range, pos.Z + range,
|
||||||
|
ids, ids.Length);
|
||||||
|
|
||||||
for (int i = 0; i < nids; ++i)
|
for (int i = 0; i < nids; ++i)
|
||||||
{
|
{
|
||||||
var ag = ids[i];
|
var ag = GetAgent(ids[i]);
|
||||||
if (ag == skip)
|
if (ag == skip)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -83,7 +83,7 @@ namespace DotRecast.Detour.Crowd
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public int QueryItems(float minx, float miny, float maxx, float maxy, DtCrowdAgent[] ids, int maxIds)
|
public int QueryItems(float minx, float miny, float maxx, float maxy, Span<int> ids, int maxIds)
|
||||||
{
|
{
|
||||||
int iminx = (int)MathF.Floor(minx * _invCellSize);
|
int iminx = (int)MathF.Floor(minx * _invCellSize);
|
||||||
int iminy = (int)MathF.Floor(miny * _invCellSize);
|
int iminy = (int)MathF.Floor(miny * _invCellSize);
|
||||||
|
@ -110,7 +110,7 @@ namespace DotRecast.Detour.Crowd
|
||||||
// Check if the id exists already.
|
// Check if the id exists already.
|
||||||
int end = n;
|
int end = n;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while (i != end && ids[i] != item)
|
while (i != end && ids[i] != item.idx)
|
||||||
{
|
{
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
@ -118,7 +118,7 @@ namespace DotRecast.Detour.Crowd
|
||||||
// Item not found, add it.
|
// Item not found, add it.
|
||||||
if (i == n)
|
if (i == n)
|
||||||
{
|
{
|
||||||
ids[n++] = item;
|
ids[n++] = item.idx;
|
||||||
|
|
||||||
if (n >= maxIds)
|
if (n >= maxIds)
|
||||||
return n;
|
return n;
|
||||||
|
|
Loading…
Reference in New Issue