fix: DtRaycastHit SOH issue reslove

This commit is contained in:
ikpil 2024-02-01 02:21:07 +09:00 committed by Ikpil
parent aaff85b229
commit dbb03988f5
4 changed files with 18 additions and 26 deletions

View File

@ -194,12 +194,13 @@ namespace DotRecast.Detour.Crowd
var delta = RcVec3f.Subtract(next, m_pos); var delta = RcVec3f.Subtract(next, m_pos);
RcVec3f goal = RcVecUtils.Mad(m_pos, delta, pathOptimizationRange / dist); RcVec3f goal = RcVecUtils.Mad(m_pos, delta, pathOptimizationRange / dist);
var status = navquery.Raycast(m_path[0], m_pos, goal, filter, out var t, out var norm, out var path); var res = new List<long>();
var status = navquery.Raycast(m_path[0], m_pos, goal, filter, out var t, out var norm, ref res);
if (status.Succeeded()) if (status.Succeeded())
{ {
if (path.Count > 1 && t > 0.99f) if (res.Count > 1 && t > 0.99f)
{ {
m_path = DtPathUtils.MergeCorridorStartShortcut(m_path, path); m_path = DtPathUtils.MergeCorridorStartShortcut(m_path, res);
} }
} }
} }

View File

@ -793,7 +793,8 @@ namespace DotRecast.Detour
DtNode lastBestNode = startNode; DtNode lastBestNode = startNode;
float lastBestNodeCost = startNode.total; float lastBestNodeCost = startNode.total;
DtRaycastHit rayHit = new DtRaycastHit();
rayHit.path = new List<long>();
while (!m_openList.IsEmpty()) while (!m_openList.IsEmpty())
{ {
// Remove node from open list and put it in closed list. // Remove node from open list and put it in closed list.
@ -892,7 +893,6 @@ namespace DotRecast.Detour
List<long> shortcut = null; List<long> shortcut = null;
if (tryLOS) if (tryLOS)
{ {
var rayHit = new DtRaycastHit(0);
var rayStatus = Raycast(parentRef, parentNode.pos, neighbourPos, filter, var rayStatus = Raycast(parentRef, parentNode.pos, neighbourPos, filter,
DtRaycastOptions.DT_RAYCAST_USE_COSTS, ref rayHit, grandpaRef); DtRaycastOptions.DT_RAYCAST_USE_COSTS, ref rayHit, grandpaRef);
if (rayStatus.Succeeded()) if (rayStatus.Succeeded())
@ -900,7 +900,7 @@ namespace DotRecast.Detour
foundShortCut = rayHit.t >= 1.0f; foundShortCut = rayHit.t >= 1.0f;
if (foundShortCut) if (foundShortCut)
{ {
shortcut = rayHit.path; shortcut = new List<long>(rayHit.path);
// shortcut found using raycast. Using shorter cost // shortcut found using raycast. Using shorter cost
// instead // instead
cost = parentNode.cost + rayHit.pathCost; cost = parentNode.cost + rayHit.pathCost;
@ -1090,6 +1090,9 @@ namespace DotRecast.Detour
return DtStatus.DT_FAILURE; return DtStatus.DT_FAILURE;
} }
var rayHit = new DtRaycastHit();
rayHit.path = new List<long>();
int iter = 0; int iter = 0;
while (iter < maxIter && !m_openList.IsEmpty()) while (iter < maxIter && !m_openList.IsEmpty())
{ {
@ -1214,7 +1217,6 @@ namespace DotRecast.Detour
List<long> shortcut = null; List<long> shortcut = null;
if (tryLOS) if (tryLOS)
{ {
var rayHit = new DtRaycastHit(0);
status = Raycast(parentRef, parentNode.pos, neighbourPos, m_query.filter, status = Raycast(parentRef, parentNode.pos, neighbourPos, m_query.filter,
DtRaycastOptions.DT_RAYCAST_USE_COSTS, ref rayHit, grandpaRef); DtRaycastOptions.DT_RAYCAST_USE_COSTS, ref rayHit, grandpaRef);
if (status.Succeeded()) if (status.Succeeded())
@ -1222,7 +1224,7 @@ namespace DotRecast.Detour
foundShortCut = rayHit.t >= 1.0f; foundShortCut = rayHit.t >= 1.0f;
if (foundShortCut) if (foundShortCut)
{ {
shortcut = rayHit.path; shortcut = new List<long>(rayHit.path);
// shortcut found using raycast. Using shorter cost // shortcut found using raycast. Using shorter cost
// instead // instead
cost = parentNode.cost + rayHit.pathCost; cost = parentNode.cost + rayHit.pathCost;
@ -2155,19 +2157,16 @@ namespace DotRecast.Detour
/// ///
public DtStatus Raycast(long startRef, RcVec3f startPos, RcVec3f endPos, public DtStatus Raycast(long startRef, RcVec3f startPos, RcVec3f endPos,
IDtQueryFilter filter, IDtQueryFilter filter,
out float t, out RcVec3f hitNormal, out List<long> path) out float t, out RcVec3f hitNormal, ref List<long> path)
{ {
DtRaycastHit hit = new DtRaycastHit(0); DtRaycastHit hit = new DtRaycastHit();
// hit.path = path; hit.path = path;
// hit.maxPath = maxPath;
DtStatus status = Raycast(startRef, startPos, endPos, filter, 0, ref hit, 0); DtStatus status = Raycast(startRef, startPos, endPos, filter, 0, ref hit, 0);
t = hit.t; t = hit.t;
hitNormal = hit.hitNormal; hitNormal = hit.hitNormal;
path = hit.path; path = hit.path;
// if (pathCount)
// *pathCount = hit.pathCount;
return status; return status;
} }

View File

@ -38,18 +38,9 @@ namespace DotRecast.Detour
public int hitEdgeIndex; public int hitEdgeIndex;
/// Pointer to an array of reference ids of the visited polygons. [opt] /// Pointer to an array of reference ids of the visited polygons. [opt]
public readonly List<long> path; public List<long> path;
/// The cost of the path until hit. /// The cost of the path until hit.
public float pathCost; public float pathCost;
public DtRaycastHit(int s)
{
t = 0;
hitEdgeIndex = 0;
hitNormal = RcVec3f.Zero;
path = new List<long>();
pathCost = 0;
}
} }
} }

View File

@ -257,7 +257,8 @@ namespace DotRecast.Recast.Toolset.Tools
return DtStatus.DT_FAILURE; return DtStatus.DT_FAILURE;
} }
var status = navQuery.Raycast(startRef, startPos, endPos, filter, out var t, out var hitNormal2, out var path); var path = new List<long>();
var status = navQuery.Raycast(startRef, startPos, endPos, filter, out var t, out var hitNormal2, ref path);
if (!status.Succeeded()) if (!status.Succeeded())
{ {
return status; return status;