/// @par /// /// The agent's position will be constrained to the surface of the navigation mesh. int dtCrowd::addAgent(const float* pos, const dtCrowdAgentParams* params) { // Find empty slot. int idx = -1; for (int i = 0; i < m_maxAgents; ++i) { if (!m_agents[i].active) { idx = i; break; } } if (idx == -1) return -1; dtCrowdAgent* ag = &m_agents[idx]; updateAgentParameters(idx, params); // Find nearest position on navmesh and place the agent there. float nearest[3]; dtPolyRef ref = 0; dtVcopy(nearest, pos); dtStatus status = m_navquery->findNearestPoly(pos, m_ext, &m_filters[ag->params.queryFilterType], &ref, nearest); if (dtStatusFailed(status)) { dtVcopy(nearest, pos); ref = 0; } ag->corridor.reset(ref, nearest); ag->boundary.reset(); ag->partial = false; ag->topologyOptTime = 0; ag->targetReplanTime = 0; ag->nneis = 0; dtVset(ag->dvel, 0,0,0); dtVset(ag->nvel, 0,0,0); dtVset(ag->vel, 0,0,0); dtVcopy(ag->npos, nearest); ag->desiredSpeed = 0; if (ref) ag->state = DT_CROWDAGENT_STATE_WALKING; else ag->state = DT_CROWDAGENT_STATE_INVALID; ag->targetState = DT_CROWDAGENT_TARGET_NONE; ag->active = true; // Clockwork: added to fix illegal memory access when ncorners is queried before the agent has updated ag->ncorners = 0; return idx; }
/// @par /// /// The agent's position will be constrained to the surface of the navigation mesh. int dtCrowd::addAgent(const float* pos, const dtCrowdAgentParams* params, const dtQueryFilter* filter) { // Find empty slot. int idx = -1; for (int i = 0; i < m_maxAgents; ++i) { if (!m_agents[i].active) { idx = i; break; } } if (idx == -1) return -1; dtCrowdAgent* ag = &m_agents[idx]; // [UE4] multiple filter support const bool bStoredFilter = updateAgentFilter(idx, filter); if (!bStoredFilter) { return -1; } // Find nearest position on navmesh and place the agent there. float nearest[3]; dtPolyRef ref; m_navquery->updateLinkFilter(params->linkFilter); m_navquery->findNearestPoly(pos, m_ext, &m_filters[ag->params.filter], &ref, nearest); ag->corridor.reset(ref, nearest); ag->boundary.reset(); updateAgentParameters(idx, params); ag->topologyOptTime = 0; ag->targetReplanTime = 0; ag->nneis = 0; ag->ncorners = 0; dtVset(ag->dvel, 0,0,0); dtVset(ag->nvel, 0,0,0); dtVset(ag->vel, 0,0,0); dtVcopy(ag->npos, nearest); ag->desiredSpeed = 0; if (ref) ag->state = DT_CROWDAGENT_STATE_WALKING; else ag->state = DT_CROWDAGENT_STATE_INVALID; ag->targetState = DT_CROWDAGENT_TARGET_NONE; ag->active = 1; return idx; }
int dtCrowd::addAgent(const float* pos, const dtCrowdAgentParams* params) { // Find empty slot. int idx = -1; for (int i = 0; i < m_maxAgents; ++i) { if (!m_agents[i].active) { idx = i; break; } } if (idx == -1) return -1; dtCrowdAgent* ag = &m_agents[idx]; // Find nearest position on navmesh and place the agent there. float nearest[3]; dtPolyRef ref; m_navquery->findNearestPoly(pos, m_ext, &m_filter, &ref, nearest); if (!ref) { // Could not find a location on navmesh. return -1; } ag->corridor.reset(ref, nearest); ag->boundary.reset(); updateAgentParameters(idx, params); ag->topologyOptTime = 0; ag->nneis = 0; dtVset(ag->dvel, 0,0,0); dtVset(ag->nvel, 0,0,0); dtVset(ag->vel, 0,0,0); dtVcopy(ag->npos, nearest); ag->desiredSpeed = 0; ag->t = 0; ag->var = (rand() % 10) / 9.0f; ag->state = DT_CROWDAGENT_STATE_WALKING; ag->active = 1; return idx; }