mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-23 14:46:53 +00:00
66 lines
1.8 KiB
C
66 lines
1.8 KiB
C
|
//========= 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_
|