diff --git a/DetourCrowd/Include/DetourCrowd.h b/DetourCrowd/Include/DetourCrowd.h index 9f92cdf..21e9283 100644 --- a/DetourCrowd/Include/DetourCrowd.h +++ b/DetourCrowd/Include/DetourCrowd.h @@ -121,6 +121,9 @@ struct dtCrowdAgent /// The type of mesh polygon the agent is traversing. (See: #CrowdAgentState) unsigned char state; + /// 1 if the path is a partial path (the path does not lead to the target) + unsigned char partial; + /// The path corridor the agent is using. dtPathCorridor corridor; diff --git a/DetourCrowd/Source/DetourCrowd.cpp b/DetourCrowd/Source/DetourCrowd.cpp index 4297b65..0107b37 100644 --- a/DetourCrowd/Source/DetourCrowd.cpp +++ b/DetourCrowd/Source/DetourCrowd.cpp @@ -538,6 +538,7 @@ int dtCrowd::addAgent(const float* pos, const dtCrowdAgentParams* params) ag->corridor.reset(ref, nearest); ag->boundary.reset(); + ag->partial = 0; updateAgentParameters(idx, params); @@ -716,6 +717,11 @@ void dtCrowd::updateMoveRequest(const float /*dt*/) status = m_navquery->finalizeSlicedFindPath(reqPath, &reqPathCount, MAX_RES); } + if (dtStatusDetail(status, DT_PARTIAL_RESULT)) + ag->partial = 1; + else + ag->partial = 0; + if (!dtStatusFailed(status) && reqPathCount > 0) { // In progress or succeed. @@ -819,7 +825,12 @@ void dtCrowd::updateMoveRequest(const float /*dt*/) status = m_pathq.getPathResult(ag->targetPathqRef, res, &nres, m_maxPathResult); if (dtStatusFailed(status) || !nres) valid = false; - + + if (dtStatusDetail(status, DT_PARTIAL_RESULT)) + ag->partial = 1; + else + ag->partial = 0; + // Merge result and existing path. // The agent might have moved whilst the request is // being processed, so the path may have changed. diff --git a/DetourCrowd/Source/DetourPathQueue.cpp b/DetourCrowd/Source/DetourPathQueue.cpp index de1862a..a8f0ec2 100644 --- a/DetourCrowd/Source/DetourPathQueue.cpp +++ b/DetourCrowd/Source/DetourPathQueue.cpp @@ -185,6 +185,7 @@ dtStatus dtPathQueue::getPathResult(dtPathQueueRef ref, dtPolyRef* path, int* pa if (m_queue[i].ref == ref) { PathQuery& q = m_queue[i]; + dtStatus details = q.status; // Free request for reuse. q.ref = DT_PATHQ_INVALID; q.status = 0; @@ -192,7 +193,7 @@ dtStatus dtPathQueue::getPathResult(dtPathQueueRef ref, dtPolyRef* path, int* pa int n = dtMin(q.npath, maxPath); memcpy(path, q.path, sizeof(dtPolyRef)*n); *pathSize = n; - return DT_SUCCESS; + return details | DT_SUCCESS; } } return DT_FAILURE;