diff --git a/DetourCrowd/Include/DetourCrowd.h b/DetourCrowd/Include/DetourCrowd.h index 21e9283..d265493 100644 --- a/DetourCrowd/Include/DetourCrowd.h +++ b/DetourCrowd/Include/DetourCrowd.h @@ -121,8 +121,8 @@ 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; + /// True if the agent has valid path (targetState == DT_CROWDAGENT_TARGET_VALID) and the path does not lead to the requested position, else false. + bool partial; /// The path corridor the agent is using. dtPathCorridor corridor; diff --git a/DetourCrowd/Source/DetourCrowd.cpp b/DetourCrowd/Source/DetourCrowd.cpp index 0107b37..35f8ebc 100644 --- a/DetourCrowd/Source/DetourCrowd.cpp +++ b/DetourCrowd/Source/DetourCrowd.cpp @@ -538,7 +538,7 @@ int dtCrowd::addAgent(const float* pos, const dtCrowdAgentParams* params) ag->corridor.reset(ref, nearest); ag->boundary.reset(); - ag->partial = 0; + ag->partial = false; updateAgentParameters(idx, params); @@ -717,11 +717,6 @@ 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. @@ -752,6 +747,7 @@ void dtCrowd::updateMoveRequest(const float /*dt*/) ag->corridor.setCorridor(reqPos, reqPath, reqPathCount); ag->boundary.reset(); + ag->partial = false; if (reqPath[reqPathCount-1] == ag->targetRef) { @@ -827,9 +823,9 @@ void dtCrowd::updateMoveRequest(const float /*dt*/) valid = false; if (dtStatusDetail(status, DT_PARTIAL_RESULT)) - ag->partial = 1; + ag->partial = true; else - ag->partial = 0; + ag->partial = false; // Merge result and existing path. // The agent might have moved whilst the request is @@ -975,6 +971,7 @@ void dtCrowd::checkPathValidity(dtCrowdAgent** agents, const int nagents, const { // Could not find location in navmesh, set state to invalid. ag->corridor.reset(0, agentPos); + ag->partial = false; ag->boundary.reset(); ag->state = DT_CROWDAGENT_STATE_INVALID; continue; @@ -1011,6 +1008,7 @@ void dtCrowd::checkPathValidity(dtCrowdAgent** agents, const int nagents, const { // Failed to reposition target, fail moverequest. ag->corridor.reset(agentRef, agentPos); + ag->partial = false; ag->targetState = DT_CROWDAGENT_TARGET_NONE; } } @@ -1403,6 +1401,7 @@ void dtCrowd::update(const float dt, dtCrowdAgentDebugInfo* debug) if (ag->targetState == DT_CROWDAGENT_TARGET_NONE || ag->targetState == DT_CROWDAGENT_TARGET_VELOCITY) { ag->corridor.reset(ag->corridor.getFirstPoly(), ag->npos); + ag->partial = false; } } diff --git a/DetourCrowd/Source/DetourPathQueue.cpp b/DetourCrowd/Source/DetourPathQueue.cpp index a8f0ec2..1ed0cd7 100644 --- a/DetourCrowd/Source/DetourPathQueue.cpp +++ b/DetourCrowd/Source/DetourPathQueue.cpp @@ -185,7 +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; + dtStatus details = q.status & DT_STATUS_DETAIL_MASK; // Free request for reuse. q.ref = DT_PATHQ_INVALID; q.status = 0;