diff --git a/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_NetImGui.cpp b/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_NetImGui.cpp index cc0a189..a0308fc 100644 --- a/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_NetImGui.cpp +++ b/Plugins/Cog/Source/CogEngine/Private/CogEngineWindow_NetImGui.cpp @@ -1,8 +1,13 @@ #include "CogEngineWindow_NetImGui.h" +#include "CogImguiContext.h" +#include "CogImguiHelper.h" +#include "CogWindowConsoleCommandManager.h" +#include "CogWindowManager.h" #include "CogWindowWidgets.h" #include "imgui.h" #include "imgui_internal.h" +#include "Misc/CoreMisc.h" #include "NetImgui_Api.h" //-------------------------------------------------------------------------------------------------------------------------- @@ -11,11 +16,54 @@ void FCogEngineWindow_NetImGui::Initialize() Super::Initialize(); bHasMenu = true; Config = GetConfig(); + + FCogWindowConsoleCommandManager::RegisterWorldConsoleCommand( + TEXT("Cog.NetImgui.ConnectTo"), + TEXT("Connect to NetImgui server"), + GetWorld(), + FCogWindowConsoleCommandDelegate::CreateLambda([this](const TArray& InArgs, UWorld* InWorld) + { + ConnectTo(); + })); + + FCogWindowConsoleCommandManager::RegisterWorldConsoleCommand( + TEXT("Cog.NetImgui.ConnectFrom"), + TEXT("Listen for NetImgui server connection"), + GetWorld(), + FCogWindowConsoleCommandDelegate::CreateLambda([this](const TArray& InArgs, UWorld* InWorld) + { + ConnectFrom(); + })); + + FCogWindowConsoleCommandManager::RegisterWorldConsoleCommand( + TEXT("Cog.NetImgui.Disconnect"), + TEXT("Disconnect from NetImgui server"), + GetWorld(), + FCogWindowConsoleCommandDelegate::CreateLambda([this](const TArray& InArgs, UWorld* InWorld) + { + Disconnect(); + })); } //-------------------------------------------------------------------------------------------------------------------------- void FCogEngineWindow_NetImGui::Shutdown() { + if (NetImgui::IsConnected()) + { + ImGui::TextUnformatted("Status: Connected"); + if (ImGui::Button("Disconnect")) + { + NetImgui::Disconnect(); + } + } + else if (NetImgui::IsConnectionPending()) + { + ImGui::TextUnformatted("Status: Waiting Server"); + if (ImGui::Button("Cancel")) + { + NetImgui::Disconnect(); + } + } } //-------------------------------------------------------------------------------------------------------------------------- @@ -31,6 +79,23 @@ void FCogEngineWindow_NetImGui::RenderHelp() ImGui::Text(""); } +//-------------------------------------------------------------------------------------------------------------------------- +void FCogEngineWindow_NetImGui::RenderTick(float DeltaTime) +{ + //------------------------------------------------------ + // Before auto connecting, wait for NetImgui startup, + // which require imgui context to be initialized + //------------------------------------------------------ + if (HasAlreadyTriedToConnectOnDedicatedServer == false + && Config->AutoConnectOnDedicatedServer + && UCogWindowManager::GetIsNetImguiInitialized() + && IsRunningDedicatedServer()) + { + ConnectFrom(); + HasAlreadyTriedToConnectOnDedicatedServer = true; + } +} + //-------------------------------------------------------------------------------------------------------------------------- void FCogEngineWindow_NetImGui::RenderContent() { @@ -52,6 +117,8 @@ void FCogEngineWindow_NetImGui::RenderContent() } ImGui::InputInt("Server Port", &Config->ServerPort); + ImGui::Separator(); + { static char Buffer[256] = ""; ImStrncpy(Buffer, TCHAR_TO_ANSI(*Config->ClientName), IM_ARRAYSIZE(Buffer)); @@ -62,6 +129,9 @@ void FCogEngineWindow_NetImGui::RenderContent() } ImGui::InputInt("Client Port", &Config->ClientPort); + ImGui::Separator(); + ImGui::Checkbox("Auto Listen On Dedicated Server", &Config->AutoConnectOnDedicatedServer); + ImGui::EndMenu(); } @@ -90,9 +160,7 @@ void FCogEngineWindow_NetImGui::RenderContent() if (ImGui::Button("Connect", ImVec2(ImGui::GetContentRegionAvail().x, 0))) { - const auto clientName = StringCast(*Config->ClientName); - const auto serverName = StringCast(*Config->ServerName); - NetImgui::ConnectToApp(clientName.Get(), serverName.Get(), Config->ServerPort, nullptr, nullptr); + ConnectTo(); } if (ImGui::IsItemHovered()) { @@ -101,8 +169,7 @@ void FCogEngineWindow_NetImGui::RenderContent() if (ImGui::Button("Listen", ImVec2(ImGui::GetContentRegionAvail().x, 0))) { - const auto clientName = StringCast(*Config->ClientName); - NetImgui::ConnectFromApp(clientName.Get(), Config->ClientPort, nullptr, nullptr); + ConnectFrom(); } if (ImGui::IsItemHovered()) { @@ -113,6 +180,44 @@ void FCogEngineWindow_NetImGui::RenderContent() #endif // #if NETIMGUI_ENABLED } +//-------------------------------------------------------------------------------------------------------------------------- +void FCogEngineWindow_NetImGui::ConnectTo() +{ + FCogImGuiContextScope ImGuiContextScope(GetOwner()->GetContext()); + + UE_LOG(LogCogImGui, Verbose, TEXT("FCogEngineWindow_NetImGui::ConnectTo | Client:%s | Server:%s | ServerPort:%d"), + *Config->ClientName, + *Config->ServerName, + Config->ServerPort); + + const auto clientName = StringCast(*Config->ClientName); + const auto serverName = StringCast(*Config->ServerName); + NetImgui::ConnectToApp(clientName.Get(), serverName.Get(), Config->ServerPort, nullptr, nullptr); +} + +//-------------------------------------------------------------------------------------------------------------------------- +void FCogEngineWindow_NetImGui::ConnectFrom() +{ + FCogImGuiContextScope ImGuiContextScope(GetOwner()->GetContext()); + + UE_LOG(LogCogImGui, Verbose, TEXT("FCogEngineWindow_NetImGui::ConnectFrom | Client:%s | ClientPort:%d"), + *Config->ClientName, + Config->ClientPort); + + const auto clientName = StringCast(*Config->ClientName); + NetImgui::ConnectFromApp(clientName.Get(), Config->ClientPort, nullptr, nullptr); +} + +//-------------------------------------------------------------------------------------------------------------------------- +void FCogEngineWindow_NetImGui::Disconnect() +{ + FCogImGuiContextScope ImGuiContextScope(GetOwner()->GetContext()); + + UE_LOG(LogCogImGui, Verbose, TEXT("FCogEngineWindow_NetImGui::Disconnect")); + NetImgui::Disconnect(); +} + +//-------------------------------------------------------------------------------------------------------------------------- void UCogEngineConfig_NetImGui::Reset() { Super::Reset(); diff --git a/Plugins/Cog/Source/CogEngine/Public/CogEngineWindow_NetImGui.h b/Plugins/Cog/Source/CogEngine/Public/CogEngineWindow_NetImGui.h index 4b972a9..8cd31db 100644 --- a/Plugins/Cog/Source/CogEngine/Public/CogEngineWindow_NetImGui.h +++ b/Plugins/Cog/Source/CogEngine/Public/CogEngineWindow_NetImGui.h @@ -25,9 +25,21 @@ protected: virtual void RenderContent() override; + virtual void RenderTick(float DeltaTime); + + void ConnectTo(); + + void ConnectFrom(); + + void Disconnect(); + + void TryStartup(); + private: TWeakObjectPtr Config = nullptr; + + bool HasAlreadyTriedToConnectOnDedicatedServer = false; }; //-------------------------------------------------------------------------------------------------------------------------- @@ -51,4 +63,7 @@ public: UPROPERTY(Config) int32 ClientPort = 8889; + + UPROPERTY(Config) + bool AutoConnectOnDedicatedServer = true; }; \ No newline at end of file diff --git a/Plugins/Cog/Source/CogImgui/Private/CogImguiContext.cpp b/Plugins/Cog/Source/CogImgui/Private/CogImguiContext.cpp index 5246c61..2c13401 100644 --- a/Plugins/Cog/Source/CogImgui/Private/CogImguiContext.cpp +++ b/Plugins/Cog/Source/CogImgui/Private/CogImguiContext.cpp @@ -57,20 +57,16 @@ void FCogImguiContext::Initialize() { IMGUI_CHECKVERSION(); - if (FSlateApplication::IsInitialized() == false) - { - return; - } - - FSlateApplication& SlateApp = FSlateApplication::Get(); - GameViewport = GEngine->GameViewport; - SAssignNew(MainWidget, SCogImguiWidget).Context(this); - GameViewport->AddViewportWidgetContent(MainWidget.ToSharedRef(), TNumericLimits::Max()); + if (GameViewport != nullptr) + { + SAssignNew(MainWidget, SCogImguiWidget).Context(this); + GameViewport->AddViewportWidgetContent(MainWidget.ToSharedRef(), TNumericLimits::Max()); - SAssignNew(InputCatcherWidget, SCogImguiInputCatcherWidget).Context(this); - GameViewport->AddViewportWidgetContent(InputCatcherWidget.ToSharedRef(), -TNumericLimits::Max()); + SAssignNew(InputCatcherWidget, SCogImguiInputCatcherWidget).Context(this); + GameViewport->AddViewportWidgetContent(InputCatcherWidget.ToSharedRef(), -TNumericLimits::Max()); + } ImGuiContext = ImGui::CreateContext(); PlotContext = ImPlot::CreateContext(); @@ -101,7 +97,7 @@ void FCogImguiContext::Initialize() ImGuiViewport* MainViewport = ImGui::GetMainViewport(); FCogImGuiViewportData* ViewportData = new FCogImGuiViewportData(); MainViewport->PlatformUserData = ViewportData; - ViewportData->Window = SlateApp.GetActiveTopLevelWindow(); + ViewportData->Window = FSlateApplication::IsInitialized() ? FSlateApplication::Get().GetActiveTopLevelWindow() : nullptr; ViewportData->Context = this; ViewportData->Widget = MainWidget; @@ -124,11 +120,23 @@ void FCogImguiContext::Initialize() PlatformIO.Platform_SetWindowAlpha = ImGui_SetWindowAlpha; PlatformIO.Platform_RenderWindow = ImGui_RenderWindow; - if (const TSharedPtr PlatformApplication = SlateApp.GetPlatformApplication()) + if (FSlateApplication::IsInitialized()) { + if (const TSharedPtr PlatformApplication = FSlateApplication::Get().GetPlatformApplication()) + { + FDisplayMetrics DisplayMetrics; + PlatformApplication->GetInitialDisplayMetrics(DisplayMetrics); + PlatformApplication->OnDisplayMetricsChanged().AddRaw(this, &FCogImguiContext::OnDisplayMetricsChanged); + OnDisplayMetricsChanged(DisplayMetrics); + } + } + else + { + FMonitorInfo monitorInfo; + monitorInfo.bIsPrimary = true; + monitorInfo.DisplayRect = FPlatformRect(0, 0, 1080, 720); FDisplayMetrics DisplayMetrics; - PlatformApplication->GetInitialDisplayMetrics(DisplayMetrics); - PlatformApplication->OnDisplayMetricsChanged().AddRaw(this, &FCogImguiContext::OnDisplayMetricsChanged); + DisplayMetrics.MonitorInfo.Add(monitorInfo); OnDisplayMetricsChanged(DisplayMetrics); } } @@ -136,31 +144,30 @@ void FCogImguiContext::Initialize() //-------------------------------------------------------------------------------------------------------------------------- void FCogImguiContext::Shutdown() { - if (FSlateApplication::IsInitialized() == false) - { - return; - } - FCogImGuiContextScope ImGuiContextScope(ImGuiContext, PlotContext); - ImGuiViewport* MainViewport = ImGui::GetMainViewport(); - if (const FCogImGuiViewportData* ViewportData = static_cast(MainViewport->PlatformUserData)) + if (ImGuiViewport* MainViewport = ImGui::GetMainViewport()) { - delete ViewportData; - MainViewport->PlatformUserData = nullptr; + if (const FCogImGuiViewportData* ViewportData = static_cast(MainViewport->PlatformUserData)) + { + delete ViewportData; + MainViewport->PlatformUserData = nullptr; + } } if (FSlateApplication::IsInitialized()) { - FSlateApplication& SlateApp = FSlateApplication::Get(); - if (const TSharedPtr PlatformApplication = SlateApp.GetPlatformApplication()) + if (const TSharedPtr PlatformApplication = FSlateApplication::Get().GetPlatformApplication()) { PlatformApplication->OnDisplayMetricsChanged().RemoveAll(this); } } - GameViewport->RemoveViewportWidgetContent(MainWidget.ToSharedRef()); - GameViewport->RemoveViewportWidgetContent(InputCatcherWidget.ToSharedRef()); + if (GameViewport != nullptr) + { + GameViewport->RemoveViewportWidgetContent(MainWidget.ToSharedRef()); + GameViewport->RemoveViewportWidgetContent(InputCatcherWidget.ToSharedRef()); + } if (PlotContext) { @@ -190,7 +197,7 @@ void FCogImguiContext::OnDisplayMetricsChanged(const FDisplayMetrics& DisplayMet ImGuiMonitor.MainSize = ImVec2(Monitor.DisplayRect.Right - Monitor.DisplayRect.Left, Monitor.DisplayRect.Bottom - Monitor.DisplayRect.Top); ImGuiMonitor.WorkPos = ImVec2(Monitor.WorkArea.Left, Monitor.WorkArea.Top); ImGuiMonitor.WorkSize = ImVec2(Monitor.WorkArea.Right - Monitor.WorkArea.Left, Monitor.WorkArea.Bottom - Monitor.WorkArea.Top); - ImGuiMonitor.DpiScale = Monitor.DPI; + ImGuiMonitor.DpiScale = 1.0f; if (Monitor.bIsPrimary) { @@ -221,7 +228,15 @@ bool FCogImguiContext::BeginFrame(float InDeltaTime) ImGuiIO& IO = ImGui::GetIO(); IO.DeltaTime = InDeltaTime; - IO.DisplaySize = FCogImguiHelper::ToImVec2(MainWidget->GetTickSpaceGeometry().GetAbsoluteSize()); + + if (MainWidget != nullptr) + { + IO.DisplaySize = FCogImguiHelper::ToImVec2(MainWidget->GetTickSpaceGeometry().GetAbsoluteSize()); + } + else + { + IO.DisplaySize = ImVec2(1080, 720); + } //------------------------------------------------------------------------------------------------------- // Build font @@ -234,36 +249,41 @@ bool FCogImguiContext::BeginFrame(float InDeltaTime) //------------------------------------------------------------------------------------------------------- // Update which viewport is under the mouse //------------------------------------------------------------------------------------------------------- - ImGuiID MouseViewportId = 0; - - FSlateApplication& SlateApp = FSlateApplication::Get(); - FWidgetPath WidgetsUnderCursor = SlateApp.LocateWindowUnderMouse(SlateApp.GetCursorPos(), SlateApp.GetInteractiveTopLevelWindows()); - if (WidgetsUnderCursor.IsValid()) + if (FSlateApplication::IsInitialized()) { - TSharedRef Window = WidgetsUnderCursor.GetWindow(); - ImGuiID* ViewportId = WindowToViewportMap.Find(Window); + ImGuiID MouseViewportId = 0; - if (ViewportId != nullptr) + FWidgetPath WidgetsUnderCursor = FSlateApplication::Get().LocateWindowUnderMouse( + FSlateApplication::Get().GetCursorPos(), + FSlateApplication::Get().GetInteractiveTopLevelWindows()); + + if (WidgetsUnderCursor.IsValid()) { - MouseViewportId = *ViewportId; - } - else - { - MouseViewportId = ImGui::GetMainViewport()->ID; + TSharedRef Window = WidgetsUnderCursor.GetWindow(); + ImGuiID* ViewportId = WindowToViewportMap.Find(Window); + + if (ViewportId != nullptr) + { + MouseViewportId = *ViewportId; + } + else + { + MouseViewportId = ImGui::GetMainViewport()->ID; + } } + + IO.AddMouseViewportEvent(MouseViewportId); + + //------------------------------------------------------------------------------------------------------- + // Refresh modifiers otherwise, when pressing ALT-TAB, the Alt modifier is always true + //------------------------------------------------------------------------------------------------------- + FModifierKeysState ModifierKeys = FSlateApplication::Get().GetModifierKeys(); + if (ModifierKeys.IsControlDown() != IO.KeyCtrl) { IO.AddKeyEvent(ImGuiMod_Ctrl, ModifierKeys.IsControlDown()); } + if (ModifierKeys.IsShiftDown() != IO.KeyShift) { IO.AddKeyEvent(ImGuiMod_Shift, ModifierKeys.IsShiftDown()); } + if (ModifierKeys.IsAltDown() != IO.KeyAlt) { IO.AddKeyEvent(ImGuiMod_Alt, ModifierKeys.IsAltDown()); } + if (ModifierKeys.IsCommandDown() != IO.KeySuper) { IO.AddKeyEvent(ImGuiMod_Super, ModifierKeys.IsCommandDown()); } } - IO.AddMouseViewportEvent(MouseViewportId); - - //------------------------------------------------------------------------------------------------------- - // Refresh modifiers otherwise, when pressing ALT-TAB, the Alt modifier is always true - //------------------------------------------------------------------------------------------------------- - FModifierKeysState ModifierKeys = FSlateApplication::Get().GetModifierKeys(); - if (ModifierKeys.IsControlDown() != IO.KeyCtrl) { IO.AddKeyEvent(ImGuiMod_Ctrl, ModifierKeys.IsControlDown()); } - if (ModifierKeys.IsShiftDown() != IO.KeyShift) { IO.AddKeyEvent(ImGuiMod_Shift, ModifierKeys.IsShiftDown()); } - if (ModifierKeys.IsAltDown() != IO.KeyAlt) { IO.AddKeyEvent(ImGuiMod_Alt, ModifierKeys.IsAltDown()); } - if (ModifierKeys.IsCommandDown() != IO.KeySuper) { IO.AddKeyEvent(ImGuiMod_Super, ModifierKeys.IsCommandDown()); } - //------------------------------------------------------------------------------------------------------- // //------------------------------------------------------------------------------------------------------- @@ -276,35 +296,32 @@ bool FCogImguiContext::BeginFrame(float InDeltaTime) IO.ConfigFlags |= ImGuiConfigFlags_NoMouse; } - //------------------------------------------------------------------------------------------------------- - // - //------------------------------------------------------------------------------------------------------- - const bool bHasMouse = (IO.ConfigFlags & ImGuiConfigFlags_NoMouse) == 0; - const bool bUpdateMouseMouseCursor = (IO.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange) == 0; - if (bHasMouse && bUpdateMouseMouseCursor) + if (MainWidget != nullptr) { - MainWidget->SetCursor(FCogImguiInputHelper::ToSlateMouseCursor(ImGui::GetMouseCursor())); - } + const bool bHasMouse = (IO.ConfigFlags & ImGuiConfigFlags_NoMouse) == 0; + const bool bUpdateMouseMouseCursor = (IO.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange) == 0; + if (bHasMouse && bUpdateMouseMouseCursor) + { + MainWidget->SetCursor(FCogImguiInputHelper::ToSlateMouseCursor(ImGui::GetMouseCursor())); + } - //------------------------------------------------------------------------------------------------------- - // - //------------------------------------------------------------------------------------------------------- - const FVector2D& MousePosition = SlateApp.GetCursorPos(); - if (IO.ConfigFlags & ImGuiConfigFlags_ViewportsEnable) - { - IO.AddMousePosEvent(MousePosition.X, MousePosition.Y); - } - else - { - const FVector2D TransformedMousePosition = MousePosition - MainWidget->GetTickSpaceGeometry().GetAbsolutePosition(); - IO.AddMousePosEvent(TransformedMousePosition.X, TransformedMousePosition.Y); + if (FSlateApplication::IsInitialized()) + { + const FVector2D& MousePosition = FSlateApplication::Get().GetCursorPos(); + if (IO.ConfigFlags & ImGuiConfigFlags_ViewportsEnable) + { + IO.AddMousePosEvent(MousePosition.X, MousePosition.Y); + } + else + { + const FVector2D TransformedMousePosition = MousePosition - MainWidget->GetTickSpaceGeometry().GetAbsolutePosition(); + IO.AddMousePosEvent(TransformedMousePosition.X, TransformedMousePosition.Y); + } + } } bWantCaptureMouse = ImGui::GetIO().WantCaptureMouse; - //------------------------------------------------------------------------------------------------------- - // - //------------------------------------------------------------------------------------------------------- if (bRefreshDPIScale) { bRefreshDPIScale = false; @@ -338,6 +355,11 @@ void FCogImguiContext::EndFrame() //-------------------------------------------------------------------------------------------------------------------------- void FCogImguiContext::ImGui_CreateWindow(ImGuiViewport* Viewport) { + if (FSlateApplication::IsInitialized() == false) + { + return; + } + if (Viewport->ParentViewportId == 0) { return; @@ -633,13 +655,16 @@ void FCogImguiContext::SetEnableInput(bool Value) { bEnableInput = Value; + if (FSlateApplication::IsInitialized() == false) + { + return; + } + if (bEnableInput) { FSlateThrottleManager::Get().DisableThrottle(true); bIsThrottleDisabled = true; - FSlateApplication& SlateApp = FSlateApplication::Get(); - if (ULocalPlayer* LocalPlayer = GetLocalPlayer()) { LocalPlayer->GetSlateOperations() @@ -653,7 +678,7 @@ void FCogImguiContext::SetEnableInput(bool Value) { FSlateThrottleManager::Get().DisableThrottle(false); } - + if (ULocalPlayer* LocalPlayer = GetLocalPlayer()) { LocalPlayer->GetSlateOperations().CaptureMouse(GameViewport->GetGameViewportWidget().ToSharedRef()); @@ -680,6 +705,11 @@ void FCogImguiContext::SetShareMouseWithGameplay(bool Value) //-------------------------------------------------------------------------------------------------------------------------- void FCogImguiContext::RefreshMouseCursor() { + if (FSlateApplication::IsInitialized() == false) + { + return; + } + //------------------------------------------------------------------------------------------- // Focus the main widget when enabling input otherwise the mouse can still be hidden because // the gameplay might have the focus and might hide the cursor. @@ -693,21 +723,24 @@ void FCogImguiContext::RefreshMouseCursor() //------------------------------------------------------------------------------------------- // Force to show the cursor when sharing mouse with gameplay for games that hide the cursor //------------------------------------------------------------------------------------------- - if (APlayerController* PlayerController = GetLocalPlayerController(GameViewport->GetWorld())) + if (GameViewport != nullptr) { - if (bHasSavedInitialCursorVisibility == false) + if (APlayerController* PlayerController = GetLocalPlayerController(GameViewport->GetWorld())) { - bIsCursorInitiallyVisible = PlayerController->ShouldShowMouseCursor(); - bHasSavedInitialCursorVisibility = true; - } + if (bHasSavedInitialCursorVisibility == false) + { + bIsCursorInitiallyVisible = PlayerController->ShouldShowMouseCursor(); + bHasSavedInitialCursorVisibility = true; + } - if (bEnableInput && bShareMouse && bShareMouseWithGameplay) - { - PlayerController->SetShowMouseCursor(true); - } - else - { - PlayerController->SetShowMouseCursor(bIsCursorInitiallyVisible); + if (bEnableInput && bShareMouse && bShareMouseWithGameplay) + { + PlayerController->SetShowMouseCursor(true); + } + else + { + PlayerController->SetShowMouseCursor(bIsCursorInitiallyVisible); + } } } } @@ -771,7 +804,9 @@ void FCogImguiContext::BuildFont() //-------------------------------------------------------------------------------------------------------------------------- bool FCogImguiContext::IsConsoleOpened() const { - return GameViewport->ViewportConsole && GameViewport->ViewportConsole->ConsoleState != NAME_None; + return GameViewport != nullptr + && GameViewport->ViewportConsole + && GameViewport->ViewportConsole->ConsoleState != NAME_None; } //-------------------------------------------------------------------------------------------------------------------------- @@ -790,15 +825,14 @@ void FCogImguiContext::DrawDebug() ImVec2 LocalSize = FCogImguiHelper::ToImVec2(MainWidget->GetTickSpaceGeometry().GetLocalSize()); ImGui::InputFloat2("Widget Local Size", &LocalSize.x, "%0.1f"); - FSlateApplication& SlateApp = FSlateApplication::Get(); - ImVec2 MousePosition = FCogImguiHelper::ToImVec2(SlateApp.GetCursorPos()); + ImVec2 MousePosition = FCogImguiHelper::ToImVec2(FSlateApplication::Get().GetCursorPos()); ImGui::InputFloat2("Mouse", &MousePosition.x, "%0.1f"); ImGuiIO& IO = ImGui::GetIO(); ImGui::InputFloat2("ImGui Mouse", &IO.MousePos.x, "%0.1f"); FString Focus = "None"; - if (TSharedPtr KeyboardFocusedWidget = SlateApp.GetKeyboardFocusedWidget()) + if (TSharedPtr KeyboardFocusedWidget = FSlateApplication::Get().GetKeyboardFocusedWidget()) { Focus = KeyboardFocusedWidget->ToString(); } diff --git a/Plugins/Cog/Source/CogImgui/Public/CogImguiHelper.h b/Plugins/Cog/Source/CogImgui/Public/CogImguiHelper.h index a40f9be..e1d7cf6 100644 --- a/Plugins/Cog/Source/CogImgui/Public/CogImguiHelper.h +++ b/Plugins/Cog/Source/CogImgui/Public/CogImguiHelper.h @@ -5,7 +5,7 @@ #include "Layout/SlateRect.h" #include "Rendering/SlateRenderTransform.h" -COGIMGUI_API DECLARE_LOG_CATEGORY_EXTERN(LogCogImGui, Warning, All); +COGIMGUI_API DECLARE_LOG_CATEGORY_EXTERN(LogCogImGui, Verbose, All); struct ImGuiWindow; diff --git a/Plugins/Cog/Source/CogWindow/Private/CogWindowManager.cpp b/Plugins/Cog/Source/CogWindow/Private/CogWindowManager.cpp index 92bd73f..1db0303 100644 --- a/Plugins/Cog/Source/CogWindow/Private/CogWindowManager.cpp +++ b/Plugins/Cog/Source/CogWindow/Private/CogWindowManager.cpp @@ -13,6 +13,7 @@ #include "GameFramework/PlayerInput.h" #include "HAL/IConsoleManager.h" #include "imgui_internal.h" +#include "Misc/CoreMisc.h" #include "Misc/EngineVersionComparison.h" #include "NetImgui_Api.h" @@ -200,7 +201,7 @@ void UCogWindowManager::Tick(float DeltaTime) { FCogImGuiContextScope ImGuiContextScope(Context); - if (GEngine->GameViewport == nullptr) + if (GEngine->GameViewport == nullptr && IsRunningDedicatedServer() == false) { return; } diff --git a/Plugins/Cog/Source/CogWindow/Public/CogWindowManager.h b/Plugins/Cog/Source/CogWindow/Public/CogWindowManager.h index 2b8064c..c0a058b 100644 --- a/Plugins/Cog/Source/CogWindow/Public/CogWindowManager.h +++ b/Plugins/Cog/Source/CogWindow/Public/CogWindowManager.h @@ -79,6 +79,8 @@ public: static void SortCommands(UPlayerInput* PlayerInput); + static bool GetIsNetImguiInitialized() { return IsNetImguiInitialized; } + protected: friend class FCogWindow_Layouts;