Fixed google code Issue 228

- more defencive use of finNearestPoly() in dtCrowd
This commit is contained in:
Mikko Mononen 2013-09-17 21:29:51 +02:00
parent c0d1efac27
commit 990b245179

View File

@ -516,8 +516,14 @@ int dtCrowd::addAgent(const float* pos, const dtCrowdAgentParams* params)
// Find nearest position on navmesh and place the agent there. // Find nearest position on navmesh and place the agent there.
float nearest[3]; float nearest[3];
dtPolyRef ref; dtPolyRef ref = 0;
m_navquery->findNearestPoly(pos, m_ext, &m_filter, &ref, nearest); dtVcopy(nearest, pos);
dtStatus status = m_navquery->findNearestPoly(pos, m_ext, &m_filter, &ref, nearest);
if (dtStatusFailed(status))
{
dtVcopy(nearest, pos);
ref = 0;
}
ag->corridor.reset(ref, nearest); ag->corridor.reset(ref, nearest);
ag->boundary.reset(); ag->boundary.reset();
@ -941,8 +947,9 @@ void dtCrowd::checkPathValidity(dtCrowdAgent** agents, const int nagents, const
// Current location is not valid, try to reposition. // Current location is not valid, try to reposition.
// TODO: this can snap agents, how to handle that? // TODO: this can snap agents, how to handle that?
float nearest[3]; float nearest[3];
dtVcopy(nearest, agentPos);
agentRef = 0; agentRef = 0;
m_navquery->findNearestPoly(ag->npos, m_ext, &m_filter, &agentRef, nearest); dtStatus status = m_navquery->findNearestPoly(ag->npos, m_ext, &m_filter, &agentRef, nearest);
dtVcopy(agentPos, nearest); dtVcopy(agentPos, nearest);
if (!agentRef) if (!agentRef)
@ -971,6 +978,8 @@ void dtCrowd::checkPathValidity(dtCrowdAgent** agents, const int nagents, const
{ {
// Current target is not valid, try to reposition. // Current target is not valid, try to reposition.
float nearest[3]; float nearest[3];
dtVcopy(nearest, ag->targetPos);
ag->targetRef = 0;
m_navquery->findNearestPoly(ag->targetPos, m_ext, &m_filter, &ag->targetRef, nearest); m_navquery->findNearestPoly(ag->targetPos, m_ext, &m_filter, &ag->targetRef, nearest);
dtVcopy(ag->targetPos, nearest); dtVcopy(ag->targetPos, nearest);
replan = true; replan = true;