//=========== Copyright Valve Corporation, All rights reserved. ===============// // // Purpose: //=============================================================================// #ifndef IUIENGINE_H #define IUIENGINE_H #pragma once #include "tier0/platform.h" #if defined( SOURCE2_PANORAMA ) #include "tier0/platwindow.h" #endif #include "tier1/convar.h" #include "panorama.h" #include "./iuipanel.h" #include "utlsymbol.h" #include "panoramatypes.h" #include "iuilayoutmanager.h" #include "controls/panelhandle.h" #include "tier1/utllinkedlist.h" #include "tier1/utlstring.h" #include "tier1/utldelegate.h" #include "tier0/validator.h" #ifdef SOURCE_PANORAMA_FIXME #include "tier1/UtlSortVector.h" #else #include "tier1/utlsortvector.h" #endif #include "language.h" #include "panorama/layout/panel2dfactory.h" #include "iuistylefactory.h" #include "interface.h" #include "steam/isteamhttp.h" #include "iuifilesystem.h" #if !defined( SOURCE2_PANORAMA ) #include "audio/iaudiointerface.h" #include #endif #if _GNUC #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wshadow" #endif #if defined( SOURCE2_PANORAMA ) #include "../thirdparty/v8/include/v8.h" #else #include "tier0/memdbgoff.h" #include "../external/v8/include/v8.h" #include "tier0/memdbgon.h" #endif #if _GNUC #pragma GCC diagnostic pop #endif #ifdef SUPPORTS_AUDIO class IAudioOutputStream; #endif typedef uint64 GID_t; class KeyValues; #if !defined( SOURCE2_PANORAMA ) class IHTMLChromeController; #endif typedef CUtlDelegate< void( GID_t, KeyValues *, void * ) > JSONWebAPIDelegate_t; #if defined( SOURCE2_PANORAMA ) DECLARE_LOGGING_CHANNEL( LOG_PANORAMA ); DECLARE_LOGGING_CHANNEL( LOG_PANORAMA_SCRIPT ); #endif namespace v8 { class Isolate; } namespace panorama { // forward decl for engine components class CUIProtoBufMsgMemoryPoolMgr; class CUIRenderEngine; class IUIInput; class IUIEvent; class IUILocalization; class IUISoundSystem; class IUILayoutManager; class CMovieManager; class IUITextLayout; class IUISettings; class IUIWindow; class CPanelStyle; class IUIJSObject; typedef void * HAUDIOSAMPLE; class IUIEngineFrameListener { public: virtual void OnPreFrame() = 0; virtual void OnPostFrame() = 0; virtual void OnEngineShutdown() = 0; }; class CJSONWebAPIParams { public: struct WebAPIParam_t { CUtlString strParamName; CUtlString strParamValue; }; CJSONWebAPIParams() { } void AddParam( const char *pchParamName, const char *pchParamValue ) { int iVec = m_vecParams.AddToTail(); WebAPIParam_t ¶m = m_vecParams[iVec]; param.strParamName = pchParamName; param.strParamValue = pchParamValue; } CUtlVector *AccessParams() { return &m_vecParams; } private: CCopyableUtlVector< WebAPIParam_t > m_vecParams; }; typedef void (*PanoramaFrameFunc_t)(); typedef int JSGenericCallbackHandle_t; const JSGenericCallbackHandle_t JS_GENERIC_CALLBACK_HANDLE_INVALID = -1; struct RegisterJSScopeInfo_t { const char *pName; const char *pDescription; int nEntries; }; enum RegisterJSType_t : uint8 { k_ERegisterJSTypeUnknown, k_ERegisterJSTypeInvalid, k_ERegisterJSTypeVoid, k_ERegisterJSTypeBool, k_ERegisterJSTypeInt8, k_ERegisterJSTypeUint8, k_ERegisterJSTypeInt16, k_ERegisterJSTypeUint16, k_ERegisterJSTypeInt32, k_ERegisterJSTypeUint32, k_ERegisterJSTypeInt64, k_ERegisterJSTypeUint64, k_ERegisterJSTypeFloat, k_ERegisterJSTypeDouble, k_ERegisterJSTypeConstString, k_ERegisterJSTypePanoramaSymbol, k_ERegisterJSTypeRawV8Args, }; struct RegisterJSEntryInfo_t { enum { k_EGlobalFunction = 0x00000000, k_EMethod = 0x00000001, k_EAccessor = 0x00000002, k_EAccessorReadOnly = 0x00000003, k_EConstantValue = 0x00000004, k_EEntryTypeMask = 0x0000000f, }; const char *pName; const char *pDescription; uint32 unFlags; // Return or value type. RegisterJSType_t eDataType; // Prototype information may not be known. static const uint8 k_unNumParamsUnknown = 0xff; uint8 unNumParams; static const uint8 k_unMaxParams = 10; RegisterJSType_t pParamTypes[k_unMaxParams]; uint32 GetEntryType() const { return unFlags & k_EEntryTypeMask; } }; // // Interface that needs to be implemented for game engines on all platforms // class IUIEngine { public: enum ERenderTarget { // these assignments are important because they are cross-cast at the protobuf layer k_ERenderToWindow = 1, k_ERenderFullScreen = 2, k_ERenderBorderlessFullScreenWindow = 3, k_ERenderToOverlayTexture = 4, k_ERenderToOverlaySharedTexture = 5, k_ERenderToOverlaySteamWM = 6, k_ERenderToLegacyVR = 7, // This one is used for the Steam Client's main interface and will die eventually k_ERenderToOpenVROverlay = 8, k_ERenderTargetUnset = 0, }; enum EHapticFeedbackPosition { k_EHapticFeedbackPosition_Left, k_EHapticFeedbackPosition_Right, }; enum EHapticFeedbackStrength { k_EHapticFeedbackStrength_VeryLow, k_EHapticFeedbackStrength_Low, k_EHapticFeedbackStrength_Medium, k_EHapticFeedbackStrength_High, }; // return true if the states are different and a valid transition. Used to test fullscreen transition static bool BValidRenderStateChange( ERenderTarget eCurrentRenderTarget, ERenderTarget eRequestedRenderTarget ); static bool BIsRenderingToTexture( ERenderTarget eTarget ) { return (eTarget == k_ERenderToOverlayTexture || eTarget == k_ERenderToOverlaySharedTexture || eTarget == k_ERenderToOpenVROverlay ); } static bool BIsOverlayTarget( ERenderTarget eTarget ) { return (eTarget == IUIEngine::k_ERenderToOverlayTexture || eTarget == IUIEngine::k_ERenderToOverlaySharedTexture || eTarget == IUIEngine::k_ERenderToOverlaySteamWM); } static bool BIsRenderingToLegacyVR( ERenderTarget eTarget ) { return (eTarget == k_ERenderToLegacyVR); } static bool BIsRenderingToOpenVROverlay( ERenderTarget eTarget ) { return (eTarget == k_ERenderToOpenVROverlay); } static bool BIsRenderingToFullScreen( ERenderTarget eTarget ) { return (eTarget == k_ERenderFullScreen); } public: virtual ~IUIEngine() {} // Starts up subsystems and makes engine ready for use, you need to call RegisterNamedLocalPath() for at least the path first! #if defined( SOURCE2_PANORAMA ) virtual bool StartupSubsystems( IUISettings *psettings, PlatWindow_t hWindow ) = 0; #else virtual bool StartupSubsystems( IUISettings *psettings, IHTMLChromeController *pHTMLController ) = 0; #endif // Hookup convars virtual void ConCommandInit( IConCommandBaseAccessor *pAccessor ) = 0; // Shutdown virtual void Shutdown() = 0; virtual void RequestShutdown() = 0; // Run will run frames and block, letting the UI engine control the whole frame loop. virtual void Run() = 0; // Run frame will run a single frame, letting you wrap the UI engine in an external frame loop virtual void RunFrame() = 0; // Will set the UI engine to aggressively limit frame rate it runs at to avoid resource usage virtual void SetAggressiveFrameRateLimit( bool bLimit ) = 0; virtual bool BIsRunning() = 0; virtual bool BHasFocus() = 0; virtual double GetCurrentFrameTime() = 0; #if !defined( SOURCE2_PANORAMA ) virtual IUIWindow *CreateNewWindow( const char *pchWindowTitle, uint32 width, uint32 height, ERenderTarget eRenderType, bool bFixedSurfaceSize, bool bEnforceWindowAspectRatio, bool bUseCustomMouseCursor, const char *pchMonitorName ) = 0; virtual IUIWindow *CreateNewOverlayWindow( const char *pchWindowTitle, uint32 width, uint32 height, panorama::IUIEngine::ERenderTarget eTarget, bool bFixedSize, bool bDrawCustomMouseCursor ) = 0; virtual IUIWindow *CreateNewOpenVROverlayWindow( uint32 width, uint32 height, vr::VROverlayHandle_t ulOverlayHandle ) = 0; #else virtual IUIWindow *CreateNewUILayerWindow( uint32 xPos, uint32 yPos, uint32 width, uint32 height, bool bFixedSurfaceSize, bool bEnforceWindowAspectRatio, bool bUseCustomMouseCursor, bool bAcceptKBandMouse, const char *pName ) = 0; #endif virtual IUITextLayout *CreateTextLayout( const char *pchText, const char *pchFontName, float flSize, float flLineHeight, EFontWeight weight, EFontStyle style, ETextAlign align, bool bWrap, bool bEllipsis, int nLetterSpacing, float flMaxWidth, float flMaxHeight ) = 0; virtual IUITextLayout *CreateTextLayout( const wchar_t *pwchText, const char *pchFontName, float flSize, float flLineHeight, EFontWeight weight, EFontStyle style, ETextAlign align, bool bWrap, bool bEllipsis, int nLetterSpacing, float flMaxWidth, float flMaxHeight ) = 0; virtual void FreeTextLayout( IUITextLayout *pLayout ) = 0; virtual const CUtlSortVector< CUtlString > &GetSortedValidFontNames() = 0; virtual IUIInput *UIInputEngine() = 0; virtual IUILocalization *UILocalize() = 0; virtual IUISoundSystem *UISoundSystem() = 0; virtual IUISettings *UISettings() = 0; virtual IUILayoutManager *UILayoutManager() = 0; virtual IUIFileSystem *UIFileSystem() = 0; virtual void RegisterFrameFunc( PanoramaFrameFunc_t frameFunc ) = 0; virtual void ReloadLayoutFile( CPanoramaSymbol symPath ) = 0; virtual void ToggleDebugMode() = 0; virtual CUtlLinkedList &GetConsoleHistory() = 0; // panel management virtual IUIPanel * CreatePanel() = 0; virtual void PanelDestroyed( IUIPanel *pPanel, IUIPanel *pOldParent ) = 0; virtual bool IsValidPanelPointer( const IUIPanel *pPanel ) = 0; virtual PanelHandle_t GetPanelHandle( const IUIPanel *pPanel ) = 0; virtual IUIPanel *GetPanelPtr( const PanelHandle_t &handle ) = 0; virtual void CallBeforeStyleAndLayout( IUIPanel *pPanel ) = 0; // registration for panel destroyed typedef CUtlDelegate< void( const panorama::IUIPanel *, IUIPanel *pOldParent ) > PanelDestroyedDel_t; virtual void RegisterForPanelDestroyed( PanelDestroyedDel_t del ) = 0; virtual void UnregisterForPanelDestroyed( PanelDestroyedDel_t del ) = 0; // Event management virtual void RegisterEventHandler( CPanoramaSymbol symMsg, IUIPanel *pPanel, CUtlAbstractDelegate pFunc ) = 0; virtual void UnregisterEventHandler( CPanoramaSymbol symMsg, IUIPanel *pPanel, CUtlAbstractDelegate pFunc ) = 0; virtual void RegisterEventHandler( CPanoramaSymbol symMsg, IUIPanelClient *pPanel, CUtlAbstractDelegate pFunc ) = 0; virtual void UnregisterEventHandler( CPanoramaSymbol symMsg, IUIPanelClient *pPanel, CUtlAbstractDelegate pFunc ) = 0; virtual void UnregisterEventHandlersForPanel( IUIPanel *pPanel ) = 0; virtual void RegisterForUnhandledEvent( CPanoramaSymbol symMsg, CUtlAbstractDelegate pFunc ) = 0; virtual void UnregisterForUnhandledEvent( CPanoramaSymbol symMsg, CUtlAbstractDelegate pFunc ) = 0; virtual bool BHaveEventHandlersRegisteredForType( CPanoramaSymbol symPanelType ) = 0; virtual void RegisterPanelTypeEventHandler( CPanoramaSymbol symMsg, CPanoramaSymbol symPanelType, CUtlAbstractDelegate pFunc, bool bThisPtrIsUIPanel = false ) = 0; virtual bool DispatchEvent( IUIEvent *pEvent ) = 0; virtual void DispatchEventAsync( float flDelay, IUIEvent *pEvent ) = 0; virtual bool BAnyHandlerRegisteredForEvent( const CPanoramaSymbol &symEvent ) = 0; virtual CPanoramaSymbol GetLastDispatchedEventSymbol() = 0; virtual IUIPanel *GetLastDispatchedEventTargetPanel() = 0; // Event filtering virtual void RegisterEventFilter( CUtlAbstractDelegate pFunc ) = 0; virtual void UnregisterEventFilter( CUtlAbstractDelegate pFunc ) = 0; // Repaints all windows immediately, queuing for animation/render threads virtual void LayoutAndPaintWindows() = 0; // Get install path for the application virtual const char *GetApplicationInstallPath() = 0; // Get the userdata path for the application virtual const char *GetApplicationUserDataPath() = 0; // Register a named local path (executable-relative, readonly on POSIX) for resources, should be something like {images} or {movies} virtual void RegisterNamedLocalPath( const char *pathName, const char *pchLocalPath, bool bWatchForFileChanges, bool bAddToOverwriteIfExists = false ) = 0; // Register a named userdata path (userdata-relative, writable on POSIX) for local read/write storage like {config} virtual void RegisterNamedUserPath( const char *pathName, const char *pchUserPath, bool bWatchForFileChanges, bool bAddToOverwriteIfExists = false ) = 0; // Register the path to load custom vfont files from virtual void RegisterCustomFontPath( const char *pchFontPath ) = 0; // Get the local path for a named path like {images} or {movies} virtual const char *GetLocalPathForNamedPath( const char *pathName ) = 0; // Get the local path for a named path like {images} or {movies} combined with the relative pathname // and also following up the possible overwritten paths virtual void GetLocalPathForRelativePath( const char *pchLocalPathName, const char *pchRelativePathname, CUtlString &strLocalPath ) = 0; // Register for a named hostname in http:// paths like {steamcommunity} virtual void RegisterNamedRemoteHost( const char *hostName, const char*pchRemoteHost ) = 0; // Get the named host for a named remote host like {steamcommunity} virtual const char *GetRemoteHostForNamedHost( const char *hostName ) = 0; // Register an additional X-Header to be sent when requesting layout from the web virtual void RegisterXHeader( const char *pchHeaderName, const char *pchHeaderValue ) = 0; // Get the current count of registers X-Headers virtual int GetXHeaderCount() const = 0; // Get the name and value for the given indexed X-Header virtual void GetXHeader( int i, CUtlString &strName, CUtlString &strValue ) const = 0; // Set the cookie header to use for the named remote host virtual void SetCookieHeaderForNamedRemoteHost( const char *hostName, const CUtlVector &vecCookies ) = 0; // Sets the cookie header to use for the remote host (doesn't require named host use) virtual void SetCookieHeaderForRemoteHost( const char *hostName, const CUtlVector &vecCookies ) = 0; // Get the cookie header string that should be used for the remote host virtual const CUtlVector &GetCookieHeadersForNamedRemoteHost( const char *namedRemoteHost ) = 0; // Get the cookie header string that should be used for the remote host virtual const CUtlVector &GetCookieHeadersForRemoteHost( const char *hostName ) = 0; // Gets the value of a cookie. Returns false if the cookie does not exist. virtual bool GetCookieValueForRemoteHost( const char *hostName, const char *cookieName, CUtlString *pstrCookieValue ) = 0; #if defined( SOURCE2_PANORAMA ) || defined( PANORAMA_PUBLIC_STEAM_SDK ) virtual ISteamHTMLSurface *AccessHTMLController() = 0; #else virtual IHTMLChromeController *AccessHTMLController() = 0; #endif // native message box. Used usually for development. enum ENativeMessageBoxType_t { k_ENativeMessageOk = 1, k_ENativeMessageYesNo = 2 }; virtual bool ShowNativeTopMostMessageBox( const char *pchMsg, const char *pchTitle, ENativeMessageBoxType_t eType ) = 0; // Add a listener callback for pre/post frame events virtual void AddFrameListener( IUIEngineFrameListener *pListener ) = 0; // Remove a listener callback for pre/post frame events virtual void RemoveFrameListener( IUIEngineFrameListener *pListener ) = 0; // storage for mouse can activate info virtual void RegisterMouseCanActivateParent( IUIPanel *pPanel, const char *pchParent ) = 0; virtual void UnregisterMouseCanActivateParent( IUIPanel *pPanel ) = 0; virtual const char *GetMouseCanActivateParent( IUIPanel *pPanel ) = 0; // See if any window owned by the ui engine has focus virtual bool BAnyWindowHasFocus() = 0; // See if any window owned by the ui engine is visible and has focus, sometimes overlay windows have focus but are not visible // and you generally don't want to consider them as focused then virtual bool BAnyVisibleWindowHasFocus() = 0; // See if any overlay window owned by the ui engine has focus virtual bool BAnyOverlayWindowHasFocus() = 0; // Get the focused window, there should really be only one, if some bug allows multiple the first found is returned virtual IUIWindow *GetFocusedWindow() = 0; // Get the last time any input event happened across any of our windows virtual double GetLastInputTime() = 0; // Called internally from input layer to update last input time to current frame virtual void UpdateLastInputTime() = 0; // Clipboard access virtual void CopyToClipboard( const char *pchTextUTF8 ) = 0; virtual void GetClipboardText( CUtlString &strUTF8 ) = 0; // Input locale support virtual ELanguage GetDisplayLanguage() = 0; virtual ELanguage GetCurrentInputLocale() = 0; virtual bool BHaveInputLocale( ELanguage language ) = 0; virtual void SetInputLocale( ELanguage language ) = 0; // Overlay tracking virtual bool BHasOverlayForApp( uint64 gameID, uint64 ulPID ) = 0; virtual void TrackOverlayForApp( uint64 gameID, uint64 ulPID, void * pOverlay ) = 0; virtual void DeleteOverlayInstanceForApp( uint64 gameID, uint64 dwPID, void * pOverlay ) = 0; virtual void *OverlayForApp( uint64 gameID, uint64 ulPID ) = 0; // GPU Information virtual bool BGetGPUInformation( char *rgchGPUDesc, uint32 unGPUDescBytes, uint64 *pulDedicatedGPUMem, uint64 *pulDedicatedSystemMem, uint64 *pulSharedMem ) = 0; // Pool allocations for panel styles virtual IUIPanelStyle *AllocPanelStyle( IUIPanel *pStyle, float flUIScaleFactor ) = 0; virtual void FreePanelStyle( IUIPanelStyle *pPanel ) = 0; virtual void SetPanelWaitingAsyncDelete( IUIPanel *pPanel ) = 0; virtual bool BIsPanelWaitingAsyncDelete( IUIPanel *pPanel ) = 0; virtual void PulseActiveControllerHaptic( EHapticFeedbackPosition ePosition, EHapticFeedbackStrength eStrength ) = 0; virtual void MarkLayerToRepaintThreadSafe( uint64 ulCompositionLayerID ) = 0; virtual void AddDirectoryChangeWatch( const char *pchPath ) = 0; // Get how many lines to scroll for mouse wheel virtual uint32 GetWheelScrollLines() = 0; // Execute some javascript in the given panel context virtual void RunScript( IUIPanel *pPanelContext, const char *pchScriptString, const char *pchSourceFilename, int nSourceBeginLine, int nSourceBeginCol, bool bPrintRetValue ) = 0; // Expose a new object type/template to javascript with the given name, // the function pointer passed should setup member accssors/methods with the functions // from uijsregistration.h virtual void ExposeObjectTypeToJavaScript( const char *pchObjectTypeName, CUtlAbstractDelegate &del ) = 0; // Expose an instance of an object type as a global with specified name to javascript virtual void ExposeGlobalObjectToJavaScript( const char *pchJSVarName, void *pInstance, const char *pchJsTypeName, bool bTrueGlobal = false ) = 0; virtual void ClearGlobalObjectForJavaScript( const char *pchJSVarName, void *pInstance ) = 0; virtual void DeleteJSObjectInstance( IUIJSObject *pInstance ) = 0; // Get panel that contains the javascript context virtual panorama::IUIPanel *GetPanelForJavaScriptContext( v8::Context *pContext ) = 0; // Get javascript context for a panel (may be NULL) virtual v8::Persistent *GetJavaScriptContextForPanel( panorama::IUIPanel *pPanel ) = 0; // Helper to spew exceptions to console virtual void OutputJSExceptionToConsole( v8::TryCatch &try_catch, IUIPanel *pPanelContext ) = 0; // Add a function template to global namespace, by default this is really panorama., but you can specify to make it really global as well virtual void AddGlobalV8FunctionTemplate( const char *pchJSFuncName, v8::Handle< v8::FunctionTemplate > *pFunc, bool bTrueGlobal = false ) = 0; // Get global v8 context virtual v8::Persistent &GetV8GlobalContext() = 0; // Access the current object template we are setting up virtual v8::Handle GetCurrentV8ObjectTemplateToSetup() = 0; // Allow access to the proto buf msg memory pool virtual CUIProtoBufMsgMemoryPoolMgr *MsgMemoryPoolMgr() = 0; // Allow access to style factory interface virtual IUIStyleFactory *UIStyleFactory() = 0; // Various code that uses JS needs this virtual v8::Isolate * GetV8Isolate() = 0; // Create a V8 object to wrap a panel virtual v8::Persistent *CreateV8PanelInstance( IUIPanel *pPanel ) = 0; // Helper to create a JS object to wrap a given panel style virtual v8::Persistent *CreateV8PanelStyleInstance( IUIPanelStyle *pPanelStyle ) = 0; // Helper to create JS object for given js object type virtual v8::Persistent *CreateV8ObjectInstance( const char *pchObjectType, void *pActualObject, IUIJSObject *pJSObject ) = 0; // Create JSON web api job, use the helpers in uiwebapiclient.h directly instead, this is there for them to use internally virtual uint32 InitiateAsyncJSONWebAPIRequest( EHTTPMethod eMethod, CUtlString strURL, IUIPanel *pCallbackTargetPanel, void *pContext, CJSONWebAPIParams *pParams = NULL, HTTPCookieContainerHandle hCookieContainer = INVALID_HTTPCOOKIE_HANDLE ) = 0; // Create JSON web api job, use the helpers in uiwebapiclient.h directly instead, this is there for them to use internally virtual uint32 InitiateAsyncJSONWebAPIRequest( EHTTPMethod eMethod, CUtlString strURL, JSONWebAPIDelegate_t callback, void *pContext, CJSONWebAPIParams *pParams = NULL, HTTPCookieContainerHandle hCookieContainer = INVALID_HTTPCOOKIE_HANDLE ) = 0; // Cancel previously created web api request job virtual void CancelAsyncJSONWebAPIRequest( uint32 requestID ) = 0; // Resolves a path that may contain named path portions, etc, to a full local path virtual CUtlString ResolvePath( const char *pchPath ) = 0; // Used internally by initialization code to register events with framework virtual void RegisterEventWithEngine( CPanoramaSymbol symEvent, UIEventFactory factory ) = 0; // Check if a symbol is a valid event name virtual bool IsValidEventName( const CPanoramaSymbol symEvent ) = 0; // Check if a symbol is a valid panel event name virtual bool IsValidPanelEvent( const CPanoramaSymbol symEvent, int *pParams ) = 0; // Create input event from symbol, internal framework use virtual IUIEvent *CreateInputEventFromSymbol( CPanoramaSymbol symEvent, IUIPanel *pPanel, EPanelEventSource_t eSource, int nRepeats ) = 0; // Create an event from a string representation virtual IUIEvent *CreateEventFromString( IUIPanel *pCreatingPanel, const char *pchEvent, const char **pchEventEnd ) = 0; // Used internally by initialization code to register panels with framework virtual void RegisterPanelFactoryWithEngine( CPanoramaSymbol symPanelType, CPanel2DFactory *pFactory ) = 0; // Is the panel type registered virtual bool BRegisteredPanelType( CPanoramaSymbol symPanelType ) = 0; // Factory func for creating panels virtual IUIPanelClient *CreatePanel( CPanoramaSymbol symName, const char *pchID, panorama::IUIPanel *parent ) = 0; // Create debugger window virtual void CreateDebuggerWindow() = 0; // Close debugger window virtual void CloseDebuggerWindow() = 0; // Register any delegate to run at specified time, be sure to use CancelScheduledDelgate if you delete the object the delgate runs on, etc. virtual int RegisterScheduledDelegate( double flTargetFrameTime, CUtlDelegate< void() > del ) = 0; // Cancel a scheduled delegate by index returned from RegisterScheduledDelegate virtual void CancelScheduledDelegate( int iScheduleIndex ) = 0; // Return the last frame time for which we already ran scheduled delegates virtual double GetLastScheduledDelegateRunTime() = 0; // CPanoramaSymbol support for cross DLL symbols virtual UtlSymId_t MakeSymbol( const char *pchText ) = 0; // CPanoramaSymbol support for cross DLL symbols virtual const char * ResolveSymbol( const UtlSymId_t sym ) = 0; // Interface to allow animation/render threads to queue a decrement of a ref count on an object next frame in the main thread virtual void QueueDecrementRefNextFrame( CRefCount *pRefCountObj ) = 0; // Register a V8 callback function associated with a given UI panel virtual JSGenericCallbackHandle_t RegisterJSGenericCallback( panorama::IUIPanel *pContextPanel, v8::Handle< v8::Function > callbackFunc ) = 0; // Invoke a callback previously registered with the system. Returns false if the handle has expired (the context panel is gone, or it was explicitly unregistered) virtual bool InvokeJSGenericCallback( JSGenericCallbackHandle_t nHandle, int nArgs = 0, v8::Handle< v8::Value > *pArgs = NULL, v8::Handle< v8::Value > *pOutRetVal = NULL ) = 0; // Explicitly remove the callback from the system (future invokes on the handle will do nothing and return false) virtual void UnregisterJSGenericCallback( JSGenericCallbackHandle_t nHandle ) = 0; // Return the number of scopes, such as classes, that JS functions // have been registered in. virtual int GetNumRegisterJSScopes() = 0; // Return information on a JS registration scope. virtual void GetRegisterJSScopeInfo( int nScope, RegisterJSScopeInfo_t *pInfo ) = 0; // Return information on a specific entry in a JS registration scope, // such as a method in a class scope. virtual void GetRegisterJSEntryInfo( int nScope, int nEntry, RegisterJSEntryInfo_t *pInfo ) = 0; // Open a new scope for JS registrations. virtual int StartRegisterJSScope( const char *pName, const char *pDesc = NULL ) = 0; // Close current JS registration scope. virtual void EndRegisterJSScope() = 0; // If there is a current JS registration scope allocate a new entry // and fill it out. If there is no scope, which is possible as // recording registration info is only enabled in certain places, // this will return -1. virtual int NewRegisterJSEntry( const char *pName, uint32 unFlags, const char *pDesc = NULL, RegisterJSType_t eDataType = k_ERegisterJSTypeUnknown ) = 0; // If there is a current JS registration entry set the parameter // type information in it. Silently ignores -1 entry indices // so this can be called safely when there is no scope. virtual void SetRegisterJSEntryParams( int nEntry, uint8 unNumParams, RegisterJSType_t *pParamTypes ) = 0; // Invalidate cached copies of all layout/style/script files (used eg. by the game when search paths change) // (Does NOT rebuild or reload any existing UI, just causes subsequent references to the files to load from scratch.) virtual void ClearFileCache() = 0; // Spew the current list of all cached files and their refcounts (for debugging) virtual void PrintCacheStatus() = 0; // get a list of all the windows owned by the engine virtual void GetWindowsForDebugger( CUtlVector &vecWindows ) = 0; // Turn on paint count tracking for panels virtual void SetPaintCountTrackingEnabled( bool bEnablePaintCountTracking ) = 0; // Is paint count tracking on for panels virtual bool GetPaintCountTrackingEnabled() = 0; // Increment paint count tracking for panels virtual void IncrementPaintCountForPanel( uint64 ulPanelPtrValue, bool bRequiredCompositionLayer, double flFrameTime ) = 0; // Get panel paint info for the panel virtual void GetPanelPaintInfo( uint64 ulPanelPtrValue, uint32 &unPaintCount, bool &bRequiredCompositionLayer, double &flFrameTimeLastPaint ) = 0; // Returns whether any windows exist for the UI engine virtual bool BHasAnyWindows() = 0; #ifdef DBGFLAG_VALIDATE // Memory validation related interfaces virtual bool PrepareForValidate() = 0; virtual bool ResumeFromValidate() = 0; virtual void Validate( CValidator &validator, const tchar *pchName ) = 0; #endif #if defined( SOURCE2_PANORAMA ) virtual void TextEntryFocusChange( IUIPanel *pPanel ) = 0; virtual void TextEntryInvalid( IUIPanel *pPanel ) = 0; #endif }; //----------------------------------------------------------------------------- // Purpose: Helper for render state transitions, returns true if a state // change is being requested, and it is valid. Helper for fullscreen switching. //----------------------------------------------------------------------------- inline bool IUIEngine::BValidRenderStateChange( ERenderTarget eCurrentRenderTarget, ERenderTarget eRequestedRenderTarget ) { if( eCurrentRenderTarget == eRequestedRenderTarget ) return false; // if we are in a mode that can switch... if( eCurrentRenderTarget == IUIEngine::k_ERenderFullScreen || eCurrentRenderTarget == IUIEngine::k_ERenderToWindow ) { switch( eRequestedRenderTarget ) // test if request is for a state that can be switched to { case IUIEngine::k_ERenderFullScreen: case IUIEngine::k_ERenderToWindow: return true; // we can change default: return false; // not so much } } // render to texture toggled shared vs copied texture if( BIsRenderingToTexture( eCurrentRenderTarget ) && BIsRenderingToTexture( eRequestedRenderTarget ) && (eCurrentRenderTarget != eRequestedRenderTarget) ) { return true; } return false; } #ifndef PANORAMA_EXPORTS extern IUIEngine *g_pUIEngineSingleton; extern CSysModule *g_PanoramaModule; inline IUIEngine *UIEngine() { return g_pUIEngineSingleton; } inline IUILocalization *UILocalize() { return UIEngine()->UILocalize(); } inline IUISoundSystem *UISoundSystem() { return UIEngine()->UISoundSystem(); } inline IUIInput *UIInputEngine() { return UIEngine() ? UIEngine()->UIInputEngine() : NULL; } #else IUIEngine *UIEngine(); IUILocalization *UILocalize(); IUIInput *UIInputEngine(); IUISoundSystem *UISoundSystem(); #endif #ifdef DBGFLAG_VALIDATE PANORAMA_INTERFACE void ValidateStaticsInternal( CValidator &validator ); #endif PANORAMA_INTERFACE IUIEngine *CreatePanoramaUIEngineInternal(); extern void RegisterEventTypesWithEngine( IUIEngine *pEngine ); #ifndef PANORAMA_EXPORTS extern bool LoadPanoramaModule( const char *pchPanoramaModulePath ); extern void UnloadPanoramaModule(); extern IUIEngine *CreatePanoramaUIEngine(); extern void ConnectPanoramaUIEngine( IUIEngine * ); extern void ShutdownPanoramaUIEngine( IUIEngine * ); #ifdef DBGFLAG_VALIDATE extern void ValidateStatics( CValidator &validator ); #endif #endif // To expose a generic object via UIEngine()->ExposeObjectTypeToJavaScript() you should derive from this interface // the GetTypeName member should return the same type name you register as exposed class IUIJSObject { public: ~IUIJSObject() { UIEngine()->DeleteJSObjectInstance( this ); } virtual const char *GetJSTypeName() = 0; }; } // namespace panorama #endif // IUIENGINE_H