void ESceneAIMapTool::UpdateLinks(SAINode* N, bool bIC) { Fvector Pos; SAINode* D; // left { Pos.set (N->Pos); Pos.x -= m_Params.fPatchSize; D = GetNode(Pos,bIC); if (bIC||CanTravel(N->Pos, Pos)) N->n1 = D; if (D&&(bIC||CanTravel(D->Pos, N->Pos))) D->n3 = N; } // fwd { Pos.set (N->Pos); Pos.z += m_Params.fPatchSize; D = GetNode(Pos,bIC); if (bIC||CanTravel(N->Pos, Pos)) N->n2 = D; if (D&&(bIC||CanTravel(D->Pos, N->Pos))) D->n4 = N; } // right { Pos.set (N->Pos); Pos.x += m_Params.fPatchSize; D = GetNode(Pos,bIC); if (bIC||CanTravel(N->Pos, Pos)) N->n3 = D; if (D&&(bIC||CanTravel(D->Pos, N->Pos))) D->n1 = N; } // back { Pos.set (N->Pos); Pos.z -= m_Params.fPatchSize; D = GetNode(Pos,bIC); if (bIC||CanTravel(N->Pos, Pos)) N->n4 = D; if (D&&(bIC||CanTravel(D->Pos, N->Pos))) D->n2 = N; } }
u32 BuildNode(Fvector& vFrom, Fvector& vAt) // return node's index { // *** Test if we can travel this path SnapXZ (vAt); if (!CanTravel(vFrom, vAt)) return InvalidNode; // *** set up xr_new<node vertex N; if (CreateNode(vAt,N)) { //*** check if similar node exists u32 old = FindNode(N.Pos); if (old==InvalidNode) { // register xr_new<node RegisterNode(N); return g_nodes.size()-1; } else { // where already was node - return it return old; } } else return InvalidNode; }
SAINode* ESceneAIMapTool::BuildNode(Fvector& vFrom, Fvector& vAt, bool bIC, bool bSuperIC) // return node's index { // *** Test if we can travel this path SnapXZ (vAt,m_Params.fPatchSize); if (!(bIC||CanTravel(vFrom, vAt))) return 0; // *** set up node SAINode N; BOOL bRes = CreateNode(vAt,N,bIC); if (!bRes&&bIC&&bSuperIC){ Fvector D = {0,1,0}; N.Plane.build(vAt,D); // build plane N.Plane.intersectRayPoint(vAt,D,N.Pos); // "project" position bRes = TRUE; } if (bRes) { //*** check if similar node exists SAINode* old = FindNode(N.Pos); if (!old){ // register xr_new<node AINodeVec* V = HashMap(N.Pos); if (V){ m_Nodes.push_back (xr_new<SAINode>(N)); V->push_back (m_Nodes.back()); return m_Nodes.back(); }else return 0; }else{ // where already was node - return it return old; } }else{ return 0; } }