]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Add scaling filter option (Nearest/Bilinear) (#39111)
authorPok <113675512+Pok27@users.noreply.github.com>
Sun, 27 Jul 2025 17:26:17 +0000 (20:26 +0300)
committerGitHub <noreply@github.com>
Sun, 27 Jul 2025 17:26:17 +0000 (20:26 +0300)
Content.Client/Options/UI/Tabs/GraphicsTab.xaml
Content.Client/Options/UI/Tabs/GraphicsTab.xaml.cs
Content.Client/UserInterface/Controls/MainViewport.cs
Content.Shared/CCVar/CCVars.Viewport.cs
Resources/Locale/en-US/escape-menu/ui/options-menu.ftl

index 29279d17333bf868491f47995c475d0d34c94db0..f764d18b4724a68e64c12815677096c04a5d4cdb 100644 (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'}" />
index efd788c58ade026e840985a2d8f9235ef1934ba3..c9c730015561130dea9603e75929c13581f76d23 100644 (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()
index 721d7501152509e0d395520e90dfff4c2e2ff1ce..0e947da7cf8bfdd85f77ea2f43f069148f7437b5 100644 (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)
index d94394d2a754b93fdb99e45debef497435be71c9..74d462f3ced95a421a557a3506eac79ad7a80c7f 100644 (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);
 }
index f2142efaa2a4904a373c54fa96c3e621127b4d01..c7773a54cdf69af334355862c959c5aae3833a49 100644 (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