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.
204 lines
7.6 KiB
204 lines
7.6 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#ifndef AI_PATHFINDER_H |
|
#define AI_PATHFINDER_H |
|
|
|
#include "ai_component.h" |
|
#include "ai_navtype.h" |
|
|
|
#if defined( _WIN32 ) |
|
#pragma once |
|
#endif |
|
|
|
struct AIMoveTrace_t; |
|
struct OverlayLine_t; |
|
struct AI_Waypoint_t; |
|
class CAI_Link; |
|
class CAI_Network; |
|
class CAI_Node; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// The type of route to build |
|
enum RouteBuildFlags_e |
|
{ |
|
bits_BUILD_GROUND = 0x00000001, // |
|
bits_BUILD_JUMP = 0x00000002, // |
|
bits_BUILD_FLY = 0x00000004, // |
|
bits_BUILD_CLIMB = 0x00000008, // |
|
bits_BUILD_GIVEWAY = 0x00000010, // |
|
bits_BUILD_TRIANG = 0x00000020, // |
|
bits_BUILD_IGNORE_NPCS = 0x00000040, // Ignore collisions with NPCs |
|
bits_BUILD_COLLIDE_NPCS = 0x00000080, // Use collisions with NPCs (redundant for argument clarity) |
|
bits_BUILD_GET_CLOSE = 0x00000100, // the route will be built even if it can't reach the destination |
|
}; |
|
|
|
//----------------------------------------------------------------------------- |
|
// CAI_Pathfinder |
|
// |
|
// Purpose: Executes pathfinds through an associated network. |
|
// |
|
//----------------------------------------------------------------------------- |
|
|
|
class CAI_Pathfinder : public CAI_Component |
|
{ |
|
public: |
|
CAI_Pathfinder( CAI_BaseNPC *pOuter ) |
|
: CAI_Component(pOuter), |
|
m_flLastStaleLinkCheckTime( 0 ), |
|
m_pNetwork( NULL ) |
|
{ |
|
} |
|
|
|
void Init( CAI_Network *pNetwork ); |
|
|
|
//--------------------------------- |
|
|
|
int NearestNodeToNPC(); |
|
int NearestNodeToPoint( const Vector &vecOrigin ); |
|
|
|
AI_Waypoint_t* FindBestPath (int startID, int endID); |
|
AI_Waypoint_t* FindShortRandomPath (int startID, float minPathLength, const Vector &vDirection = vec3_origin); |
|
|
|
// -------------------------------- |
|
|
|
bool IsLinkUsable(CAI_Link *pLink, int startID); |
|
|
|
// -------------------------------- |
|
|
|
AI_Waypoint_t *BuildRoute( const Vector &vStart, const Vector &vEnd, CBaseEntity *pTarget, float goalTolerance, Navigation_t curNavType = NAV_NONE, bool bLocalSucceedOnWithinTolerance = false ); |
|
void UnlockRouteNodes( AI_Waypoint_t * ); |
|
|
|
// -------------------------------- |
|
|
|
void SetIgnoreBadLinks() { m_bIgnoreStaleLinks = true; } // lasts only for the next pathfind |
|
|
|
// -------------------------------- |
|
|
|
virtual AI_Waypoint_t *BuildNodeRoute( const Vector &vStart, const Vector &vEnd, int buildFlags, float goalTolerance ); |
|
virtual AI_Waypoint_t *BuildLocalRoute( const Vector &vStart, const Vector &vEnd, CBaseEntity const *pTarget, int endFlags, int nodeID, int buildFlags, float goalTolerance); |
|
virtual AI_Waypoint_t *BuildRadialRoute( const Vector &vStartPos, const Vector &vCenterPos, const Vector &vGoalPos, float flRadius, float flArc, float flStepDist, bool bClockwise, float goalTolerance, bool bAirRoute ); |
|
|
|
virtual AI_Waypoint_t *BuildTriangulationRoute( const Vector &vStart, |
|
const Vector &vEnd, CBaseEntity const *pTarget, int endFlags, int nodeID, |
|
float flYaw, float flDistToBlocker, Navigation_t navType); |
|
|
|
virtual AI_Waypoint_t *BuildOBBAvoidanceRoute( const Vector &vStart, const Vector &vEnd, |
|
const CBaseEntity *pObstruction, const CBaseEntity *pTarget, |
|
Navigation_t navType ); |
|
|
|
// -------------------------------- |
|
|
|
bool Triangulate( Navigation_t navType, const Vector &vecStart, const Vector &vecEnd, |
|
float flDistToBlocker, CBaseEntity const *pTargetEnt, Vector *pApex ); |
|
|
|
// -------------------------------- |
|
|
|
void DrawDebugGeometryOverlays( int m_debugOverlays ); |
|
|
|
protected: |
|
virtual bool CanUseLocalNavigation() { return true; } |
|
|
|
private: |
|
friend class CPathfindNearestNodeFilter; |
|
|
|
//--------------------------------- |
|
|
|
AI_Waypoint_t* RouteToNode(const Vector &vecOrigin, int buildFlags, int nodeID, float goalTolerance); |
|
AI_Waypoint_t* RouteFromNode(const Vector &vecOrigin, int buildFlags, int nodeID, float goalTolerance); |
|
|
|
AI_Waypoint_t * BuildNearestNodeRoute( const Vector &vGoal, bool bToNode, int buildFlags, float goalTolerance, int *pNearestNode ); |
|
|
|
//--------------------------------- |
|
|
|
AI_Waypoint_t* MakeRouteFromParents(int *parentArray, int endID); |
|
AI_Waypoint_t* CreateNodeWaypoint( Hull_t hullType, int nodeID, int nodeFlags = 0 ); |
|
|
|
AI_Waypoint_t* BuildRouteThroughPoints( Vector *vecPoints, int nNumPoints, int nDirection, int nStartIndex, int nEndIndex, Navigation_t navType, CBaseEntity *pTarget ); |
|
|
|
bool IsLinkStillStale(int moveType, CAI_Link *nodeLink); |
|
|
|
// -------------------------------- |
|
|
|
// Builds a simple route (no triangulation, no making way) |
|
AI_Waypoint_t *BuildSimpleRoute( Navigation_t navType, const Vector &vStart, const Vector &vEnd, |
|
const CBaseEntity *pTarget, int endFlags, int nodeID, int nodeTargetType, float flYaw); |
|
|
|
// Builds a complex route (triangulation, making way) |
|
AI_Waypoint_t *BuildComplexRoute( Navigation_t navType, const Vector &vStart, |
|
const Vector &vEnd, const CBaseEntity *pTarget, int endFlags, int nodeID, |
|
int buildFlags, float flYaw, float goalTolerance, float maxLocalNavDistance ); |
|
|
|
AI_Waypoint_t *BuildGroundRoute( const Vector &vStart, const Vector &vEnd, CBaseEntity const *pTarget, int endFlags, int nodeID, int buildFlags, float flYaw, float goalTolerance ); |
|
AI_Waypoint_t *BuildFlyRoute( const Vector &vStart, const Vector &vEnd, CBaseEntity const *pTarget, int endFlags, int nodeID, int buildFlags, float flYaw, float goalTolerance ); |
|
AI_Waypoint_t *BuildJumpRoute( const Vector &vStart, const Vector &vEnd, CBaseEntity const *pTarget, int endFlags, int nodeID, int buildFlags, float flYaw ); |
|
AI_Waypoint_t *BuildClimbRoute( const Vector &vStart, const Vector &vEnd, CBaseEntity const *pTarget, int endFlags, int nodeID, int buildFlags, float flYaw ); |
|
|
|
// Computes the link type |
|
Navigation_t ComputeWaypointType( CAI_Node **ppNodes, int parentID, int destID ); |
|
|
|
// -------------------------------- |
|
|
|
bool TestTriangulationRoute( Navigation_t navType, const Vector& vecStart, |
|
const Vector &vecApex, const Vector &vecEnd, const CBaseEntity *pTargetEnt, AIMoveTrace_t *pStartTrace ); |
|
|
|
// -------------------------------- |
|
|
|
bool CheckStaleRoute( const Vector &vStart, const Vector &vEnd, int moveTypes); |
|
bool CheckStaleNavTypeRoute( Navigation_t navType, const Vector &vStart, const Vector &vEnd ); |
|
|
|
// -------------------------------- |
|
|
|
bool CanGiveWay( const Vector& vStart, const Vector& vEnd, CBaseEntity *pNPCBlocker ); |
|
|
|
// -------------------------------- |
|
|
|
bool UseStrongOptimizations(); |
|
|
|
// -------------------------------- |
|
// Debugging fields and functions |
|
|
|
class CTriDebugOverlay |
|
{ |
|
public: |
|
CTriDebugOverlay() |
|
: m_debugTriOverlayLine( NULL ) |
|
{ |
|
} |
|
void AddTriOverlayLines( const Vector &vecStart, const Vector &vecApex, const Vector &vecEnd, const AIMoveTrace_t &startTrace, const AIMoveTrace_t &endTrace, bool bPathClear ); |
|
void ClearTriOverlayLines(void); |
|
void FadeTriOverlayLines(void); |
|
|
|
void Draw(int npcDebugOverlays); |
|
private: |
|
void AddTriOverlayLine(const Vector &origin, const Vector &dest, int r, int g, int b, bool noDepthTest); |
|
|
|
OverlayLine_t **m_debugTriOverlayLine; |
|
}; |
|
|
|
CTriDebugOverlay m_TriDebugOverlay; |
|
|
|
//--------------------------------- |
|
|
|
float m_flLastStaleLinkCheckTime; // Last time I check for a stale link |
|
bool m_bIgnoreStaleLinks; |
|
|
|
//--------------------------------- |
|
|
|
CAI_Network *GetNetwork() { return m_pNetwork; } |
|
const CAI_Network *GetNetwork() const { return m_pNetwork; } |
|
|
|
CAI_Network *m_pNetwork; |
|
|
|
public: |
|
DECLARE_SIMPLE_DATADESC(); |
|
}; |
|
|
|
//----------------------------------------------------------------------------- |
|
|
|
#endif // AI_PATHFINDER_H
|
|
|