//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // //=============================================================================// #ifndef PANELANIMATIONVAR_H #define PANELANIMATIONVAR_H #ifdef _WIN32 #pragma once #endif #include "tier1/utlvector.h" #include #define DECLARE_PANELANIMATION( className ) \ static void AddToAnimationMap( char const *scriptname, char const *type, char const *var, \ char const *defaultvalue, bool array, PANELLOOKUPFUNC func ) \ { \ PanelAnimationMap *map = FindOrAddPanelAnimationMap( GetPanelClassName() ); \ \ PanelAnimationMapEntry entry; \ entry.m_pszScriptName = scriptname; \ entry.m_pszVariable = var; \ entry.m_pszType = type; \ entry.m_pszDefaultValue = defaultvalue; \ entry.m_pfnLookup = func; \ entry.m_bArray = array; \ \ map->entries.AddToTail( entry ); \ } \ \ static void ChainToAnimationMap( void ) \ { \ static bool chained = false; \ if ( chained ) \ return; \ chained = true; \ PanelAnimationMap *map = FindOrAddPanelAnimationMap( GetPanelClassName() ); \ map->pfnClassName = GetPanelClassName; \ if ( map && GetPanelBaseClassName() && GetPanelBaseClassName()[0] ) \ { \ map->baseMap = FindOrAddPanelAnimationMap( GetPanelBaseClassName() ); \ } \ } \ \ class className##_Register; \ friend class className##_Register; \ class className##_Register \ { \ public: \ className##_Register() \ { \ className::ChainToAnimationMap(); \ } \ }; \ className##_Register m_RegisterAnimationClass; \ \ virtual PanelAnimationMap *GetAnimMap() \ { \ return FindOrAddPanelAnimationMap( GetPanelClassName() ); \ } typedef void *( *PANELLOOKUPFUNC )( vgui::Panel *panel ); // Use this macro to define a variable which hudanimations.txt and hudlayout.res scripts can access #define CPanelAnimationVarAliasType( type, name, scriptname, defaultvalue, typealias ) \ class PanelAnimationVar_##name; \ friend class PanelAnimationVar_##name; \ static void *GetVar_##name( vgui::Panel *panel ) \ { \ return &(( ThisClass *)panel)->name; \ } \ class PanelAnimationVar_##name \ { \ public: \ static void InitVar() \ { \ static bool bAdded = false; \ if ( !bAdded ) \ { \ bAdded = true; \ AddToAnimationMap( scriptname, typealias, #name, defaultvalue, false, ThisClass::GetVar_##name ); \ } \ } \ PanelAnimationVar_##name() \ { \ PanelAnimationVar_##name::InitVar(); \ } \ }; \ PanelAnimationVar_##name m_##name##_register; \ type name; #define CPanelAnimationVar( type, name, scriptname, defaultvalue ) \ CPanelAnimationVarAliasType( type, name, scriptname, defaultvalue, #type ) // Use this macro to define a variable which hudanimations.txt and hudlayout.res scripts can access #define CPanelAnimationStringVarAliasType( count, name, scriptname, defaultvalue, typealias ) \ class PanelAnimationVar_##name; \ friend class PanelAnimationVar_##name; \ static void *GetVar_##name( vgui::Panel *panel ) \ { \ return &(( ThisClass *)panel)->name; \ } \ class PanelAnimationVar_##name \ { \ public: \ static void InitVar() \ { \ static bool bAdded = false; \ if ( !bAdded ) \ { \ bAdded = true; \ AddToAnimationMap( scriptname, typealias, #name, defaultvalue, true, ThisClass::GetVar_##name ); \ } \ } \ PanelAnimationVar_##name() \ { \ PanelAnimationVar_##name::InitVar(); \ } \ }; \ PanelAnimationVar_##name m_##name##_register; \ char name[ count ]; #define CPanelAnimationStringVar( count, name, scriptname, defaultvalue ) \ CPanelAnimationStringVarAliasType( count, name, scriptname, defaultvalue, "string" ) struct PanelAnimationMapEntry { char const *name() { return m_pszScriptName; } char const *type() { return m_pszType; } char const *defaultvalue() { return m_pszDefaultValue; } bool isarray() { return m_bArray; } char const *m_pszScriptName; char const *m_pszVariable; char const *m_pszType; char const *m_pszDefaultValue; bool m_bArray; PANELLOOKUPFUNC m_pfnLookup; }; struct PanelAnimationMap { PanelAnimationMap() { baseMap = NULL; pfnClassName = NULL; } CUtlVector< PanelAnimationMapEntry > entries; PanelAnimationMap *baseMap; char const *(*pfnClassName)( void ); }; PanelAnimationMap *FindPanelAnimationMap( char const *className ); PanelAnimationMap *FindOrAddPanelAnimationMap( char const *className ); void PanelAnimationDumpVars( char const *className ); #endif // PANELANIMATIONVAR_H