You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.8 KiB
65 lines
1.8 KiB
//========= Copyright 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_
|
|
|