forked from mirror/DotRecast
Compare commits
44 Commits
risky_opti
...
master
Author | SHA1 | Date |
---|---|---|
wrenge | 0b888b16fb | |
wrenge | 7de4b51135 | |
wrenge | 2cf9d9de18 | |
wrenge | 0876d3adcf | |
wrenge | 38a8029b6e | |
wrenge | 858e094ea0 | |
wrenge | acd3f8d879 | |
wrenge | fff0998613 | |
wrenge | 2397f23fc3 | |
wrenge | b6a1a81fdc | |
wrenge | c989276f5e | |
wrenge | c0b916a0d1 | |
wrenge | 3e754529e5 | |
wrenge | 8642d47738 | |
wrenge | ff930712ee | |
wrenge | 6fe6844efd | |
wrenge | c8104cec4d | |
wrenge | db0717a77e | |
wrenge | 724be6f3b2 | |
wrenge | 0f28fa26ec | |
Georgiy Sadovnikov | 20a86b5bae | |
Семенов Иван | c84fb0b11e | |
Семенов Иван | 4a1b430ee6 | |
Семенов Иван | 53aac60713 | |
wrenge | e67dbfa604 | |
wrenge | b09eada4cf | |
wrenge | b8832e50e7 | |
wrenge | 005ab583f7 | |
ikpil | 15384cacb0 | |
ikpil | 94e66ed318 | |
wrenge | 0ed414f08c | |
wrenge | 897748285f | |
wrenge | 331e35ecbb | |
wrenge | 3157c1e764 | |
wrenge | 7f1b9e63bb | |
wrenge | d625e83fad | |
wrenge | 838064f3b6 | |
wrenge | 8ca008a5c3 | |
ikpil | 6a57c067ac | |
ikpil | 0c6921ad6b | |
ikpil | b0644a70b7 | |
ikpil | 2f2d68c29f | |
ikpil | 30bce34eaf | |
ikpil | d8ae9f2297 |
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"name": "rnd/dotrecastnetsim",
|
||||
"description": "DotRecast",
|
||||
"homepage": "https://git.bit5.ru/rnd/DotRecastNetSim.git",
|
||||
"require": {
|
||||
"php": ">=7.4"
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
using System;
|
||||
using System;
|
||||
using System.Buffers;
|
||||
using System.Runtime.CompilerServices;
|
||||
|
||||
|
@ -13,7 +13,7 @@ namespace DotRecast.Core.Buffers
|
|||
}
|
||||
}
|
||||
|
||||
public class RcRentedArray<T> : IDisposable
|
||||
public struct RcRentedArray<T> : IDisposable
|
||||
{
|
||||
private ArrayPool<T> _owner;
|
||||
private T[] _array;
|
||||
|
|
|
@ -27,12 +27,12 @@ namespace DotRecast.Core.Collections
|
|||
{
|
||||
private bool _dirty;
|
||||
private readonly List<T> _items;
|
||||
private readonly Comparer<T> _comparer;
|
||||
private readonly Comparison<T> _comparison;
|
||||
|
||||
public RcSortedQueue(Comparison<T> comp)
|
||||
{
|
||||
_items = new List<T>();
|
||||
_comparer = Comparer<T>.Create((x, y) => comp.Invoke(x, y) * -1);
|
||||
_comparison = (x, y) => comp(x, y) * -1;
|
||||
}
|
||||
|
||||
public int Count()
|
||||
|
@ -55,7 +55,7 @@ namespace DotRecast.Core.Collections
|
|||
{
|
||||
if (_dirty)
|
||||
{
|
||||
_items.Sort(_comparer); // reverse
|
||||
_items.Sort(_comparison); // reverse
|
||||
_dirty = false;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
{
|
||||
"name": "DotRecast.Core",
|
||||
"rootNamespace": "DotRecast.Core",
|
||||
"references": [],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": false,
|
||||
"precompiledReferences": [],
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": [],
|
||||
"versionDefines": [],
|
||||
"noEngineReferences": true
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
{
|
||||
"name": "DotRecast.Detour.Crowd",
|
||||
"rootNamespace": "DotRecast.Detour.Crowd",
|
||||
"references": [
|
||||
"DotRecast.Core",
|
||||
"DotRecast.Detour"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": false,
|
||||
"precompiledReferences": [],
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": [],
|
||||
"versionDefines": [],
|
||||
"noEngineReferences": true
|
||||
}
|
|
@ -22,6 +22,7 @@ using System;
|
|||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using DotRecast.Core;
|
||||
using DotRecast.Core.Buffers;
|
||||
using DotRecast.Core.Collections;
|
||||
using DotRecast.Core.Numerics;
|
||||
|
||||
|
@ -1056,7 +1057,7 @@ namespace DotRecast.Detour.Crowd
|
|||
}
|
||||
|
||||
// Check
|
||||
float triggerRadius = ag.option.radius * 2.25f;
|
||||
float triggerRadius = ag.option.radius * 0.25f;//todo make parameterizable
|
||||
if (ag.OverOffmeshConnection(triggerRadius))
|
||||
{
|
||||
// Prepare to off-mesh connection.
|
||||
|
@ -1205,6 +1206,9 @@ namespace DotRecast.Detour.Crowd
|
|||
for (int j = 0; j < ag.nneis; ++j)
|
||||
{
|
||||
DtCrowdAgent nei = ag.neis[j].agent;
|
||||
if(!nei.option.contributeObstacleAvoidance || nei.option.obstacleAvoidanceWeight < ag.option.obstacleAvoidanceWeight)
|
||||
continue;
|
||||
|
||||
_obstacleQuery.AddCircle(nei.npos, nei.option.radius, nei.vel, nei.dvel);
|
||||
}
|
||||
|
||||
|
|
|
@ -45,6 +45,9 @@ namespace DotRecast.Detour.Crowd
|
|||
/// [Limits: 0 <= value < #DT_CROWD_MAX_OBSTAVOIDANCE_PARAMS]
|
||||
public int obstacleAvoidanceType;
|
||||
|
||||
public bool contributeObstacleAvoidance;
|
||||
public float obstacleAvoidanceWeight;
|
||||
|
||||
/// The index of the query filter used by this agent.
|
||||
public int queryFilterType;
|
||||
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"name": "DotRecast.Detour.Dynamic",
|
||||
"rootNamespace": "DotRecast.Detour.Dynamic",
|
||||
"references": [
|
||||
"DotRecast.Detour",
|
||||
"DotRecast.Recast",
|
||||
"DotRecast.Core"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": false,
|
||||
"precompiledReferences": [],
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": [],
|
||||
"versionDefines": [],
|
||||
"noEngineReferences": true
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"name": "DotRecast.Detour.Extras",
|
||||
"rootNamespace": "DotRecast.Detour.Extras",
|
||||
"references": [
|
||||
"DotRecast.Core",
|
||||
"DotRecast.Detour",
|
||||
"DotRecast.Recast"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": false,
|
||||
"precompiledReferences": [],
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": [],
|
||||
"versionDefines": [],
|
||||
"noEngineReferences": true
|
||||
}
|
|
@ -52,25 +52,12 @@ namespace DotRecast.Detour.Extras.Jumplink
|
|||
|
||||
RcVec3f halfExtents = new RcVec3f { X = cs, Y = heightRange, Z = cs };
|
||||
float maxHeight = pt.Y + heightRange;
|
||||
RcAtomicBoolean found = new RcAtomicBoolean();
|
||||
RcAtomicFloat minHeight = new RcAtomicFloat(pt.Y);
|
||||
var query = new DtHeightSamplePolyQuery(navMeshQuery, pt, pt.Y, maxHeight);
|
||||
navMeshQuery.QueryPolygons(pt, halfExtents, DtQueryNoOpFilter.Shared, ref query);
|
||||
|
||||
navMeshQuery.QueryPolygons(pt, halfExtents, DtQueryNoOpFilter.Shared, new DtCallbackPolyQuery((tile, poly, refs) =>
|
||||
if (query.Found)
|
||||
{
|
||||
var status = navMeshQuery.GetPolyHeight(refs, pt, out var h);
|
||||
if (status.Succeeded())
|
||||
{
|
||||
if (h > minHeight.Get() && h < maxHeight)
|
||||
{
|
||||
minHeight.Exchange(h);
|
||||
found.Set(true);
|
||||
}
|
||||
}
|
||||
}));
|
||||
|
||||
if (found.Get())
|
||||
{
|
||||
height = minHeight.Get();
|
||||
height = query.MinHeight;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
"name": "DotRecast.Detour.TileCache",
|
||||
"rootNamespace": "DotRecast.Detour.TileCache",
|
||||
"references": [
|
||||
"DotRecast.Core",
|
||||
"DotRecast.Detour",
|
||||
"DotRecast.Recast"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": false,
|
||||
"precompiledReferences": [],
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": [],
|
||||
"versionDefines": [],
|
||||
"noEngineReferences": true
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"name": "DotRecast.Detour",
|
||||
"rootNamespace": "DotRecast.Detour",
|
||||
"references": [
|
||||
"DotRecast.Core"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": false,
|
||||
"precompiledReferences": [],
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": [],
|
||||
"versionDefines": [],
|
||||
"noEngineReferences": true
|
||||
}
|
|
@ -2,7 +2,7 @@ using System;
|
|||
|
||||
namespace DotRecast.Detour
|
||||
{
|
||||
public class DtCallbackPolyQuery : IDtPolyQuery
|
||||
public struct DtCallbackPolyQuery : IDtPolyQuery
|
||||
{
|
||||
private readonly Action<DtMeshTile, DtPoly, long> _callback;
|
||||
|
||||
|
@ -11,7 +11,7 @@ namespace DotRecast.Detour
|
|||
_callback = callback;
|
||||
}
|
||||
|
||||
public void Process(DtMeshTile tile, DtPoly[] poly, Span<long> refs, int count)
|
||||
public void Process(DtMeshTile tile, Span<DtPoly> poly, Span<long> refs, int count)
|
||||
{
|
||||
for (int i = 0; i < count; ++i)
|
||||
{
|
||||
|
|
|
@ -26,7 +26,7 @@ namespace DotRecast.Detour
|
|||
return m_overflow;
|
||||
}
|
||||
|
||||
public void Process(DtMeshTile tile, DtPoly[] poly, Span<long> refs, int count)
|
||||
public void Process(DtMeshTile tile, Span<DtPoly> poly, Span<long> refs, int count)
|
||||
{
|
||||
int numLeft = m_maxPolys - m_numCollected;
|
||||
int toCopy = count;
|
||||
|
|
|
@ -3,7 +3,7 @@ using DotRecast.Core.Numerics;
|
|||
|
||||
namespace DotRecast.Detour
|
||||
{
|
||||
public class DtFindNearestPolyQuery : IDtPolyQuery
|
||||
public struct DtFindNearestPolyQuery : IDtPolyQuery
|
||||
{
|
||||
private readonly DtNavMeshQuery _query;
|
||||
private readonly RcVec3f _center;
|
||||
|
@ -18,9 +18,12 @@ namespace DotRecast.Detour
|
|||
_center = center;
|
||||
_nearestDistanceSqr = float.MaxValue;
|
||||
_nearestPoint = center;
|
||||
|
||||
_nearestRef = default;
|
||||
_overPoly = default;
|
||||
}
|
||||
|
||||
public void Process(DtMeshTile tile, DtPoly[] poly, Span<long> refs, int count)
|
||||
public void Process(DtMeshTile tile, Span<DtPoly> poly, Span<long> refs, int count)
|
||||
{
|
||||
for (int i = 0; i < count; ++i)
|
||||
{
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
using System;
|
||||
using DotRecast.Core;
|
||||
using DotRecast.Core.Numerics;
|
||||
|
||||
namespace DotRecast.Detour
|
||||
{
|
||||
public struct DtHeightSamplePolyQuery : IDtPolyQuery
|
||||
{
|
||||
private readonly DtNavMeshQuery _navMeshQuery;
|
||||
private readonly RcVec3f _pt;
|
||||
private readonly float _maxHeight;
|
||||
public float MinHeight { get; private set; }
|
||||
public bool Found { get; private set; }
|
||||
|
||||
public DtHeightSamplePolyQuery(DtNavMeshQuery navMeshQuery, RcVec3f pt, float minHeight, float maxHeight)
|
||||
{
|
||||
_navMeshQuery = navMeshQuery;
|
||||
_pt = pt;
|
||||
MinHeight = minHeight;
|
||||
_maxHeight = maxHeight;
|
||||
Found = default;
|
||||
}
|
||||
|
||||
public void Process(DtMeshTile tile, Span<DtPoly> poly, Span<long> refs, int count)
|
||||
{
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
ProcessSingle(refs[i]);
|
||||
}
|
||||
}
|
||||
|
||||
private void ProcessSingle(long refs)
|
||||
{
|
||||
var status = _navMeshQuery.GetPolyHeight(refs, _pt, out var h);
|
||||
if (!status.Succeeded())
|
||||
return;
|
||||
|
||||
if (!(h > MinHeight) || !(h < _maxHeight))
|
||||
return;
|
||||
|
||||
MinHeight = h;
|
||||
Found = true;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -18,8 +18,11 @@ freely, subject to the following restrictions:
|
|||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
using System;
|
||||
|
||||
namespace DotRecast.Detour
|
||||
{
|
||||
[Serializable]
|
||||
public class DtMeshData
|
||||
{
|
||||
public DtMeshHeader header; //< The tile header.
|
||||
|
|
|
@ -18,11 +18,13 @@ freely, subject to the following restrictions:
|
|||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using DotRecast.Core.Numerics;
|
||||
|
||||
namespace DotRecast.Detour
|
||||
{
|
||||
/** Provides high level information related to a dtMeshTile object. */
|
||||
[Serializable]
|
||||
public class DtMeshHeader
|
||||
{
|
||||
/** Tile magic number. (Used to identify the data format.) */
|
||||
|
|
|
@ -1365,6 +1365,11 @@ namespace DotRecast.Detour
|
|||
}
|
||||
|
||||
public int GetTilesAt(int x, int y, DtMeshTile[] tiles, int maxTiles)
|
||||
{
|
||||
return GetTilesAt(x, y, (Span<DtMeshTile>)tiles, maxTiles);
|
||||
}
|
||||
|
||||
public int GetTilesAt(int x, int y, Span<DtMeshTile> tiles, int maxTiles)
|
||||
{
|
||||
int n = 0;
|
||||
|
||||
|
|
|
@ -18,6 +18,7 @@ freely, subject to the following restrictions:
|
|||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using DotRecast.Core.Numerics;
|
||||
|
||||
namespace DotRecast.Detour
|
||||
|
|
|
@ -589,7 +589,7 @@ namespace DotRecast.Detour
|
|||
|
||||
// Get nearby polygons from proximity grid.
|
||||
DtFindNearestPolyQuery query = new DtFindNearestPolyQuery(this, center);
|
||||
DtStatus status = QueryPolygons(center, halfExtents, filter, query);
|
||||
DtStatus status = QueryPolygons(center, halfExtents, filter, ref query);
|
||||
if (status.Failed())
|
||||
{
|
||||
return status;
|
||||
|
@ -603,11 +603,13 @@ namespace DotRecast.Detour
|
|||
}
|
||||
|
||||
/// Queries polygons within a tile.
|
||||
protected void QueryPolygonsInTile(DtMeshTile tile, RcVec3f qmin, RcVec3f qmax, IDtQueryFilter filter, IDtPolyQuery query)
|
||||
protected void QueryPolygonsInTile<TQuery>(DtMeshTile tile, RcVec3f qmin, RcVec3f qmax, IDtQueryFilter filter, ref TQuery query)
|
||||
where TQuery : IDtPolyQuery
|
||||
{
|
||||
const int batchSize = 32;
|
||||
Span<long> polyRefs = stackalloc long[batchSize];
|
||||
DtPoly[] polys = new DtPoly[batchSize];
|
||||
using RcRentedArray<DtPoly> polysRent = RcRentedArray.Rent<DtPoly>(batchSize);
|
||||
Span<DtPoly> polys = polysRent.AsSpan();
|
||||
int n = 0;
|
||||
|
||||
if (tile.data.bvTree != null)
|
||||
|
@ -758,7 +760,7 @@ namespace DotRecast.Detour
|
|||
return DtStatus.DT_FAILURE | DtStatus.DT_INVALID_PARAM;
|
||||
|
||||
DtCollectPolysQuery collector = new DtCollectPolysQuery(polys, maxPolys);
|
||||
DtStatus status = QueryPolygons(center, halfExtents, filter, collector);
|
||||
DtStatus status = QueryPolygons(center, halfExtents, filter, ref collector);
|
||||
if (status.Failed())
|
||||
return status;
|
||||
|
||||
|
@ -780,7 +782,8 @@ namespace DotRecast.Detour
|
|||
/// @param[in] halfExtents The search distance along each axis. [(x, y, z)]
|
||||
/// @param[in] filter The polygon filter to apply to the query.
|
||||
/// @param[in] query The query. Polygons found will be batched together and passed to this query.
|
||||
public DtStatus QueryPolygons(RcVec3f center, RcVec3f halfExtents, IDtQueryFilter filter, IDtPolyQuery query)
|
||||
public DtStatus QueryPolygons<TQuery>(RcVec3f center, RcVec3f halfExtents, IDtQueryFilter filter, ref TQuery query)
|
||||
where TQuery : IDtPolyQuery
|
||||
{
|
||||
if (!center.IsFinite() || !halfExtents.IsFinite() || null == filter)
|
||||
{
|
||||
|
@ -796,7 +799,8 @@ namespace DotRecast.Detour
|
|||
m_nav.CalcTileLoc(bmax, out var maxx, out var maxy);
|
||||
|
||||
const int MAX_NEIS = 32;
|
||||
DtMeshTile[] neis = new DtMeshTile[MAX_NEIS];
|
||||
using RcRentedArray<DtMeshTile> neisRent = RcRentedArray.Rent<DtMeshTile>(MAX_NEIS);
|
||||
Span<DtMeshTile> neis = neisRent.AsSpan();
|
||||
|
||||
for (int y = miny; y <= maxy; ++y)
|
||||
{
|
||||
|
@ -805,7 +809,7 @@ namespace DotRecast.Detour
|
|||
int nneis = m_nav.GetTilesAt(x, y, neis, MAX_NEIS);
|
||||
for (int j = 0; j < nneis; ++j)
|
||||
{
|
||||
QueryPolygonsInTile(neis[j], bmin, bmax, filter, query);
|
||||
QueryPolygonsInTile(neis[j], bmin, bmax, filter, ref query);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2537,7 +2541,7 @@ namespace DotRecast.Detour
|
|||
// int va = a * 3;
|
||||
// int vb = b * 3;
|
||||
float dx = verts[b].X - verts[a].X;
|
||||
float dz = verts[b].Z - verts[a].X;
|
||||
float dz = verts[b].Z - verts[a].Z;
|
||||
hit.hitNormal = RcVec3f.Normalize(new RcVec3f(dz, 0, -dx));
|
||||
return DtStatus.DT_SUCCESS;
|
||||
}
|
||||
|
|
|
@ -18,8 +18,10 @@ freely, subject to the following restrictions:
|
|||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using DotRecast.Core.Buffers;
|
||||
|
||||
namespace DotRecast.Detour
|
||||
{
|
||||
|
@ -27,24 +29,68 @@ namespace DotRecast.Detour
|
|||
{
|
||||
private readonly Dictionary<long, List<DtNode>> m_map;
|
||||
|
||||
private int m_nodeCount;
|
||||
private readonly List<DtNode> m_nodes;
|
||||
private int m_usedNodesCount;
|
||||
private List<DtNode[]> m_buckets;
|
||||
private readonly int m_initialBufferCapacityBase;
|
||||
private readonly RcObjectPool<List<DtNode>> m_listPool;
|
||||
|
||||
public DtNodePool()
|
||||
public DtNodePool(int initialBufferCapacityBase = 6) // initial size 64
|
||||
{
|
||||
m_map = new Dictionary<long, List<DtNode>>();
|
||||
m_nodes = new List<DtNode>();
|
||||
m_listPool = new RcObjectPool<List<DtNode>>(() => new List<DtNode>());
|
||||
m_buckets = new List<DtNode[]>();
|
||||
m_initialBufferCapacityBase = initialBufferCapacityBase;
|
||||
}
|
||||
|
||||
private void AddNewBucket()
|
||||
{
|
||||
var bucketIndex = m_buckets.Count;
|
||||
var bucket = new DtNode[1 << (bucketIndex + m_initialBufferCapacityBase)];
|
||||
m_buckets.Add(bucket);
|
||||
FillBucket(bucketIndex);
|
||||
}
|
||||
|
||||
private void FillBucket(int bucketIndex)
|
||||
{
|
||||
var bucket = m_buckets[bucketIndex];
|
||||
var startIndex = GetBucketStartIndex(bucketIndex);
|
||||
for (int i = 0; i < bucket.Length; i++)
|
||||
{
|
||||
bucket[i] = new DtNode(startIndex + i);
|
||||
}
|
||||
}
|
||||
|
||||
private int GetBucketStartIndex(int bucketIndex)
|
||||
{
|
||||
return ((1 << (bucketIndex + m_initialBufferCapacityBase)) - 1) ^ ((1 << m_initialBufferCapacityBase) - 1);
|
||||
}
|
||||
|
||||
private DtNode[] EnsureBucket(int bucketIndex)
|
||||
{
|
||||
if (m_buckets.Count == bucketIndex)
|
||||
AddNewBucket();
|
||||
else if (m_buckets.Count < bucketIndex)
|
||||
throw new Exception();
|
||||
return m_buckets[bucketIndex];
|
||||
}
|
||||
|
||||
private int GetBucketIndexByElementIndex(int elementIndex)
|
||||
{
|
||||
return DtUtils.Ilog2((elementIndex >> m_initialBufferCapacityBase) + 1);
|
||||
}
|
||||
|
||||
public void Clear()
|
||||
{
|
||||
foreach (var pair in m_map)
|
||||
m_listPool.Return(pair.Value);
|
||||
|
||||
m_map.Clear();
|
||||
m_nodeCount = 0;
|
||||
m_usedNodesCount = 0;
|
||||
}
|
||||
|
||||
public int GetNodeCount()
|
||||
{
|
||||
return m_nodeCount;
|
||||
return m_usedNodesCount;
|
||||
}
|
||||
|
||||
public int FindNodes(long id, out List<DtNode> nodes)
|
||||
|
@ -84,7 +130,8 @@ namespace DotRecast.Detour
|
|||
}
|
||||
else
|
||||
{
|
||||
nodes = new List<DtNode>();
|
||||
nodes = m_listPool.Get();
|
||||
nodes.Clear();
|
||||
m_map.Add(id, nodes);
|
||||
}
|
||||
|
||||
|
@ -93,15 +140,10 @@ namespace DotRecast.Detour
|
|||
|
||||
private DtNode Create(long id, int state, List<DtNode> nodes)
|
||||
{
|
||||
if (m_nodes.Count <= m_nodeCount)
|
||||
{
|
||||
var newNode = new DtNode(m_nodeCount);
|
||||
m_nodes.Add(newNode);
|
||||
}
|
||||
|
||||
int i = m_nodeCount;
|
||||
m_nodeCount++;
|
||||
var node = m_nodes[i];
|
||||
int i = m_usedNodesCount++;
|
||||
int bucketIndex = GetBucketIndexByElementIndex(i);
|
||||
int bucketStartIndex = GetBucketStartIndex(bucketIndex);
|
||||
var node = EnsureBucket(bucketIndex)[i - bucketStartIndex];
|
||||
node.pidx = 0;
|
||||
node.cost = 0;
|
||||
node.total = 0;
|
||||
|
@ -123,9 +165,16 @@ namespace DotRecast.Detour
|
|||
|
||||
public DtNode GetNodeAtIdx(int idx)
|
||||
{
|
||||
return idx != 0
|
||||
? m_nodes[idx - 1]
|
||||
: null;
|
||||
if (idx == 0)
|
||||
return null;
|
||||
|
||||
int bucketIndex = GetBucketIndexByElementIndex(idx - 1);
|
||||
if (m_buckets.Count <= bucketIndex)
|
||||
throw new ArgumentOutOfRangeException();
|
||||
|
||||
int bucketStartIndex = GetBucketStartIndex(bucketIndex);
|
||||
var node = EnsureBucket(bucketIndex)[idx - bucketStartIndex - 1];
|
||||
return node;
|
||||
}
|
||||
|
||||
public DtNode GetNode(long refs)
|
||||
|
@ -135,7 +184,7 @@ namespace DotRecast.Detour
|
|||
|
||||
public IEnumerable<DtNode> AsEnumerable()
|
||||
{
|
||||
return m_nodes.Take(m_nodeCount);
|
||||
return m_buckets.SelectMany(x => x);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -18,12 +18,14 @@ freely, subject to the following restrictions:
|
|||
3. This notice may not be removed or altered from any source distribution.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using DotRecast.Core.Numerics;
|
||||
|
||||
namespace DotRecast.Detour
|
||||
{
|
||||
/// Defines an navigation mesh off-mesh connection within a dtMeshTile object.
|
||||
/// An off-mesh connection is a user defined traversable connection made up to two vertices.
|
||||
[Serializable]
|
||||
public class DtOffMeshConnection
|
||||
{
|
||||
/// The endpoints of the connection. [(ax, ay, az, bx, by, bz)]
|
||||
|
|
|
@ -9,6 +9,6 @@ namespace DotRecast.Detour
|
|||
{
|
||||
/// Called for each batch of unique polygons touched by the search area in dtNavMeshQuery::queryPolygons.
|
||||
/// This can be called multiple times for a single query.
|
||||
void Process(DtMeshTile tile, DtPoly[] poly, Span<long> refs, int count);
|
||||
void Process(DtMeshTile tile, Span<DtPoly> poly, Span<long> refs, int count);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
{
|
||||
"name": "DotRecast.Recast.Demo",
|
||||
"rootNamespace": "DotRecast.Recast.Demo",
|
||||
"references": [
|
||||
"DotRecast.Core"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [
|
||||
"Android",
|
||||
"Editor",
|
||||
"EmbeddedLinux",
|
||||
"GameCoreScarlett",
|
||||
"GameCoreXboxOne",
|
||||
"iOS",
|
||||
"LinuxStandalone64",
|
||||
"CloudRendering",
|
||||
"macOSStandalone",
|
||||
"PS4",
|
||||
"PS5",
|
||||
"QNX",
|
||||
"Stadia",
|
||||
"Switch",
|
||||
"tvOS",
|
||||
"WSA",
|
||||
"VisionOS",
|
||||
"WebGL",
|
||||
"WindowsStandalone32",
|
||||
"WindowsStandalone64",
|
||||
"XboxOne"
|
||||
],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": false,
|
||||
"precompiledReferences": [],
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": [],
|
||||
"versionDefines": [
|
||||
{
|
||||
"name": "Select...",
|
||||
"expression": "",
|
||||
"define": "USE_RECAST_DEMO"
|
||||
}
|
||||
],
|
||||
"noEngineReferences": true
|
||||
}
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"name": "DotRecast.Recast.Toolset",
|
||||
"rootNamespace": "DotRecast.Recast.Toolset",
|
||||
"references": [
|
||||
"DotRecast.Core",
|
||||
"DotRecast.Recast",
|
||||
"DotRecast.Detour",
|
||||
"DotRecast.Detour.Crowd",
|
||||
"DotRecast.Detour.Dynamic",
|
||||
"DotRecast.Detour.Extras",
|
||||
"DotRecast.Detour.TileCache"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": false,
|
||||
"precompiledReferences": [],
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": [],
|
||||
"versionDefines": [],
|
||||
"noEngineReferences": true
|
||||
}
|
|
@ -46,13 +46,13 @@ namespace DotRecast.Recast.Toolset.Geom
|
|||
if (null != _geom)
|
||||
{
|
||||
var offMeshConnections = _geom.GetOffMeshConnections();
|
||||
option.offMeshConCount = offMeshConnections.Count;
|
||||
option.offMeshConVerts = new float[option.offMeshConCount * 6];
|
||||
option.offMeshConRad = new float[option.offMeshConCount];
|
||||
option.offMeshConDir = new int[option.offMeshConCount];
|
||||
option.offMeshConAreas = new int[option.offMeshConCount];
|
||||
option.offMeshConFlags = new int[option.offMeshConCount];
|
||||
option.offMeshConUserID = new int[option.offMeshConCount];
|
||||
option.offMeshConCount = offMeshConnections.Count;
|
||||
for (int i = 0; i < option.offMeshConCount; i++)
|
||||
{
|
||||
RcOffMeshConnection offMeshCon = offMeshConnections[i];
|
||||
|
@ -65,7 +65,7 @@ namespace DotRecast.Recast.Toolset.Geom
|
|||
option.offMeshConDir[i] = offMeshCon.bidir ? 1 : 0;
|
||||
option.offMeshConAreas[i] = offMeshCon.area;
|
||||
option.offMeshConFlags[i] = offMeshCon.flags;
|
||||
// option.offMeshConUserID[i] = offMeshCon.userId;
|
||||
option.offMeshConUserID[i] = offMeshCon.userId;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"name": "DotRecast.Recast",
|
||||
"rootNamespace": "DotRecast.Recast",
|
||||
"references": [
|
||||
"DotRecast.Core"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": false,
|
||||
"overrideReferences": false,
|
||||
"precompiledReferences": [],
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": [],
|
||||
"versionDefines": [],
|
||||
"noEngineReferences": true
|
||||
}
|
|
@ -33,7 +33,7 @@ namespace DotRecast.Recast.Geom
|
|||
public readonly int flags;
|
||||
public readonly int userId;
|
||||
|
||||
public RcOffMeshConnection(RcVec3f start, RcVec3f end, float radius, bool bidir, int area, int flags)
|
||||
public RcOffMeshConnection(RcVec3f start, RcVec3f end, float radius, bool bidir, int area, int flags, int userId = 0)
|
||||
{
|
||||
verts = new float[6];
|
||||
verts[0] = start.X;
|
||||
|
@ -46,6 +46,7 @@ namespace DotRecast.Recast.Geom
|
|||
this.bidir = bidir;
|
||||
this.area = area;
|
||||
this.flags = flags;
|
||||
this.userId = userId;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"name": "com.rnd.dotrecast",
|
||||
"displayName": "DotRecast",
|
||||
"version": "0.4.1"
|
||||
}
|
Loading…
Reference in New Issue