bool UEngine::Exec( UWorld* InWorld, const TCHAR* Cmd, FOutputDevice& Ar )
{
// If we don't have a viewport specified to catch the stat commands, use to the game viewport
if (GStatProcessingViewportClient == NULL)
{
GStatProcessingViewportClient = GameViewport;
}
// See if any other subsystems claim the command.
if (StaticExec(InWorld, Cmd,Ar) == true)
{
return true;
}
if (GDebugToolExec && (GDebugToolExec->Exec( InWorld, Cmd,Ar) == true))
{
return true;
}
if (GMalloc && (GMalloc->Exec( InWorld, Cmd,Ar) == true))
{
return true;
}
if (GSystemSettings.Exec( InWorld, Cmd,Ar) == true)
{
return true;
}
FAudioDevice* AudioDevice = nullptr;
if (InWorld)
{
AudioDevice = InWorld->GetAudioDevice();
}
else
{
AudioDevice = GetMainAudioDevice();
}
if (AudioDevice && AudioDevice->Exec(InWorld, Cmd, Ar) == true)
{
return true;
}
if (FPlatformMisc::Exec( InWorld, Cmd,Ar) == true)
{
return true;
}
#if ENABLE_LOW_LEVEL_MEM_TRACKER
if (FLowLevelMemTracker::Get().Exec(Cmd, Ar))
{
return true;
}
#endif
{
FString CultureName;
if (FParse::Value(Cmd, TEXT("CULTURE="), CultureName))
{
FInternationalization::Get().SetCurrentCulture(CultureName);
return true;
}
}
{
FString LanguageName;
if (FParse::Value(Cmd, TEXT("LANGUAGE="), LanguageName))
{
FInternationalization::Get().SetCurrentLanguage(LanguageName);
return true;
}
}
{
FString LocaleName;
if (FParse::Value(Cmd, TEXT("LOCALE="), LocaleName))
{
FInternationalization::Get().SetCurrentLocale(LocaleName);
return true;
}
}
#if ENABLE_LOC_TESTING
{
FString ConfigFilePath;
if (FParse::Value(Cmd, TEXT("REGENLOC="), ConfigFilePath))
{
ILocalizationModule::Get().HandleRegenLocCommand(ConfigFilePath, /*bSkipSourceCheck*/false);
}
}
#endif
// Handle engine command line.
if ( FParse::Command(&Cmd,TEXT("FLUSHLOG")) )
{
return HandleFlushLogCommand( Cmd, Ar );
}
else if( FParse::Command(&Cmd, TEXT("GAMEVER")) || FParse::Command(&Cmd, TEXT("GAMEVERSION")))
{
return HandleGameVerCommand( Cmd, Ar );
}
#if 0
else if (FParse::Command(&Cmd, TEXT("HOTFIXTEST")))
{
FTestHotFixPayload Test;
Test.ValueToReturn = true;
Test.Result = false;
Test.Message = FString(TEXT("Hi there"));
FCoreDelegates::GetHotfixDelegate(EHotfixDelegates::Test).ExecuteIfBound(&Test, sizeof(FTestHotFixPayload));
check(Test.ValueToReturn == Test.Result);
}
#endif
else if( FParse::Command(&Cmd,TEXT("STAT")) )
{
return HandleStatCommand(InWorld, GStatProcessingViewportClient, Cmd, Ar);
}
else if( FParse::Command(&Cmd,TEXT("STOPMOVIECAPTURE")) && GIsEditor )
{
return HandleStopMovieCaptureCommand( Cmd, Ar );
}
else if( FParse::Command(&Cmd,TEXT("CRACKURL")) )
{
return HandleCrackURLCommand( Cmd, Ar );
}
else if( FParse::Command(&Cmd,TEXT("DEFER")) )
{
return HandleDeferCommand( Cmd, Ar );
}
else if( FParse::Command( &Cmd, TEXT("OPEN") ) )
{
return HandleOpenCommand( Cmd, Ar, InWorld );
}
else if( FParse::Command( &Cmd, TEXT("STREAMMAP")) )
{
return HandleStreamMapCommand( Cmd, Ar, InWorld );
}
#if WITH_SERVER_CODE
else if (FParse::Command(&Cmd, TEXT("SERVERTRAVEL")) )
{
return HandleServerTravelCommand( Cmd, Ar, InWorld );
}
#endif // WITH_SERVER_CODE
else if( FParse::Command( &Cmd, TEXT("DISCONNECT")) )
{
return HandleDisconnectCommand( Cmd, Ar, InWorld );
}
else if( FParse::Command( &Cmd, TEXT("RECONNECT")) )
{
return HandleReconnectCommand( Cmd, Ar, InWorld );
}
else if( FParse::Command( &Cmd, TEXT("TRAVEL") ) )
{
return HandleTravelCommand( Cmd, Ar, InWorld );
}
else if (FParse::Command(&Cmd, TEXT("CE")))
{
return HandleCeCommand( InWorld, Cmd, Ar );
}
else if (FParse::Command(&Cmd, TEXT("GAMMA") ) )
{
return HandleGammaCommand( Cmd, Ar );
}
#if STATS
else if( FParse::Command( &Cmd, TEXT("DUMPPARTICLEMEM") ) )
{
return HandleDumpParticleMemCommand( Cmd, Ar );
}
#endif
#if WITH_PROFILEGPU
else if( FParse::Command(&Cmd,TEXT("PROFILEGPU")) )
{
return HandleProfileGPUCommand( Cmd, Ar );
}
#endif // #if !UE_BUILD_SHIPPING
#if !(UE_BUILD_SHIPPING || UE_BUILD_TEST) && WITH_HOT_RELOAD
else if( FParse::Command(&Cmd,TEXT("HotReload")) )
{
return HandleHotReloadCommand( Cmd, Ar );
}
#endif // !(UE_BUILD_SHIPPING || UE_BUILD_TEST) && WITH_HOT_RELOAD
#if !UE_BUILD_SHIPPING
else if (FParse::Command(&Cmd, TEXT("DumpConsoleCommands")))
{
return HandleDumpConsoleCommandsCommand( Cmd, Ar, InWorld );
}
else if (FParse::Command(&Cmd, TEXT("DUMPAVAILABLERESOLUTIONS")))
{
return HandleDumpAvailableResolutionsCommand( Cmd, Ar );
}
else if(FParse::Command(&Cmd,TEXT("ANIMSEQSTATS")))
{
return HandleAnimSeqStatsCommand( Cmd, Ar );
}
else if (FParse::Command(&Cmd,TEXT("CountDisabledParticleItems")))
{
return HandleCountDisabledParticleItemsCommand( Cmd, Ar );
}
else if( FParse::Command( &Cmd, TEXT("VIEWNAMES") ) )
{
return HandleViewnamesCommand( Cmd, Ar );
}
else if( FParse::Command(&Cmd,TEXT("FREEZESTREAMING")) )
{
return HandleFreezeStreamingCommand( Cmd, Ar, InWorld );
}
else if( FParse::Command(&Cmd,TEXT("FREEZEALL")) )
{
return HandleFreezeAllCommand( Cmd, Ar, InWorld );
}
else if( FParse::Command(&Cmd,TEXT("ToggleRenderingThread")) )
{
return HandleToggleRenderingThreadCommand( Cmd, Ar );
}
else if (FParse::Command(&Cmd, TEXT("ToggleAsyncCompute")))
{
return HandleToggleAsyncComputeCommand(Cmd, Ar);
}
else if( FParse::Command(&Cmd,TEXT("RecompileShaders")) )
{
return HandleRecompileShadersCommand( Cmd, Ar );
}
else if( FParse::Command(&Cmd,TEXT("RecompileGlobalShaders")) )
{
return HandleRecompileGlobalShadersCommand( Cmd, Ar );
}
else if( FParse::Command(&Cmd,TEXT("DUMPSHADERSTATS")) )
{
return HandleDumpShaderStatsCommand( Cmd, Ar );
}
else if( FParse::Command(&Cmd,TEXT("DUMPMATERIALSTATS")) )
{
return HandleDumpMaterialStatsCommand( Cmd, Ar );
}
else if (FParse::Command(&Cmd, TEXT("DumpShaderPipelineStats")))
{
return HandleDumpShaderPipelineStatsCommand(Cmd, Ar);
}
else if (FParse::Command(&Cmd, TEXT("visrt")))
{
extern bool HandleVisualizeRT();
return HandleVisualizeRT();
}
else if( FParse::Command(&Cmd,TEXT("PROFILE")) )
{
return HandleProfileCommand( Cmd, Ar );
}
else if( FParse::Command(&Cmd,TEXT("PROFILEGPUHITCHES")) )
{
return HandleProfileGPUHitchesCommand( Cmd, Ar );
}
else if( FParse::Command(&Cmd,TEXT("SHADERCOMPLEXITY")) )
{
return HandleShaderComplexityCommand( Cmd, Ar );
}
else if( FParse::Command(&Cmd,TEXT("FREEZERENDERING")) )
{
return HandleFreezeRenderingCommand( Cmd, Ar, InWorld );
}
else if (FParse::Command(&Cmd, TEXT("ShowSelectedLightmap")))
{
return HandleShowSelectedLightmapCommand( Cmd, Ar );
}
else if( FParse::Command(&Cmd,TEXT("SHOWLOG")) )
{
return HandleShowLogCommand( Cmd, Ar );
}
else if( FParse::Command(&Cmd,TEXT("STARTFPSCHART")) )
{
return HandleStartFPSChartCommand( Cmd, Ar );
}
else if( FParse::Command(&Cmd,TEXT("STOPFPSCHART")) )
{
return HandleStopFPSChartCommand( Cmd, Ar, InWorld );
}
else if (FParse::Command(&Cmd, TEXT("DumpLevelScriptActors")))
{
return HandleDumpLevelScriptActorsCommand( InWorld, Cmd, Ar );
}
else if (FParse::Command(&Cmd, TEXT("KE")) || FParse::Command(&Cmd, TEXT("KISMETEVENT")))
{
return HandleKismetEventCommand( InWorld, Cmd, Ar );
}
else if(FParse::Command(&Cmd,TEXT("LISTTEXTURES")))
{
return HandleListTexturesCommand( Cmd, Ar );
}
else if (FParse::Command(&Cmd, TEXT("LISTSTATICMESHES")))
{
return HandleListStaticMeshesCommand(Cmd, Ar);
}
else if (FParse::Command(&Cmd, TEXT("LISTSKELETALMESHES")))
{
return HandleListSkeletalMeshesCommand(Cmd, Ar);
}
else if (FParse::Command(&Cmd, TEXT("LISTANIMS")))
{
return HandleListAnimsCommand( Cmd, Ar );
}
else if(FParse::Command(&Cmd,TEXT("REMOTETEXTURESTATS")))
{
return HandleRemoteTextureStatsCommand( Cmd, Ar );
}
else if(FParse::Command(&Cmd,TEXT("LISTPARTICLESYSTEMS")))
{
return HandleListParticleSystemsCommand( Cmd, Ar );
}
else if( FParse::Command(&Cmd,TEXT("LISTSPAWNEDACTORS")) )
{
return HandleListSpawnedActorsCommand( Cmd, Ar, InWorld );
}
else if( FParse::Command( &Cmd, TEXT("MemReport") ) )
{
return HandleMemReportCommand( Cmd, Ar, InWorld );
}
else if( FParse::Command( &Cmd, TEXT("MemReportDeferred") ) )
{
return HandleMemReportDeferredCommand( Cmd, Ar, InWorld );
}
else if( FParse::Command( &Cmd, TEXT("PARTICLEMESHUSAGE") ) )
{
return HandleParticleMeshUsageCommand( Cmd, Ar );
}
else if( FParse::Command( &Cmd, TEXT("DUMPPARTICLECOUNTS") ) )
{
return HandleDumpParticleCountsCommand( Cmd, Ar );
}
// we can't always do an obj linkers, as cooked games have their linkers tossed out. So we need to look at the actual packages which are loaded
else if( FParse::Command( &Cmd, TEXT("ListLoadedPackages") ) )
{
return HandleListLoadedPackagesCommand( Cmd, Ar );
}
else if( FParse::Command( &Cmd,TEXT("MEM")) )
{
return HandleMemCommand( Cmd, Ar );
}
else if( FParse::Command(&Cmd,TEXT("LOGOUTSTATLEVELS")) )
{
return HandleLogoutStatLevelsCommand( Cmd, Ar, InWorld );
}
else if( FParse::Command( &Cmd, TEXT("DEBUG") ) )
{
return HandleDebugCommand( Cmd, Ar );
}
else if (FParse::Command(&Cmd,TEXT("MERGEMESH")))
{
return HandleMergeMeshCommand( Cmd, Ar, InWorld );
}
else if (FParse::Command(&Cmd, TEXT("CONTENTCOMPARISON")))
{
return HandleContentComparisonCommand( Cmd, Ar );
}
else if (FParse::Command(&Cmd, TEXT("TOGGLEGTPSYSLOD")))
{
return HandleTogglegtPsysLODCommand( Cmd, Ar );
}
else if( FParse::Command(&Cmd,TEXT("OBJ")) )
{
return HandleObjCommand( Cmd, Ar );
}
else if( FParse::Command( &Cmd, TEXT("TESTSLATEGAMEUI")) && InWorld && InWorld->IsGameWorld() )
{
return HandleTestslateGameUICommand( Cmd, Ar );
}
else if( FParse::Command(&Cmd,TEXT("DIR")) ) // DIR [path\pattern]
{
return HandleDirCommand( Cmd, Ar );
}
else if( FParse::Command(&Cmd,TEXT("TRACKPARTICLERENDERINGSTATS")) )
{
return HandleTrackParticleRenderingStatsCommand( Cmd, Ar );
}
else if ( FParse::Command(&Cmd,TEXT("DUMPALLOCS")) )
{
return HandleDumpAllocatorStats( Cmd, Ar );
}
else if ( FParse::Command(&Cmd,TEXT("HEAPCHECK")) )
{
return HandleHeapCheckCommand( Cmd, Ar );
}
else if (FParse::Command(&Cmd,TEXT("TOGGLEONSCREENDEBUGMESSAGEDISPLAY")))
{
return HandleToggleOnscreenDebugMessageDisplayCommand( Cmd, Ar );
}
else if (FParse::Command(&Cmd,TEXT("TOGGLEONSCREENDEBUGMESSAGESYSTEM")))
{
return HandleToggleOnscreenDebugMessageSystemCommand( Cmd, Ar );
}
else if (FParse::Command(&Cmd,TEXT("DISABLEALLSCREENMESSAGES")) || FParse::Command(&Cmd,TEXT("DISABLESCREENMESSAGES")))
{
return HandleDisableAllScreenMessagesCommand( Cmd, Ar );
}
else if (FParse::Command(&Cmd,TEXT("ENABLEALLSCREENMESSAGES")) || FParse::Command(&Cmd,TEXT("ENABLESCREENMESSAGES")))
{
return HandleEnableAllScreenMessagesCommand( Cmd, Ar );
}
else if (FParse::Command(&Cmd,TEXT("TOGGLEALLSCREENMESSAGES")) || FParse::Command(&Cmd,TEXT("TOGGLESCREENMESSAGES")) || FParse::Command(&Cmd,TEXT("CAPTUREMODE")))
{
return HandleToggleAllScreenMessagesCommand( Cmd, Ar );
}
else if( FParse::Command(&Cmd,TEXT("CONFIGHASH")) )
{
return HandleConfigHashCommand( Cmd, Ar );
}
else if ( FParse::Command(&Cmd,TEXT("CONFIGMEM")) )
{
return HandleConfigMemCommand( Cmd, Ar );
}
else if (FParse::Command(&Cmd, TEXT("GETINI")))
{
return HandleGetIniCommand(Cmd, Ar);
}
#endif // !UE_BUILD_SHIPPING
else if ( FParse::Command(&Cmd,TEXT("SCALABILITY")) )
{
Scalability::ProcessCommand(Cmd, Ar);
return true;
}
else if(IConsoleManager::Get().ProcessUserConsoleInput(Cmd, Ar, InWorld))
{
// console variable interaction (get value, set value or get help)
return true;
}
else if (!IStreamingManager::HasShutdown() && IStreamingManager::Get().Exec( InWorld, Cmd,Ar ))
{
// The streaming manager has handled the exec command.
}
else if( FParse::Command(&Cmd, TEXT("DUMPTICKS")) )
{
return HandleDumpTicksCommand( InWorld, Cmd, Ar );
}
else if (FParse::Command(&Cmd, TEXT("CANCELASYNCLOAD")))
{
CancelAsyncLoading();
return true;
}
#if USE_NETWORK_PROFILER
else if( FParse::Command(&Cmd,TEXT("NETPROFILE")) )
{
GNetworkProfiler.Exec( InWorld, Cmd, Ar );
}
#endif
else
{
return false;
}
return true;
}