//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ // //=============================================================================// // nav_pathfind.h // Path-finding mechanisms using the Navigation Mesh // Author: Michael S. Booth (mike@turtlerockstudios.com), January 2003 #ifndef _CS_NAV_PATHFIND_H_ #define _CS_NAV_PATHFIND_H_ #include "nav_pathfind.h" //-------------------------------------------------------------------------------------------------------------- /** * Compute travel distance along shortest path from startPos to goalPos. * Return -1 if can't reach endPos from goalPos. */ template< typename CostFunctor > float NavAreaTravelDistance( const Vector &startPos, const Vector &goalPos, CostFunctor &costFunc ) { CNavArea *startArea = TheNavMesh->GetNearestNavArea( startPos ); if (startArea == NULL) { return -1.0f; } // compute path between areas using given cost heuristic CNavArea *goalArea = NULL; if (NavAreaBuildPath( startArea, NULL, &goalPos, costFunc, &goalArea ) == false) { return -1.0f; } // compute distance along path if (goalArea->GetParent() == NULL) { // both points are in the same area - return euclidean distance return (goalPos - startPos).Length(); } else { CNavArea *area; float distance; // goalPos is assumed to be inside goalArea (or very close to it) - skip to next area area = goalArea->GetParent(); distance = (goalPos - area->GetCenter()).Length(); for( ; area->GetParent(); area = area->GetParent() ) { distance += (area->GetCenter() - area->GetParent()->GetCenter()).Length(); } // add in distance to startPos distance += (startPos - area->GetCenter()).Length(); return distance; } } #endif // _CS_NAV_PATHFIND_H_