mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-14 20:56:56 +00:00
1
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
//========= 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_
|
||||
Reference in New Issue
Block a user