// 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(): ""; } 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& 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__