218 lines
6.7 KiB
C++
218 lines
6.7 KiB
C++
//========= 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
|