// converts part of a low-res path into a med-res path void CPathManager::LowRes2MedRes(MultiPath& multiPath, const float3& startPos, int ownerId, bool synced) const { IPath::Path& medResPath = multiPath.medResPath; IPath::Path& lowResPath = multiPath.lowResPath; if (lowResPath.path.empty()) return; lowResPath.path.pop_back(); // Remove estimate2 waypoints until // the next one is far enough while (!lowResPath.path.empty() && lowResPath.path.back().SqDistance2D(startPos) < Square(ESTIMATE_DISTANCE * SQUARE_SIZE)) { lowResPath.path.pop_back(); } //Get the goal of the detailed search. float3 goalPos; if (lowResPath.path.empty()) { goalPos = lowResPath.pathGoal; } else { goalPos = lowResPath.path.back(); } // define the search CRangedGoalWithCircularConstraint rangedGoal(startPos, goalPos, 0.0f, 2.0f, 20); // Perform the search. // If there is no estimate2 path left, use original goal. IPath::SearchResult result; if (lowResPath.path.empty()) { result = medResPE->GetPath(*multiPath.moveData, startPos, *multiPath.peDef, medResPath, MAX_SEARCHED_NODES_ON_REFINE, synced); } else { result = medResPE->GetPath(*multiPath.moveData, startPos, rangedGoal, medResPath, MAX_SEARCHED_NODES_ON_REFINE, synced); } // If no refined path could be found, set goal as desired goal. if (result == IPath::CantGetCloser || result == IPath::Error) { medResPath.pathGoal = goalPos; } }
float3 CPathEstimator::FindBestBlockCenter(const MoveData* moveData, float3 pos) { int pathType=moveData->pathType; CRangedGoalWithCircularConstraint rangedGoal(pos,pos, 0,0,SQUARE_SIZE*BLOCK_SIZE*SQUARE_SIZE*BLOCK_SIZE*4); IPath::Path path; std::vector<float3> startPos; int xm=(int)(pos.x/(SQUARE_SIZE*BLOCK_SIZE)); int ym=(int)(pos.z/(SQUARE_SIZE*BLOCK_SIZE)); for(int y=max(0,ym-1);y<=min(nbrOfBlocksZ-1,ym+1);++y){ for(int x=max(0,xm-1);x<=min(nbrOfBlocksX-1,xm+1);++x){ startPos.push_back(float3(blockState[y*nbrOfBlocksX+x].sqrCenter[pathType].x*SQUARE_SIZE,0,blockState[y*nbrOfBlocksX+x].sqrCenter[pathType].y*SQUARE_SIZE)); } } IPath::SearchResult result = pathFinder->GetPath(*moveData, startPos, rangedGoal, path); if(result == IPath::Ok && !path.path.empty()) { return path.path.back(); } return ZeroVector; }
/* Turns a part of the estimate2 path into estimate path. */ void CPathManager::Estimate2ToEstimate(MultiPath& path, float3 startPos, int ownerId, bool synced) const { //If there is no estimate2 path, nothing could be done. if (path.estimatedPath2.path.empty()) return; path.estimatedPath2.path.pop_back(); //Remove estimate2 waypoints until //the next one is far enought. while (!path.estimatedPath2.path.empty() && path.estimatedPath2.path.back().SqDistance2D(startPos) < Square(ESTIMATE_DISTANCE * SQUARE_SIZE)) { path.estimatedPath2.path.pop_back(); } //Get the goal of the detailed search. float3 goalPos; if (path.estimatedPath2.path.empty()) goalPos = path.estimatedPath2.pathGoal; else goalPos = path.estimatedPath2.path.back(); //Define the search. CRangedGoalWithCircularConstraint rangedGoal(startPos,goalPos, 0,2,20); // Perform the search. // If there is no estimate2 path left, use original goal. IPath::SearchResult result; if (path.estimatedPath2.path.empty()) result = pe->GetPath(*path.moveData, startPos, *path.peDef, path.estimatedPath, MAX_SEARCHED_NODES_ON_REFINE, synced); else { result = pe->GetPath(*path.moveData, startPos, rangedGoal, path.estimatedPath, MAX_SEARCHED_NODES_ON_REFINE, synced); } // If no refined path could be found, set goal as desired goal. if (result == IPath::CantGetCloser || result == IPath::Error) { path.estimatedPath.pathGoal = goalPos; } }