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.
217 lines
6.5 KiB
217 lines
6.5 KiB
//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//=============================================================================// |
|
|
|
#ifndef AI_NETWORKMANAGER_H |
|
#define AI_NETWORKMANAGER_H |
|
|
|
#include "utlvector.h" |
|
#include "bitstring.h" |
|
#include "threadtools.h" |
|
|
|
#if defined( _WIN32 ) |
|
#pragma once |
|
#endif |
|
|
|
class CAI_NetworkEditTools; |
|
class CAI_Network; |
|
class CAI_Node; |
|
class CAI_Link; |
|
class CAI_TestHull; |
|
extern ConVar g_ai_threadedgraphbuild; |
|
|
|
//----------------------------------------------------------------------------- |
|
// CAI_NetworkManager |
|
// |
|
// Purpose: The entity in the level responsible for building the network if it |
|
// isn't there, saving & loading of the network, and holding the |
|
// CAI_Network instance. |
|
// |
|
//----------------------------------------------------------------------------- |
|
|
|
class CAI_NetworkManager : public CPointEntity |
|
{ |
|
public: |
|
static void InitializeAINetworks(); |
|
|
|
DECLARE_DATADESC(); |
|
|
|
DECLARE_CLASS( CAI_NetworkManager, CPointEntity ); |
|
|
|
public: |
|
CAI_NetworkManager(void); |
|
virtual ~CAI_NetworkManager(void); |
|
|
|
void Spawn (); |
|
virtual int ObjectCaps( void ) { return BaseClass::ObjectCaps() | FCAP_DONT_SAVE; } |
|
void RebuildNetworkGraph(); // Used in WC edit mode |
|
void StartRebuild(); // Used in WC edit mode |
|
void LoadNetworkGraph(); |
|
|
|
static bool NetworksLoaded() { return gm_fNetworksLoaded; } |
|
bool IsInitialized() { return m_fInitalized; } |
|
|
|
void BuildNetworkGraph(); |
|
|
|
static void DeleteAllAINetworks(); |
|
|
|
void FixupHints(); |
|
void MarkDontSaveGraph(); |
|
bool NeedsRebuild( void ) { return m_bNeedGraphRebuild; } |
|
|
|
public: |
|
CAI_NetworkEditTools * GetEditOps() { return m_pEditOps; } |
|
CAI_Network * GetNetwork() { Assert(!m_ThreadedBuild.pBuildingNetwork); return m_pNetwork; } |
|
|
|
private: |
|
|
|
void DelayedInit(); |
|
void ThreadedInit(); ///< experimental |
|
void RebuildThink(); |
|
void SaveNetworkGraph( void) ; |
|
static bool IsAIFileCurrent( const char *szMapName ); |
|
|
|
static bool gm_fNetworksLoaded; // Have AINetworks been loaded |
|
|
|
bool m_bNeedGraphRebuild; |
|
CAI_NetworkEditTools * m_pEditOps; |
|
CAI_Network * m_pNetwork; |
|
|
|
bool m_fInitalized; |
|
bool m_bDontSaveGraph; |
|
|
|
/// experimental -- to be replaced with a real job hopefully. |
|
/// affinity should be the second hardware thread on the server core |
|
struct ThreadedGraphBuildData |
|
{ |
|
CThreadMutex mutex; |
|
CAI_Network *pBuildingNetwork; |
|
CInterlockedInt nBuildStage; |
|
ThreadHandle_t job; ///< hopefully will replace w/ real job |
|
|
|
enum { BUILD_NOT_STARTED, BUILD_UNDERWAY, BUILD_DONE, }; |
|
|
|
ThreadedGraphBuildData() : pBuildingNetwork(NULL), nBuildStage(BUILD_NOT_STARTED), job(NULL) {} |
|
} m_ThreadedBuild; |
|
static unsigned ThreadedBuildJob( /* (ThreadedGraphBuildData *) */ void *pBuildData ); |
|
}; |
|
|
|
//----------------------------------------------------------------------------- |
|
|
|
abstract_class CAI_NetworkBuildHelper : public CLogicalEntity |
|
{ |
|
DECLARE_CLASS( CAI_NetworkBuildHelper, CLogicalEntity ); |
|
|
|
public: |
|
virtual void PostInitNodePosition( CAI_Network *pNetwork, CAI_Node *pNode ) = 0; |
|
}; |
|
|
|
//----------------------------------------------------------------------------- |
|
|
|
class CAI_NetworkBuilder |
|
{ |
|
public: |
|
void Build( CAI_Network *pNetwork ); |
|
void Rebuild( CAI_Network *pNetwork ); |
|
|
|
void InitNodePosition( CAI_Network *pNetwork, CAI_Node *pNode ); |
|
|
|
void InitZones( CAI_Network *pNetwork ); |
|
|
|
private: |
|
void InitVisibility( CAI_Network *pNetwork, CAI_Node *pNode ); |
|
void InitNeighbors( CAI_Network *pNetwork, CAI_Node *pNode ); |
|
void InitClimbNodePosition( CAI_Network *pNetwork, CAI_Node *pNode ); |
|
void InitGroundNodePosition( CAI_Network *pNetwork, CAI_Node *pNode ); |
|
void InitLinks( CAI_Network *pNetwork, CAI_Node *pNode ); |
|
void ForceDynamicLinkNeighbors(); |
|
|
|
void FloodFillZone( CAI_Node **ppNodes, CAI_Node *pNode, int zone ); |
|
|
|
int ComputeConnection( CAI_Node *pSrcNode, CAI_Node *pDestNode, Hull_t hull ); |
|
|
|
void BeginBuild(); |
|
void EndBuild(); |
|
|
|
CUtlVector<CVarBitVec> m_NeighborsTable; |
|
CVarBitVec m_DidSetNeighborsTable; |
|
CAI_TestHull * m_pTestHull; |
|
}; |
|
|
|
extern CAI_NetworkBuilder g_AINetworkBuilder; |
|
|
|
//----------------------------------------------------------------------------- |
|
// CAI_NetworkEditTools |
|
// |
|
// Purpose: Bridge class to Hammer node editing functionality |
|
// |
|
//----------------------------------------------------------------------------- |
|
|
|
class CAI_NetworkEditTools |
|
{ |
|
public: |
|
CAI_NetworkEditTools(CAI_NetworkManager *); |
|
~CAI_NetworkEditTools(); |
|
// ---------------------- |
|
// Debug & Edit fields |
|
// ---------------------- |
|
static CAI_Node * m_pLastDeletedNode; // For undo in wc edit mode |
|
static int m_iHullDrawNum; // Which hulls to draw |
|
static int m_iVisibilityNode; // Node I'm showing visibility for |
|
static int m_iGConnectivityNode; // Node I'm showing graph connectivity for |
|
static bool m_bAirEditMode; // Editing Air Nodes |
|
static bool m_bLinkEditMode; // Editing Links |
|
static float m_flAirEditDistance; // Distance editing Air Nodes |
|
|
|
static void DrawHull(Hull_t eHull); |
|
static void DrawNextHull(const char *ainet_name); // Draws next hull set for the named ai network |
|
static void SetDebugBits(const char *ainet_name,int debug_bit); |
|
|
|
static CAI_Node * FindAINodeNearestFacing( const Vector &origin, const Vector &facing, float threshold, int nNodeType); |
|
static CAI_Link * FindAILinkNearestFacing( const Vector &origin, const Vector &facing, float threshold); |
|
|
|
//--------------- |
|
// WC Editing |
|
//--------------- |
|
int m_nNextWCIndex; // Next unused index used by WC |
|
Vector * m_pWCPosition; // Array of vectors only used in wc edit mode |
|
|
|
//----------------- |
|
// Debugging Tools |
|
//----------------- |
|
int m_debugNetOverlays; // Which network debug overlays to draw |
|
void DrawAINetworkOverlay(void); // Draw network on the client |
|
|
|
void RecalcUsableNodesForHull(void); // Used only for debug drawing |
|
|
|
//----------------- |
|
void OnInit(); |
|
|
|
int GetNodeIdFromWCId( int nWCId ); |
|
int GetWCIdFromNodeId( int nNodeId ); |
|
int * m_pNodeIndexTable; // Table of WC Id's to Engine Id's |
|
|
|
void ClearRebuildFlags(); |
|
void SetRebuildFlags(); |
|
void DrawEditInfoOverlay(); |
|
|
|
#ifdef AI_PERF_MON |
|
//---------------------- |
|
// Performance stats |
|
//---------------------- |
|
static int m_nPerfStatNN; |
|
static int m_nPerfStatPB; |
|
static float m_fNextPerfStatTime; |
|
#endif |
|
|
|
CAI_NetworkManager *m_pManager; |
|
CAI_Network * m_pNetwork; |
|
|
|
|
|
}; |
|
|
|
//----------------------------------------------------------------------------- |
|
|
|
#endif // AI_NETWORKMANAGER_H
|
|
|