6fa78218d2
There was an intermittent crash related to garbage in the level name box with prefabs, possibly due to levelName being uninitialized. This change improves the UX by listing out all the possible choices, instead of making people type it in.
758 lines
34 KiB
C++
758 lines
34 KiB
C++
/*
|
|
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
|
|
* its licensors.
|
|
*
|
|
* For complete copyright and license terms please see the LICENSE at the root of this
|
|
* distribution (the "License"). All use of this software is governed by the License,
|
|
* or, if provided, by the license below or the license accompanying this file. Do not
|
|
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
*
|
|
*/
|
|
|
|
#include "ImGui_precompiled.h"
|
|
#include "ImGuiLYCommonMenu.h"
|
|
|
|
#ifdef IMGUI_ENABLED
|
|
#include <AzCore/std/string/conversions.h>
|
|
#include <AzCore/std/sort.h>
|
|
#include <AzFramework/Input/Buses/Requests/InputSystemCursorRequestBus.h>
|
|
#include <AzFramework/Input/Devices/Mouse/InputDeviceMouse.h>
|
|
#include <ILevelSystem.h>
|
|
#include "ImGuiColorDefines.h"
|
|
#include "LYImGuiUtils/ImGuiDrawHelpers.h"
|
|
|
|
namespace ImGui
|
|
{
|
|
// Resolution Widths to recommend for usage for both O3DE Rendering and/or ImGui Rendering
|
|
static int s_renderResolutionWidths[7] = { 800, 1280, 1600, 1920, 2560, 3440, 3840 };
|
|
static int s_renderAspectRatios[4][2] = { {16,9}, {16,10}, {43,18}, {4,3} };
|
|
static const char* s_toggleTelemetryConsoleCmd = "radtm_ToggleEnabled 1";
|
|
|
|
ImGuiLYCommonMenu::ImGuiLYCommonMenu()
|
|
: m_telemetryCaptureTime(8.0f)
|
|
, m_telemetryCaptureTimeRemaining(-1.0f)
|
|
, m_controllerLegendWindowVisible(false)
|
|
{
|
|
}
|
|
ImGuiLYCommonMenu::~ImGuiLYCommonMenu()
|
|
{
|
|
}
|
|
|
|
void ImGuiLYCommonMenu::Initialize()
|
|
{
|
|
// Connect EBusses
|
|
ImGuiUpdateListenerBus::Handler::BusConnect();
|
|
|
|
// init sub menu objects
|
|
m_assetExplorer.Initialize();
|
|
m_cameraMonitor.Initialize();
|
|
m_entityOutliner.Initialize();
|
|
}
|
|
|
|
void ImGuiLYCommonMenu::Shutdown()
|
|
{
|
|
// Disconnect EBusses
|
|
ImGuiUpdateListenerBus::Handler::BusDisconnect();
|
|
|
|
// shutdown sub menu objects
|
|
m_assetExplorer.Shutdown();
|
|
m_cameraMonitor.Shutdown();
|
|
m_entityOutliner.Shutdown();
|
|
}
|
|
|
|
static auto SystemCursorStateComboGetter = []([[maybe_unused]] void* contextPtr, int idx, const char** out_text)
|
|
{
|
|
AzFramework::SystemCursorState cursorState = static_cast<AzFramework::SystemCursorState>(idx);
|
|
switch (cursorState)
|
|
{
|
|
default:
|
|
break;
|
|
|
|
case AzFramework::SystemCursorState::Unknown:
|
|
*out_text = "*unknown*";
|
|
return true;
|
|
|
|
case AzFramework::SystemCursorState::ConstrainedAndHidden:
|
|
*out_text = "ConstrainedAndHidden";
|
|
return true;
|
|
|
|
case AzFramework::SystemCursorState::ConstrainedAndVisible:
|
|
*out_text = "ConstrainedAndVisible";
|
|
return true;
|
|
|
|
case AzFramework::SystemCursorState::UnconstrainedAndHidden:
|
|
*out_text = "UnconstrainedAndHidden";
|
|
return true;
|
|
|
|
case AzFramework::SystemCursorState::UnconstrainedAndVisible:
|
|
*out_text = "UnconstrainedAndVisible";
|
|
return true;
|
|
|
|
}
|
|
|
|
*out_text = "*error_unimplemented*";
|
|
return false;
|
|
};
|
|
|
|
void ImGuiLYCommonMenu::OnImGuiUpdate()
|
|
{
|
|
if (ImGui::BeginMainMenuBar())
|
|
{
|
|
// Get Discrete Input state now, we will use it both inside the ImGui SubMenu, and along the main task bar ( when it is on )
|
|
bool discreteInputEnabled = false;
|
|
ImGuiManagerBus::BroadcastResult(discreteInputEnabled, &IImGuiManager::GetEnableDiscreteInputMode);
|
|
|
|
// Input Mode Display
|
|
{
|
|
const float prevCursorPos = ImGui::GetCursorPosX();
|
|
ImGui::SetCursorPosX(ImGui::GetWindowWidth() - 300.0f);
|
|
|
|
AZStd::string inputTitle = "Input: ";
|
|
if (!discreteInputEnabled)
|
|
{
|
|
inputTitle.append("ImGui & Game");
|
|
}
|
|
else
|
|
{
|
|
// Discrete Input - Control ImGui and Game independently.
|
|
ImGui::DisplayState state;
|
|
ImGui::ImGuiManagerBus::BroadcastResult(state, &ImGui::IImGuiManager::GetClientMenuBarState);
|
|
if (state == DisplayState::Visible)
|
|
{
|
|
inputTitle.append("ImGui");
|
|
}
|
|
else
|
|
{
|
|
inputTitle.append("Game");
|
|
}
|
|
}
|
|
|
|
if (ImGui::BeginMenu(inputTitle.c_str()))
|
|
{
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Discrete Input Mode. Currently Enabled:");
|
|
ImGui::SameLine();
|
|
ImGui::TextColored(ImGui::Colors::s_NiceLabelColor, discreteInputEnabled ? "True" : "False");
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, " * Discrete Input mode ON: All input goes to both ImGui and the Game, all the time.");
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, " * Discrete Input mode OFF: ImGui has three states 1)ImGui On, Input->ImGui, 2)ImGui On, Input->Game 3) ImGui Off");
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, " * Hot Tip: use the LY Common -> ImGui Menu to toggle on and off discrete input mode, or the CVAR: 'imgui_DiscreteInputMode'");
|
|
ImGui::Separator();
|
|
ImGui::Text("Controller Legend ");
|
|
ImGui::SameLine();
|
|
if (ImGui::SmallButton("Window"))
|
|
{
|
|
m_controllerLegendWindowVisible = true;
|
|
}
|
|
ImGui::SameLine();
|
|
if (ImGui::BeginMenu("Peek"))
|
|
{
|
|
OnImGuiUpdate_DrawControllerLegend();
|
|
ImGui::EndMenu();
|
|
}
|
|
|
|
ImGui::EndMenu(); // inputTitle
|
|
}
|
|
|
|
ImGui::SetCursorPosX(prevCursorPos);
|
|
}
|
|
|
|
// Add some space before the first menu so it won't overlap with view control buttons
|
|
ImGui::SetCursorPosX(40.f);
|
|
|
|
// Main Open 3D Engine menu
|
|
if (ImGui::BeginMenu("Open 3D Engine"))
|
|
{
|
|
// Asset Explorer
|
|
if (ImGui::MenuItem("Asset Explorer"))
|
|
{
|
|
m_assetExplorer.ToggleEnabled();
|
|
}
|
|
|
|
// Camera Monitor
|
|
if (ImGui::MenuItem("Camera Monitor"))
|
|
{
|
|
m_cameraMonitor.ToggleEnabled();
|
|
}
|
|
|
|
// LY Entity Outliner
|
|
if (ImGui::SmallButton("Launch"))
|
|
{
|
|
m_entityOutliner.ToggleEnabled();
|
|
}
|
|
ImGui::SameLine();
|
|
if (ImGui::BeginMenu("Entity Outliner"))
|
|
{
|
|
m_entityOutliner.ImGuiUpdate_DrawComponentViewSubMenu();
|
|
ImGui::EndMenu();
|
|
}
|
|
|
|
// Display Options
|
|
if (ImGui::BeginMenu("Display Info"))
|
|
{
|
|
// Display Info
|
|
static ICVar* rDisplayInfoCVar = gEnv->pConsole->GetCVar("r_DisplayInfo");
|
|
if (rDisplayInfoCVar)
|
|
{
|
|
int displayInfoVal = rDisplayInfoCVar->GetIVal();
|
|
int dragIntVal = displayInfoVal;
|
|
ImGui::Text("r_DisplayInfo: %d ( View Runtime LY Debug Stats)", displayInfoVal);
|
|
ImGui::SliderInt("##DisplayInfo", &dragIntVal, 0, 5);
|
|
|
|
if (dragIntVal != displayInfoVal)
|
|
{
|
|
rDisplayInfoCVar->Set(dragIntVal);
|
|
}
|
|
}
|
|
|
|
// Lod Min
|
|
static ICVar* eLodMinCVAR = gEnv->pConsole->GetCVar("e_LodMin");
|
|
if (eLodMinCVAR)
|
|
{
|
|
int minLodValue = eLodMinCVAR->GetIVal();
|
|
int dragIntVal = minLodValue;
|
|
ImGui::Text("e_LodMin: %d ( Force a lowest LOD level )", minLodValue);
|
|
ImGui::SliderInt("##LodMin", &dragIntVal, 0, 5);
|
|
if (dragIntVal != minLodValue)
|
|
{
|
|
eLodMinCVAR->Set(dragIntVal);
|
|
}
|
|
}
|
|
|
|
// Texel Density
|
|
static ICVar* eTexelDensityCVAR = gEnv->pConsole->GetCVar("e_texeldensity");
|
|
if (eTexelDensityCVAR)
|
|
{
|
|
int texelDensityValue = eTexelDensityCVAR->GetIVal();
|
|
int dragIntVal = texelDensityValue;
|
|
ImGui::Text("e_texeldensity: %d ( Used for Misc. LOD/MipMap debugging )", texelDensityValue);
|
|
ImGui::SliderInt("##texelDensity", &dragIntVal, 0, 2);
|
|
if (dragIntVal != texelDensityValue)
|
|
{
|
|
eTexelDensityCVAR->Set(dragIntVal);
|
|
}
|
|
}
|
|
|
|
ImGui::EndMenu();
|
|
}
|
|
|
|
// View Maps ( pending valid ILevelSystem )
|
|
auto lvlSystem = (gEnv && gEnv->pSystem) ? gEnv->pSystem->GetILevelSystem() : nullptr;
|
|
if (lvlSystem && ImGui::BeginMenu("Levels"))
|
|
{
|
|
if (lvlSystem->IsLevelLoaded())
|
|
{
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Current Level: ");
|
|
ImGui::SameLine();
|
|
ImGui::TextColored(ImGui::Colors::s_NiceLabelColor, "%s", lvlSystem->GetCurrentLevelName());
|
|
}
|
|
|
|
bool usePrefabSystemForLevels = false;
|
|
AzFramework::ApplicationRequests::Bus::BroadcastResult(
|
|
usePrefabSystemForLevels, &AzFramework::ApplicationRequests::IsPrefabSystemForLevelsEnabled);
|
|
|
|
if (usePrefabSystemForLevels)
|
|
{
|
|
// Run through all the assets in the asset catalog and gather up the list of level assets
|
|
|
|
AZ::Data::AssetType levelAssetType = lvlSystem->GetLevelAssetType();
|
|
AZStd::vector<AZStd::string> levelNames;
|
|
auto enumerateCB =
|
|
[levelAssetType, &levelNames]([[maybe_unused]] const AZ::Data::AssetId id, const AZ::Data::AssetInfo& assetInfo)
|
|
{
|
|
if (assetInfo.m_assetType == levelAssetType)
|
|
{
|
|
levelNames.emplace_back(assetInfo.m_relativePath);
|
|
}
|
|
};
|
|
|
|
AZ::Data::AssetCatalogRequestBus::Broadcast(
|
|
&AZ::Data::AssetCatalogRequestBus::Events::EnumerateAssets, nullptr, enumerateCB, nullptr);
|
|
|
|
AZStd::sort(levelNames.begin(), levelNames.end());
|
|
|
|
// Create a menu item for each level asset, with an action to load it if selected.
|
|
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Load Level: ");
|
|
for (int i = 0; i < levelNames.size(); i++)
|
|
{
|
|
if (ImGui::MenuItem(AZStd::string::format("%d- %s", i, levelNames[i].c_str()).c_str()))
|
|
{
|
|
AZ::TickBus::QueueFunction(
|
|
[lvlSystem, levelNames, i]()
|
|
{
|
|
lvlSystem->LoadLevel(levelNames[i].c_str());
|
|
});
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Load Level: ");
|
|
for (int i = 0; i < lvlSystem->GetLevelCount(); i++)
|
|
{
|
|
if (ImGui::MenuItem(AZStd::string::format("%d- %s", i, lvlSystem->GetLevelInfo(i)->GetName()).c_str()))
|
|
{
|
|
AZ::TickBus::QueueFunction([lvlSystem, i]() {
|
|
lvlSystem->LoadLevel(lvlSystem->GetLevelInfo(i)->GetName());
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
ImGui::EndMenu();
|
|
}
|
|
|
|
if (ImGui::BeginMenu("Mouse/Cursor"))
|
|
{
|
|
AzFramework::SystemCursorState currentCursorState;
|
|
AzFramework::InputSystemCursorRequestBus::EventResult(currentCursorState, AzFramework::InputDeviceMouse::Id, &AzFramework::InputSystemCursorRequests::GetSystemCursorState);
|
|
int comboCursorState = static_cast<int>(currentCursorState);
|
|
ImGui::Combo("System Cursor State", &comboCursorState, SystemCursorStateComboGetter, this, static_cast<int>(AzFramework::SystemCursorState::UnconstrainedAndVisible) + 1);
|
|
AzFramework::SystemCursorState postComboCursorState = static_cast<AzFramework::SystemCursorState>(comboCursorState);
|
|
|
|
if (postComboCursorState != currentCursorState)
|
|
{
|
|
AzFramework::InputSystemCursorRequestBus::Event(AzFramework::InputDeviceMouse::Id, &AzFramework::InputSystemCursorRequests::SetSystemCursorState, postComboCursorState);
|
|
}
|
|
|
|
ImGui::EndMenu();
|
|
}
|
|
|
|
if (ImGui::BeginMenu("Telemetry"))
|
|
{
|
|
bool telemetryToggleEnabled = false;
|
|
if (ImGui::MenuItem("Toggle Enabled"))
|
|
{
|
|
telemetryToggleEnabled = true;
|
|
m_telemetryCaptureTimeRemaining = -1;
|
|
}
|
|
|
|
if (telemetryToggleEnabled)
|
|
{
|
|
gEnv->pConsole->ExecuteString(s_toggleTelemetryConsoleCmd);
|
|
}
|
|
|
|
if (m_telemetryCaptureTimeRemaining <= 0.0f)
|
|
{
|
|
if (ImGui::SmallButton(AZStd::string::format("Enable for %.01f seconds \n(ImGui will close and re-open upon completion)", m_telemetryCaptureTime).c_str()))
|
|
{
|
|
StartTelemetryCapture();
|
|
}
|
|
ImGui::DragFloat("Capture Time", &m_telemetryCaptureTime, 0.1f, 0.1f, 600.0f);
|
|
}
|
|
else
|
|
{
|
|
ImGui::TextColored(ImGui::Colors::s_NiceLabelColor, "Currently Auto-Capturing for % .01f / % .01f", (m_telemetryCaptureTime - m_telemetryCaptureTimeRemaining), m_telemetryCaptureTime);
|
|
}
|
|
|
|
ImGui::EndMenu();
|
|
}
|
|
|
|
if (ImGui::BeginMenu("Video Options"))
|
|
{
|
|
// VSync
|
|
IMGUI_DRAW_CVAR_CHECKBOX("r_VSync", "VSync");
|
|
|
|
// Max Frame Rate
|
|
static ICVar* maxFPSCVar = gEnv->pConsole->GetCVar("sys_MaxFPS");
|
|
if (maxFPSCVar)
|
|
{
|
|
// Display max frame rate
|
|
ImGui::Text("Max FPS: %d", maxFPSCVar->GetIVal());
|
|
|
|
// Shortcut buttons
|
|
int fpsToSet = 0;
|
|
if (ImGui::SmallButton("30"))
|
|
{
|
|
fpsToSet = 30;
|
|
}
|
|
ImGui::SameLine();
|
|
if (ImGui::SmallButton("60"))
|
|
{
|
|
fpsToSet = 60;
|
|
}
|
|
ImGui::SameLine();
|
|
if (ImGui::SmallButton("unlocked"))
|
|
{
|
|
fpsToSet = -1;
|
|
}
|
|
|
|
// fpsToSet will be 0 if no one set it.
|
|
if (fpsToSet && fpsToSet != maxFPSCVar->GetIVal())
|
|
{
|
|
maxFPSCVar->Set(fpsToSet);
|
|
}
|
|
}
|
|
|
|
ImGui::Separator();
|
|
|
|
// FullScreen options
|
|
IMGUI_DRAW_CVAR_CHECKBOX("r_Fullscreen", "FullScreen");
|
|
IMGUI_DRAW_CVAR_CHECKBOX("r_FullscreenWindow", "FullScreen Window");
|
|
IMGUI_DRAW_CVAR_CHECKBOX("r_FullscreenNativeRes", "FullScreen Native Resolution");
|
|
|
|
ImGui::Separator();
|
|
|
|
// Render Resolution ( pending valid CVARS
|
|
static ICVar* widthCVar = gEnv->pConsole->GetCVar("r_width");
|
|
static ICVar* heightCVar = gEnv->pConsole->GetCVar("r_height");
|
|
if (widthCVar && heightCVar)
|
|
{
|
|
if (ImGui::BeginMenu(AZStd::string::format("Render Resolution ( %d x %d )", widthCVar->GetIVal(), heightCVar->GetIVal()).c_str()))
|
|
{
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Current Render Resolution: ");
|
|
ImGui::SameLine();
|
|
ImGui::TextColored(ImGui::Colors::s_NiceLabelColor, "%d x %d", widthCVar->GetIVal(), heightCVar->GetIVal());
|
|
|
|
const int aspectRatioCount = sizeof(s_renderAspectRatios) / sizeof(s_renderAspectRatios[0]);
|
|
const int resolutionWidthsCount = sizeof(s_renderResolutionWidths) / sizeof(s_renderResolutionWidths[0]);
|
|
for (int i = 0; i < aspectRatioCount; i++)
|
|
{
|
|
ImGui::TextColored(ImGui::Colors::s_NiceLabelColor, "%d:%d", s_renderAspectRatios[i][0], s_renderAspectRatios[i][1]);
|
|
for (int j = 0; j < resolutionWidthsCount; j++)
|
|
{
|
|
const int renderHeight = s_renderResolutionWidths[j] * s_renderAspectRatios[i][1] / s_renderAspectRatios[i][0];
|
|
if (ImGui::Button(AZStd::string::format("%d x %d", s_renderResolutionWidths[j], renderHeight).c_str(), ImVec2(400, 0)))
|
|
{
|
|
widthCVar->Set(s_renderResolutionWidths[j]);
|
|
heightCVar->Set(renderHeight);
|
|
}
|
|
}
|
|
}
|
|
|
|
// End Render Resolution menu
|
|
ImGui::EndMenu();
|
|
}
|
|
}
|
|
|
|
// End Video Options Menu
|
|
ImGui::EndMenu();
|
|
}
|
|
|
|
// Frame Rate Cap and VSync CVAR
|
|
if (ImGui::BeginMenu("ImGui Options"))
|
|
{
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Input Options:");
|
|
// Controller Support - Contextual
|
|
{
|
|
bool controllerEnabled = false;
|
|
ImGuiManagerBus::BroadcastResult(controllerEnabled, &IImGuiManager::IsControllerSupportModeEnabled, ImGuiControllerModeFlags::Contextual);
|
|
|
|
bool controllerEnabledCheckbox = controllerEnabled;
|
|
ImGui::Checkbox(AZStd::string::format("Controller Support (Contextual) %s (Click Checkbox to Toggle)", controllerEnabledCheckbox ? "On" : "Off").c_str(), &controllerEnabledCheckbox);
|
|
if (controllerEnabledCheckbox != controllerEnabled)
|
|
{
|
|
ImGuiManagerBus::Broadcast(&IImGuiManager::EnableControllerSupportMode, ImGuiControllerModeFlags::Contextual, controllerEnabledCheckbox);
|
|
}
|
|
}
|
|
|
|
// Controller Support - Mouse
|
|
{
|
|
bool controllerMouseEnabled = false;
|
|
ImGuiManagerBus::BroadcastResult(controllerMouseEnabled, &IImGuiManager::IsControllerSupportModeEnabled, ImGuiControllerModeFlags::Mouse);
|
|
|
|
bool controllerMouseEnabledCheckbox = controllerMouseEnabled;
|
|
ImGui::Checkbox(AZStd::string::format("Controller Support (Mouse) %s (Click Checkbox to Toggle)", controllerMouseEnabledCheckbox ? "On" : "Off").c_str(), &controllerMouseEnabledCheckbox);
|
|
if (controllerMouseEnabledCheckbox != controllerMouseEnabled)
|
|
{
|
|
ImGuiManagerBus::Broadcast(&IImGuiManager::EnableControllerSupportMode, ImGuiControllerModeFlags::Mouse, controllerMouseEnabledCheckbox);
|
|
}
|
|
|
|
// Only draw Controller Mouse Sensitivity slider if the mouse is enabled
|
|
if (controllerMouseEnabled)
|
|
{
|
|
float controllerMouseSensitivity = 1.0f;
|
|
ImGuiManagerBus::BroadcastResult(controllerMouseSensitivity, &IImGuiManager::GetControllerMouseSensitivity);
|
|
|
|
float controllerMouseSensitivitySlider = controllerMouseSensitivity;
|
|
ImGui::DragFloat("Controller Mouse Sensitivity", &controllerMouseSensitivitySlider, 0.1f, 0.1f, 50.0f);
|
|
|
|
if (controllerMouseSensitivitySlider != controllerMouseSensitivity)
|
|
{
|
|
ImGuiManagerBus::Broadcast(&IImGuiManager::SetControllerMouseSensitivity, controllerMouseSensitivitySlider);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Discrete Input Mode
|
|
{
|
|
bool discreteInputEnabledCheckbox = discreteInputEnabled;
|
|
ImGui::Checkbox(AZStd::string::format("Discrete Input %s (Click Checkbox to Toggle)", discreteInputEnabledCheckbox ? "On" : "Off").c_str(), &discreteInputEnabledCheckbox);
|
|
if (discreteInputEnabledCheckbox != discreteInputEnabled)
|
|
{
|
|
ImGuiManagerBus::Broadcast(&IImGuiManager::SetEnableDiscreteInputMode, discreteInputEnabledCheckbox);
|
|
}
|
|
}
|
|
|
|
// Controller Legend
|
|
ImGui::Text("Controller Legend ");
|
|
ImGui::SameLine();
|
|
if (ImGui::SmallButton("Window"))
|
|
{
|
|
m_controllerLegendWindowVisible = true;
|
|
}
|
|
ImGui::SameLine();
|
|
if (ImGui::BeginMenu("Peek"))
|
|
{
|
|
OnImGuiUpdate_DrawControllerLegend();
|
|
ImGui::EndMenu();
|
|
}
|
|
|
|
ImGui::Separator();
|
|
|
|
if (ImGui::BeginMenu("ImGui Resolution"))
|
|
{
|
|
// Resolution Mode
|
|
ImGui::TextColored(ImGui::Colors::s_NiceLabelColor, "ImGui Resolution Mode:");
|
|
|
|
ImGuiResolutionMode resMode = ImGuiResolutionMode::MatchRenderResolution;
|
|
ImGuiManagerBus::BroadcastResult(resMode, &IImGuiManager::GetResolutionMode);
|
|
|
|
int resModeRadioBtn = static_cast<int>(resMode);
|
|
ImGui::RadioButton("Force Resolution", &resModeRadioBtn, static_cast<int>(ImGuiResolutionMode::LockToResolution));
|
|
ImGui::SameLine();
|
|
ImGui::RadioButton("Match Render Resolution", &resModeRadioBtn, static_cast<int>(ImGuiResolutionMode::MatchRenderResolution));
|
|
ImGui::SameLine();
|
|
ImGui::RadioButton("Match Render Resolution To Max", &resModeRadioBtn, static_cast<int>(ImGuiResolutionMode::MatchToMaxRenderResolution));
|
|
|
|
ImGuiResolutionMode resModeRadioBtnResult = static_cast<ImGuiResolutionMode>(resModeRadioBtn);
|
|
if (resModeRadioBtnResult != resMode)
|
|
{
|
|
ImGuiManagerBus::Broadcast(&IImGuiManager::SetResolutionMode, resModeRadioBtnResult);
|
|
}
|
|
|
|
// Resolutions
|
|
ImVec2 imGuiRes;
|
|
ImGuiManagerBus::BroadcastResult(imGuiRes, &IImGuiManager::GetImGuiRenderResolution);
|
|
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Current ImGui Resolution: ");
|
|
ImGui::SameLine();
|
|
ImGui::TextColored(ImGui::Colors::s_NiceLabelColor, "%.0f x %.0f", imGuiRes.x, imGuiRes.y);
|
|
|
|
const int aspectRatioCount = sizeof(s_renderAspectRatios) / sizeof(s_renderAspectRatios[0]);
|
|
const int resolutionWidthsCount = sizeof(s_renderResolutionWidths) / sizeof(s_renderResolutionWidths[0]);
|
|
for (int i = 0; i < aspectRatioCount; i++)
|
|
{
|
|
ImGui::TextColored(ImGui::Colors::s_NiceLabelColor, "%d:%d", s_renderAspectRatios[i][0], s_renderAspectRatios[i][1]);
|
|
for (int j = 0; j < resolutionWidthsCount; j++)
|
|
{
|
|
const int renderHeight = s_renderResolutionWidths[j] * s_renderAspectRatios[i][1] / s_renderAspectRatios[i][0];
|
|
if (ImGui::Button(AZStd::string::format("%d x %d", s_renderResolutionWidths[j], renderHeight).c_str(), ImVec2(400, 0)))
|
|
{
|
|
ImVec2 newRenderRes(static_cast<float>(s_renderResolutionWidths[j]), static_cast<float>(renderHeight));
|
|
ImGuiManagerBus::Broadcast(&IImGuiManager::SetImGuiRenderResolution, newRenderRes);
|
|
}
|
|
}
|
|
}
|
|
|
|
// End ImGui Render Resolution menu
|
|
ImGui::EndMenu();
|
|
}
|
|
|
|
// End ImGui Options Menu
|
|
ImGui::EndMenu();
|
|
}
|
|
|
|
if (ImGui::BeginMenu("Misc."))
|
|
{
|
|
// Assert Level
|
|
static ICVar* gAssertLevelCVAR = gEnv->pConsole->GetCVar("sys_asserts");
|
|
if (gAssertLevelCVAR)
|
|
{
|
|
int assertLevelValue = gAssertLevelCVAR->GetIVal();
|
|
int dragIntVal = assertLevelValue;
|
|
ImGui::Text("sys_asserts: %d ( 0-off | 1-log | 2-popup | 3-crash )", assertLevelValue);
|
|
ImGui::SliderInt("##sys_asserts", &dragIntVal, 0, 3);
|
|
if (dragIntVal != assertLevelValue)
|
|
{
|
|
gAssertLevelCVAR->Set(dragIntVal);
|
|
}
|
|
}
|
|
|
|
// End Misc Options Menu
|
|
ImGui::EndMenu();
|
|
}
|
|
|
|
// End LY Common Tools menu
|
|
ImGui::EndMenu();
|
|
}
|
|
ImGuiUpdateListenerBus::Broadcast(&IImGuiUpdateListener::OnImGuiMainMenuUpdate);
|
|
ImGui::EndMainMenuBar();
|
|
}
|
|
|
|
// Update Contextual Controller Window
|
|
if (m_controllerLegendWindowVisible)
|
|
{
|
|
if (ImGui::Begin("Controller ImGui Input Legend", &m_controllerLegendWindowVisible, ImGuiWindowFlags_NoSavedSettings))
|
|
{
|
|
OnImGuiUpdate_DrawControllerLegend();
|
|
}
|
|
ImGui::End();
|
|
}
|
|
|
|
// Update sub menus
|
|
m_assetExplorer.ImGuiUpdate();
|
|
m_cameraMonitor.ImGuiUpdate();
|
|
m_entityOutliner.ImGuiUpdate();
|
|
}
|
|
|
|
void ImGuiLYCommonMenu::OnImGuiUpdate_DrawControllerLegend()
|
|
{
|
|
bool contextualControllerEnabled = false;
|
|
ImGuiManagerBus::BroadcastResult(contextualControllerEnabled, &IImGuiManager::IsControllerSupportModeEnabled, ImGuiControllerModeFlags::Contextual);
|
|
|
|
bool controllerMouseEnabled = false;
|
|
ImGuiManagerBus::BroadcastResult(controllerMouseEnabled, &IImGuiManager::IsControllerSupportModeEnabled, ImGuiControllerModeFlags::Mouse);
|
|
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Contextual Controller Input Legend. Currently Enabled:");
|
|
ImGui::SameLine();
|
|
ImGui::TextColored(ImGui::Colors::s_NiceLabelColor, contextualControllerEnabled ? "True" : "False");
|
|
ImGui::NewLine();
|
|
|
|
ImGui::Columns(2);
|
|
ImGui::SetColumnWidth(-1, 170.0f);
|
|
ImGui::TextColored(ImGui::Colors::s_NiceLabelColor, "Controller Input");
|
|
ImGui::NextColumn();
|
|
ImGui::TextColored(ImGui::Colors::s_NiceLabelColor, "ImGui Action");
|
|
ImGui::Separator();
|
|
ImGui::NextColumn();
|
|
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "D-Pad U/D/L/R");
|
|
ImGui::NextColumn();
|
|
ImGui::Bullet();
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Move");
|
|
ImGui::Bullet();
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Tweak Values (when activated with A)");
|
|
ImGui::Bullet();
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Resize Window (when holding X)");
|
|
ImGui::Separator();
|
|
ImGui::NextColumn();
|
|
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Left Stick");
|
|
ImGui::NextColumn();
|
|
ImGui::Bullet();
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Scroll");
|
|
ImGui::Bullet();
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Move Window (when holding X)");
|
|
ImGui::Separator();
|
|
ImGui::NextColumn();
|
|
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "X (Left Face Button)");
|
|
ImGui::NextColumn();
|
|
ImGui::Bullet();
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Tap: Toggle Menu");
|
|
ImGui::Bullet();
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Hold + L1/R1: Focus Windows");
|
|
ImGui::Bullet();
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Hold + D-Pad: Resize Window");
|
|
ImGui::Bullet();
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Hold + Left Stick: Move Window");
|
|
ImGui::Separator();
|
|
ImGui::NextColumn();
|
|
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Y (Upper Face Button)");
|
|
ImGui::NextColumn();
|
|
ImGui::Bullet();
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Exit text / on-screen keyboard");
|
|
ImGui::Separator();
|
|
ImGui::NextColumn();
|
|
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "B (Right Face Button)");
|
|
ImGui::NextColumn();
|
|
ImGui::Bullet();
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Cancel / Close / Exit");
|
|
ImGui::Separator();
|
|
ImGui::NextColumn();
|
|
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "A (Lower Face Button)");
|
|
ImGui::NextColumn();
|
|
ImGui::Bullet();
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Activate / Open / Toggle");
|
|
ImGui::Bullet();
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Tweak values with D-Pad");
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, " (+ L1/R1 to tweak slower/faster)");
|
|
ImGui::NextColumn();
|
|
|
|
ImGui::Columns(1);
|
|
ImGui::Separator();
|
|
|
|
ImGui::NewLine();
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Controller Mouse Legend. Currently Enabled:");
|
|
ImGui::SameLine();
|
|
ImGui::TextColored(ImGui::Colors::s_NiceLabelColor, controllerMouseEnabled ? "True" : "False");
|
|
ImGui::NewLine();
|
|
|
|
ImGui::Columns(2);
|
|
ImGui::SetColumnWidth(-1, 170.0f);
|
|
ImGui::TextColored(ImGui::Colors::s_NiceLabelColor, "Controller Input");
|
|
ImGui::NextColumn();
|
|
ImGui::TextColored(ImGui::Colors::s_NiceLabelColor, "Mouse Action");
|
|
ImGui::Separator();
|
|
ImGui::NextColumn();
|
|
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Left Stick");
|
|
ImGui::NextColumn();
|
|
ImGui::Bullet();
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Mova Mouse Pointer");
|
|
ImGui::Separator();
|
|
ImGui::NextColumn();
|
|
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "A");
|
|
ImGui::NextColumn();
|
|
ImGui::Bullet();
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Left Mouse Button (Btn1)");
|
|
ImGui::Separator();
|
|
ImGui::NextColumn();
|
|
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "B");
|
|
ImGui::NextColumn();
|
|
ImGui::Bullet();
|
|
ImGui::TextColored(ImGui::Colors::s_PlainLabelColor, "Right Mouse Button (Btn2)");
|
|
ImGui::NextColumn();
|
|
|
|
ImGui::Columns(1);
|
|
}
|
|
|
|
void ImGuiLYCommonMenu::StartTelemetryCapture()
|
|
{
|
|
// Start the Capture
|
|
gEnv->pConsole->ExecuteString(s_toggleTelemetryConsoleCmd);
|
|
|
|
// Set the timer and connect to tick bus to count down.
|
|
m_telemetryCaptureTimeRemaining = m_telemetryCaptureTime;
|
|
AZ::TickBus::Handler::BusConnect();
|
|
|
|
// Get the current ImGui Display state to restore it later.
|
|
ImGuiManagerBus::BroadcastResult(m_telemetryCapturePreCaptureState, &IImGuiManager::GetClientMenuBarState);
|
|
|
|
// Turn off the ImGui Manager
|
|
ImGuiManagerBus::Broadcast(&IImGuiManager::SetClientMenuBarState, DisplayState::Hidden);
|
|
}
|
|
|
|
void ImGuiLYCommonMenu::StopTelemetryCapture()
|
|
{
|
|
// Stop the Capture
|
|
gEnv->pConsole->ExecuteString(s_toggleTelemetryConsoleCmd);
|
|
|
|
// Restore ImGui State
|
|
// Turn off the ImGui Manager
|
|
ImGuiManagerBus::Broadcast(&IImGuiManager::SetClientMenuBarState, m_telemetryCapturePreCaptureState);
|
|
|
|
// Reset timer and disconnect tick bus
|
|
m_telemetryCaptureTimeRemaining = 0.0f;
|
|
AZ::TickBus::Handler::BusDisconnect();
|
|
}
|
|
|
|
// OnTick just used for telemetry captures.
|
|
void ImGuiLYCommonMenu::OnTick(float deltaTime, [[maybe_unused]] AZ::ScriptTimePoint time)
|
|
{
|
|
m_telemetryCaptureTimeRemaining -= deltaTime;
|
|
if (m_telemetryCaptureTimeRemaining <= 0.0f)
|
|
{
|
|
StopTelemetryCapture();
|
|
}
|
|
}
|
|
} // namespace ImGui
|
|
|
|
#endif // IMGUI_ENABLED
|