//========= Copyright 1996-2005, Valve Corporation, All rights reserved. ============// // // Purpose: Helper for the CHudElement class to add themselves to the list of hud elements // // $NoKeywords: $ //=============================================================================// #ifndef HUD_ELEMENT_HELPER_H #define HUD_ELEMENT_HELPER_H #ifdef _WIN32 #pragma once #endif class CHudElement; #define HUDELEMENT_DEFAULT 0 // default, hud elements present in all split contexts #define HUDELEMENT_SS_FULLSCREEN_ONLY 1 // hud element only created in fullscreen context //----------------------------------------------------------------------------- // Purpose: Used by DECLARE_HUDELEMENT macro to create a linked list of // instancing functions //----------------------------------------------------------------------------- class CHudElementHelper { public: // Static list of helpers static CHudElementHelper *m_sHelpers; // Create all the hud elements static void CreateAllElements( void ); public: // Construction CHudElementHelper( CHudElement *( *pfnCreate )( void ), int depth, int flags = HUDELEMENT_DEFAULT ); // Accessors CHudElementHelper *GetNext( void ); private: // Next factory in list CHudElementHelper *m_pNext; // Creation function to use for this technology CHudElement *( *m_pfnCreate )( void ); //Depth used to determine hud panel ordering int m_iDepth; // Flags for visibility of hud elements in splitscreen int m_iFlags; }; // This is the macro which implements creation of each hud element // It creates a function which instances an object of the specified type // It them hooks that function up to the helper list so that the CHud objects can create // the elements by name, with no header file dependency, etc. #define DECLARE_HUDELEMENT( className ) \ static CHudElement *Create_##className( void ) \ { \ return new className( #className ); \ }; \ static CHudElementHelper g_##className##_Helper( Create_##className, 50 ); #define DECLARE_HUDELEMENT_DEPTH( className, depth ) \ static CHudElement *Create_##className( void ) \ { \ return new className( #className ); \ }; \ static CHudElementHelper g_##className##_Helper( Create_##className, depth ); #define DECLARE_NAMED_HUDELEMENT( className, panelName ) \ static CHudElement *Create_##panelName( void ) \ { \ return new className( #panelName ); \ }; \ static CHudElementHelper g_##panelName##_Helper( Create_##panelName, 50 ); // Versions with flags #define DECLARE_HUDELEMENT_FLAGS( className, flags ) \ static CHudElement *Create_##className( void ) \ { \ return new className( #className ); \ }; \ static CHudElementHelper g_##className##_Helper( Create_##className, 50, flags ); #define DECLARE_HUDELEMENT_DEPTH_FLAGS( className, depth, flags ) \ static CHudElement *Create_##className( void ) \ { \ return new className( #className ); \ }; \ static CHudElementHelper g_##className##_Helper( Create_##className, depth ); #define DECLARE_NAMED_HUDELEMENT_FLAGS( className, panelName, flags ) \ static CHudElement *Create_##panelName( void ) \ { \ return new className( #panelName ); \ }; \ static CHudElementHelper g_##panelName##_Helper( Create_##panelName, 50 ); // This macro can be used to get a pointer to a specific hud element #define GET_HUDELEMENT( className ) \ (className*)GetHud().FindElement( #className ) #define GET_NAMED_HUDELEMENT( className, panelName ) \ (className*)GetHud().FindElement( #panelName ) #define GET_FULLSCREEN_HUDELEMENT( className ) \ ((className*)GetHud( 0 ).FindElement( #className )) // Things that inherit from vgui::Panel, too, will have ambiguous new operators // so this should disambiguate them #define DECLARE_MULTIPLY_INHERITED() \ void *operator new( size_t stAllocateBlock ) \ { \ return CHudElement::operator new ( stAllocateBlock ); \ } \ void* operator new( size_t stAllocateBlock, int nBlockUse, const char *pFileName, int nLine ) \ { \ return CHudElement::operator new ( stAllocateBlock, nBlockUse, pFileName, nLine ); \ } \ void operator delete( void *pMem ) \ { \ CHudElement::operator delete ( pMem ); \ } \ void operator delete( void *pMem, int nBlockUse, const char *pFileName, int nLine ) \ { \ CHudElement::operator delete ( pMem, nBlockUse, pFileName, nLine ); \ } // Alias for base hud element #define IMPLEMENT_OPERATORS_NEW_AND_DELETE DECLARE_MULTIPLY_INHERITED #endif // HUD_ELEMENT_HELPER_H