/* * Copyright (c) Contributors to the Open 3D Engine Project. * For complete copyright and license terms please see the LICENSE at the root of this distribution. * * SPDX-License-Identifier: Apache-2.0 OR MIT * */ #pragma once #ifdef CRYSYSTEM_EXPORTS #define CRYSYSTEM_API DLL_EXPORT #else #define CRYSYSTEM_API DLL_IMPORT #endif #include #include "CryAssert.h" #include #if defined(AZ_RESTRICTED_PLATFORM) #undef AZ_RESTRICTED_SECTION #define ISYSTEM_H_SECTION_1 1 #define ISYSTEM_H_SECTION_2 2 #define ISYSTEM_H_SECTION_3 3 #define ISYSTEM_H_SECTION_4 4 #define ISYSTEM_H_SECTION_5 5 #endif //////////////////////////////////////////////////////////////////////////////////////////////// // Forward declarations //////////////////////////////////////////////////////////////////////////////////////////////// #include // <> required for Interfuscator #include // <> required for Interfuscator #include "CryVersion.h" #include "smartptr.h" #include // shared_ptr #include struct ISystem; struct ILog; namespace AZ::IO { struct IArchive; } struct IConsole; struct IRemoteConsole; struct IRenderer; struct ICryFont; struct IMovieSystem; namespace Audio { struct IAudioSystem; } // namespace Audio struct SFileVersion; struct INameTable; struct ILevelSystem; class IXMLBinarySerializer; struct IAVI_Reader; class CPNoise3; struct ILocalizationManager; struct IOutputPrintSink; struct IWindowMessageHandler; namespace AZ { namespace IO { class FileIOBase; } } typedef void* WIN_HWND; struct CLoadingTimeProfiler; class ICmdLine; class ILyShine; enum EValidatorModule : int; enum EValidatorSeverity : int; enum ESystemUpdateFlags { // Summary: // Special update mode for editor. ESYSUPDATE_EDITOR = 0x0004 }; // Description: // Configuration platform. Autodetected at start, can be modified through the editor. enum ESystemConfigPlatform { CONFIG_INVALID_PLATFORM = 0, CONFIG_PC = 1, CONFIG_MAC = 2, CONFIG_OSX_METAL = 3, CONFIG_ANDROID = 4, CONFIG_IOS = 5, CONFIG_PROVO = 7, CONFIG_SALEM = 8, CONFIG_JASPER = 9, END_CONFIG_PLATFORM_ENUM, // MUST BE LAST VALUE. USED FOR ERROR CHECKING. }; enum ESystemGlobalState { ESYSTEM_GLOBAL_STATE_UNKNOWN, ESYSTEM_GLOBAL_STATE_INIT, ESYSTEM_GLOBAL_STATE_RUNNING, ESYSTEM_GLOBAL_STATE_LEVEL_LOAD_START_PREPARE, ESYSTEM_GLOBAL_STATE_LEVEL_LOAD_START, ESYSTEM_GLOBAL_STATE_LEVEL_LOAD_START_MATERIALS, ESYSTEM_GLOBAL_STATE_LEVEL_LOAD_START_OBJECTS, ESYSTEM_GLOBAL_STATE_LEVEL_LOAD_START_STATIC_WORLD, ESYSTEM_GLOBAL_STATE_LEVEL_LOAD_START_PRECACHE, ESYSTEM_GLOBAL_STATE_LEVEL_LOAD_START_TEXTURES, ESYSTEM_GLOBAL_STATE_LEVEL_LOAD_END, ESYSTEM_GLOBAL_STATE_LEVEL_LOAD_COMPLETE }; // Summary: // System wide events. enum ESystemEvent { // Description: // Seeds all random number generators to the same seed number, WParam will hold seed value. //##@{ ESYSTEM_EVENT_RANDOM_SEED = 1, ESYSTEM_EVENT_RANDOM_ENABLE, ESYSTEM_EVENT_RANDOM_DISABLE, //##@} // Description: // Changes to main window focus. // wparam is not 0 is focused, 0 if not focused ESYSTEM_EVENT_CHANGE_FOCUS = 10, // Description: // Moves of the main window. // wparam=x, lparam=y ESYSTEM_EVENT_MOVE = 11, // Description: // Resizes of the main window. // wparam=width, lparam=height ESYSTEM_EVENT_RESIZE = 12, // Description: // Activation of the main window. // wparam=1/0, 1=active 0=inactive ESYSTEM_EVENT_ACTIVATE = 13, // Description: // Main window position changed. ESYSTEM_EVENT_POS_CHANGED = 14, // Description: // Main window style changed. ESYSTEM_EVENT_STYLE_CHANGED = 15, // Description: // Sent before the loading movie is begun ESYSTEM_EVENT_LEVEL_LOAD_START_PRELOADINGSCREEN, // Description: // Sent before the loading last save ESYSTEM_EVENT_LEVEL_LOAD_RESUME_GAME, // Description: // Sent before starting level, before game rules initialization and before ESYSTEM_EVENT_LEVEL_LOAD_START event // Used mostly for level loading profiling ESYSTEM_EVENT_LEVEL_LOAD_PREPARE, // Description: // Sent to start the active loading screen rendering. ESYSTEM_EVENT_LEVEL_LOAD_START_LOADINGSCREEN, // Description: // Sent when loading screen is active ESYSTEM_EVENT_LEVEL_LOAD_LOADINGSCREEN_ACTIVE, // Description: // Sent before starting loading a new level. // Used for a more efficient resource management. ESYSTEM_EVENT_LEVEL_LOAD_START, // Description: // Sent after loading a level finished. // Used for a more efficient resource management. ESYSTEM_EVENT_LEVEL_LOAD_END, // Description: // Sent after trying to load a level failed. // Used for resetting the front end. ESYSTEM_EVENT_LEVEL_LOAD_ERROR, // Description: // Sent in case the level was requested to load, but it's not ready // Used in streaming install scenario for notifying the front end. ESYSTEM_EVENT_LEVEL_NOT_READY, // Description: // Sent after precaching of the streaming system has been done ESYSTEM_EVENT_LEVEL_PRECACHE_START, // Description: // Sent before object/texture precache stream requests are submitted ESYSTEM_EVENT_LEVEL_PRECACHE_FIRST_FRAME, // Description: // Sent when level loading is completely finished with no more onscreen // movie or info rendering, and when actual gameplay can start ESYSTEM_EVENT_LEVEL_GAMEPLAY_START, // Level is unloading. ESYSTEM_EVENT_LEVEL_UNLOAD, // Summary: // Sent after level have been unloaded. For cleanup code. ESYSTEM_EVENT_LEVEL_POST_UNLOAD, // Summary: // Called when the game framework has been initialized. ESYSTEM_EVENT_GAME_POST_INIT, // Summary: // Called when the game framework has been initialized, not loading should happen in this event. ESYSTEM_EVENT_GAME_POST_INIT_DONE, // Summary: // Sent when the system is doing a full shutdown. ESYSTEM_EVENT_FULL_SHUTDOWN, // Summary: // Sent when the system is doing a fast shutdown. ESYSTEM_EVENT_FAST_SHUTDOWN, // Summary: // When keyboard layout changed. ESYSTEM_EVENT_LANGUAGE_CHANGE, // Description: // Toggled fullscreen. // wparam is 1 means we switched to fullscreen, 0 if for windowed ESYSTEM_EVENT_TOGGLE_FULLSCREEN, ESYSTEM_EVENT_SHARE_SHADER_COMBINATIONS, // Summary: // Start 3D post rendering ESYSTEM_EVENT_3D_POST_RENDERING_START, // Summary: // End 3D post rendering ESYSTEM_EVENT_3D_POST_RENDERING_END, // Summary: // Called before switching to level memory heap ESYSTEM_EVENT_SWITCHING_TO_LEVEL_HEAP_DEPRECATED, // Summary: // Called after switching to level memory heap ESYSTEM_EVENT_SWITCHED_TO_LEVEL_HEAP_DEPRECATED, // Summary: // Called before switching to global memory heap ESYSTEM_EVENT_SWITCHING_TO_GLOBAL_HEAP_DEPRECATED, // Summary: // Called after switching to global memory heap ESYSTEM_EVENT_SWITCHED_TO_GLOBAL_HEAP_DEPRECATED, // Description: // Sent after precaching of the streaming system has been done ESYSTEM_EVENT_LEVEL_PRECACHE_END, // Description: // Sent when game mode switch begins ESYSTEM_EVENT_GAME_MODE_SWITCH_START, // Description: // Sent when game mode switch ends ESYSTEM_EVENT_GAME_MODE_SWITCH_END, // Description: // Video notifications // wparam=[0/1/2/3] : [stop/play/pause/resume] ESYSTEM_EVENT_VIDEO, // Description: // Sent if the game is paused ESYSTEM_EVENT_GAME_PAUSED, // Description: // Sent if the game is resumed ESYSTEM_EVENT_GAME_RESUMED, // Description: // Sent when time of day is set ESYSTEM_EVENT_TIME_OF_DAY_SET, // Description: // Sent once the Editor finished initialization. ESYSTEM_EVENT_EDITOR_ON_INIT, // Description: // Sent when frontend is initialised ESYSTEM_EVENT_FRONTEND_INITIALISED, // Description: // Sent once the Editor switches between in-game and editing mode. ESYSTEM_EVENT_EDITOR_GAME_MODE_CHANGED, // Description: // Sent once the Editor switches simulation mode (AI/Physics). ESYSTEM_EVENT_EDITOR_SIMULATION_MODE_CHANGED, // Description: // Sent when frontend is reloaded ESYSTEM_EVENT_FRONTEND_RELOADED, #if defined(AZ_RESTRICTED_PLATFORM) #define AZ_RESTRICTED_SECTION ISYSTEM_H_SECTION_1 #include AZ_RESTRICTED_FILE(ISystem_h) #endif #if defined(AZ_RESTRICTED_PLATFORM) #define AZ_RESTRICTED_SECTION ISYSTEM_H_SECTION_2 #include AZ_RESTRICTED_FILE(ISystem_h) #endif ESYSTEM_EVENT_STREAMING_INSTALL_ERROR, // Description: // Sent when the online services are initialized. ESYSTEM_EVENT_ONLINE_SERVICES_INITIALISED, // Description: // Sent when a new audio implementation is loaded ESYSTEM_EVENT_AUDIO_IMPLEMENTATION_LOADED, // Description: // Sent when simulation mode switch begins ESYSTEM_EVENT_EDITOR_SIMULATION_MODE_SWITCH_START, // Description: // Sent when simluation mode switch ends ESYSTEM_EVENT_EDITOR_SIMULATION_MODE_SWITCH_END, ESYSTEM_EVENT_USER = 0x1000, ESYSTEM_BEAM_PLAYER_TO_CAMERA_POS }; // Description: // User defined callback, which can be passed to ISystem. struct ISystemUserCallback { // virtual ~ISystemUserCallback() {} // Description: // This method is called at the earliest point the ISystem pointer can be used // the log might not be yet there. virtual void OnSystemConnect([[maybe_unused]] ISystem* pSystem) {} // Summary: // Signals to User that engine error occurred. // Return Value: // True to Halt execution or false to ignore this error virtual bool OnError(const char* szErrorString) = 0; // Notes: // If working in Editor environment notify user that engine want to Save current document. // This happens if critical error have occurred and engine gives a user way to save data and not lose it // due to crash. virtual bool OnSaveDocument() = 0; // Notes: // If working in Editor environment and a critical error occurs notify the user to backup // the current document to prevent data loss due to crash. virtual bool OnBackupDocument() = 0; // Description: // Notifies user that system wants to switch out of current process. // Example: // Called when pressing ESC in game mode to go to Menu. virtual void OnProcessSwitch() = 0; // Description: // Notifies user, usually editor, about initialization progress in system. virtual void OnInitProgress(const char* sProgressMsg) = 0; // Description: // Initialization callback. This is called early in CSystem::Init(), before // any of the other callback methods is called. // See also: // CSystem::Init() virtual void OnInit(ISystem*) { } // Summary: // Shutdown callback. virtual void OnShutdown() { } // Summary: // Quit callback. // See also: // CSystem::Quit() virtual void OnQuit() { } // Description: // Notify user of an update iteration. Called in the update loop. virtual void OnUpdate() { } // Description: // Show message by provider. virtual void ShowMessage(const char* text, const char* caption, unsigned int uType) { CryMessageBox(text, caption, uType); } // // Post console load, for cvar setting virtual void OnConsoleCreated([[maybe_unused]] ::IConsole* pConsole) {} }; // Description: // Interface used for getting notified when a system event occurs. struct ISystemEventListener { // virtual ~ISystemEventListener() {} virtual void OnSystemEventAnyThread([[maybe_unused]] ESystemEvent event, [[maybe_unused]] UINT_PTR wparam, [[maybe_unused]] UINT_PTR lparam) {} virtual void OnSystemEvent([[maybe_unused]] ESystemEvent event, [[maybe_unused]] UINT_PTR wparam, [[maybe_unused]] UINT_PTR lparam) { } // }; // Description: // Structure used for getting notified when a system event occurs. struct ISystemEventDispatcher { // virtual ~ISystemEventDispatcher() {} virtual bool RegisterListener(ISystemEventListener* pListener) = 0; virtual bool RemoveListener(ISystemEventListener* pListener) = 0; virtual void OnSystemEvent(ESystemEvent event, UINT_PTR wparam, UINT_PTR lparam) = 0; virtual void Update() = 0; //virtual void OnLocaleChange() = 0; // }; struct IErrorObserver { // virtual ~IErrorObserver() {} virtual void OnAssert(const char* condition, const char* message, const char* fileName, unsigned int fileLineNumber) = 0; virtual void OnFatalError(const char* message) = 0; // }; #if defined(AZ_RESTRICTED_PLATFORM) #define AZ_RESTRICTED_SECTION ISYSTEM_H_SECTION_3 #include AZ_RESTRICTED_FILE(ISystem_h) #endif namespace AZ { namespace Internal { class EnvironmentInterface; } // namespace Internal } // namespace AZ typedef AZ::Internal::EnvironmentInterface SharedEnvironmentInstance; // Description: // Structure passed to Init method of ISystem interface. struct SSystemInitParams { void* hInstance; // void* hWnd; // ILog* pLog; // You can specify your own ILog to be used by System. ILogCallback* pLogCallback; // You can specify your own ILogCallback to be added on log creation (used by Editor). ISystemUserCallback* pUserCallback; const char* sLogFileName; // File name to use for log. bool autoBackupLogs; // if true, logs will be automatically backed up each startup IOutputPrintSink* pPrintSync; // Print Sync which can be used to catch all output from engine char szSystemCmdLine[2048]; // Command line. bool bEditor; // When running in Editor mode. bool bPreview; // When running in Preview mode (Minimal initialization). bool bTestMode; // When running in Automated testing mode. bool bDedicatedServer; // When running a dedicated server. bool bSkipConsole; // Don't create console bool bUnattendedMode; // When running as part of a build on build-machines: Prevent popping up of any dialog bool bSkipMovie; // Don't load movie bool bToolMode; // System is running inside a tool. Will not create USER directory or anything else that the game needs to do ISystem* pSystem; // Pointer to existing ISystem interface, it will be reused if not NULL. SharedEnvironmentInstance* pSharedEnvironment; // Summary: // Initialization defaults. SSystemInitParams() { hInstance = NULL; hWnd = NULL; pLog = NULL; pLogCallback = NULL; pUserCallback = NULL; sLogFileName = NULL; autoBackupLogs = true; pPrintSync = NULL; memset(szSystemCmdLine, 0, sizeof(szSystemCmdLine)); bEditor = false; bPreview = false; bTestMode = false; bDedicatedServer = false; bSkipConsole = false; bUnattendedMode = false; bSkipMovie = false; bToolMode = false; pSystem = NULL; pSharedEnvironment = nullptr; } }; // Notes: // Can be used for LoadConfiguration(). // See also: // LoadConfiguration() struct ILoadConfigurationEntrySink { // virtual ~ILoadConfigurationEntrySink() {} virtual void OnLoadConfigurationEntry(const char* szKey, const char* szValue, const char* szGroup) = 0; virtual void OnLoadConfigurationEntry_End() {} // }; struct SPlatformInfo { unsigned int numCoresAvailableToProcess; unsigned int numLogicalProcessors; #if defined(WIN32) || defined(WIN64) enum EWinVersion { WinUndetected, Win2000, WinXP, WinSrv2003, WinVista, Win7, Win8, Win81, Win10 }; EWinVersion winVer; bool win64Bit; bool vistaKB940105Required; #endif }; // Description: // Holds info about system update stats over perior of time (cvar-tweakable) struct SSystemUpdateStats { SSystemUpdateStats() : avgUpdateTime(0.0f) , minUpdateTime(0.0f) , maxUpdateTime(0.0f) {} float avgUpdateTime; float minUpdateTime; float maxUpdateTime; }; // Description: // Global environment. // Contains pointers to all global often needed interfaces. // This is a faster way to get interface pointer then calling ISystem interface to retrieve one. // Notes: // Some pointers can be NULL, use with care. // See also: // ISystem struct SSystemGlobalEnvironment { AZ::IO::IArchive* pCryPak; AZ::IO::FileIOBase* pFileIO; ICryFont* pCryFont; ::IConsole* pConsole; ISystem* pSystem = nullptr; ILog* pLog; IMovieSystem* pMovieSystem; SharedEnvironmentInstance* pSharedEnvironment; #if defined(AZ_RESTRICTED_PLATFORM) #define AZ_RESTRICTED_SECTION ISYSTEM_H_SECTION_4 #include AZ_RESTRICTED_FILE(ISystem_h) #endif threadID mMainThreadId; //The main thread ID is used in multiple systems so should be stored globally ////////////////////////////////////////////////////////////////////////// // Used by CRY_ASSERT bool bIgnoreAllAsserts; bool bNoAssertDialog; ////////////////////////////////////////////////////////////////////////// bool bToolMode; int retCode = 0; ILINE const bool IsDedicated() const { #if defined(CONSOLE) return false; #else return bDedicated; #endif } #if !defined(CONSOLE) ILINE void SetIsEditor(bool isEditor) { bEditor = isEditor; } ILINE void SetIsEditorGameMode(bool isEditorGameMode) { bEditorGameMode = isEditorGameMode; } ILINE void SetIsEditorSimulationMode(bool isEditorSimulationMode) { bEditorSimulationMode = isEditorSimulationMode; } ILINE void SetIsDedicated(bool isDedicated) { bDedicated = isDedicated; } #endif //this way the compiler can strip out code for consoles ILINE const bool IsEditor() const { #if defined(CONSOLE) return false; #else return bEditor; #endif } ILINE const bool IsEditorGameMode() const { #if defined(CONSOLE) return false; #else return bEditorGameMode; #endif } ILINE const bool IsEditorSimulationMode() const { #if defined(CONSOLE) return false; #else return bEditorSimulationMode; #endif } ILINE const bool IsEditing() const { #if defined(CONSOLE) return false; #else return bEditor && !bEditorGameMode; #endif } ILINE bool IsInToolMode() const { return bToolMode; } ILINE void SetToolMode(bool bNewToolMode) { bToolMode = bNewToolMode; } #if !defined(CONSOLE) private: bool bEditor; // Engine is running under editor. bool bEditorGameMode; // Engine is in editor game mode. bool bEditorSimulationMode; // Engine is in editor simulation mode. bool bDedicated; // Engine is in dedicated #endif public: SSystemGlobalEnvironment() : bToolMode(false) { }; }; // NOTE Nov 25, 2008: the ISystem interface that follows has a member function // called 'GetUserName'. If we don't #undef'ine the same-named Win32 symbol here // ISystem wouldn't even compile. // TODO Nov 25, 2008: there might be a better place for this? #ifdef GetUserName #undef GetUserName #endif //////////////////////////////////////////////////////////////////////////////////////////////// // Description: // Main Engine Interface. // Initialize and dispatch all engine's subsystems. struct ISystem { // virtual ~ISystem() {} // Summary: // Releases ISystem. virtual void Release() = 0; // Summary: // Returns pointer to the global environment structure. virtual SSystemGlobalEnvironment* GetGlobalEnvironment() = 0; // Summary: // Updates all subsystems (including the ScriptSink() ) // Arguments: // flags - One or more flags from ESystemUpdateFlags structure. // nPauseMode - 0=normal(no pause), 1=menu/pause, 2=cutscene virtual bool UpdatePreTickBus(int updateFlags = 0, int nPauseMode = 0) = 0; // Summary: // Updates all subsystems (including the ScriptSink() ) // Arguments: // flags - One or more flags from ESystemUpdateFlags structure. // nPauseMode - 0=normal(no pause), 1=menu/pause, 2=cutscene virtual bool UpdatePostTickBus(int updateFlags = 0, int nPauseMode = 0) = 0; // Summary: // Updates only require components during loading virtual bool UpdateLoadtime() = 0; // Summary: // Retrieve the name of the user currently logged in to the computer. virtual const char* GetUserName() = 0; // Summary: // Quits the application. virtual void Quit() = 0; // Summary: // Tells the system if it is relaunching or not. virtual void Relaunch(bool bRelaunch) = 0; // Summary: // Returns true if the application is in the shutdown phase. virtual bool IsQuitting() const = 0; // Summary: // Tells the system in which way we are using the serialization system. virtual void SerializingFile(int mode) = 0; virtual int IsSerializingFile() const = 0; virtual bool IsRelaunch() const = 0; // Description: // Displays error message. // Logs it to console and file and error message box then terminates execution. virtual void FatalError(const char* sFormat, ...) PRINTF_PARAMS(2, 3) = 0; // Description: // Reports a bug using the crash handler. // Logs an error to the console and launches the crash handler, then continues execution. virtual void ReportBug(const char* sFormat, ...) PRINTF_PARAMS(2, 3) = 0; // Description: // Report warning to current Validator object. // Doesn't terminate the execution. //##@{ virtual void WarningV(EValidatorModule module, EValidatorSeverity severity, int flags, const char* file, const char* format, va_list args) = 0; virtual void Warning(EValidatorModule module, EValidatorSeverity severity, int flags, const char* file, const char* format, ...) = 0; //##@} // Description: // Report message by provider or by using CryMessageBox. // Doesn't terminate the execution. virtual void ShowMessage(const char* text, const char* caption, unsigned int uType) = 0; // Summary: // Compare specified verbosity level to the one currently set. virtual bool CheckLogVerbosity(int verbosity) = 0; // return the related subsystem interface virtual ILevelSystem* GetILevelSystem() = 0; virtual ICmdLine* GetICmdLine() = 0; virtual ILog* GetILog() = 0; virtual AZ::IO::IArchive* GetIPak() = 0; virtual ICryFont* GetICryFont() = 0; virtual IMovieSystem* GetIMovieSystem() = 0; virtual ::IConsole* GetIConsole() = 0; virtual IRemoteConsole* GetIRemoteConsole() = 0; virtual ISystemEventDispatcher* GetISystemEventDispatcher() = 0; virtual bool IsDevMode() const = 0; ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // IXmlNode interface. ////////////////////////////////////////////////////////////////////////// // Summary: // Creates new xml node. virtual XmlNodeRef CreateXmlNode(const char* sNodeName = "", bool bReuseStrings = false, bool bIsProcessingInstruction = false) = 0; // Summary: // Loads xml from memory buffer, returns 0 if load failed. virtual XmlNodeRef LoadXmlFromBuffer(const char* buffer, size_t size, bool bReuseStrings = false, bool bSuppressWarnings = false) = 0; // Summary: // Loads xml file, returns 0 if load failed. virtual XmlNodeRef LoadXmlFromFile(const char* sFilename, bool bReuseStrings = false) = 0; // Summary: // Retrieves access to XML utilities interface. virtual IXmlUtils* GetXmlUtils() = 0; // Description: // When ignore update sets to true, system will ignore and updates and render calls. virtual void IgnoreUpdates(bool bIgnore) = 0; // Return Value: // True if system running in Test mode. virtual bool IsTestMode() const = 0; ////////////////////////////////////////////////////////////////////////// // File version. ////////////////////////////////////////////////////////////////////////// // Summary: // Gets file version. virtual const SFileVersion& GetFileVersion() = 0; // Summary: // Gets product version. virtual const SFileVersion& GetProductVersion() = 0; // Summary: // Gets build version. virtual const SFileVersion& GetBuildVersion() = 0; ////////////////////////////////////////////////////////////////////////// // Configuration. ////////////////////////////////////////////////////////////////////////// // Summary: // Loads configurations from CVarGroup directory recursively // If m_GraphicsSettingsMap is defined (in Graphics Settings Dialog box), fills in mapping based on sys_spec_Full // Arguments: // sPath - e.g. "Game/Config/CVarGroups" virtual void AddCVarGroupDirectory(const AZStd::string& sPath) = 0; // Summary: // Saves system configuration. virtual void SaveConfiguration() = 0; // Summary: // Loads system configuration // Arguments: // pCallback - 0 means normal LoadConfigVar behaviour is used virtual void LoadConfiguration(const char* sFilename, ILoadConfigurationEntrySink* pSink = 0, bool warnIfMissing = true) = 0; ////////////////////////////////////////////////////////////////////////// // Summary: // Retrieves current configuration platform virtual ESystemConfigPlatform GetConfigPlatform() const = 0; // Summary: // Changes current configuration platform. virtual void SetConfigPlatform(ESystemConfigPlatform platform) = 0; ////////////////////////////////////////////////////////////////////////// // Summary: // Query if system is now paused. // Pause flag is set when calling system update with pause mode. virtual bool IsPaused() const = 0; // Summary: // Retrieves localized strings manager interface. virtual ILocalizationManager* GetLocalizationManager() = 0; // Summary: // Retrieves the perlin noise singleton instance. virtual CPNoise3* GetNoiseGen() = 0; ////////////////////////////////////////////////////////////////////////// // Error callback handling // Summary: // Registers listeners to CryAssert and error messages. (may not be called if asserts are disabled) // Each pointer can be registered only once. (stl::push_back_unique) // It will return false if the pointer is already registered. Returns true, otherwise. virtual bool RegisterErrorObserver(IErrorObserver* errorObserver) = 0; // Summary: // Unregisters listeners to CryAssert and error messages. // It will return false if the pointer is not registered. Otherwise, returns true. virtual bool UnregisterErrorObserver(IErrorObserver* errorObserver) = 0; // Summary: // Called after the processing of the assert message box on some platforms. // It will be called even when asserts are disabled by the console variables. virtual void OnAssert(const char* condition, const char* message, const char* fileName, unsigned int fileLineNumber) = 0; // Summary: // Returns if the assert window from CryAssert is visible. // OBS1: needed by the editor, as in some cases it can freeze if during an assert engine it will handle // some events such as mouse movement in a CryPhysics assert. // OBS2: it will always return false, if asserts are disabled or ignored. virtual bool IsAssertDialogVisible() const = 0; // Summary: // Sets the AssertVisisble internal variable. // Typically it should only be called by CryAssert. virtual void SetAssertVisible(bool bAssertVisble) = 0; ////////////////////////////////////////////////////////////////////////// // Summary: // Get the index of the currently running O3DE application. (0 = first instance, 1 = second instance, etc) virtual int GetApplicationInstance() = 0; // Summary: // Get log index of the currently running Open 3D Engine application. (0 = first instance, 1 = second instance, etc) virtual int GetApplicationLogInstance(const char* logFilePath) = 0; // Summary: // Clear all currently logged and drawn on screen error messages virtual void ClearErrorMessages() = 0; ////////////////////////////////////////////////////////////////////////// // For debugging use only!, query current C++ call stack. ////////////////////////////////////////////////////////////////////////// // Notes: // Pass nCount to indicate maximum number of functions to get. // For debugging use only, query current C++ call stack. // Description: // Fills array of function pointers, nCount return number of functions. virtual void debug_GetCallStack(const char** pFunctions, int& nCount) = 0; // Summary: // Logs current callstack. // Notes: // For debugging use only!, query current C++ call stack. virtual void debug_LogCallStack(int nMaxFuncs = 32, int nFlags = 0) = 0; // Description: // Execute command line arguments. // Should be after init game. // Example: // +g_gametype ASSAULT +map "testy" virtual void ExecuteCommandLine(bool deferred=true) = 0; // Description: // GetSystemUpdate stats (all systems update without except console) // very useful on dedicated server as we throttle it to fixed frequency // returns zeroes if no updates happened yet virtual void GetUpdateStats(SSystemUpdateStats& stats) = 0; virtual ESystemGlobalState GetSystemGlobalState(void) = 0; virtual void SetSystemGlobalState(ESystemGlobalState systemGlobalState) = 0; #if !defined(_RELEASE) virtual bool IsSavingResourceList() const = 0; #endif // Summary: // Register a IWindowMessageHandler that will be informed about window messages // The delivered messages are platform-specific virtual void RegisterWindowMessageHandler(IWindowMessageHandler* pHandler) = 0; // Summary: // Unregister an IWindowMessageHandler that was previously registered using RegisterWindowMessageHandler virtual void UnregisterWindowMessageHandler(IWindowMessageHandler* pHandler) = 0; //////////////////////////////////////////////////////////////////////////////////////////////// // EBus interface used to listen for cry system notifications class CrySystemNotifications : public AZ::EBusTraits { public: virtual ~CrySystemNotifications() = default; // Override to be notified right before the call to ISystem::Render virtual void OnPreRender() {} // Override to be notified right after the call to ISystem::Render (but before RenderEnd) virtual void OnPostRender() {} }; using CrySystemNotificationBus = AZ::EBus; }; ////////////////////////////////////////////////////////////////////////// // CrySystem DLL Exports. ////////////////////////////////////////////////////////////////////////// typedef ISystem* (*PFNCREATESYSTEMINTERFACE)(SSystemInitParams& initParams); ////////////////////////////////////////////////////////////////////////// // Global environment variable. ////////////////////////////////////////////////////////////////////////// extern SSystemGlobalEnvironment* gEnv; // Summary: // Gets the system interface. inline ISystem* GetISystem() { // Some unit tests temporarily install and then uninstall ISystem* mocks. // It is generally okay for runtime and tool systems which call this function to cache the returned pointer, // because their lifetime is usually shorter than the lifetime of the ISystem* implementation. // It is NOT safe for this function to cache it as a static itself, though, as the static it would cache // it inside may outlive the the actual instance implementing ISystem* when unit tests are torn down and then restarted. ISystem* systemInterface = gEnv ? gEnv->pSystem : nullptr; if (!systemInterface) { CrySystemRequestBus::BroadcastResult(systemInterface, &CrySystemRequests::GetCrySystem); } return systemInterface; }; ////////////////////////////////////////////////////////////////////////// // Description: // This function must be called once by each module at the beginning, to setup global pointers. void ModuleInitISystem(ISystem* pSystem, const char* moduleName); void ModuleShutdownISystem(ISystem* pSystem); void* GetModuleInitISystemSymbol(); void* GetModuleShutdownISystemSymbol(); #define PREVENT_MODULE_AND_ENVIRONMENT_SYMBOL_STRIPPING \ AZ_UNUSED(GetModuleInitISystemSymbol()); \ AZ_UNUSED(GetModuleShutdownISystemSymbol()); // Summary: // Interface of the DLL. extern "C" { CRYSYSTEM_API ISystem* CreateSystemInterface(const SSystemInitParams& initParams); } // Description: // Displays error message. // Logs it to console and file and error message box. // Then terminates execution. void CryFatalError(const char*, ...) PRINTF_PARAMS(1, 2); inline void CryFatalError(const char* format, ...) { if (!gEnv || !gEnv->pSystem) { return; } va_list ArgList; char szBuffer[MAX_WARNING_LENGTH]; va_start(ArgList, format); int count = azvsnprintf(szBuffer, sizeof(szBuffer), format, ArgList); if (count == -1 || count >= sizeof(szBuffer)) { szBuffer[sizeof(szBuffer) - 1] = '\0'; } va_end(ArgList); gEnv->pSystem->FatalError("%s", szBuffer); } ////////////////////////////////////////////////////////////////////////// // Description: // Displays warning message. // Logs it to console and file and display a warning message box. // Doesn't terminate execution. void CryWarning(EValidatorModule, EValidatorSeverity, const char*, ...) PRINTF_PARAMS(3, 4); inline void CryWarning(EValidatorModule module, EValidatorSeverity severity, const char* format, ...) { if (!gEnv || !gEnv->pSystem || !format) { return; } va_list args; va_start(args, format); GetISystem()->WarningV(module, severity, 0, 0, format, args); va_end(args); } #ifdef EXCLUDE_CVARHELP #define CVARHELP(_comment) 0 #else #define CVARHELP(_comment) _comment #endif //Provide macros for fixing cvars for release mode on consoles to enums to allow for code stripping //Do not enable for PC, apply VF_CHEAT there if required #if defined(CONSOLE) #define CONST_CVAR_FLAGS (VF_CHEAT) #else #define CONST_CVAR_FLAGS (VF_NULL) #endif #if defined(AZ_RESTRICTED_PLATFORM) #define AZ_RESTRICTED_SECTION ISYSTEM_H_SECTION_5 #include AZ_RESTRICTED_FILE(ISystem_h) #endif #if defined(_RELEASE) && defined(IS_CONSOLE_PLATFORM) #ifndef LOG_CONST_CVAR_ACCESS #error LOG_CONST_CVAR_ACCESS should be defined in ProjectDefines.h #endif #include "IConsole.h" namespace Detail { template struct SQueryTypeEnum; template<> struct SQueryTypeEnum { static const int type = CVAR_INT; static int ParseString(const char* s) { return atoi(s); } }; template<> struct SQueryTypeEnum { static const int type = CVAR_FLOAT; static float ParseString(const char* s) { return (float)atof(s); } }; template struct SDummyCVar : ICVar { const T value; #if LOG_CONST_CVAR_ACCESS mutable bool bWasRead; mutable bool bWasChanged; SDummyCVar(T val) : value(val) , bWasChanged(false) , bWasRead(false) {} #else SDummyCVar(T val) : value(val) {} #endif void WarnUse() const { #if LOG_CONST_CVAR_ACCESS if (!bWasRead) { CryWarning(VALIDATOR_MODULE_SYSTEM, VALIDATOR_WARNING, "[CVAR] Read from const CVar '%s' via name look-up, this is non-optimal", GetName()); bWasRead = true; } #endif } void InvalidAccess() const { #if LOG_CONST_CVAR_ACCESS if (!bWasChanged) { CryWarning(VALIDATOR_MODULE_SYSTEM, VALIDATOR_ERROR, "[CVAR] Write to const CVar '%s' with wrong value '%f' was ignored. This indicates a bug in code or a config file", GetName(), GetFVal()); bWasChanged = true; } #endif } void Release() {} int GetIVal() const { WarnUse(); return static_cast(value); } int64 GetI64Val() const { WarnUse(); return static_cast(value); } float GetFVal() const { WarnUse(); return static_cast(value); } const char* GetString() const { return ""; } const char* GetDataProbeString() const { return ""; } void Set(const char* s) { if (SQueryTypeEnum::ParseString(s) != value) { InvalidAccess(); } } void ForceSet(const char* s) { Set(s); } void Set(const float f) { if (static_cast(f) != value) { InvalidAccess(); } } void Set(const int i) { if (static_cast(i) != value) { InvalidAccess(); } } void ClearFlags([[maybe_unused]] int flags) {} int GetFlags() const { return VF_CONST_CVAR | VF_READONLY; } int SetFlags([[maybe_unused]] int flags) { return 0; } int GetType() { return SQueryTypeEnum::type; } const char* GetHelp() { return NULL; } bool IsConstCVar() const { return true; } void SetOnChangeCallback(ConsoleVarFunc pChangeFunc) { (void)pChangeFunc; } uint64 AddOnChangeFunctor(const AZStd::function& pChangeFunctor) { (void)pChangeFunctor; return 0; } ConsoleVarFunc GetOnChangeCallback() const { InvalidAccess(); return NULL; } int GetRealIVal() const { return GetIVal(); } void SetLimits([[maybe_unused]] float min, [[maybe_unused]] float max) { return; } void GetLimits([[maybe_unused]] float& min, [[maybe_unused]] float& max) { return; } bool HasCustomLimits() { return false; } void SetDataProbeString([[maybe_unused]] const char* pDataProbeString) { InvalidAccess(); } }; } #define REGISTER_DUMMY_CVAR(type, name, value) \ do { \ static struct DummyCVar \ : Detail::SDummyCVar \ { \ DummyCVar() \ : Detail::SDummyCVar(value) {} \ const char* GetName() const { return name; } \ } DummyStaticInstance; \ if (!(gEnv->pConsole != 0 ? gEnv->pConsole->Register(&DummyStaticInstance) : 0)) \ { \ AZ::Debug::Trace::Break(); \ CryFatalError("Can not register dummy CVar"); \ } \ } while (0) # define CONSOLE_CONST_CVAR_MODE # define DeclareConstIntCVar(name, defaultValue) enum : int { name = (defaultValue) } # define DeclareStaticConstIntCVar(name, defaultValue) enum : int { name = (defaultValue) } # define DefineConstIntCVarName(strname, name, defaultValue, flags, help) { static_assert((int)(defaultValue) == (int)(name)); REGISTER_DUMMY_CVAR(int, strname, defaultValue); } # define DefineConstIntCVar(name, defaultValue, flags, help) { static_assert((int)(defaultValue) == (int)(name)); REGISTER_DUMMY_CVAR(int, (#name), defaultValue); } // DefineConstIntCVar2 is deprecated, any such instance can be converted to the 3 variant by removing the quotes around the first parameter # define DefineConstIntCVar3(name, _var_, defaultValue, flags, help) { static_assert((int)(defaultValue) == (int)(_var_)); REGISTER_DUMMY_CVAR(int, name, defaultValue); } # define AllocateConstIntCVar(scope, name) # define DefineConstFloatCVar(name, flags, help) { REGISTER_DUMMY_CVAR(float, (#name), name ## Default); } # define DeclareConstFloatCVar(name) # define DeclareStaticConstFloatCVar(name) # define AllocateConstFloatCVar(scope, name) # define IsCVarConstAccess(expr) expr #else # define DeclareConstIntCVar(name, defaultValue) int name { defaultValue } # define DeclareStaticConstIntCVar(name, defaultValue) static int name # define DefineConstIntCVarName(strname, name, defaultValue, flags, help) \ (gEnv->pConsole == 0 ? 0 : gEnv->pConsole->Register(strname, &name, defaultValue, flags | CONST_CVAR_FLAGS, CVARHELP(help))) # define DefineConstIntCVar(name, defaultValue, flags, help) \ (gEnv->pConsole == 0 ? 0 : gEnv->pConsole->Register((#name), &name, defaultValue, flags | CONST_CVAR_FLAGS, CVARHELP(help), 0, false)) // DefineConstIntCVar2 is deprecated, any such instance can be converted to the 3 variant by removing the quotes around the first parameter # define DefineConstIntCVar3(_name, _var, _def_val, _flags, help) \ (gEnv->pConsole == 0 ? 0 : gEnv->pConsole->Register(_name, &(_var), (_def_val), (_flags) | CONST_CVAR_FLAGS, CVARHELP(help), 0, false)) # define AllocateConstIntCVar(scope, name) int scope:: name # define DefineConstFloatCVar(name, flags, help) \ (gEnv->pConsole == 0 ? 0 : gEnv->pConsole->Register((#name), &name, name ## Default, flags | CONST_CVAR_FLAGS, CVARHELP(help), 0, false)) # define DeclareConstFloatCVar(name) float name # define DeclareStaticConstFloatCVar(name) static float name # define AllocateConstFloatCVar(scope, name) float scope:: name # define IsCVarConstAccess(expr) #endif // the following macros allow the help text to be easily stripped out // Summary: // Preferred way to register a CVar #define REGISTER_CVAR(_var, _def_val, _flags, _comment) \ (gEnv->pConsole == 0 ? 0 : gEnv->pConsole->Register((#_var), &(_var), (_def_val), (_flags), CVARHELP(_comment))) // Summary: // Preferred way to register a CVar with a callback #define REGISTER_CVAR_CB(_var, _def_val, _flags, _comment, _onchangefunction) \ (gEnv->pConsole == 0 ? 0 : gEnv->pConsole->Register((#_var), &(_var), (_def_val), (_flags), CVARHELP(_comment), _onchangefunction)) // Summary: // Preferred way to register a string CVar #define REGISTER_STRING(_name, _def_val, _flags, _comment) \ (gEnv->pConsole == 0 ? 0 : gEnv->pConsole->RegisterString(_name, (_def_val), (_flags), CVARHELP(_comment))) // Summary: // Preferred way to register a string CVar with a callback #define REGISTER_STRING_CB(_name, _def_val, _flags, _comment, _onchangefunction) \ (gEnv->pConsole == 0 ? 0 : gEnv->pConsole->RegisterString(_name, (_def_val), (_flags), CVARHELP(_comment), _onchangefunction)) // Summary: // Preferred way to register an int CVar #define REGISTER_INT(_name, _def_val, _flags, _comment) \ (gEnv->pConsole == 0 ? 0 : gEnv->pConsole->RegisterInt(_name, (_def_val), (_flags), CVARHELP(_comment))) // Summary: // Preferred way to register an int CVar with a callback #define REGISTER_INT_CB(_name, _def_val, _flags, _comment, _onchangefunction) \ (gEnv->pConsole == 0 ? 0 : gEnv->pConsole->RegisterInt(_name, (_def_val), (_flags), CVARHELP(_comment), _onchangefunction)) // Summary: // Preferred way to register a float CVar #define REGISTER_FLOAT(_name, _def_val, _flags, _comment) \ (gEnv->pConsole == 0 ? 0 : gEnv->pConsole->RegisterFloat(_name, (_def_val), (_flags), CVARHELP(_comment))) // Summary: // Offers more flexibility but more code is required #define REGISTER_CVAR2(_name, _var, _def_val, _flags, _comment) \ (gEnv->pConsole == 0 ? 0 : gEnv->pConsole->Register(_name, _var, (_def_val), (_flags), CVARHELP(_comment))) // Summary: // Offers more flexibility but more code is required #define REGISTER_CVAR2_CB(_name, _var, _def_val, _flags, _comment, _onchangefunction) \ (gEnv->pConsole == 0 ? 0 : gEnv->pConsole->Register(_name, _var, (_def_val), (_flags), CVARHELP(_comment), _onchangefunction)) // Summary: // Offers more flexibility but more code is required, explicit address taking of destination variable #define REGISTER_CVAR3(_name, _var, _def_val, _flags, _comment) \ (gEnv->pConsole == 0 ? 0 : gEnv->pConsole->Register(_name, &(_var), (_def_val), (_flags), CVARHELP(_comment))) // Summary: // Preferred way to register a console command #define REGISTER_COMMAND(_name, _func, _flags, _comment) \ (gEnv->pConsole == 0 ? false : gEnv->pConsole->AddCommand(_name, _func, (_flags), CVARHELP(_comment))) // Summary: // Preferred way to unregister a CVar #define UNREGISTER_CVAR(_name) \ (gEnv->pConsole == 0 ? (void)0 : gEnv->pConsole->UnregisterVariable(_name)) // Summary: // Preferred way to unregister a console command #define UNREGISTER_COMMAND(_name) \ (gEnv->pConsole == 0 ? (void)0 : gEnv->pConsole->RemoveCommand(_name)) //////////////////////////////////////////////////////////////////////////////// // // Development only cvars // // N.B: // (1) Registered as real cvars *in non release builds only*. // (2) Can still be manipulated in release by the mapped variable, so not the same as const cvars. // (3) Any 'OnChanged' callback will need guarding against in release builds since the cvar won't exist // (4) Any code that tries to get ICVar* will need guarding against in release builds since the cvar won't exist // // ILLEGAL_DEV_FLAGS is a mask of all those flags which make no sense in a _DEV_ONLY or _DEDI_ONLY cvar since the // cvar potentially won't exist in a release build. // #define ILLEGAL_DEV_FLAGS (VF_NET_SYNCED | VF_CHEAT | VF_CHEAT_ALWAYS_CHECK | VF_CHEAT_NOCHECK | VF_READONLY | VF_CONST_CVAR) #if defined(_RELEASE) #define REGISTER_CVAR_DEV_ONLY(_var, _def_val, _flags, _comment) NULL; static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0); _var = _def_val #define REGISTER_CVAR_CB_DEV_ONLY(_var, _def_val, _flags, _comment, _onchangefunction) NULL; static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0); _var = _def_val /* _onchangefunction consumed; callback not available */ #define REGISTER_STRING_DEV_ONLY(_name, _def_val, _flags, _comment) NULL; static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) /* consumed; pure cvar not available */ #define REGISTER_STRING_CB_DEV_ONLY(_name, _def_val, _flags, _comment, _onchangefunction) NULL; static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) /* consumed; pure cvar not available */ #define REGISTER_INT_DEV_ONLY(_name, _def_val, _flags, _comment) NULL; static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) /* consumed; pure cvar not available */ #define REGISTER_INT_CB_DEV_ONLY(_name, _def_val, _flags, _comment, _onchangefunction) NULL; static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) /* consumed; pure cvar not available */ #define REGISTER_FLOAT_DEV_ONLY(_name, _def_val, _flags, _comment) NULL; static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) /* consumed; pure cvar not available */ #define REGISTER_CVAR2_DEV_ONLY(_name, _var, _def_val, _flags, _comment) NULL; static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0); *(_var) = _def_val #define REGISTER_CVAR2_CB_DEV_ONLY(_name, _var, _def_val, _flags, _comment, _onchangefunction) NULL; static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0); *(_var) = _def_val #define REGISTER_CVAR3_DEV_ONLY(_name, _var, _def_val, _flags, _comment) NULL; static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0); _var = _def_val #define REGISTER_COMMAND_DEV_ONLY(_name, _func, _flags, _comment) /* consumed; command not available */ #else #define REGISTER_CVAR_DEV_ONLY(_var, _def_val, _flags, _comment) REGISTER_CVAR(_var, _def_val, ((_flags) | VF_DEV_ONLY), _comment); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_CVAR_CB_DEV_ONLY(_var, _def_val, _flags, _comment, _onchangefunction) REGISTER_CVAR_CB(_var, _def_val, ((_flags) | VF_DEV_ONLY), _comment, _onchangefunction); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_STRING_DEV_ONLY(_name, _def_val, _flags, _comment) REGISTER_STRING(_name, _def_val, ((_flags) | VF_DEV_ONLY), _comment); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_STRING_CB_DEV_ONLY(_name, _def_val, _flags, _comment, _onchangefunction) REGISTER_STRING_CB(_name, _def_val, ((_flags) | VF_DEV_ONLY), _comment, _onchangefunction); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_INT_DEV_ONLY(_name, _def_val, _flags, _comment) REGISTER_INT(_name, _def_val, ((_flags) | VF_DEV_ONLY), _comment); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_INT_CB_DEV_ONLY(_name, _def_val, _flags, _comment, _onchangefunction) REGISTER_INT_CB(_name, _def_val, ((_flags) | VF_DEV_ONLY), _comment, _onchangefunction); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_FLOAT_DEV_ONLY(_name, _def_val, _flags, _comment) REGISTER_FLOAT(_name, _def_val, ((_flags) | VF_DEV_ONLY), _comment); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_CVAR2_DEV_ONLY(_name, _var, _def_val, _flags, _comment) REGISTER_CVAR2(_name, _var, _def_val, ((_flags) | VF_DEV_ONLY), _comment); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_CVAR2_CB_DEV_ONLY(_name, _var, _def_val, _flags, _comment, _onchangefunction) REGISTER_CVAR2_CB(_name, _var, _def_val, ((_flags) | VF_DEV_ONLY), _comment, _onchangefunction); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_CVAR3_DEV_ONLY(_name, _var, _def_val, _flags, _comment) REGISTER_CVAR3(_name, _var, _def_val, ((_flags) | VF_DEV_ONLY), _comment); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_COMMAND_DEV_ONLY(_name, _func, _flags, _comment) REGISTER_COMMAND(_name, _func, ((_flags) | VF_DEV_ONLY), _comment); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #endif // defined(_RELEASE) // //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// // // Dedicated server only cvars // // N.B: // (1) Registered as real cvars in all non release builds // (2) Registered as real cvars in release on dedi servers only, otherwise treated as DEV_ONLY type cvars (see above) // // TODO Registering all cvars for Dedicated server as well. Currently CrySystems have no concept of Dedicated server with cmake. // If we introduce server specific targets for CrySystems, we can add DEDICATED_SERVER flags to those and add the flag back in here. #if defined(_RELEASE) #define REGISTER_CVAR_DEDI_ONLY(_var, _def_val, _flags, _comment) REGISTER_CVAR(_var, _def_val, ((_flags) | VF_DEDI_ONLY), _comment); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_CVAR_CB_DEDI_ONLY(_var, _def_val, _flags, _comment, _onchangefunction) REGISTER_CVAR_CB(_var, _def_val, ((_flags) | VF_DEDI_ONLY), _comment, _onchangefunction); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_STRING_DEDI_ONLY(_name, _def_val, _flags, _comment) REGISTER_STRING(_name, _def_val, ((_flags) | VF_DEDI_ONLY), _comment); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_STRING_CB_DEDI_ONLY(_name, _def_val, _flags, _comment, _onchangefunction) REGISTER_STRING_CB(_name, _def_val, ((_flags) | VF_DEDI_ONLY), _comment, _onchangefunction); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_INT_DEDI_ONLY(_name, _def_val, _flags, _comment) REGISTER_INT(_name, _def_val, ((_flags) | VF_DEDI_ONLY), _comment); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_INT_CB_DEDI_ONLY(_name, _def_val, _flags, _comment, _onchangefunction) REGISTER_INT_CB(_name, _def_val, ((_flags) | VF_DEDI_ONLY), _comment, _onchangefunction); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_FLOAT_DEDI_ONLY(_name, _def_val, _flags, _comment) REGISTER_FLOAT(_name, _def_val, ((_flags) | VF_DEDI_ONLY), _comment); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_CVAR2_DEDI_ONLY(_name, _var, _def_val, _flags, _comment) REGISTER_CVAR2(_name, _var, _def_val, ((_flags) | VF_DEDI_ONLY), _comment); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_CVAR2_CB_DEDI_ONLY(_name, _var, _def_val, _flags, _comment, _onchangefunction) REGISTER_CVAR2_CB(_name, _var, _def_val, ((_flags) | VF_DEDI_ONLY), _comment, _onchangefunction); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #define REGISTER_COMMAND_DEDI_ONLY(_name, _func, _flags, _comment) REGISTER_COMMAND(_name, _func, ((_flags) | VF_DEDI_ONLY), _comment); static_assert(((_flags) & ILLEGAL_DEV_FLAGS) == 0) #else #define REGISTER_CVAR_DEDI_ONLY(_var, _def_val, _flags, _comment) REGISTER_CVAR_DEV_ONLY(_var, _def_val, ((_flags) | VF_DEDI_ONLY), _comment) #define REGISTER_CVAR_CB_DEDI_ONLY(_var, _def_val, _flags, _comment, _onchangefunction) REGISTER_CVAR_CB_DEV_ONLY(_var, _def_val, ((_flags) | VF_DEDI_ONLY), _comment, _onchangefunction) #define REGISTER_STRING_DEDI_ONLY(_name, _def_val, _flags, _comment) REGISTER_STRING_DEV_ONLY(_name, _def_val, ((_flags) | VF_DEDI_ONLY), _comment) #define REGISTER_STRING_CB_DEDI_ONLY(_name, _def_val, _flags, _comment, _onchangefunction) REGISTER_STRING_CB_DEV_ONLY(_name, _def_val, ((_flags) | VF_DEDI_ONLY), _comment, _onchangefunction) #define REGISTER_INT_DEDI_ONLY(_name, _def_val, _flags, _comment) REGISTER_INT_DEV_ONLY(_name, _def_val, ((_flags) | VF_DEDI_ONLY), _comment) #define REGISTER_INT_CB_DEDI_ONLY(_name, _def_val, _flags, _comment, _onchangefunction) REGISTER_INT_CB_DEV_ONLY(_name, _def_val, ((_flags) | VF_DEDI_ONLY), _comment, _onchangefunction) #define REGISTER_FLOAT_DEDI_ONLY(_name, _def_val, _flags, _comment) REGISTER_FLOAT_DEV_ONLY(_name, _def_val, ((_flags) | VF_DEDI_ONLY), _comment) #define REGISTER_CVAR2_DEDI_ONLY(_name, _var, _def_val, _flags, _comment) REGISTER_CVAR2_DEV_ONLY(_name, _var, _def_val, ((_flags) | VF_DEDI_ONLY), _comment) #define REGISTER_CVAR2_CB_DEDI_ONLY(_name, _var, _def_val, _flags, _comment, _onchangefunction) REGISTER_CVAR2_CB_DEV_ONLY(_name, _var, _def_val, ((_flags) | VF_DEDI_ONLY), _comment, _onchangefunction) #define REGISTER_COMMAND_DEDI_ONLY(_name, _func, _flags, _comment) REGISTER_COMMAND_DEV_ONLY(_name, _func, ((_flags) | VF_DEDI_ONLY), _comment) #endif // defined(_RELEASE) // //////////////////////////////////////////////////////////////////////////////// #ifdef EXCLUDE_NORMAL_LOG // setting this removes a lot of logging to reduced code size (useful for consoles) #define CryLog(...) ((void)0) #define CryComment(...) ((void)0) #define CryLogAlways(...) ((void)0) #else // EXCLUDE_NORMAL_LOG // Summary: // Simple logs of data with low verbosity. void CryLog(const char*, ...) PRINTF_PARAMS(1, 2); inline void CryLog(const char* format, ...) { // Fran: we need these guards for the testing framework to work if (gEnv && gEnv->pSystem && gEnv->pLog) { va_list args; va_start(args, format); gEnv->pLog->LogV(ILog::eMessage, format, args); va_end(args); } } // Notes: // Very rarely used log comment. void CryComment(const char*, ...) PRINTF_PARAMS(1, 2); inline void CryComment(const char* format, ...) { // Fran: we need these guards for the testing framework to work if (gEnv && gEnv->pSystem && gEnv->pLog) { va_list args; va_start(args, format); gEnv->pLog->LogV(ILog::eComment, format, args); va_end(args); } } // Summary: // Logs important data that must be printed regardless verbosity. void CryLogAlways(const char*, ...) PRINTF_PARAMS(1, 2); inline void CryLogAlways(const char* format, ...) { // log should not be used before system is ready // error before system init should be handled explicitly // Fran: we need these guards for the testing framework to work if (gEnv && gEnv->pSystem && gEnv->pLog) { // assert(gEnv); // assert(gEnv->pSystem); va_list args; va_start(args, format); gEnv->pLog->LogV(ILog::eAlways, format, args); va_end(args); } } #endif // EXCLUDE_NORMAL_LOG