Add scaling filter option (Nearest/Bilinear) (#39111)

This commit is contained in:
Pok
2025-07-27 20:26:17 +03:00
committed by GitHub
parent 8fdfb9deae
commit 688c91b597
5 changed files with 25 additions and 1 deletions

View File

@@ -25,6 +25,7 @@
<CheckBox Name="IntegerScalingCheckBox"
Text="{Loc 'ui-options-vp-integer-scaling'}"
ToolTip="{Loc 'ui-options-vp-integer-scaling-tooltip'}" />
<ui:OptionDropDown Name="DropDownFilterMode" Title="{Loc 'ui-options-filter-label'}" />
<CheckBox Name="ViewportVerticalFitCheckBox"
Text="{Loc 'ui-options-vp-vertical-fit'}"
ToolTip="{Loc 'ui-options-vp-vertical-fit-tooltip'}" />

View File

@@ -39,6 +39,14 @@ public sealed partial class GraphicsTab : Control
new OptionDropDownCVar<float>.ValueOption(2.00f, Loc.GetString("ui-options-scale-200")),
]);
Control.AddOptionDropDown(
CCVars.ViewportScalingFilterMode,
DropDownFilterMode,
[
new OptionDropDownCVar<string>.ValueOption("nearest", Loc.GetString("ui-options-filter-nearest")),
new OptionDropDownCVar<string>.ValueOption("bilinear", Loc.GetString("ui-options-filter-bilinear")),
]);
var vpStretch = Control.AddOptionCheckBox(CCVars.ViewportStretch, ViewportStretchCheckBox);
var vpVertFit = Control.AddOptionCheckBox(CCVars.ViewportVerticalFit, ViewportVerticalFitCheckBox);
Control.AddOptionSlider(
@@ -50,6 +58,7 @@ public sealed partial class GraphicsTab : Control
vpStretch.ImmediateValueChanged += _ => UpdateViewportSettingsVisibility();
vpVertFit.ImmediateValueChanged += _ => UpdateViewportSettingsVisibility();
IntegerScalingCheckBox.OnToggled += _ => UpdateViewportSettingsVisibility();
Control.AddOptionSlider(
CCVars.ViewportWidth,
@@ -77,6 +86,7 @@ public sealed partial class GraphicsTab : Control
IntegerScalingCheckBox.Visible = ViewportStretchCheckBox.Pressed;
ViewportVerticalFitCheckBox.Visible = ViewportStretchCheckBox.Pressed;
ViewportWidthSlider.Visible = !ViewportStretchCheckBox.Pressed || !ViewportVerticalFitCheckBox.Pressed;
DropDownFilterMode.Visible = !IntegerScalingCheckBox.Pressed && ViewportStretchCheckBox.Pressed;
}
private void UpdateViewportWidthRange()

View File

@@ -30,6 +30,8 @@ namespace Content.Client.UserInterface.Controls
};
AddChild(Viewport);
_cfg.OnValueChanged(CCVars.ViewportScalingFilterMode, _ => UpdateCfg(), true);
}
protected override void EnteredTree()
@@ -52,6 +54,7 @@ namespace Content.Client.UserInterface.Controls
var renderScaleUp = _cfg.GetCVar(CCVars.ViewportScaleRender);
var fixedFactor = _cfg.GetCVar(CCVars.ViewportFixedScaleFactor);
var verticalFit = _cfg.GetCVar(CCVars.ViewportVerticalFit);
var filterMode = _cfg.GetCVar(CCVars.ViewportScalingFilterMode);
if (stretch)
{
@@ -60,7 +63,11 @@ namespace Content.Client.UserInterface.Controls
{
// Did not find a snap, enable stretching.
Viewport.FixedStretchSize = null;
Viewport.StretchMode = ScalingViewportStretchMode.Bilinear;
Viewport.StretchMode = filterMode switch
{
"nearest" => ScalingViewportStretchMode.Nearest,
"bilinear" => ScalingViewportStretchMode.Bilinear
};
Viewport.IgnoreDimension = verticalFit ? ScalingViewportIgnoreDimension.Horizontal : ScalingViewportIgnoreDimension.None;
if (renderScaleUp)

View File

@@ -30,4 +30,7 @@ public sealed partial class CCVars
public static readonly CVarDef<bool> ViewportVerticalFit =
CVarDef.Create("viewport.vertical_fit", true, CVar.CLIENTONLY | CVar.ARCHIVE);
public static readonly CVarDef<string> ViewportScalingFilterMode =
CVarDef.Create("viewport.scaling_filter", "nearest", CVar.CLIENTONLY | CVar.ARCHIVE);
}

View File

@@ -92,6 +92,9 @@ ui-options-vp-integer-scaling-tooltip = If this option is enabled, the viewport
at specific resolutions. While this results in crisp textures, it also often
means that black bars appear at the top/bottom of the screen or that part
of the viewport is not visible.
ui-options-filter-label = Scaling filter:
ui-options-filter-nearest = Nearest (no smoothing)
ui-options-filter-bilinear = Bilinear (smoothed)
ui-options-vp-vertical-fit = Vertical viewport fitting
ui-options-vp-vertical-fit-tooltip = When enabled, the main viewport will ignore the horizontal axis entirely when
fitting to your screen. If your screen is smaller than the viewport, then this