etqw-sdk/source/game/guis/UserInterfaceLocal.h

850 lines
36 KiB
C++

// Copyright (C) 2007 Id Software, Inc.
//
#ifndef __GAME_GUIS_USERINTERFACELOCAL_H__
#define __GAME_GUIS_USERINTERFACELOCAL_H__
#include "../../idlib/PropertiesImpl.h"
#include "UserInterfaceTypes.h"
#include "UITimeline.h"
#include "UserInterfaceScript.h"
#include "../../renderer/DeviceContext.h"
#include "../gamesys/DeviceContextHelper.h"
class sdFloatParmExpression;
class sdSingleParmExpression;
class sdUserInterfaceLocal;
class sdUIExpression;
class sdDeclGUITheme;
class sdHudModule;
class sdDeclInvItem;
class idEntity;
class sdUIObject;
class sdBindContext;
class sdDeclItemPackageNode;
/*
============
sdUserInterfaceState
============
*/
class idEntity;
class sdUserInterfaceState : public sdUserInterfaceScope {
public:
sdUserInterfaceState( void ) : ui( NULL ) { ; }
~sdUserInterfaceState( void );
void Init( sdUserInterfaceLocal* _ui ) { ui = _ui; }
virtual bool IsReadOnly() const { return false; }
virtual int NumSubScopes() const { return 0; }
virtual const char* GetSubScopeNameForIndex( int index ) { assert( 0 ); return ""; }
virtual sdUserInterfaceScope* GetSubScopeForIndex( int index ) { assert( 0 ); return NULL; }
virtual sdProperties::sdProperty* GetProperty( const char* name, sdProperties::ePropertyType type );
virtual sdProperties::sdProperty* GetProperty( const char* name );
virtual sdUIFunctionInstance* GetFunction( const char* name );
virtual sdUIEvaluatorTypeBase* GetEvaluator( const char* name );
virtual bool RunNamedFunction( const char* name, sdUIFunctionStack& stack );
virtual const char* FindPropertyNameByKey( int propertyKey, sdUserInterfaceScope*& scope ) { return FindPropertyName( boundProperties.PropertyForKey( propertyKey ), scope ); }
virtual const char* FindPropertyName( sdProperties::sdProperty* property, sdUserInterfaceScope*& scope );
sdProperties::sdPropertyHandler& GetProperties() { return properties; }
virtual int IndexForProperty( sdProperties::sdProperty* property );
virtual void SetPropertyExpression( int propertyKey, int propertyIndex, sdUIExpression* expression );
virtual void ClearPropertyExpression( int propertyKey, int propertyIndex );
virtual void RunFunction( int expressionIndex );
virtual int AddExpression( sdUIExpression* expression ) { return expressions.Append( expression ); }
virtual sdUIExpression* GetExpression( int index ) { return expressions[ index ]; }
sdProperties::sdPropertyHandler& GetPropertyHandler( void ) { return properties; }
virtual sdUIEventHandle GetEvent( const sdUIEventInfo& info ) const;
virtual void AddEvent( const sdUIEventInfo& info, sdUIEventHandle scriptHandle );
void Clear();
void ClearExpressions();
void Update( void );
void OnSnapshotHitch( int delta );
virtual sdUserInterfaceLocal* GetUI() { return ui; }
virtual const char* GetName() const;
void AddTransition( sdUIExpression* expression );
void RemoveTransition( sdUIExpression* expression );
virtual sdUserInterfaceScope* GetSubScope( const char* name );
virtual const char* GetScopeClassName() const { return "sdUserInterfaceLocal"; }
private:
sdUserInterfaceLocal* ui;
sdProperties::sdPropertyHandler properties;
idList< sdUIExpression* > transitionExpressions;
idList< sdUIExpression* > expressions;
sdPropertyBinder boundProperties;
};
/*
============
sdUserInterfaceLocal
============
*/
SD_UI_PUSH_CLASS_TAG( sdUserInterfaceLocal )
SD_UI_CLASS_INFO_TAG(
/* ============ */
"This is the GUI itself, all window defs must be inside it. You may set properties, " \
"flags, cache materials, cache sounds, set atmospheres and add events directly on the GUI. " \
"GUI script functions may be called from any event or timeline by using a " \
"\"gui.\" prefix to the function name."
/* ============ */
)
SD_UI_CLASS_EXAMPLE_TAG(
/* ============ */
" gui guis/vehicles/edf_titan {\n" \
" \t// Properties for the GUI.\n" \
" \tproperties {\n" \
" \t\tfloat flags = immediate( flags ) | GUI_FULLSCREEN;\n" \
" \t}\n" \
" \t_class_icons\n" \
" \n" \
" \t// Cache the titan icon material.\n" \
" \tmaterials {\n" \
" \t\t\"icon\" \"guis/assets/hud/gdf/vehicles/titan\"\n" \
" \t}\n" \
" \n" \
" \t_base_icon // Template: setup background material, player list, etc.\n" \
" \t_hud_materials // Template: Cache all materials used in the HUD.\n" \
" \t_position( 0, 2, 10 ) // Template: Setup icon for player position 0\n" \
" \t_position( 1, 2, 24 ) // Template: Setup icon for player position 1\n" \
" \n" \
" \t// Template: Draw a generic GDF missile sight.\n" \
" \t_gdf_generic_missile_sight( \"dontshowlines\", \"0,0,0,1\", \"0,0,0,1\" )\n" \
" }"
/* ============ */
)
SD_UI_POP_CLASS_TAG
class sdUIObject;
class sdUIObject_Drawable;
class sdUIEvaluatorTypeBase;
class sdUIEvaluator;
extern const char sdUITemplateFunctionInstance_Identifier[];
typedef sdPair< const sdDeclInvItem*, int > itemBankPair_t;
SD_UI_PROPERTY_TAG(
"1. Behavior" = "Expand";
"2. Drawing" = "Expand";
"3. Cursor" = "Collapse";
)
class sdUserInterfaceLocal : public sdUserInterface {
public:
typedef sdUITemplateFunction< sdUserInterfaceLocal > uiFunction_t;
typedef sdUITemplateFunctionInstance< sdUserInterfaceLocal, sdUITemplateFunctionInstance_Identifier > uiFunctionInstance_t;
private:
enum guiEvent_e {
GE_CONSTRUCTOR,
GE_ACTIVATE,
GE_DEACTIVATE,
GE_CREATE,
GE_NAMED,
GE_PROPCHANGED,
GE_CVARCHANGED,
GE_CANCEL,
GE_TOOLTIPEVENT,
GE_NUM_EVENTS
};
enum soundTestCommand_e {
STC_MIN = -1,
STC_START,
STC_STATUS_RECORDING,
STC_STATUS_PLAYBACK,
STC_STATUS_PERCENT,
STC_MAX
};
public:
enum voipCommand_e {
VOIPC_MIN = -1,
VOIPC_GLOBAL,
VOIPC_TEAM,
VOIPC_FIRETEAM,
VOIPC_DISABLE,
VOIPC_MAX
};
enum guiFlags_e {
GUI_FRONTEND = BITT< 0 >::VALUE, // receive time updates from the system, rather than the game
GUI_FULLSCREEN = BITT< 1 >::VALUE, // allow for aspect ratio corrections
GUI_SHOWCURSOR = BITT< 2 >::VALUE, // show mouse cursor
GUI_TOOLTIPS = BITT< 3 >::VALUE, // post onQueryTooltip events, display them in windowDef "tooltip"
GUI_INTERACTIVE = BITT< 4 >::VALUE, // allow player interaction
GUI_SCREENSAVER = BITT< 5 >::VALUE, // (in-world) - replaces normal GUI drawing with a simple image when the player is far away
GUI_CATCH_ALL_EVENTS = BITT< 6 >::VALUE, // capture all events, used to prevent keys from making it back to the game
GUI_NON_FOCUSED_MOUSE_EVENTS = BITT< 7 >::VALUE, // send mouse button events to windows that aren't focused
GUI_USE_MOUSE_PITCH = BITT< 8 >::VALUE, // negative m_pitch will cause mouse movement to invert as well
GUI_INHIBIT_GAME_WORLD = BITT< 9 >::VALUE, // the game view should not be drawn if this is set
};
sdUserInterfaceLocal( int _spawnId, bool _isUnique, bool _isPermanent, sdHudModule* _module );
virtual ~sdUserInterfaceLocal( void );
virtual void Draw( void );
virtual void OnInputInit( void );
virtual void OnInputShutdown( void );
virtual void OnLanguageInit( void );
virtual void OnLanguageShutdown( void );
void SetRenderCallback( const char* objectName, uiRenderCallback_t callback, uiRenderCallbackType_t type );
bool IsActive( void ) const { return flags.isActive; }
bool IsUnique( void ) const { return flags.isUnique; }
bool IsPermanent( void ) const { return flags.isPermanent; }
int GetSpawnId( void ) const { return spawnId; }
const char* GetName( void ) const { return guiDecl ? guiDecl->GetName(): "<INVALID>"; }
const sdDeclGUI* GetDecl() const { return guiDecl; }
virtual sdUIObject* GetWindow( const char* name );
virtual const sdUIObject* GetWindow( const char* name ) const;
sdUIWindow* GetDesktop() { return desktop; }
const sdUIWindow* GetDesktop() const { return desktop; }
virtual int GetNumWindows() { return windows.Num(); }
virtual sdUIObject* GetWindow( int index ) { return windows.FindIndex( index )->second; }
void OnSnapshotHitch( int delta );
void OnToolTipEvent( const char* arg );
virtual bool Load( const char* name );
void EndLevelLoad();
bool IsValidMaterial( uiMaterialCache_t::Iterator iter ) { return iter != materialCache.End(); }
sdUserInterfaceState& GetState( void ) { return scriptState; }
int AddExpression( sdUIExpression* expression ) { return scriptState.AddExpression( expression ); }
bool Translate( const idKey& key, sdKeyCommand** cmd );
bool TestGUIFlag( const int flag ) const { return ( idMath::Ftoi( scriptFlags ) & flag ) != 0; }
void SetGUIFlag( const int flag ) { scriptFlags = idMath::Ftoi( scriptFlags ) | flag; }
void ClearGUIFlag( const int flag ) { scriptFlags = idMath::Ftoi( scriptFlags ) & ~flag; }
bool FlagActivated( const float oldValue, const float newValue, const int flag ) const { return ( !( idMath::Ftoi( oldValue ) & flag ) && ( idMath::Ftoi( newValue ) & flag ) ); }
bool FlagDeactivated( const float oldValue, const float newValue, const int flag ) const { return ( ( idMath::Ftoi( oldValue ) & flag ) && !( idMath::Ftoi( newValue ) & flag ) ); }
bool FlagChanged( const float oldValue, const float newValue, const int flag ) const { return FlagActivated( oldValue, newValue, flag ) || FlagDeactivated( oldValue, newValue, flag ); }
sdIntProperty* AllocIntProperty( void ) { sdIntProperty* p = new sdIntProperty( -1 ); externalProperties.Alloc() = p; return p; }
sdFloatProperty* AllocFloatProperty( void ) { sdFloatProperty* p = new sdFloatProperty( 0.f ); externalProperties.Alloc() = p; return p; }
sdStringProperty* AllocStringProperty( void ) { sdStringProperty* p = new sdStringProperty(); externalProperties.Alloc() = p; return p; }
sdWStringProperty* AllocWStringProperty( void ) { sdWStringProperty* p = new sdWStringProperty(); externalProperties.Alloc() = p; return p; }
sdVec2Property* AllocVec2Property( void ) { sdVec2Property* p = new sdVec2Property( idVec2( 0.f, 0.f ) ); externalProperties.Alloc() = p; return p; }
sdVec3Property* AllocVec3Property( void ) { sdVec3Property* p = new sdVec3Property( idVec3( 0.f, 0.f, 0.f ) ); externalProperties.Alloc() = p; return p; }
sdVec4Property* AllocVec4Property( void ) { sdVec4Property* p = new sdVec4Property( idVec4( 0.f, 0.f, 0.f, 0.f ) ); externalProperties.Alloc() = p; return p; }
sdUIScript& GetScript( void ) { return script; }
virtual const sdDeclGUITheme* GetTheme() const { return theme; }
virtual void SetTheme( const char* theme );
void MakeLayoutDirty();
void Init();
virtual void Clear();
virtual void Activate( void );
virtual void Deactivate( bool forceDeactivate = false );
// in-game guis don't need to accumulate mouse movement deltas, since the player will constantly set the mouse position
void SetIgnoreLocalCursorUpdates( bool ignore ) {flags.ignoreLocalCursorUpdates = ignore; }
void SetCursor( const int x, const int y );
virtual void Update( void );
bool RunEvent( const sdUIEventInfo& info );
virtual bool PostEvent( const sdSysEvent* event );
bool PostNamedEvent( const char* event, bool allowMissing = false );
void RegisterTimelineWindow( sdUIObject* window );
bool NonGameGui( void ) { return TestGUIFlag( GUI_FRONTEND ); }
static void InitFunctions( void );
static void InitEvaluators( void );
static uiFunction_t* FindFunction( const char* name );
static void Shutdown( void );
void CreateEvents( const sdDeclGUI* guiDecl, idTokenCache& tokenCache );
void EnumerateEvents( const char* name, const idList<unsigned short>& flags, idList< sdUIEventInfo >& events, const idTokenCache& tokenCache );
sdUITimelineManager* GetTimelineManager() { return timelines.Get(); }
// Events
virtual int GetNumEvents( const sdUIEventHandle type ) { return events.Num( type ); }
virtual sdUIEventHandle GetEvent( const sdUIEventInfo& info ) const;
void AddEvent( const sdUIEventInfo& info, sdUIEventHandle scriptHandle );
virtual int GetFirstEventType() { return 0; }
virtual int GetNextEventType( int event ) { return ++event; }
virtual int GetMaxEventTypes( void ) { return GE_NUM_EVENTS; }
virtual const char* GetNameForEventId( int event ) const { return eventNames[ event ]; }
sdUIFunctionInstance* GetFunction( const char* name );
sdUIEvaluatorTypeBase* GetEvaluator( const char* name );
uiMaterialCache_t::Iterator SetCachedMaterial( const char* alias, const char* newMaterial, int& handle );
uiMaterialCache_t::Iterator FindCachedMaterial( const char* alias, int& handle );
uiMaterialCache_t::Iterator FindCachedMaterialForHandle( int handle );
static void SetupMaterialInfo( uiMaterialInfo_t& mi, int* baseWidth = NULL, int* baseHeight = NULL );
static void LookupPartSizes( uiDrawPart_t* parts, int num );
static int ParseMaterial( const char* mat, idStr& outMaterial, bool& globalLookup, bool& literal, uiDrawMode_e& mode );
void LookupMaterial( const char* materialName, uiMaterialInfo_t& mi, int* baseWidth = NULL, int* baseHeight = NULL );
void InitPartsForBaseMaterial( const char* material, uiCachedMaterial_t& cached );
void SetupPart( uiDrawPart_t& part, const char* partName, const char* material );
void EnumerateItemNodeForBank( idList< itemBankPair_t >& items, int slot, const sdDeclItemPackageNode& node, int packageIndex );
void EnumerateItemsForBank( idList< itemBankPair_t >& items, const char* className, int slot, int package );
void PopScriptVar( idStr& str ) { scriptStack.Pop( str ); }
void PopScriptVar( float& f ) { scriptStack.Pop( f ); }
void PopScriptVar( idVec4& v ) { scriptStack.Pop( v ); }
void PopScriptVar( idVec3& v ) { scriptStack.Pop( v ); }
void PopScriptVar( idVec2& v ) { scriptStack.Pop( v ); }
void PopScriptVar( int& i ) { scriptStack.Pop( i ); }
void PopScriptVar( bool& b ) { scriptStack.Pop( b ); }
void ClearScriptStack() { scriptStack.Clear(); }
bool IsScriptStackEmpty() const { return scriptStack.Empty(); }
void PushScriptVar( const idWStr& str ) { scriptStack.Push( str.c_str() ); }
void PushScriptVar( const idStr& str ) { scriptStack.Push( str ); }
void PushScriptVar( float f ) { scriptStack.Push( f ); }
void PushScriptVar( const idVec2& v ) { scriptStack.Push( v ); }
void PushScriptVar( const idVec4& v ) { scriptStack.Push( v ); }
void PushScriptVar( int i ) { scriptStack.Push( i ); }
// up to 16 strings can be pushed into each stack (see the definition of stringStack_t)
void GetGeneralScriptVar( const char* stackName, idStr& str );
void PopGeneralScriptVar( const char* stackName, idStr& str );
void PushGeneralScriptVar( const char* stackName, const char* str );
void ClearGeneralStrings( const char* stackName );
void Script_ConsoleCommand( sdUIFunctionStack& stack );
void Script_ConsoleCommandImmediate( sdUIFunctionStack& stack );
void Script_PostNamedEvent( sdUIFunctionStack& stack );
void Script_PostNamedEventOn( sdUIFunctionStack& stack );
void Script_PlaySound( sdUIFunctionStack& stack );
void Script_PlayGameSound( sdUIFunctionStack& stack );
void Script_PlayGameSoundDirectly( sdUIFunctionStack& stack );
void Script_PlayMusic( sdUIFunctionStack& stack );
void Script_StopMusic( sdUIFunctionStack& stack );
void Script_PlayVoice( sdUIFunctionStack& stack );
void Script_StopVoice( sdUIFunctionStack& stack );
void Script_QuerySpeakers( sdUIFunctionStack& stack );
void Script_FadeSoundClass( sdUIFunctionStack& stack );
void Script_Activate( sdUIFunctionStack& stack );
void Script_Deactivate( sdUIFunctionStack& stack );
void Script_SendNetworkCommand( sdUIFunctionStack& stack );
void Script_SendCommand( sdUIFunctionStack& stack );
void Script_ScriptCall( sdUIFunctionStack& stack );
// void Script_Resupply( sdUIFunctionStack& stack );
void Script_GetKeyBind( sdUIFunctionStack& stack );
void Script_GetParentName( sdUIFunctionStack& stack );
void Script_CacheMaterial( sdUIFunctionStack& stack );
void Script_CollapseColors( sdUIFunctionStack& stack );
void Script_PushString( sdUIFunctionStack& stack );
void Script_PushFloat( sdUIFunctionStack& stack );
void Script_PushVec2( sdUIFunctionStack& stack );
void Script_PushVec3( sdUIFunctionStack& stack );
void Script_PushVec4( sdUIFunctionStack& stack );
void Script_SetCookieString( sdUIFunctionStack& stack );
void Script_GetCookieString( sdUIFunctionStack& stack );
void Script_SetCookieInt( sdUIFunctionStack& stack );
void Script_GetCookieInt( sdUIFunctionStack& stack );
void Script_GetFloatResult( sdUIFunctionStack& stack );
void Script_GetVec2Result( sdUIFunctionStack& stack );
void Script_GetVec4Result( sdUIFunctionStack& stack );
void Script_GetStringResult( sdUIFunctionStack& stack );
void Script_GetWStringResult( sdUIFunctionStack& stack );
void Script_PushGeneralString( sdUIFunctionStack& stack );
void Script_PopGeneralString( sdUIFunctionStack& stack );
void Script_GetGeneralString( sdUIFunctionStack& stack );
void Script_GeneralStringAvailable( sdUIFunctionStack& stack );
void Script_ClearGeneralStrings( sdUIFunctionStack& stack );
void Script_Print( sdUIFunctionStack& stack );
void Script_ChatCommand( sdUIFunctionStack& stack );
void Script_GetStringForProperty( sdUIFunctionStack& stack );
void Script_SetPropertyFromString( sdUIFunctionStack& stack );
// only broadcast to immediate children
void Script_BroadcastEventToChildren( sdUIFunctionStack& stack );
// broadcast recursively to all children
void Script_BroadcastEventToDescendants( sdUIFunctionStack& stack );
void Script_BroadcastEvent( sdUIFunctionStack& stack );
void Script_GetCVar( sdUIFunctionStack& stack );
void Script_SetCVar( sdUIFunctionStack& stack );
void Script_ResetCVar( sdUIFunctionStack& stack );
void Script_GetCVarInt( sdUIFunctionStack& stack );
void Script_SetCVarInt( sdUIFunctionStack& stack );
void Script_GetCVarFloat( sdUIFunctionStack& stack );
void Script_SetCVarFloat( sdUIFunctionStack& stack );
void Script_GetCVarBool( sdUIFunctionStack& stack );
void Script_SetCVarBool( sdUIFunctionStack& stack );
void Script_GetCVarColor( sdUIFunctionStack& stack );
void Script_IsCVarLocked( sdUIFunctionStack& stack );
void Script_SetShaderParm( sdUIFunctionStack& stack );
void Script_GetWeaponBankForName( sdUIFunctionStack& stack );
void Script_GetWeaponData( sdUIFunctionStack& stack );
void Script_GetNumWeaponPackages( sdUIFunctionStack& stack );
void Script_GetRoleCountForTeam( sdUIFunctionStack& stack );
void Script_GetEquivalentClass( sdUIFunctionStack& stack );
void Script_GetStringMapValue( sdUIFunctionStack& stack );
void Script_GetPersistentRankInfo( sdUIFunctionStack& stack );
void Script_SetSpawnPoint( sdUIFunctionStack& stack );
void Script_HighlightSpawnPoint( sdUIFunctionStack& stack );
void Script_GetClassSkin( sdUIFunctionStack& stack );
void Script_MutePlayer( sdUIFunctionStack& stack );
void Script_MutePlayerQuickChat( sdUIFunctionStack& stack );
void Script_GetTeamPlayerCount( sdUIFunctionStack& stack );
void Script_UpdateLimboProficiency( sdUIFunctionStack& stack );
void Script_GetSpecatorList( sdUIFunctionStack& stack );
void Script_CopyHandle( sdUIFunctionStack& stack );
void Script_ActivateMenuSoundWorld( sdUIFunctionStack& stack );
void Script_ToggleReady( sdUIFunctionStack& stack );
void Script_ExecVote( sdUIFunctionStack& stack );
void Script_GetCommandMapTitle( sdUIFunctionStack& stack );
void Script_IsBackgroundLoadComplete( sdUIFunctionStack& stack );
void Script_CopyText( sdUIFunctionStack& stack );
void Script_PasteText( sdUIFunctionStack& stack );
void Script_UploadLevelShot( sdUIFunctionStack& stack );
void Script_GetGameTag( sdUIFunctionStack& stack );
void Script_SpectateClient( sdUIFunctionStack& stack );
void Script_GetLoadTip( sdUIFunctionStack& stack );
void Script_CancelToolTip( sdUIFunctionStack& stack );
void Script_CheckCVarsAgainstCFG( sdUIFunctionStack& stack );
void Script_OpenURL( sdUIFunctionStack& stack );
void Script_SoundTest( sdUIFunctionStack& stack );
void Script_DeleteFile( sdUIFunctionStack& stack );
void Script_VoiceChat( sdUIFunctionStack& stack );
void Script_RefreshSoundDevices( sdUIFunctionStack& stack );
void SetFocus( sdUIWindow* focus );
bool IsFocused( const sdUIObject* focus ) const { return focusedWindow == focus; }
void SetEntity( idEntity* entity ) { this->entity = entity; }
idEntity* GetEntity() const { return entity; }
float GetShaderParms( int idx ) { return shaderParms[idx-4]; }
bool GetUseLocalTime() const { return TestGUIFlag( GUI_FRONTEND ); }
void SetUseLocalTime( bool localTime ) { if( localTime ) {
SetGUIFlag( GUI_FRONTEND );
} else {
ClearGUIFlag( GUI_FRONTEND );
}
}
bool GetShouldUpdate() const { return flags.shouldUpdate; }
bool SetShouldUpdate( bool update ) { return flags.shouldUpdate = update; }
virtual void SetCurrentTime( int now ) { currentTime = now; }
virtual int GetCurrentTime() const { return currentTime; }
const char* GetMaterial( const char* key ) const;
const char* GetSound( const char* key ) const;
idVec4 GetColor( const char* key ) const;
void ApplyLatchedTheme();
bool IsInteractive() { return TestGUIFlag( GUI_INTERACTIVE ); }
void PushColor( const idVec4& color );
const idVec4& TopColor() const;
idVec4 PopColor();
static float Eval_Compare( const sdUIEvaluator* evaluator );
static float Eval_Icompare( const sdUIEvaluator* evaluator );
static float Eval_Wcompare( const sdUIEvaluator* evaluator );
static float Eval_Iwcompare( const sdUIEvaluator* evaluator );
static float Eval_Hcompare( const sdUIEvaluator* evaluator );
static idStr Eval_ToString( const sdUIEvaluator* evaluator );
static idWStr Eval_ToWString( const sdUIEvaluator* evaluator );
static float Eval_ToFloat( const sdUIEvaluator* evaluator );
static idWStr Eval_LocalizeArgs( const sdUIEvaluator* evaluator );
static idWStr Eval_FormatWString( const sdUIEvaluator* evaluator );
static idWStr Eval_LocalizeHandle( const sdUIEvaluator* evaluator );
static int Eval_Localize( const sdUIEvaluator* evaluator );
static float Eval_FAbs( const sdUIEvaluator* evaluator );
static float Eval_Square( const sdUIEvaluator* evaluator );
static float Eval_Vec2Length( const sdUIEvaluator* evaluator );
static idVec2 Eval_Vec2Normalize( const sdUIEvaluator* evaluator );
static float Eval_Clamp( const sdUIEvaluator* evaluator );
static float Eval_Min( const sdUIEvaluator* evaluator );
static float Eval_Max( const sdUIEvaluator* evaluator );
static idStr Eval_MSToHMS( const sdUIEvaluator* evaluator );
static idStr Eval_SToHMS( const sdUIEvaluator* evaluator );
static float Eval_Toggle( const sdUIEvaluator* evaluator );
static float Eval_Floor( const sdUIEvaluator* evaluator );
static float Eval_Ceil( const sdUIEvaluator* evaluator );
static idStr Eval_ToUpper( const sdUIEvaluator* evaluator );
static idStr Eval_ToLower( const sdUIEvaluator* evaluator );
static idWStr Eval_ToWStr( const sdUIEvaluator* evaluator );
static idStr Eval_ToStr( const sdUIEvaluator* evaluator );
static float Eval_IsValidHandle( const sdUIEvaluator* evaluator );
static int Eval_FloatToHandle( const sdUIEvaluator* evaluator );
static idVec4 Eval_Color( const sdUIEvaluator* evaluator );
static float Eval_StrLen( const sdUIEvaluator* evaluator );
static float Eval_WStrLen( const sdUIEvaluator* evaluator );
static float Eval_Sin( const sdUIEvaluator* evaluator );
static float Eval_Cos( const sdUIEvaluator* evaluator );
static idVec4 Eval_ColorForIndex( const sdUIEvaluator* evaluator );
static idVec4 Eval_StringToVec4( const sdUIEvaluator* evaluator );
sdHudModule* GetModule( void ) { return module; }
static idCVar g_debugGUIEvents;
static idCVar g_debugGUI;
static idCVar g_debugGUITextRect;
static idCVar g_debugGUITextScale;
static idCVar gui_tooltipDelay;
static idCVar gui_doubleClickTime;
static idCVar s_volumeMusic_dB;
static idCVar g_skipIntro;
static idCVar gui_invertMenuPitch;
static idCVar gui_crosshairDef;
static idCVar gui_crosshairKey;
static idCVar gui_crosshairAlpha;
static idCVar gui_crosshairSpreadAlpha;
static idCVar gui_crosshairStatsAlpha;
static idCVar gui_crosshairGrenadeAlpha;
static idCVar gui_crosshairSpreadScale;
static idCVar gui_crosshairColor;
static idCVar gui_chatAlpha;
static idCVar gui_fireTeamAlpha;
static idCVar gui_commandMapAlpha;
static idCVar gui_objectiveListAlpha;
static idCVar gui_personalBestsAlpha;
static idCVar gui_objectiveStatusAlpha;
static idCVar gui_obitAlpha;
static idCVar gui_voteAlpha;
static idCVar gui_tooltipAlpha;
static idCVar gui_vehicleAlpha;
static idCVar gui_vehicleDirectionAlpha;
static idCVar gui_showRespawnText;
static idStrList parseStack;
static void PushTrace( const char* info );
static void PrintStackTrace();
static void PopTrace();
private:
void DisconnectGlobalCallbacks() {
for( int i = 0; i < toDisconnect.Num(); i++ ) {
toDisconnect[ i ].first->RemoveOnChangeHandler( toDisconnect[ i ].second );
}
toDisconnect.Clear();
cvarCallbacks.DeleteContents( true );
}
sdUserInterfaceLocal( const sdUserInterfaceLocal& );
sdUserInterfaceLocal& operator=( const sdUserInterfaceLocal& );
void UpdateToolTip();
void CancelToolTip();
int NamedEventHandleForString( const char* name );
void OnCursorMaterialNameChanged( const idStr& oldValue, const idStr& newValue );
void OnPostProcessMaterialNameChanged( const idStr& oldValue, const idStr& newValue );
void OnScreenSaverMaterialNameChanged( const idStr& oldValue, const idStr& newValue );
void OnFocusedWindowNameChanged( const idStr& oldValue, const idStr& newValue );
void OnThemeNameChanged( const idStr& oldValue, const idStr& newValue );
void OnBindContextChanged( const idStr& oldValue, const idStr& newValue );
void OnScreenDimensionChanged( const idVec2& oldValue, const idVec2& newValue );
void OnStringPropertyChanged( int event, const idStr& oldValue, const idStr& newValue );
void OnWStringPropertyChanged( int event, const idWStr& oldValue, const idWStr& newValue );
void OnIntPropertyChanged( int event, const int oldValue, const int newValue );
void OnFloatPropertyChanged( int event, const float oldValue, const float newValue );
void OnVec4PropertyChanged( int event, const idVec4& oldValue, const idVec4& newValue );
void OnVec3PropertyChanged( int event, const idVec3& oldValue, const idVec3& newValue );
void OnVec2PropertyChanged( int event, const idVec2& oldValue, const idVec2& newValue );
void BroadcastEventToDescendants_r( sdUIObject* parent, const char* eventName );
void OnCVarChanged( idCVar& cvar, int id );
public:
SD_UI_PROPERTY_TAG(
title = "1. Behavior/Cursor Position";
desc = "Cursor position in GUI.";
editor = "edit";
datatype = "vec2";
)
sdVec2Property cursorPos;
// ===========================================
SD_UI_PROPERTY_TAG(
title = "1. Behavior/Screen Dimensions";
desc = "GUI screen dimensions";
editor = "edit";
datatype = "ved2";
readOnly = "true";
)
sdVec2Property screenDimensions;
// ===========================================
SD_UI_PROPERTY_TAG(
title = "1. Behavior/Screen Center";
desc = "GUI screen center";
editor = "edit";
datatype = "vec2";
readOnly = "true";
)
sdVec2Property screenCenter;
// ===========================================
SD_UI_PROPERTY_TAG(
title = "1. Behavior/Focused Window Name";
desc = "Window name of focused window";
editor = "edit";
datatype = "string";
alias = "focusedWindow";
)
sdStringProperty focusedWindowName;
// ===========================================
SD_UI_PROPERTY_TAG(
title = "3. Cursor/Cursor Material";
desc = "Name of the cursor material.";
editor = "edit";
datatype = "string";
alias = "cursorMaterial";
)
sdStringProperty cursorMaterialName;
// ===========================================
SD_UI_PROPERTY_TAG(
title = "3. Cursor/Cursor Size";
desc = "Width and height of the cursor (only used if Show Cursor is true).";
editor = "edit";
datatype = "vec2";
)
sdVec2Property cursorSize;
// ===========================================
SD_UI_PROPERTY_TAG(
title = "3. Cursor/Cursor Color";
desc = "Color of the cursor.";
editor = "edit";
option1 = "{editorComponents} {r,g,b,a}";
option2 = "{editorSeparator} {,}";
datatype = "vec4";
aliasdatatype = "color";
)
sdVec4Property cursorColor;
// ===========================================
SD_UI_PROPERTY_TAG(
title = "2. Drawing/Screensaver Material";
desc = "Name of the screensaver material.";
editor = "edit";
datatype = "string";
option1 = "{browseTable} {materials}";
)
sdStringProperty screenSaverName;
// ===========================================
SD_UI_PROPERTY_TAG(
title = "2. Drawing/Postprocess Material";
desc = "Name of the material to draw over the UI. Most-often used to disable bloom on in-game GUIs.";
editor = "edit";
datatype = "string";
option1 = "{browseTable} {materials}";
alias = "postProcessMaterial";
)
sdStringProperty postProcessMaterialName;
// ===========================================
SD_UI_PROPERTY_TAG(
title = "2. Drawing/Theme";
desc = "Name of the current theme";
editor = "edit";
datatype = "string";
alias = "theme";
)
sdStringProperty themeName;
// ===========================================
SD_UI_PROPERTY_TAG(
title = "1. Behavior/Flags";
desc = "Script behavior flags. See GUI_* flags.";
editor = "edit";
datatype = "float";
alias = "flags";
)
sdFloatProperty scriptFlags;
// ===========================================
SD_UI_PROPERTY_TAG(
title = "1. Behavior/Input scale";
desc = "Factor to scale mouse input";
editor = "edit";
datatype = "float";
alias = "flags";
)
sdFloatProperty inputScale;
// ===========================================
SD_UI_PROPERTY_TAG(
title = "1. Behavior/Bind Context Name";
desc = "Bind context name. Use a specific bind context for the GUI instead of the default bind context.";
editor = "edit";
datatype = "string";
alias = "bindContext";
)
sdStringProperty bindContextName;
// ===========================================
SD_UI_PROPERTY_TAG(
title = "1. Behavior/GUI Time";
desc = "Time in milliseconds.";
editor = "edit";
datatype = "float";
alias = "time";
readOnly = "true";
)
sdFloatProperty guiTime;
// ===========================================
SD_UI_PROPERTY_TAG(
title = "1. Behavior/Blank Wide String";
desc = "A blank wide string.";
editor = "edit";
datatype = "wstring";
readOnly = "true";
)
sdWStringProperty blankWStr;
// ===========================================
private:
typedef sdHashMapGeneric< idStr, sdUIObject*, sdHashCompareStrIcmp, sdHashGeneratorIHash > windowHash_t;
typedef sdPair< sdProperties::sdProperty*, sdProperties::CallbackHandle > callbackHandler_t;
typedef idStaticList< idStr, 16 > stringStack_t;
typedef sdHashMapGeneric< idStr, stringStack_t, sdHashCompareStrIcmp, sdHashGeneratorIHash > stackHash_t;
idList< callbackHandler_t > toDisconnect;
stackHash_t generalStacks; // general purpose stacks used by the UI script
sdUIFunctionStack scriptStack; // used for passing parameters between code, UI script, and game scripts
sdUIWindow* desktop;
sdUIObject* focusedWindow;
// Cursor management
const idMaterial* cursorMaterial;
const idMaterial* screenSaverMaterial;
const idMaterial* postProcessMaterial;
struct uiFlags_t {
bool isUnique : 1;
bool isActive : 1;
bool isPermanent : 1;
bool ignoreLocalCursorUpdates : 1;
bool shouldUpdate : 1;
};
int spawnId;
uiFlags_t flags;
const sdDeclGUI* guiDecl;
sdUserInterfaceState scriptState;
windowHash_t windows;
idListGranularityOne< sdUIObject* > timelineWindows;
sdUIEventTable events;
idList< sdProperties::sdPropertyValueBase* > externalProperties;
sdUIScript script;
sdAutoPtr< sdUITimelineManager > timelines;
static idHashMap< uiFunction_t* > uiFunctions;
static idList< sdUIEvaluatorTypeBase* > uiEvaluators;
sdBindContext* bindContext;
idStrList namedEvents;
idStaticList< float, MAX_ENTITY_SHADER_PARMS - 4 > shaderParms;
idEntityPtr< idEntity > entity;
sdHudModule* module;
int currentTime;
const sdDeclGUITheme* theme;
idStr latchedTheme;
// tooltips
sdUIWindow* toolTipWindow;
sdUIObject* toolTipSource;
int lastMouseMoveTime;
int nextAllowToolTipTime;
idVec2 tooltipAnchor;
typedef sdUICVarCallback< sdUserInterfaceLocal > cvarCallback_t;
friend class sdUICVarCallback< sdUserInterfaceLocal >;
idList< cvarCallback_t* > cvarCallbacks;
uiMaterialCache_t materialCache;
sdStack< idVec4 > colorStack;
idVec4 currentColor;
static idBlockAlloc< uiCachedMaterial_t, 64 > materialCacheAllocator;
static const char* partNames[ FP_MAX ];
private:
static const char* eventNames[ GE_NUM_EVENTS ];
static const int TOOLTIP_DELAY_MS;
static const int TOOLTIP_MOVE_TOLERANCE;
};
#endif // __GAME_GUIS_USERINTERFACELOCAL_H__