From 410d2791aea7770ce1f89cb09f21b7b07641623e Mon Sep 17 00:00:00 2001 From: Daniel Gibson Date: Thu, 30 May 2024 08:59:28 +0200 Subject: [PATCH] Dhewm3SettingsMenu: More video settings, a few other tweaks --- neo/framework/Dhewm3SettingsMenu.cpp | 66 +++++++++++++++++++++------- neo/sys/sys_imgui.cpp | 17 +++++-- 2 files changed, 64 insertions(+), 19 deletions(-) diff --git a/neo/framework/Dhewm3SettingsMenu.cpp b/neo/framework/Dhewm3SettingsMenu.cpp index 9b682e31..ffb02e80 100644 --- a/neo/framework/Dhewm3SettingsMenu.cpp +++ b/neo/framework/Dhewm3SettingsMenu.cpp @@ -1248,6 +1248,8 @@ static void DrawBindingsMenu() bindingsMenuAlreadyOpen = true; } + ImGui::Spacing(); + { // the InputInt will look kinda like this: // [10] [-] [+] Number of Binding columns... @@ -1593,12 +1595,8 @@ struct VidMode { } }; -static CVarOption videoOptionsApply[] = { - //CVarOption( "r_fullsc" ) -}; - static CVarOption videoOptionsImmediately[] = { - CVarOption( "Options that take effect in realtime" ), + CVarOption( "Options that take effect immediately" ), CVarOption( "r_swapInterval", []( idCVar& cvar ) { int curVsync = idMath::ClampInt( -1, 1, r_swapInterval.GetInteger() ); @@ -1646,7 +1644,7 @@ static CVarOption videoOptionsImmediately[] = { } else { ImGui::BeginDisabled(); bool b = false; - ImGui::Checkbox("Enable Anisotropic Filtering##disabled", &b ); + ImGui::Checkbox( "Enable Anisotropic Filtering##disabled", &b ); ImGui::EndDisabled(); descr = "Anisotropic filtering is not supported by this system!"; } @@ -1654,7 +1652,18 @@ static CVarOption videoOptionsImmediately[] = { } ), CVarOption( "r_brightness", "Brightness", OT_FLOAT, 0.5f, 2.0f ), CVarOption( "r_gamma", "Gamma", OT_FLOAT, 0.5f, 3.0f ), + CVarOption( "r_gammaInShader", "Apply gamma and brightness in shaders", OT_BOOL ), CVarOption( "r_scaleMenusTo43", "Scale fullscreen menus to 4:3", OT_BOOL ), + CVarOption( "r_screenshotFormat", []( idCVar& cvar ) { + // "Screenshot format. 0 = TGA (default), 1 = BMP, 2 = PNG, 3 = JPG" + int curFormat = idMath::ClampInt( 0, 3, cvar.GetInteger() ); + if ( ImGui::Combo( "Screenshot Format", &curFormat, "TGA\0BMP\0PNG\0JPG\0" ) ) { + cvar.SetInteger( curFormat ); + } + AddTooltip( "r_screenshotFormat" ); + } ), + CVarOption( "r_screenshotPngCompression", "Compression level for PNG screenshots", OT_INT, 0, 9 ), + CVarOption( "r_screenshotJpgQuality", "Quality level for JPG screenshots", OT_INT, 1, 100 ), CVarOption( "Advanced Options" ), CVarOption( "r_skipNewAmbient", "Disable High Quality Special Effects", OT_BOOL ), @@ -1669,6 +1678,7 @@ static int selModeIdx = 0; static int customVidRes[2]; static int fullscreenChoice = 0; static int msaaModeIndex = 0; +static int qualityPreset = 0; static void SetVideoStuffFromCVars() { @@ -1688,6 +1698,15 @@ static void SetVideoStuffFromCVars() const int msaa = r_multiSamples.GetInteger(); msaaModeIndex = Min( 4, ( msaa > 1 ) ? idMath::ILog2( msaa ) : 0 ); + + qualityPreset = com_machineSpec.GetInteger(); + if ( qualityPreset == -1 ) { + // if it's not set, most probably setMachineSpec hasn't been run yet + cmdSystem->BufferCommandText( CMD_EXEC_NOW, "setMachineSpec\n" ); + qualityPreset = com_machineSpec.GetInteger(); + if ( qualityPreset == -1 ) + qualityPreset = 1; // default to medium Quality + } } static bool VideoHasApplyableChanges() @@ -1743,7 +1762,6 @@ static void ApplyVideoSettings() static void InitVideoOptionsMenu() { - InitOptions( videoOptionsApply, IM_ARRAYSIZE(videoOptionsApply) ); InitOptions( videoOptionsImmediately, IM_ARRAYSIZE(videoOptionsImmediately) ); vidModes.SetNum(0, false); @@ -1771,6 +1789,26 @@ static void InitVideoOptionsMenu() static void DrawVideoOptionsMenu() { + ImGui::Spacing(); + ImGui::Combo( "##qualPresets", &qualityPreset, "Low Quality\0Medium Quality\0High Quality\0Ultra Quality\0" ); + AddTooltip( "com_machineSpec" ); + ImGui::SameLine(); + if ( ImGui::Button( "Load Quality Preset" ) ) { + com_machineSpec.SetInteger( qualityPreset ); // TODO: or always set this even if button is not pressed? + // execMachineSpec might change the MSAA value, so remember the old one (that's actually set) + const int oldMSAA = r_multiSamples.GetInteger(); + cmdSystem->BufferCommandText( CMD_EXEC_NOW, "execMachineSpec nores\n" ); + + const int newMSAA = r_multiSamples.GetInteger(); + if ( newMSAA != oldMSAA ) { + // select the modified MSAA mode in the slider, but restore the CVars old value + // so the Apply button is active and can be pressed for vid_restart + msaaModeIndex = Min( 4, ( newMSAA > 1 ) ? idMath::ILog2( newMSAA ) : 0 ); + r_multiSamples.SetInteger( oldMSAA ); + } + } + AddTooltip( "Sets lots of rendering-related CVars based on the selected quality" ); + ImGui::SeparatorText( "Options that must be applied" ); ImGui::Combo( "Window Mode", &fullscreenChoice, @@ -1802,17 +1840,9 @@ static void DrawVideoOptionsMenu() "8x Antialiasing (MSAA)###msaaLvl", "16x Antialiasing (MSAA)###msaaLvl" }; - ImGui::SliderInt( msaaLevels[msaaModeIndex], &msaaModeIndex, 0, 4, "", ImGuiSliderFlags_NoInput ); AddCVarOptionTooltips( r_multiSamples, "Note: Not all GPUs/drivers support all modes, esp. not 16x!" ); - // TODO: MSAA, what else? - // r_multiSamples - - // TODO: replicate quality settings from orig menu - - // TODO: vsync (does that need vid_restart?) r_swapInterval - if ( !VideoHasApplyableChanges() ) { ImGui::BeginDisabled(); ImGui::Button( "Apply" ); @@ -1843,6 +1873,7 @@ static bool showStyleEditor = false; static void DrawOtherOptionsMenu() { + ImGui::Spacing(); float scale = D3::ImGuiHooks::GetScale(); if ( ImGui::DragFloat("ImGui scale", &scale, 0.005f, 0.25f, 8.0f, "%.3f") ) { D3::ImGuiHooks::SetScale( scale ); @@ -1898,7 +1929,7 @@ static void DrawOtherOptionsMenu() static bool BeginTabChild( const char* name ) { - bool ret = ImGui::BeginChild( name ); + bool ret = ImGui::BeginChild( name, ImVec2(0, 0), 0, ImGuiWindowFlags_NavFlattened ); float itemWidth = fminf( ImGui::GetWindowWidth() * 0.5f, ImGui::GetFontSize() * 20.0f ); ImGui::PushItemWidth( itemWidth ); return ret; @@ -1908,6 +1939,9 @@ static bool BeginTabChild( const char* name ) void Com_DrawDhewm3SettingsMenu() { bool showSettingsWindow = true; + + ImGui::SetNextWindowCollapsed( false, ImGuiCond_Appearing ); + ImGui::Begin("dhewm3 Settings", &showSettingsWindow); ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_None; diff --git a/neo/sys/sys_imgui.cpp b/neo/sys/sys_imgui.cpp index bd2410c0..b5957f82 100644 --- a/neo/sys/sys_imgui.cpp +++ b/neo/sys/sys_imgui.cpp @@ -309,8 +309,18 @@ void Shutdown() // => ProcessEvent() has already been called (probably multiple times) void NewFrame() { - if (openImguiWindows == 0) - return; + // even if all windows are closed, still run a few frames + // so ImGui also recognizes internally that all windows are closed + // and e.g. ImGuiCond_Appearing works as intended + static int framesAfterAllWindowsClosed = 0; + if ( openImguiWindows == 0 ) { + if ( framesAfterAllWindowsClosed > 1 ) + return; + else + ++framesAfterAllWindowsClosed; + } else { + framesAfterAllWindowsClosed = 0; + } // Start the Dear ImGui frame ImGui_ImplOpenGL2_NewFrame(); @@ -574,9 +584,10 @@ ImGuiStyle GetImGuiStyle( Style d3style ) // make it look a bit nicer with rounded edges style.WindowRounding = 2.0f; style.FrameRounding = 3.0f; + style.FramePadding = ImVec2( 6.0f, 3.0f ); //style.ChildRounding = 6.0f; style.ScrollbarRounding = 8.0f; - style.GrabRounding = 1.0f; + style.GrabRounding = 3.0f; style.PopupRounding = 2.0f; SetDhewm3StyleColors( &style ); } else if ( d3style == Style::User ) {