#include "CogSampleGameState.h" #include "AssetRegistry/AssetRegistryModule.h" #include "AssetRegistry/IAssetRegistry.h" #include "CogSampleFunctionLibrary_Tag.h" #include "GameFramework/Character.h" #include "GameFramework/GameMode.h" #include "GameFramework/GameState.h" #include "Modules/ModuleManager.h" #if ENABLE_COG #include "CogAbilityDataAsset.h" #include "CogAbilityModule.h" #include "CogAbilityWindow_Abilities.h" #include "CogAbilityWindow_Attributes.h" #include "CogAbilityWindow_Cheats.h" #include "CogAbilityWindow_Effects.h" #include "CogAbilityWindow_Pools.h" #include "CogAbilityWindow_Tags.h" #include "CogAbilityWindow_Tweaks.h" #include "CogDebugDrawImGui.h" #include "CogDebugPlot.h" #include "CogEngineDataAsset.h" #include "CogEngineModule.h" #include "CogEngineWindow_Collisions.h" #include "CogEngineWindow_DebugSettings.h" #include "CogEngineWindow_ImGui.h" #include "CogEngineWindow_Inspector.h" #include "CogEngineWindow_LogCategories.h" #include "CogEngineWindow_NetEmulation.h" #include "CogEngineWindow_OutputLog.h" #include "CogEngineWindow_Metrics.h" #include "CogEngineWindow_Plots.h" #include "CogEngineWindow_Scalability.h" #include "CogEngineWindow_Selection.h" #include "CogEngineWindow_Skeleton.h" #include "CogEngineWindow_Spawns.h" #include "CogEngineWindow_Stats.h" #include "CogEngineWindow_TimeScale.h" #include "CogImguiModule.h" #include "CogInputDataAsset.h" #include "CogInputWindow_Actions.h" #include "CogInputWindow_Gamepad.h" #include "CogWindowManager.h" #include "GameFramework/GameUserSettings.h" #endif //ENABLE_COG //-------------------------------------------------------------------------------------------------------------------------- template T* GetFirstAssetByClass() { IAssetRegistry& AssetRegistry = FModuleManager::LoadModuleChecked(TEXT("AssetRegistry")).Get(); TArray Assets; AssetRegistry.GetAssetsByClass(T::StaticClass()->GetClassPathName(), Assets, true); if (Assets.Num() == 0) { return nullptr; } UObject* Asset = Assets[0].GetAsset(); T* CastedAsset = Cast(Asset); return CastedAsset; } //-------------------------------------------------------------------------------------------------------------------------- ACogSampleGameState::ACogSampleGameState(const FObjectInitializer & ObjectInitializer) : Super(ObjectInitializer) { SetActorTickEnabled(true); PrimaryActorTick.bCanEverTick = true; PrimaryActorTick.SetTickFunctionEnable(true); PrimaryActorTick.bStartWithTickEnabled = true; } //-------------------------------------------------------------------------------------------------------------------------- void ACogSampleGameState::BeginPlay() { Super::BeginPlay(); #if ENABLE_COG InitializeCog(); #endif //ENABLE_COG } //-------------------------------------------------------------------------------------------------------------------------- void ACogSampleGameState::EndPlay(const EEndPlayReason::Type EndPlayReason) { Super::EndPlay(EndPlayReason); #if ENABLE_COG if (CogWindowManager != nullptr) { CogWindowManager->Shutdown(); } #endif //ENABLE_COG } //-------------------------------------------------------------------------------------------------------------------------- void ACogSampleGameState::Tick(float DeltaSeconds) { Super::Tick(DeltaSeconds); #if ENABLE_COG extern ENGINE_API float GAverageFPS; extern ENGINE_API float GAverageMS; FCogDebugPlot::PlotValue(this, "Frame Rate", GAverageFPS); FCogDebugPlot::PlotValue(this, "Frame Time", GAverageMS); CogWindowManager->Tick(DeltaSeconds); #endif //ENABLE_COG } #if ENABLE_COG //-------------------------------------------------------------------------------------------------------------------------- void ACogSampleGameState::InitializeCog() { FCogImguiModule::Get().SetToggleInputKey(FCogImGuiKeyInfo(EKeys::Tab)); RegisterCommand(TEXT("Cog.ToggleInput"), TEXT(""), FConsoleCommandWithArgsDelegate::CreateUObject(this, &ACogSampleGameState::CogToggleInput)); CogWindowManager = NewObject(this); CogWindowManagerRef = CogWindowManager; //--------------------------------------- // Engine //--------------------------------------- const UCogEngineDataAsset* EngineAsset = GetFirstAssetByClass(); UCogEngineWindow_Collisions* CollisionsWindow = CogWindowManager->CreateWindow("Engine.Collision"); CollisionsWindow->SetAsset(EngineAsset); CogWindowManager->CreateWindow("Engine.Debug Settings"); CogWindowManager->CreateWindow("Engine.ImGui"); UCogEngineWindow_Inspector* Inspector = CogWindowManager->CreateWindow("Engine.Inspector"); Inspector->AddFavorite(GEngine->GetGameUserSettings(), [](UObject* Object) { if (UGameUserSettings* UserSettings = Cast(Object)) { UserSettings->ApplySettings(true); } }); CogWindowManager->CreateWindow("Engine.Log Categories"); CogWindowManager->CreateWindow("Engine.Net Emulation"); CogWindowManager->CreateWindow("Engine.Output Log"); CogWindowManager->CreateWindow("Engine.Metrics"); CogWindowManager->CreateWindow("Engine.Plots"); UCogEngineWindow_Selection* SelectionWindow = CogWindowManager->CreateWindow("Engine.Selection"); SelectionWindow->SetActorSubClasses({ AActor::StaticClass(), AGameModeBase::StaticClass(), AGameStateBase::StaticClass(), ACharacter::StaticClass() }); SelectionWindow->SetCurrentActorSubClass(ACharacter::StaticClass()); SelectionWindow->SetTraceType(UEngineTypes::ConvertToTraceType(ECollisionChannel::ECC_Pawn)); CogWindowManager->CreateWindow("Engine.Scalability"); CogWindowManager->CreateWindow("Engine.Skeleton"); UCogEngineWindow_Spawns* SpawnWindow = CogWindowManager->CreateWindow("Engine.Spawns"); SpawnWindow->SetAsset(EngineAsset); UCogEngineWindow_Stats* StatsWindow = CogWindowManager->CreateWindow("Engine.Stats"); CogWindowManager->CreateWindow("Engine.Time Scale"); //--------------------------------------- // Abilities //--------------------------------------- const UCogAbilityDataAsset* AbilityAsset = GetFirstAssetByClass(); UCogAbilityWindow_Abilities* AbilitiesWindow = CogWindowManager->CreateWindow("Gameplay.Abilities"); AbilitiesWindow->SetAsset(AbilityAsset); UCogAbilityWindow_Attributes* AttributesWindow = CogWindowManager->CreateWindow("Gameplay.Attributes"); AttributesWindow->SetAsset(AbilityAsset); UCogAbilityWindow_Cheats* CheatsWindow = CogWindowManager->CreateWindow("Gameplay.Cheats"); CheatsWindow->SetAsset(AbilityAsset); UCogAbilityWindow_Effects* EffectsWindow = CogWindowManager->CreateWindow("Gameplay.Effects"); EffectsWindow->SetAsset(AbilityAsset); UCogAbilityWindow_Pools* PoolsWindow = CogWindowManager->CreateWindow("Gameplay.Pools"); PoolsWindow->SetAsset(AbilityAsset); CogWindowManager->CreateWindow("Gameplay.Tags"); UCogAbilityWindow_Tweaks* TweaksWindow = CogWindowManager->CreateWindow("Gameplay.Tweaks"); TweaksWindow->SetAsset(AbilityAsset); //--------------------------------------- // Input //--------------------------------------- const UCogInputDataAsset* InputAsset = GetFirstAssetByClass(); UCogInputWindow_Actions* ActionsWindow = CogWindowManager->CreateWindow("Input.Actions"); ActionsWindow->SetAsset(InputAsset); UCogInputWindow_Gamepad* GamepadWindow = CogWindowManager->CreateWindow("Input.Gamepad"); GamepadWindow->SetAsset(InputAsset); //--------------------------------------- // Main Menu Widget //--------------------------------------- CogWindowManager->AddMainMenuWidget(SelectionWindow); CogWindowManager->AddMainMenuWidget(StatsWindow); } //-------------------------------------------------------------------------------------------------------------------------- void ACogSampleGameState::RegisterCommand(const TCHAR* Name, const TCHAR* Help, const FConsoleCommandWithArgsDelegate& Command) { IConsoleManager& ConsoleManager = IConsoleManager::Get(); if (!ConsoleManager.FindConsoleObject(Name)) { ConsoleManager.RegisterConsoleCommand(Name, Help, Command, ECVF_Cheat); } } //-------------------------------------------------------------------------------------------------------------------------- void ACogSampleGameState::CogToggleInput(const TArray& Args) { FCogImguiModule::Get().ToggleEnableInput(); } #endif //ENABLE_COG