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.
200 lines
5.7 KiB
200 lines
5.7 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
//=============================================================================//
|
||
|
|
||
|
#ifndef AI_NETWORKMANAGER_H
|
||
|
#define AI_NETWORKMANAGER_H
|
||
|
|
||
|
#include "utlvector.h"
|
||
|
#include "bitstring.h"
|
||
|
|
||
|
#if defined( _WIN32 )
|
||
|
#pragma once
|
||
|
#endif
|
||
|
|
||
|
class CAI_NetworkEditTools;
|
||
|
class CAI_Network;
|
||
|
class CAI_Node;
|
||
|
class CAI_Link;
|
||
|
class CAI_TestHull;
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// 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();
|
||
|
|
||
|
public:
|
||
|
CAI_NetworkEditTools * GetEditOps() { return m_pEditOps; }
|
||
|
CAI_Network * GetNetwork() { return m_pNetwork; }
|
||
|
|
||
|
private:
|
||
|
|
||
|
void DelayedInit();
|
||
|
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;
|
||
|
};
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
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
|