#include "CogSampleGameState.h" #include "AssetRegistry/AssetRegistryModule.h" #include "AssetRegistry/IAssetRegistry.h" #include "CogDefines.h" #include "GameFramework/Character.h" #include "GameFramework/GameMode.h" #include "GameFramework/GameState.h" #include "Modules/ModuleManager.h" #if USE_COG #include "CogAbilityDataAsset_Abilities.h" #include "CogAbilityDataAsset_Cheats.h" #include "CogAbilityDataAsset_Pools.h" #include "CogAbilityDataAsset_Tweaks.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 "CogDebugDefines.h" #include "CogDebugDrawImGui.h" #include "CogDebugPlot.h" #include "CogEngineDataAsset_Collisions.h" #include "CogEngineDataAsset_Spawns.h" #include "CogEngineModule.h" #include "CogEngineWindow_Collisions.h" #include "CogEngineWindow_DebugSettings.h" #include "CogEngineWindow_ImGui.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_Actions.h" #include "CogInputWindow_Actions.h" #include "CogInputWindow_Gamepad.h" #include "CogSampleTagLibrary.h" #include "CogWindowManager.h" #endif //USE_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(); } //-------------------------------------------------------------------------------------------------------------------------- void ACogSampleGameState::EndPlay(const EEndPlayReason::Type EndPlayReason) { Super::EndPlay(EndPlayReason); #if USE_COG if (CogWindowManager != nullptr) { CogWindowManager->Shutdown(); } #endif //USE_COG } //-------------------------------------------------------------------------------------------------------------------------- void ACogSampleGameState::Tick(float DeltaSeconds) { Super::Tick(DeltaSeconds); #if USE_COG TickCog(DeltaSeconds); #endif //USE_COG } #if USE_COG //-------------------------------------------------------------------------------------------------------------------------- void ACogSampleGameState::TickCog(float DeltaSeconds) { //--------------------------------------- // Wait for the viewport to be set //--------------------------------------- if (GEngine->GameViewport != nullptr) { if (CogWindowManager == nullptr) { InitializeCog(); } else { CogWindowManager->Tick(DeltaSeconds); } } extern ENGINE_API float GAverageFPS; extern ENGINE_API float GAverageMS; FCogDebugPlot::PlotValue(this, "Frame Rate", GAverageFPS); FCogDebugPlot::PlotValue(this, "Frame Time", GAverageMS); } //-------------------------------------------------------------------------------------------------------------------------- void ACogSampleGameState::InitializeCog() { TSharedPtr Widget = FCogImguiModule::Get().CreateImGuiViewport(GEngine->GameViewport, [this](float DeltaTime) { RenderCog(DeltaTime); }); FCogImguiModule::Get().SetToggleInputKey(FCogImGuiKeyInfo(EKeys::Insert)); CogWindowManager = NewObject(this); CogWindowManagerRef = CogWindowManager; CogWindowManager->Initialize(GetWorld(), Widget); //--------------------------------------- // Engine //--------------------------------------- UCogEngineWindow_Collisions* CollisionsWindow = CogWindowManager->CreateWindow("Engine.Collision"); CollisionsWindow->SetCollisionsAsset(GetFirstAssetByClass()); CogWindowManager->CreateWindow("Engine.Debug Settings"); CogWindowManager->CreateWindow("Engine.ImGui"); 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->SetSpawnsAsset(GetFirstAssetByClass()); UCogEngineWindow_Stats* StatsWindow = CogWindowManager->CreateWindow("Engine.Stats"); CogWindowManager->CreateWindow("Engine.Time Scale"); //--------------------------------------- // Abilities //--------------------------------------- UCogAbilityWindow_Abilities* AbilitiesWindow = CogWindowManager->CreateWindow("Gameplay.Abilities"); AbilitiesWindow->AbilitiesAsset = GetFirstAssetByClass(); CogWindowManager->CreateWindow("Gameplay.Attributes"); UCogAbilityWindow_Cheats* CheatsWindow = CogWindowManager->CreateWindow("Gameplay.Cheats"); CheatsWindow->CheatsAsset = GetFirstAssetByClass(); UCogAbilityWindow_Effects* EffectsWindow = CogWindowManager->CreateWindow("Gameplay.Effects"); EffectsWindow->NegativeEffectTag = Tag_Effect_Alignment_Negative; EffectsWindow->PositiveEffectTag = Tag_Effect_Alignment_Positive; UCogAbilityWindow_Pools* PoolsWindow = CogWindowManager->CreateWindow("Gameplay.Pools"); PoolsWindow->PoolsAsset = GetFirstAssetByClass(); CogWindowManager->CreateWindow("Gameplay.Tags"); UCogAbilityWindow_Tweaks* TweaksWindow = CogWindowManager->CreateWindow("Gameplay.Tweaks"); TweaksWindow->TweaksAsset = GetFirstAssetByClass(); //--------------------------------------- // Input //--------------------------------------- UCogInputWindow_Actions* ActionsWindow = CogWindowManager->CreateWindow("Input.Actions"); ActionsWindow->ActionsAsset = GetFirstAssetByClass(); UCogInputWindow_Gamepad* GamepadWindow = CogWindowManager->CreateWindow("Input.Gamepad"); GamepadWindow->ActionsAsset = GetFirstAssetByClass(); //--------------------------------------- // Main Menu Widget //--------------------------------------- CogWindowManager->AddMainMenuWidget(SelectionWindow); CogWindowManager->AddMainMenuWidget(StatsWindow); } //-------------------------------------------------------------------------------------------------------------------------- void ACogSampleGameState::RenderCog(float DeltaTime) { CogWindowManager->Render(DeltaTime); FCogDebugDrawImGui::Draw(); } #endif //USE_COG