sqwarmed/sdk_src/game/server/ai_networkmanager.h

218 lines
6.7 KiB
C
Raw Normal View History

2024-08-29 19:18:30 -04:00
//========= Copyright <20> 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