diff options
Diffstat (limited to 'game/server/ai_pathfinder.h')
| -rw-r--r-- | game/server/ai_pathfinder.h | 204 |
1 files changed, 204 insertions, 0 deletions
diff --git a/game/server/ai_pathfinder.h b/game/server/ai_pathfinder.h new file mode 100644 index 0000000..615e7d7 --- /dev/null +++ b/game/server/ai_pathfinder.h @@ -0,0 +1,204 @@ +//========= 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 |