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 Š 1996-2005, Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $NoKeywords: $
|
|
//
|
|
//=============================================================================//
|
|
// nav_pathfind.h
|
|
// Path-finding mechanisms using the Navigation Mesh
|
|
// Author: Michael S. Booth ([email protected]), 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_
|