Rework how ImGui input toggle is triggered

Add a new window CommandBindings to configure the shortcuts of console commands
The first time it is created, this window add the bindings to control cog:

[Tab]  Cog.ToggleInput
[F1]   Cog.LoadLayout 1
[F2]   Cog.LoadLayout 2
[F3]   Cog.LoadLayout 3
[F4]   Cog.LoadLayout 4
[F5]   Cog.ToggleSelectionMode

The selection window can now uses the Actor Label instead of Name (simpler to read)
Fix Blackboard sorting
This commit is contained in:
Arnaud Jamin
2023-10-19 17:28:42 -04:00
parent c32efe88f5
commit 1b5d63b0af
18 changed files with 705 additions and 165 deletions
@@ -7,13 +7,15 @@ public class CogEngine : ModuleRules
PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
PublicIncludePaths.AddRange(
new string[] {
new string[]
{
}
);
PrivateIncludePaths.AddRange(
new string[] {
new string[]
{
}
);
@@ -21,11 +23,6 @@ public class CogEngine : ModuleRules
PublicDependencyModuleNames.AddRange(
new string[]
{
"Core",
"CogCommon",
"CogImgui",
"CogDebug",
"CogWindow",
}
);
@@ -33,11 +30,17 @@ public class CogEngine : ModuleRules
PrivateDependencyModuleNames.AddRange(
new string[]
{
"CoreUObject",
"CogCommon",
"CogDebug",
"CogImgui",
"CogWindow",
"Core",
"CoreUObject",
"Engine",
"InputCore",
"NetCore",
"Slate",
"SlateCore",
"NetCore",
}
);
@@ -0,0 +1,172 @@
#include "CogEngineWindow_CommandBindings.h"
#include "CogWindowWidgets.h"
#include "GameFramework/PlayerInput.h"
#include "imgui.h"
//--------------------------------------------------------------------------------------------------------------------------
void UCogEngineWindow_CommandBindings::RenderHelp()
{
ImGui::Text(
"This window can be used to configure the command bindings. "
"Bindings are used to trigger console commands from a keyboard shortcuts. "
);
}
//--------------------------------------------------------------------------------------------------------------------------
UCogEngineWindow_CommandBindings::UCogEngineWindow_CommandBindings()
{
}
//--------------------------------------------------------------------------------------------------------------------------
void UCogEngineWindow_CommandBindings::PostInitProperties()
{
Super::PostInitProperties();
if (bRegisterDefaultCommands)
{
if (RegisterDefaultCommands())
{
bRegisterDefaultCommands = false;
}
}
}
//--------------------------------------------------------------------------------------------------------------------------
void UCogEngineWindow_CommandBindings::RenderContent()
{
Super::RenderContent();
APlayerController* PlayerController = GetLocalPlayerController();
if (PlayerController == nullptr)
{
return;
}
UPlayerInput* PlayerInput = PlayerController->PlayerInput;
if (PlayerInput == nullptr)
{
return;
}
int32 Index = 0;
int32 IndexToRemove = INDEX_NONE;
if (FCogWindowWidgets::ButtonWithTooltip("Add", "Add a new item in the array"))
{
PlayerInput->DebugExecBindings.AddDefaulted();
PlayerInput->SaveConfig();
}
ImGui::SameLine();
if (FCogWindowWidgets::ButtonWithTooltip("Sort", "Sort the array"))
{
Sort(PlayerInput);
PlayerInput->SaveConfig();
}
ImGui::SameLine();
if (FCogWindowWidgets::ButtonWithTooltip(
"Register Default Commands",
"Register the default commands used to control Cog:\n\n"
"[Tab] Cog.ToggleInput\n"
"[F1] Cog.LoadLayout 1\n"
"[F2] Cog.LoadLayout 2\n"
"[F3] Cog.LoadLayout 3\n"
"[F4] Cog.LoadLayout 4\n"
"[F5] Cog.ToggleSelectionMode\n"
))
{
RegisterDefaultCommands();
}
for (FKeyBind& KeyBind : PlayerInput->DebugExecBindings)
{
ImGui::PushID(Index);
if (FCogWindowWidgets::KeyBind(KeyBind))
{
PlayerInput->SaveConfig();
}
ImGui::SameLine();
if (FCogWindowWidgets::DeleteArrayItemButton())
{
IndexToRemove = Index;
}
ImGui::PopID();
Index++;
}
if (IndexToRemove != INDEX_NONE)
{
PlayerInput->DebugExecBindings.RemoveAt(IndexToRemove);
PlayerInput->SaveConfig();
}
}
//--------------------------------------------------------------------------------------------------------------------------
void UCogEngineWindow_CommandBindings::Sort(UPlayerInput* PlayerInput)
{
PlayerInput->DebugExecBindings.Sort([](const FKeyBind& Key1, const FKeyBind& Key2)
{
return Key1.Command.Compare(Key2.Command) < 0;
});
}
//--------------------------------------------------------------------------------------------------------------------------
bool UCogEngineWindow_CommandBindings::RegisterDefaultCommands()
{
APlayerController* PlayerController = GetLocalPlayerController();
if (PlayerController == nullptr)
{
return false;
}
UPlayerInput* PlayerInput = PlayerController->PlayerInput;
if (PlayerInput == nullptr)
{
return false;
}
AddCogCommand(PlayerInput, "Cog.ToggleInput", EKeys::Tab);
AddCogCommand(PlayerInput, "Cog.LoadLayout 1", EKeys::F1);
AddCogCommand(PlayerInput, "Cog.LoadLayout 2", EKeys::F2);
AddCogCommand(PlayerInput, "Cog.LoadLayout 3", EKeys::F3);
AddCogCommand(PlayerInput, "Cog.LoadLayout 4", EKeys::F4);
AddCogCommand(PlayerInput, "Cog.ToggleSelectionMode", EKeys::F5);
Sort(PlayerInput);
PlayerInput->SaveConfig();
return true;
}
//--------------------------------------------------------------------------------------------------------------------------
void UCogEngineWindow_CommandBindings::AddCogCommand(UPlayerInput* PlayerInput, const FString& Command, const FKey& Key)
{
for (FKeyBind& KeyBind : PlayerInput->DebugExecBindings)
{
if (KeyBind.Key == Key && KeyBind.Command != Command)
{
KeyBind.Control = true;
KeyBind.bIgnoreCtrl = false;
}
}
FKeyBind* ExistingKeyBind = PlayerInput->DebugExecBindings.FindByPredicate([Command](const FKeyBind& KeyBind){ return KeyBind.Command == Command; });
if (ExistingKeyBind == nullptr)
{
ExistingKeyBind = &PlayerInput->DebugExecBindings.AddDefaulted_GetRef();
}
FKeyBind CogKeyBind;
CogKeyBind.Command = Command;
CogKeyBind.Control = false;
CogKeyBind.bIgnoreCtrl = true;
CogKeyBind.Key = Key;
*ExistingKeyBind = CogKeyBind;
}
@@ -1,12 +1,14 @@
#include "CogEngineWindow_Selection.h"
#include "CogDebugDraw.h"
#include "CogDebugSettings.h"
#include "CogEngineReplicator.h"
#include "CogImguiModule.h"
#include "CogWindowManager.h"
#include "CogWindowWidgets.h"
#include "EngineUtils.h"
#include "GameFramework/Character.h"
#include "HAL/IConsoleManager.h"
#include "imgui.h"
#include "Kismet/GameplayStatics.h"
@@ -26,14 +28,24 @@ UCogEngineWindow_Selection::UCogEngineWindow_Selection()
{
bHasMenu = true;
ActorClasses = { AActor::StaticClass(), ACharacter::StaticClass() };
}
ConsoleCommands.Add(IConsoleManager::Get().RegisterConsoleCommand(
TEXT("Cog.ToggleSelectionMode"),
TEXT("Toggle the actor selection mode"),
FConsoleCommandWithArgsDelegate::CreateLambda([this](const TArray<FString>& Args) { ToggleSelectionMode(); }),
ECVF_Cheat));
}
//--------------------------------------------------------------------------------------------------------------------------
void UCogEngineWindow_Selection::ResetConfig()
{
Super::ResetConfig();
for (IConsoleObject* ConsoleCommand : ConsoleCommands)
{
IConsoleManager::Get().UnregisterConsoleObject(ConsoleCommand);
}
SelectedClassIndex = 0;
SelectionName = FString();
bReapplySelection = true;
@@ -169,7 +181,7 @@ void UCogEngineWindow_Selection::RenderTick(float DeltaTime)
{
if (Actor != GetLocalPlayerPawn())
{
DrawActorFrame(Actor);
DrawActorFrame(*Actor);
}
}
}
@@ -250,8 +262,7 @@ bool UCogEngineWindow_Selection::DrawSelectionCombo()
ImGui::PushStyleColor(ImGuiCol_Text, Actor == LocalPlayerPawn ? IM_COL32(255, 255, 0, 255) : IM_COL32(255, 255, 255, 255));
bool bIsSelected = Actor == FCogDebugSettings::GetSelection();
const FString ActorName = GetNameSafe(Actor);
if (ImGui::Selectable(TCHAR_TO_ANSI(*ActorName), bIsSelected))
if (ImGui::Selectable(TCHAR_TO_ANSI(*GetActorName(*Actor)), bIsSelected))
{
SetGlobalSelection(Actor);
SelectionChanged = true;
@@ -266,7 +277,7 @@ bool UCogEngineWindow_Selection::DrawSelectionCombo()
//------------------------
if (ImGui::IsItemHovered())
{
DrawActorFrame(Actor);
DrawActorFrame(*Actor);
}
if (bIsSelected)
@@ -281,6 +292,31 @@ bool UCogEngineWindow_Selection::DrawSelectionCombo()
return SelectionChanged;
}
//--------------------------------------------------------------------------------------------------------------------------
FString UCogEngineWindow_Selection::GetActorName(const AActor* Actor) const
{
if (Actor == nullptr)
{
return FString("none");
}
return GetActorName(*Actor);
}
//--------------------------------------------------------------------------------------------------------------------------
FString UCogEngineWindow_Selection::GetActorName(const AActor& Actor) const
{
#if WITH_EDITOR
return bDisplayActorLabel ? Actor.GetActorLabel() : Actor.GetName();
#else //WITH_EDITOR
return Actor.GetName();
#endif //WITH_EDITOR
}
//--------------------------------------------------------------------------------------------------------------------------
void UCogEngineWindow_Selection::DrawActorContextMenu(AActor* Actor)
{
@@ -333,6 +369,7 @@ void UCogEngineWindow_Selection::DrawActorContextMenu(AActor* Actor)
ImGui::Separator();
ImGui::Checkbox("Save selection", &bReapplySelection);
ImGui::Checkbox("Display Actor Label", &bDisplayActorLabel);
ImGui::EndPopup();
}
@@ -387,7 +424,7 @@ void UCogEngineWindow_Selection::TickSelectionMode()
if (HoveredActor != nullptr)
{
DrawActorFrame(HoveredActor);
DrawActorFrame(*HoveredActor);
}
if (bSelectionModeActive)
@@ -412,7 +449,7 @@ void UCogEngineWindow_Selection::TickSelectionMode()
}
//--------------------------------------------------------------------------------------------------------------------------
void UCogEngineWindow_Selection::DrawActorFrame(const AActor* Actor)
void UCogEngineWindow_Selection::DrawActorFrame(const AActor& Actor)
{
APlayerController* PlayerController = GetWorld()->GetFirstPlayerController();
if (PlayerController == nullptr)
@@ -427,14 +464,14 @@ void UCogEngineWindow_Selection::DrawActorFrame(const AActor* Actor)
bool PrimitiveFound = false;
FBox Bounds(ForceInit);
if (const UPrimitiveComponent* PrimitiveComponent = Cast<UPrimitiveComponent>(Actor->GetRootComponent()))
if (const UPrimitiveComponent* PrimitiveComponent = Cast<UPrimitiveComponent>(Actor.GetRootComponent()))
{
PrimitiveFound = true;
Bounds += PrimitiveComponent->Bounds.GetBox();
}
else
{
Actor->ForEachComponent<UPrimitiveComponent>(true, [&](const UPrimitiveComponent* InPrimComp)
Actor.ForEachComponent<UPrimitiveComponent>(true, [&](const UPrimitiveComponent* InPrimComp)
{
if (InPrimComp->IsRegistered() && InPrimComp->IsCollisionEnabled())
{
@@ -450,16 +487,16 @@ void UCogEngineWindow_Selection::DrawActorFrame(const AActor* Actor)
}
else
{
BoxOrigin = Actor->GetActorLocation();
BoxOrigin = Actor.GetActorLocation();
BoxExtent = FVector(50.f, 50.f, 50.f);
}
FVector2D ScreenPosMin, ScreenPosMax;
if (ComputeBoundingBoxScreenPosition(PlayerController, BoxOrigin, BoxExtent, ScreenPosMin, ScreenPosMax))
{
const ImU32 Color = (Actor == GetSelection()) ? IM_COL32(255, 255, 255, 255) : IM_COL32(255, 255, 255, 128);
const ImU32 Color = (&Actor == GetSelection()) ? IM_COL32(255, 255, 255, 255) : IM_COL32(255, 255, 255, 128);
DrawList->AddRect(FCogImguiHelper::ToImVec2(ScreenPosMin), FCogImguiHelper::ToImVec2(ScreenPosMax), Color, 0.0f, 0, 1.0f);
FCogWindowWidgets::AddTextWithShadow(DrawList, FCogImguiHelper::ToImVec2(ScreenPosMin + FVector2D(0, -14.0f)), Color, TCHAR_TO_ANSI(*Actor->GetName()));
FCogWindowWidgets::AddTextWithShadow(DrawList, FCogImguiHelper::ToImVec2(ScreenPosMin + FVector2D(0, -14.0f)), Color, TCHAR_TO_ANSI(*GetActorName(Actor)));
}
}
@@ -563,7 +600,7 @@ void UCogEngineWindow_Selection::RenderMainMenuWidget(bool Draw, float& Width)
ImGui::PushStyleVar(ImGuiStyleVar_ButtonTextAlign, ImVec2(0.0f, 0.5f));
ImGui::PushStyleColor(ImGuiCol_Button, IM_COL32(0, 0, 0, 0));
ImGui::SameLine();
FString CurrentSelectionName = GetNameSafe(GlobalSelection);
FString CurrentSelectionName = GetActorName(GlobalSelection);
if (ImGui::Button(TCHAR_TO_ANSI(*CurrentSelectionName), ImVec2(SelectionButtonWidth, 0)))
{
@@ -0,0 +1,37 @@
#pragma once
#include "CoreMinimal.h"
#include "CogWindow.h"
#include "CogEngineWindow_CommandBindings.generated.h"
class UPlayerInput;
struct FKeyBind;
UCLASS(Config = Cog)
class COGENGINE_API UCogEngineWindow_CommandBindings : public UCogWindow
{
GENERATED_BODY()
public:
UCogEngineWindow_CommandBindings();
protected:
virtual void PostInitProperties() override;
virtual void RenderHelp() override;
virtual void RenderContent() override;
virtual bool RegisterDefaultCommands();
private:
UPROPERTY(Config)
bool bRegisterDefaultCommands = true;
void Sort(UPlayerInput* PlayerInput);
void AddCogCommand(UPlayerInput* PlayerInput, const FString& Command, const FKey& Key);
};
@@ -5,6 +5,8 @@
#include "CogWindow.h"
#include "CogEngineWindow_Selection.generated.h"
class IConsoleObject;
UCLASS(Config = Cog)
class COGENGINE_API UCogEngineWindow_Selection : public UCogWindow
{
@@ -24,10 +26,16 @@ public:
void SetTraceType(ETraceTypeQuery Value) { TraceType = Value; }
void TryReapplySelection() const;
virtual void ActivateSelectionMode();
virtual void DeactivateSelectionMode();
virtual void ToggleSelectionMode();
protected:
virtual void TryReapplySelection() const;
virtual void ResetConfig() override;
virtual void PreSaveConfig() override;
@@ -46,8 +54,6 @@ protected:
virtual void DrawActorContextMenu(AActor* Actor);
virtual void ActivateSelectionMode();
virtual void HackWaitInputRelease();
virtual void SetGlobalSelection(AActor* Value) const;
@@ -58,19 +64,22 @@ private:
TSubclassOf<AActor> GetSelectedActorClass() const;
FString GetActorName(const AActor* Actor) const;
FString GetActorName(const AActor& Actor) const;
void TickSelectionMode();
void ToggleSelectionMode();
void DeactivateSelectionMode();
void DrawActorFrame(const AActor* Actor);
void DrawActorFrame(const AActor& Actor);
bool ComputeBoundingBoxScreenPosition(const APlayerController* PlayerController, const FVector& Origin, const FVector& Extent, FVector2D& Min, FVector2D& Max);
UPROPERTY(Config)
bool bReapplySelection = true;
UPROPERTY(Config)
bool bDisplayActorLabel = true;
UPROPERTY(Config)
FString SelectionName;
@@ -88,4 +97,6 @@ private:
TArray<TSubclassOf<AActor>> ActorClasses;
ETraceTypeQuery TraceType = TraceTypeQuery1;
TArray<IConsoleObject*> ConsoleCommands;
};
@@ -31,29 +31,59 @@ APlayerController* FCogImguiInputHelper::GetFirstLocalPlayerController(UWorld& W
}
//--------------------------------------------------------------------------------------------------------------------------
bool FCogImguiInputHelper::IsKeyEventHandled(const FKeyEvent& KeyEvent)
bool FCogImguiInputHelper::IsKeyEventHandled(UWorld* World, const FKeyEvent& KeyEvent)
{
//------------------------------------------------------------------------------------------------
// Do not handle the input if imgui input is disabled
//------------------------------------------------------------------------------------------------
if (FCogImguiModule::Get().GetEnableInput() == false)
{
return false;
}
//------------------------------------------------------------------------------------------------
// We want the user to control the character with its gamepad even when imgui has the input.
//------------------------------------------------------------------------------------------------
if (KeyEvent.GetKey().IsGamepadKey())
{
return false;
}
//------------------------------------------------------------------------------------------------
// We want the user to be able to open the console command when imgui has the input.
//------------------------------------------------------------------------------------------------
if (IsConsoleEvent(KeyEvent))
{
return false;
}
//------------------------------------------------------------------------------------------------
// We want the user to be able to stop its session by pressing Esc, even when imgui has the input
//------------------------------------------------------------------------------------------------
if (IsStopPlaySessionEvent(KeyEvent))
{
return false;
}
if (IsImGuiToggleInputEvent(KeyEvent))
//------------------------------------------------------------------------------------------------
// If we receive a key modifier, we want to let others systems know about it.
// Otherwise, the console command bindings that are bound to something like CTRL+Key
// won't work, even if we let the KeyEvent pass with 'IsKeyBoundToCommand' below.
// It seems the command binings system needs to know about the modifier key press event itself,
// and not the Key+Modifier event.
// We update ImGui modifier keys in SCogImguiWidget::TickKeyModifiers().
//------------------------------------------------------------------------------------------------
if (KeyEvent.GetKey().IsModifierKey())
{
return false;
}
//------------------------------------------------------------------------------------------------
// We want the user to be able to use command bingings, even when imgui has the input.
// We actually use a console command to toggle the input from the game to imgui, and other
// windows command such as LoadLayout.
//------------------------------------------------------------------------------------------------
if (IsKeyBoundToCommand(World, KeyEvent))
{
return false;
}
@@ -80,6 +110,73 @@ bool FCogImguiInputHelper::IsKeyEventMatchingKeyInfo(const FKeyEvent& KeyEvent,
return Result;
}
//--------------------------------------------------------------------------------------------------------------------------
#define BREAK_CHECKBOX_STATE(CheckBoxState, RequireValue, IgnoreValue) \
{ \
if (CheckBoxState == ECheckBoxState::Checked) \
{ \
RequireValue = true; \
IgnoreValue = false; \
} \
else if (CheckBoxState == ECheckBoxState::Unchecked) \
{ \
RequireValue = false; \
IgnoreValue = true; \
} \
else if (CheckBoxState == ECheckBoxState::Undetermined) \
{ \
RequireValue = false; \
IgnoreValue = false; \
} \
} \
//--------------------------------------------------------------------------------------------------------------------------
ECheckBoxState FCogImguiInputHelper::MakeCheckBoxState(uint8 RequireValue, uint8 IgnoreValue)
{
if (RequireValue)
{
return ECheckBoxState::Checked;
}
if (IgnoreValue)
{
return ECheckBoxState::Unchecked;
}
return ECheckBoxState::Undetermined;
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogImguiInputHelper::KeyBindToKeyInfo(const FKeyBind& KeyBind, FCogImGuiKeyInfo& KeyInfo)
{
KeyInfo.Key = KeyBind.Key;
KeyInfo.Shift = MakeCheckBoxState(KeyBind.Shift, KeyBind.bIgnoreShift);
KeyInfo.Ctrl = MakeCheckBoxState(KeyBind.Control, KeyBind.bIgnoreCtrl);
KeyInfo.Alt = MakeCheckBoxState(KeyBind.Alt, KeyBind.bIgnoreAlt);
KeyInfo.Alt = MakeCheckBoxState(KeyBind.Cmd, KeyBind.bIgnoreCmd);
}
//--------------------------------------------------------------------------------------------------------------------------
void FCogImguiInputHelper::KeyInfoToKeyBind(const FCogImGuiKeyInfo& KeyInfo, FKeyBind& KeyBind)
{
KeyBind.Key = KeyInfo.Key;
BREAK_CHECKBOX_STATE(KeyInfo.Shift, KeyBind.Shift, KeyBind.bIgnoreShift);
BREAK_CHECKBOX_STATE(KeyInfo.Ctrl, KeyBind.Control, KeyBind.bIgnoreCtrl);
BREAK_CHECKBOX_STATE(KeyInfo.Alt, KeyBind.Alt, KeyBind.bIgnoreAlt);
BREAK_CHECKBOX_STATE(KeyInfo.Cmd, KeyBind.Cmd, KeyBind.bIgnoreCmd);
}
//--------------------------------------------------------------------------------------------------------------------------
bool FCogImguiInputHelper::IsKeyEventMatchingKeyBind(const FKeyEvent& KeyEvent, const FKeyBind& KeyBind)
{
FCogImGuiKeyInfo KeyInfo;
KeyBindToKeyInfo(KeyBind, KeyInfo);
const bool Result = IsKeyEventMatchingKeyInfo(KeyEvent, KeyInfo);
return Result;
}
//--------------------------------------------------------------------------------------------------------------------------
bool FCogImguiInputHelper::WasKeyInfoJustPressed(APlayerController& PlayerController, const FCogImGuiKeyInfo& KeyInfo)
{
@@ -99,6 +196,38 @@ bool FCogImguiInputHelper::WasKeyInfoJustPressed(APlayerController& PlayerContro
return false;
}
//--------------------------------------------------------------------------------------------------------------------------
bool FCogImguiInputHelper::IsKeyBoundToCommand(UWorld* World, const FKeyEvent& KeyEvent)
{
if (World == nullptr)
{
return false;
}
APlayerController* Controller = GetFirstLocalPlayerController(*World);
if (Controller == nullptr)
{
return false;
}
UPlayerInput* PlayerInput = Controller->PlayerInput;
if (PlayerInput == nullptr)
{
return false;
}
for (const FKeyBind& KeyBind : PlayerInput->DebugExecBindings)
{
if (IsKeyEventMatchingKeyBind(KeyEvent, KeyBind))
{
return true;
}
}
return false;
}
//--------------------------------------------------------------------------------------------------------------------------
bool FCogImguiInputHelper::IsConsoleEvent(const FKeyEvent& KeyEvent)
{
@@ -124,13 +253,6 @@ bool FCogImguiInputHelper::IsStopPlaySessionEvent(const FKeyEvent& KeyEvent)
return false;
}
//--------------------------------------------------------------------------------------------------------------------------
bool FCogImguiInputHelper::IsImGuiToggleInputEvent(const FKeyEvent& KeyEvent)
{
const bool Result = IsKeyEventMatchingKeyInfo(KeyEvent, FCogImguiModule::Get().GetToggleInputKey());
return Result;
}
//--------------------------------------------------------------------------------------------------------------------------
ImGuiKey FCogImguiInputHelper::KeyEventToImGuiKey(const FKeyEvent& KeyEvent)
{
@@ -150,11 +272,11 @@ ImGuiKey FCogImguiInputHelper::KeyEventToImGuiKey(const FKeyEvent& KeyEvent)
//--------------------------------------------------------------------------------------------------------------------------
uint32 FCogImguiInputHelper::MouseButtonToImGuiMouseButton(const FKey& MouseButton)
{
if (MouseButton == EKeys::LeftMouseButton) { return 0; }
if (MouseButton == EKeys::RightMouseButton) { return 1; }
if (MouseButton == EKeys::MiddleMouseButton) { return 2; }
if (MouseButton == EKeys::ThumbMouseButton) { return 3; }
if (MouseButton == EKeys::ThumbMouseButton2) { return 4; }
if (MouseButton == EKeys::LeftMouseButton) { return 0; }
if (MouseButton == EKeys::RightMouseButton) { return 1; }
if (MouseButton == EKeys::MiddleMouseButton) { return 2; }
if (MouseButton == EKeys::ThumbMouseButton) { return 3; }
if (MouseButton == EKeys::ThumbMouseButton2) { return 4; }
return -1;
}
@@ -121,17 +121,6 @@ void SCogImguiWidget::TickFocus()
{
FCogImguiModule& Module = FCogImguiModule::Get();
if (UWorld* World = GameViewport->GetWorld())
{
if (APlayerController* Controller = FCogImguiInputHelper::GetFirstLocalPlayerController(*World))
{
if (FCogImguiInputHelper::WasKeyInfoJustPressed(*Controller, Module.GetToggleInputKey()))
{
Module.ToggleEnableInput();
}
}
}
const bool bShouldEnableInput = Module.GetEnableInput();
if (bEnableInput != bShouldEnableInput)
{
@@ -264,18 +253,19 @@ FVector2D SCogImguiWidget::ComputeDesiredSize(float Scale) const
//--------------------------------------------------------------------------------------------------------------------------
ULocalPlayer* SCogImguiWidget::GetLocalPlayer() const
{
if (GameViewport.IsValid())
{
if (UWorld* World = GameViewport->GetWorld())
{
if (ULocalPlayer* LocalPlayer = World->GetFirstLocalPlayerFromController())
{
return World->GetFirstLocalPlayerFromController();
}
}
if (GameViewport.IsValid() == false)
{
return nullptr;
}
return nullptr;
UWorld* World = GameViewport->GetWorld();
if (World == nullptr)
{
return nullptr;
}
ULocalPlayer* LocalPlayer = World->GetFirstLocalPlayerFromController();
return LocalPlayer;
}
//--------------------------------------------------------------------------------------------------------------------------
@@ -358,7 +348,7 @@ FReply SCogImguiWidget::OnKeyChar(const FGeometry& MyGeometry, const FCharacterE
//--------------------------------------------------------------------------------------------------------------------------
FReply SCogImguiWidget::OnKeyDown(const FGeometry& MyGeometry, const FKeyEvent& KeyEvent)
{
if (FCogImguiInputHelper::IsKeyEventHandled(KeyEvent) == false)
if (FCogImguiInputHelper::IsKeyEventHandled(GameViewport->GetWorld(), KeyEvent) == false)
{
return FReply::Unhandled();
}
@@ -377,7 +367,7 @@ FReply SCogImguiWidget::OnKeyDown(const FGeometry& MyGeometry, const FKeyEvent&
//--------------------------------------------------------------------------------------------------------------------------
FReply SCogImguiWidget::OnKeyUp(const FGeometry& MyGeometry, const FKeyEvent& KeyEvent)
{
if (FCogImguiInputHelper::IsKeyEventHandled(KeyEvent) == false)
if (FCogImguiInputHelper::IsKeyEventHandled(GameViewport->GetWorld(), KeyEvent) == false)
{
return FReply::Unhandled();
}
@@ -5,6 +5,7 @@
#include "imgui.h"
struct FCogImGuiKeyInfo;
struct FKeyBind;
class COGIMGUI_API FCogImguiInputHelper
{
@@ -12,7 +13,7 @@ public:
static APlayerController* GetFirstLocalPlayerController(UWorld& World);
static bool IsKeyEventHandled(const FKeyEvent& KeyEvent);
static bool IsKeyEventHandled(UWorld* World, const FKeyEvent& KeyEvent);
static bool WasKeyInfoJustPressed(APlayerController& PlayerController, const FCogImGuiKeyInfo& KeyInfo);
@@ -20,9 +21,17 @@ public:
static bool IsKeyEventMatchingKeyInfo(const FKeyEvent& KeyEvent, const FCogImGuiKeyInfo& InputChord);
static bool IsKeyEventMatchingKeyBind(const FKeyEvent& KeyEvent, const FKeyBind& KeyBind);
static ECheckBoxState MakeCheckBoxState(uint8 RequireValue, uint8 IgnoreValue);
static void KeyBindToKeyInfo(const FKeyBind& KeyBind, FCogImGuiKeyInfo& KeyInfo);
static void KeyInfoToKeyBind(const FCogImGuiKeyInfo& KeyInfo, FKeyBind& KeyBind);
static bool IsConsoleEvent(const FKeyEvent& KeyEvent);
static bool IsImGuiToggleInputEvent(const FKeyEvent& KeyEvent);
static bool IsKeyBoundToCommand(UWorld* World, const FKeyEvent& KeyEvent);
static bool IsStopPlaySessionEvent(const FKeyEvent& KeyEvent);
@@ -35,10 +35,6 @@ public:
void ToggleEnableInput() { bEnabledInput = !bEnabledInput; }
const FCogImGuiKeyInfo& GetToggleInputKey() const { return ToggleInputKey; }
void SetToggleInputKey(const FCogImGuiKeyInfo& Value) { ToggleInputKey = Value; }
private:
void Initialize();
@@ -47,5 +43,4 @@ private:
ImFontAtlas DefaultFontAtlas;
bool bEnabledInput = true;
bool bIsInitialized = false;
FCogImGuiKeyInfo ToggleInputKey;
};
@@ -3,10 +3,11 @@
#include "CogDebugDrawImGui.h"
#include "CogImguiModule.h"
#include "CogImguiWidget.h"
#include "CogWindow_Spacing.h"
#include "CogWindow_Settings.h"
#include "CogWindow_Spacing.h"
#include "CogWindowWidgets.h"
#include "Engine/Engine.h"
#include "HAL/IConsoleManager.h"
#include "imgui_internal.h"
//--------------------------------------------------------------------------------------------------------------------------
@@ -36,6 +37,25 @@ void UCogWindowManager::InitializeInternal()
SpaceWindows.Add(CreateWindow<UCogWindow_Spacing>("Spacing 4", false));
SettingsWindow = CreateWindow<UCogWindow_Settings>("Window.Settings", false);
ConsoleCommands.Add(IConsoleManager::Get().RegisterConsoleCommand(
TEXT("Cog.ToggleInput"),
TEXT("Toggle the input focus between the Game and ImGui"),
FConsoleCommandWithArgsDelegate::CreateLambda([](const TArray<FString>& Args) { FCogImguiModule::Get().ToggleEnableInput(); }),
ECVF_Cheat));
ConsoleCommands.Add(IConsoleManager::Get().RegisterConsoleCommand(
TEXT("Cog.LoadLayout"),
TEXT("Load the layout. Cog.LoadLayout <Index>"),
FConsoleCommandWithArgsDelegate::CreateLambda([this](const TArray<FString>& Args) { if (Args.Num() > 0) { LoadLayout(FCString::Atoi(*Args[0])); }}),
ECVF_Cheat));
ConsoleCommands.Add(IConsoleManager::Get().RegisterConsoleCommand(
TEXT("Cog.SaveLayout"),
TEXT("Save the layout. Cog.SaveLayout <Index>"),
FConsoleCommandWithArgsDelegate::CreateLambda([this](const TArray<FString>& Args) { if (Args.Num() > 0) { SaveLayout(FCString::Atoi(*Args[0])); }}),
ECVF_Cheat));
}
//--------------------------------------------------------------------------------------------------------------------------
@@ -47,6 +67,11 @@ void UCogWindowManager::Shutdown()
Window->SaveConfig();
}
for (IConsoleObject* ConsoleCommand : ConsoleCommands)
{
IConsoleManager::Get().UnregisterConsoleObject(ConsoleCommand);
}
SaveConfig();
}
@@ -190,7 +215,7 @@ void UCogWindowManager::CloseAllWindows()
}
//--------------------------------------------------------------------------------------------------------------------------
void UCogWindowManager::LoadLayout(int LayoutIndex)
void UCogWindowManager::LoadLayout(int32 LayoutIndex)
{
for (UCogWindow* Window : Windows)
{
@@ -201,7 +226,7 @@ void UCogWindowManager::LoadLayout(int LayoutIndex)
}
//--------------------------------------------------------------------------------------------------------------------------
void UCogWindowManager::SaveLayout(int LayoutIndex)
void UCogWindowManager::SaveLayout(int32 LayoutIndex)
{
FString Filename = *FCogImguiHelper::GetIniFilePath(FString::Printf(TEXT("imgui_layout_%d"), LayoutIndex));
ImGui::SaveIniSettingsToDisk(TCHAR_TO_ANSI(*Filename));
@@ -1,9 +1,12 @@
#include "CogWindowWidgets.h"
#include "CogImguiHelper.h"
#include "Kismet/KismetMathLibrary.h"
#include "CogImGuiKeyInfo.h"
#include "CogImguiInputHelper.h"
#include "imgui.h"
#include "imgui_internal.h"
#include "InputCoreTypes.h"
#include "Kismet/KismetMathLibrary.h"
//--------------------------------------------------------------------------------------------------------------------------
void FCogWindowWidgets::BeginTableTooltip()
@@ -283,4 +286,193 @@ bool FCogWindowWidgets::ComboboxEnum(const char* Label, UEnum* Enum, int64 Curre
}
return HasChanged;
}
//--------------------------------------------------------------------------------------------------------------------------
bool FCogWindowWidgets::CheckBoxState(const char* Label, ECheckBoxState& State)
{
const char* TooltipText = nullptr;
ImVec4 ButtonColor = ImGui::GetStyleColorVec4(ImGuiCol_Button);
ImVec4 TextColor = ImGui::GetStyleColorVec4(ImGuiCol_Text);
switch (State)
{
case ECheckBoxState::Checked:
{
TooltipText = "Checked";
break;
}
case ECheckBoxState::Unchecked:
{
ButtonColor.w = 0.5f;
TextColor.w = 0.5f;
TooltipText = "Unchecked";
break;
}
case ECheckBoxState::Undetermined:
{
ButtonColor.w = 0.1f;
TextColor.w = 0.1f;
TooltipText = "Undetermined";
break;
}
}
ImGui::PushStyleColor(ImGuiCol_Text, TextColor);
ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(ButtonColor.x, ButtonColor.y, ButtonColor.z, ButtonColor.w * 0.6f));
ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(ButtonColor.x, ButtonColor.y, ButtonColor.z, ButtonColor.w * 0.8f));
ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(ButtonColor.x, ButtonColor.y, ButtonColor.z, ButtonColor.w * 1.0f));
ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(1.0f, 1.0f, 1.0f, 0.1f));
ImGui::PushStyleVar(ImGuiStyleVar_FrameBorderSize, 1.0f);
const bool Pressed = ImGui::Button(Label);
if (State == ECheckBoxState::Unchecked)
{
ImVec2 Pos = ImGui::GetItemRectMin();
ImVec2 Size = ImGui::GetItemRectSize();
ImGui::GetWindowDrawList()->AddLine(ImVec2(Pos.x, Pos.y + Size.y * 0.5f), ImVec2(Pos.x + Size.x, Pos.y + Size.y * 0.5f), IM_COL32(255, 255, 255, 255), 0.0f);
}
ImGui::PopStyleVar();
ImGui::PopStyleColor(5);
if (ImGui::IsItemHovered(ImGuiHoveredFlags_Stationary))
{
ImGui::SetTooltip(TooltipText);
}
if (Pressed)
{
switch (State)
{
case ECheckBoxState::Checked: State = ECheckBoxState::Unchecked; break;
case ECheckBoxState::Unchecked: State = ECheckBoxState::Undetermined; break;
case ECheckBoxState::Undetermined: State = ECheckBoxState::Checked; break;
}
}
return Pressed;
}
//--------------------------------------------------------------------------------------------------------------------------
bool FCogWindowWidgets::InputKey(const char* Label, FCogImGuiKeyInfo& KeyInfo)
{
ImGui::PushID(Label);
ImGui::AlignTextToFramePadding();
ImGui::TextUnformatted(Label);
const bool HasChanged = InputKey(KeyInfo);
ImGui::PopID();
return HasChanged;
}
//--------------------------------------------------------------------------------------------------------------------------
bool FCogWindowWidgets::InputKey(FCogImGuiKeyInfo& KeyInfo)
{
static TArray<FKey> AllKeys;
if (AllKeys.IsEmpty())
{
EKeys::GetAllKeys(AllKeys);
}
bool HasKeyChanged = false;
ImGui::SetNextItemWidth(ImGui::GetFontSize() * 6);
if (ImGui::BeginCombo("##Key", TCHAR_TO_ANSI(*KeyInfo.Key.ToString()), ImGuiComboFlags_HeightLarge))
{
for (int32 i = 0; i < AllKeys.Num(); ++i)
{
const FKey Key = AllKeys[i];
if (Key.IsDigital() == false || Key.IsDeprecated() || Key.IsBindableToActions() == false || Key.IsMouseButton() || Key.IsTouch() || Key.IsGamepadKey())
{
continue;
}
bool IsSelected = KeyInfo.Key == Key;
if (ImGui::Selectable(TCHAR_TO_ANSI(*Key.ToString()), IsSelected))
{
KeyInfo.Key = Key;
HasKeyChanged = true;
}
}
ImGui::EndCombo();
}
ImGui::SameLine();
HasKeyChanged |= CheckBoxState("Ctrl", KeyInfo.Ctrl);
ImGui::SameLine();
HasKeyChanged |= CheckBoxState("Shift", KeyInfo.Shift);
ImGui::SameLine();
HasKeyChanged |= CheckBoxState("Alt", KeyInfo.Alt);
ImGui::SameLine();
HasKeyChanged |= CheckBoxState("Cmd", KeyInfo.Cmd);
return HasKeyChanged;
}
//--------------------------------------------------------------------------------------------------------------------------
bool FCogWindowWidgets::KeyBind(FKeyBind& KeyBind)
{
static char Buffer[256] = "";
const char* Str = TCHAR_TO_ANSI(*KeyBind.Command);
ImStrncpy(Buffer, Str, IM_ARRAYSIZE(Buffer));
bool HasChanged = false;
ImGui::SetNextItemWidth(ImGui::GetFontSize() * 15);
if (ImGui::InputText("##Command", Buffer, IM_ARRAYSIZE(Buffer)))
{
KeyBind.Command = FString(Buffer);
HasChanged = true;
}
FCogImGuiKeyInfo KeyInfo;
FCogImguiInputHelper::KeyBindToKeyInfo(KeyBind, KeyInfo);
ImGui::SameLine();
if (InputKey(KeyInfo))
{
HasChanged = true;
FCogImguiInputHelper::KeyInfoToKeyBind(KeyInfo, KeyBind);
}
return HasChanged;
}
//--------------------------------------------------------------------------------------------------------------------------
bool FCogWindowWidgets::ButtonWithTooltip(const char* Text, const char* Tooltip)
{
bool IsPressed = ImGui::Button(Text);
if (ImGui::IsItemHovered(ImGuiHoveredFlags_Stationary))
{
ImGui::SetTooltip(Tooltip);
}
return IsPressed;
}
//--------------------------------------------------------------------------------------------------------------------------
bool FCogWindowWidgets::DeleteArrayItemButton()
{
bool IsPressed = ImGui::Button("x");
if (ImGui::IsItemHovered(ImGuiHoveredFlags_Stationary))
{
ImGui::SetTooltip("Delete Item");
}
return IsPressed;
}
@@ -9,18 +9,12 @@
UCogWindow_Settings::UCogWindow_Settings()
{
bHasMenu = false;
ToggleInputKey.Key = EKeys::Tab;
}
//--------------------------------------------------------------------------------------------------------------------------
void UCogWindow_Settings::PostInitProperties()
{
Super::PostInitProperties();
if (ToggleInputKey.Key != EKeys::Invalid)
{
FCogImguiModule::Get().SetToggleInputKey(ToggleInputKey);
}
}
//--------------------------------------------------------------------------------------------------------------------------
@@ -49,52 +43,6 @@ void UCogWindow_Settings::RenderContent()
ImGui::Separator();
ImGui::Text("Toggle Input Key");
TArray<FKey> Keys;
EKeys::GetAllKeys(Keys);
bool HasKeyChanged = false;
FCogWindowWidgets::SetNextItemToShortWidth();
if (ImGui::BeginCombo("Key", TCHAR_TO_ANSI(*ToggleInputKey.Key.ToString())))
{
for (int32 i = 0; i < Keys.Num(); ++i)
{
const FKey Key = Keys[i];
if (Key.IsDigital() == false || Key.IsDeprecated())
{
continue;
}
bool IsSelected = ToggleInputKey.Key == Key;
if (ImGui::Selectable(TCHAR_TO_ANSI(*Key.ToString()), IsSelected))
{
ToggleInputKey.Key = Key;
HasKeyChanged = true;
}
}
ImGui::EndCombo();
}
FCogWindowWidgets::SetNextItemToShortWidth();
HasKeyChanged |= FCogWindowWidgets::ComboboxEnum("Ctrl", ToggleInputKey.Ctrl);
FCogWindowWidgets::SetNextItemToShortWidth();
HasKeyChanged |= FCogWindowWidgets::ComboboxEnum("Shift", ToggleInputKey.Shift);
FCogWindowWidgets::SetNextItemToShortWidth();
HasKeyChanged |= FCogWindowWidgets::ComboboxEnum("Alt", ToggleInputKey.Alt);
FCogWindowWidgets::SetNextItemToShortWidth();
HasKeyChanged |= FCogWindowWidgets::ComboboxEnum("Cmd", ToggleInputKey.Cmd);
if (HasKeyChanged)
{
FCogImguiModule::Get().SetToggleInputKey(ToggleInputKey);
}
ImGui::Separator();
ImGui::Spacing();
ImGui::Spacing();
if (ImGui::Button("Reset All Windows Config"))
@@ -5,10 +5,11 @@
#include "imgui.h"
#include "CogWindowManager.generated.h"
class IConsoleObject;
class SCogImguiWidget;
class UCogWindow;
class UCogWindow_Settings;
class UWorld;
class SCogImguiWidget;
struct ImGuiSettingsHandler;
struct ImGuiTextBuffer;
@@ -48,9 +49,9 @@ public:
void ResetLayout();
void LoadLayout(int LayoutIndex);
void LoadLayout(int32 LayoutIndex);
void SaveLayout(int LayoutIndex);
void SaveLayout(int32 LayoutIndex);
bool GetHideAllWindows() const { return bHideAllWindows; }
@@ -147,4 +148,6 @@ protected:
bool bHideAllWindows = false;
bool bRefreshDPIScale = false;
TArray<IConsoleObject*> ConsoleCommands;
};
@@ -6,6 +6,7 @@
class UEnum;
class FEnumProperty;
struct FCogImGuiKeyInfo;
class COGWINDOW_API FCogWindowWidgets
{
@@ -51,6 +52,18 @@ public:
static bool ComboboxEnum(const char* Label, const FEnumProperty* EnumProperty, uint8* PointerToEnumValue);
static bool CheckBoxState(const char* Label, ECheckBoxState& State);
static bool InputKey(const char* Label, FCogImGuiKeyInfo& KeyInfo);
static bool InputKey(FCogImGuiKeyInfo& KeyInfo);
static bool KeyBind(FKeyBind& KeyBind);
static bool ButtonWithTooltip(const char* Text, const char* Tooltip);
static bool DeleteArrayItemButton();
};
template<typename EnumType>
@@ -5,6 +5,7 @@
#include "CogImGuiKeyInfo.h"
#include "CogWindow_Settings.generated.h"
UCLASS(Config = Cog)
class COGWINDOW_API UCogWindow_Settings : public UCogWindow
{
@@ -22,6 +23,4 @@ protected:
private:
UPROPERTY(Config)
FCogImGuiKeyInfo ToggleInputKey;
};
@@ -100,7 +100,7 @@ void UCogAIWindow_Blackboard::RenderContent()
{
Keys.Sort([](const FBlackboardEntry& Key1, const FBlackboardEntry& Key2)
{
return Key1.EntryName.Compare(Key1.EntryName) < 0;
return Key1.EntryName.Compare(Key2.EntryName) < 0;
});
}
+8 -26
View File
@@ -25,13 +25,14 @@
#include "CogEngineDataAsset.h"
#include "CogEngineModule.h"
#include "CogEngineWindow_Collisions.h"
#include "CogEngineWindow_CommandBindings.h"
#include "CogEngineWindow_DebugSettings.h"
#include "CogEngineWindow_ImGui.h"
#include "CogEngineWindow_Inspector.h"
#include "CogEngineWindow_LogCategories.h"
#include "CogEngineWindow_Metrics.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"
@@ -43,6 +44,7 @@
#include "CogInputDataAsset.h"
#include "CogInputWindow_Actions.h"
#include "CogInputWindow_Gamepad.h"
#include "CogSampleLogCategories.h"
#include "CogWindowManager.h"
#include "GameFramework/GameUserSettings.h"
@@ -94,6 +96,7 @@ void ACogSampleGameState::EndPlay(const EEndPlayReason::Type EndPlayReason)
Super::EndPlay(EndPlayReason);
#if ENABLE_COG
if (CogWindowManager != nullptr)
{
CogWindowManager->Shutdown();
@@ -123,9 +126,6 @@ void ACogSampleGameState::Tick(float DeltaSeconds)
//--------------------------------------------------------------------------------------------------------------------------
void ACogSampleGameState::InitializeCog()
{
FCogImguiModule::Get().SetToggleInputKey(FCogImGuiKeyInfo(EKeys::Tab));
RegisterCommand(TEXT("Cog.ToggleInput"), TEXT(""), FConsoleCommandWithArgsDelegate::CreateUObject(this, &ACogSampleGameState::CogToggleInput));
CogWindowManager = NewObject<UCogWindowManager>(this);
CogWindowManagerRef = CogWindowManager;
@@ -137,6 +137,8 @@ void ACogSampleGameState::InitializeCog()
UCogEngineWindow_Collisions* CollisionsWindow = CogWindowManager->CreateWindow<UCogEngineWindow_Collisions>("Engine.Collision");
CollisionsWindow->SetAsset(EngineAsset);
CogWindowManager->CreateWindow<UCogEngineWindow_CommandBindings>("Engine.Command Bindings");
CogWindowManager->CreateWindow<UCogEngineWindow_DebugSettings>("Engine.Debug Settings");
CogWindowManager->CreateWindow<UCogEngineWindow_ImGui>("Engine.ImGui");
@@ -150,9 +152,6 @@ void ACogSampleGameState::InitializeCog()
}
});
CogWindowManager->CreateWindow<UCogEngineWindow_LogCategories>("Engine.Log Categories");
CogWindowManager->CreateWindow<UCogEngineWindow_NetEmulation>("Engine.Net Emulation");
@@ -163,7 +162,7 @@ void ACogSampleGameState::InitializeCog()
CogWindowManager->CreateWindow<UCogEngineWindow_Plots>("Engine.Plots");
UCogEngineWindow_Selection* SelectionWindow = CogWindowManager->CreateWindow<UCogEngineWindow_Selection>("Engine.Selection");
SelectionWindow = CogWindowManager->CreateWindow<UCogEngineWindow_Selection>("Engine.Selection");
SelectionWindow->SetActorClasses({ ACharacter::StaticClass(), AActor::StaticClass(), AGameModeBase::StaticClass(), AGameStateBase::StaticClass() });
SelectionWindow->SetTraceType(UEngineTypes::ConvertToTraceType(ECollisionChannel::ECC_Pawn));
@@ -223,25 +222,8 @@ void ACogSampleGameState::InitializeCog()
//---------------------------------------
// Main Menu Widget
//---------------------------------------
CogWindowManager->AddMainMenuWidget(SelectionWindow);
CogWindowManager->AddMainMenuWidget(SelectionWindow.Get());
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<FString>& Args)
{
FCogImguiModule::Get().ToggleEnableInput();
}
#endif //ENABLE_COG
+4 -2
View File
@@ -6,6 +6,7 @@
#include "CogSampleGameState.generated.h"
class UCogWindowManager;
class UCogEngineWindow_Selection;
UCLASS()
class ACogSampleGameState : public AGameStateBase
@@ -32,11 +33,12 @@ private:
void InitializeCog();
void RegisterCommand(const TCHAR* Name, const TCHAR* Help, const FConsoleCommandWithArgsDelegate& Command);
void RegisterCommands();
void CogToggleInput(const TArray<FString>& Args);
void UnregisterCommands();
TObjectPtr<UCogWindowManager> CogWindowManager = nullptr;
TObjectPtr<UCogEngineWindow_Selection> SelectionWindow = nullptr;
#endif //ENABLE_COG
};