Skip to content
This repository has been archived by the owner on Nov 1, 2024. It is now read-only.

Fixed the maximum size of the game window #82

Merged
merged 8 commits into from
Apr 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Content.Client/Options/UI/Tabs/GraphicsTab.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@
<CheckBox Name="IntegerScalingCheckBox"
Text="{Loc 'ui-options-vp-integer-scaling'}"
ToolTip="{Loc 'ui-options-vp-integer-scaling-tooltip'}" />
<CheckBox Name="ViewportVerticalFitCheckBox"
Text="{Loc 'ui-options-vp-vertical-fit'}"
ToolTip="{Loc 'ui-options-vp-vertical-fit-tooltip'}" />
<CheckBox Name="ViewportLowResCheckBox" Text="{Loc 'ui-options-vp-low-res'}" />
<CheckBox Name="ParallaxLowQualityCheckBox" Text="{Loc 'ui-options-parallax-low-quality'}" />
<CheckBox Name="FpsCounterCheckBox" Text="{Loc 'ui-options-fps-counter'}" />
Expand Down
12 changes: 12 additions & 0 deletions Content.Client/Options/UI/Tabs/GraphicsTab.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,12 @@ public GraphicsTab()
UpdateApplyButton();
};

ViewportVerticalFitCheckBox.OnToggled += _ =>
{
UpdateViewportScale();
UpdateApplyButton();
};

IntegerScalingCheckBox.OnToggled += OnCheckBoxToggled;
ViewportLowResCheckBox.OnToggled += OnCheckBoxToggled;
ParallaxLowQualityCheckBox.OnToggled += OnCheckBoxToggled;
Expand All @@ -79,6 +85,7 @@ public GraphicsTab()
ViewportScaleSlider.Value = _cfg.GetCVar(CCVars.ViewportFixedScaleFactor);
ViewportStretchCheckBox.Pressed = _cfg.GetCVar(CCVars.ViewportStretch);
IntegerScalingCheckBox.Pressed = _cfg.GetCVar(CCVars.ViewportSnapToleranceMargin) != 0;
ViewportVerticalFitCheckBox.Pressed = _cfg.GetCVar(CCVars.ViewportVerticalFit);
ViewportLowResCheckBox.Pressed = !_cfg.GetCVar(CCVars.ViewportScaleRender);
ParallaxLowQualityCheckBox.Pressed = _cfg.GetCVar(CCVars.ParallaxLowQuality);
FpsCounterCheckBox.Pressed = _cfg.GetCVar(CCVars.HudFpsCounterVisible);
Expand Down Expand Up @@ -111,6 +118,7 @@ private void OnApplyButtonPressed(BaseButton.ButtonEventArgs args)
_cfg.SetCVar(CCVars.ViewportFixedScaleFactor, (int) ViewportScaleSlider.Value);
_cfg.SetCVar(CCVars.ViewportSnapToleranceMargin,
IntegerScalingCheckBox.Pressed ? CCVars.ViewportSnapToleranceMargin.DefaultValue : 0);
_cfg.SetCVar(CCVars.ViewportVerticalFit, ViewportVerticalFitCheckBox.Pressed);
_cfg.SetCVar(CCVars.ViewportScaleRender, !ViewportLowResCheckBox.Pressed);
_cfg.SetCVar(CCVars.ParallaxLowQuality, ParallaxLowQualityCheckBox.Pressed);
_cfg.SetCVar(CCVars.HudFpsCounterVisible, FpsCounterCheckBox.Pressed);
Expand Down Expand Up @@ -140,6 +148,7 @@ private void UpdateApplyButton()
var isVPStretchSame = ViewportStretchCheckBox.Pressed == _cfg.GetCVar(CCVars.ViewportStretch);
var isVPScaleSame = (int) ViewportScaleSlider.Value == _cfg.GetCVar(CCVars.ViewportFixedScaleFactor);
var isIntegerScalingSame = IntegerScalingCheckBox.Pressed == (_cfg.GetCVar(CCVars.ViewportSnapToleranceMargin) != 0);
var isVPVerticalFitSame = ViewportVerticalFitCheckBox.Pressed == _cfg.GetCVar(CCVars.ViewportVerticalFit);
var isVPResSame = ViewportLowResCheckBox.Pressed == !_cfg.GetCVar(CCVars.ViewportScaleRender);
var isPLQSame = ParallaxLowQualityCheckBox.Pressed == _cfg.GetCVar(CCVars.ParallaxLowQuality);
var isFpsCounterVisibleSame = FpsCounterCheckBox.Pressed == _cfg.GetCVar(CCVars.HudFpsCounterVisible);
Expand All @@ -152,6 +161,7 @@ private void UpdateApplyButton()
isVPStretchSame &&
isVPScaleSame &&
isIntegerScalingSame &&
isVPVerticalFitSame &&
isVPResSame &&
isPLQSame &&
isFpsCounterVisibleSame &&
Expand Down Expand Up @@ -235,6 +245,8 @@ private void UpdateViewportScale()
{
ViewportScaleBox.Visible = !ViewportStretchCheckBox.Pressed;
IntegerScalingCheckBox.Visible = ViewportStretchCheckBox.Pressed;
ViewportVerticalFitCheckBox.Visible = ViewportStretchCheckBox.Pressed;
ViewportWidthSlider.Visible = ViewportWidthSliderDisplay.Visible = !ViewportStretchCheckBox.Pressed || ViewportStretchCheckBox.Pressed && !ViewportVerticalFitCheckBox.Pressed;
ViewportScaleText.Text = Loc.GetString("ui-options-vp-scale", ("scale", ViewportScaleSlider.Value));
}

Expand Down
7 changes: 6 additions & 1 deletion Content.Client/UserInterface/Controls/MainViewport.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ public void UpdateCfg()
var stretch = _cfg.GetCVar(CCVars.ViewportStretch);
var renderScaleUp = _cfg.GetCVar(CCVars.ViewportScaleRender);
var fixedFactor = _cfg.GetCVar(CCVars.ViewportFixedScaleFactor);
var verticalFit = _cfg.GetCVar(CCVars.ViewportVerticalFit);

if (stretch)
{
Expand All @@ -60,6 +61,7 @@ public void UpdateCfg()
// Did not find a snap, enable stretching.
Viewport.FixedStretchSize = null;
Viewport.StretchMode = ScalingViewportStretchMode.Bilinear;
Viewport.IgnoreDimension = verticalFit ? ScalingViewportIgnoreDimension.Horizontal : ScalingViewportIgnoreDimension.None;

if (renderScaleUp)
{
Expand Down Expand Up @@ -104,6 +106,8 @@ public void UpdateCfg()
// where we are clipping the viewport to make it fit.
var cfgToleranceClip = _cfg.GetCVar(CCVars.ViewportSnapToleranceClip);

var cfgVerticalFit = _cfg.GetCVar(CCVars.ViewportVerticalFit);

// Calculate if the viewport, when rendered at an integer scale,
// is close enough to the control size to enable "snapping" to NN,
// potentially cutting a tiny bit off/leaving a margin.
Expand All @@ -123,7 +127,8 @@ public void UpdateCfg()
// The rule for which snap fits is that at LEAST one axis needs to be in the tolerance size wise.
// One axis MAY be larger but not smaller than tolerance.
// Obviously if it's too small it's bad, and if it's too big on both axis we should stretch up.
if (Fits(dx) && Fits(dy) || Fits(dx) && Larger(dy) || Larger(dx) && Fits(dy))
// Additionally, if the viewport's supposed to be vertically fit, then the horizontal scale should just be ignored where appropriate.
if ((Fits(dx) || cfgVerticalFit) && Fits(dy) || !cfgVerticalFit && Fits(dx) && Larger(dy) || Larger(dx) && Fits(dy))
{
// Found snap that fits.
return i;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ public override void Initialize()
_configurationManager.OnValueChanged(CCVars.ViewportMinimumWidth, _ => UpdateViewportRatio());
_configurationManager.OnValueChanged(CCVars.ViewportMaximumWidth, _ => UpdateViewportRatio());
_configurationManager.OnValueChanged(CCVars.ViewportWidth, _ => UpdateViewportRatio());
_configurationManager.OnValueChanged(CCVars.ViewportVerticalFit, _ => UpdateViewportRatio());

var gameplayStateLoad = UIManager.GetUIController<GameplayStateLoadController>();
gameplayStateLoad.OnScreenLoad += OnScreenLoad;
Expand All @@ -45,13 +46,19 @@ private void UpdateViewportRatio()
var min = _configurationManager.GetCVar(CCVars.ViewportMinimumWidth);
var max = _configurationManager.GetCVar(CCVars.ViewportMaximumWidth);
var width = _configurationManager.GetCVar(CCVars.ViewportWidth);
var verticalfit = _configurationManager.GetCVar(CCVars.ViewportVerticalFit) && _configurationManager.GetCVar(CCVars.ViewportStretch);

if (width < min || width > max)
if (verticalfit)
{
width = max;
}
else if (width < min || width > max)
{
width = CCVars.ViewportWidth.DefaultValue;
}

Viewport.Viewport.ViewportSize = (EyeManager.PixelsPerMeter * width, EyeManager.PixelsPerMeter * ViewportHeight);
Viewport.UpdateCfg();
}

public void ReloadViewport()
Expand Down
47 changes: 46 additions & 1 deletion Content.Client/Viewport/ScalingViewport.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ public sealed class ScalingViewport : Control, IViewportControl
private int _curRenderScale;
private ScalingViewportStretchMode _stretchMode = ScalingViewportStretchMode.Bilinear;
private ScalingViewportRenderScaleMode _renderScaleMode = ScalingViewportRenderScaleMode.Fixed;
private ScalingViewportIgnoreDimension _ignoreDimension = ScalingViewportIgnoreDimension.None;
private int _fixedRenderScale = 1;

private readonly List<CopyPixelsDelegate<Rgba32>> _queuedScreenshots = new();
Expand Down Expand Up @@ -106,6 +107,17 @@ public int FixedRenderScale
}
}

[ViewVariables(VVAccess.ReadWrite)]
public ScalingViewportIgnoreDimension IgnoreDimension
{
get => _ignoreDimension;
set
{
_ignoreDimension = value;
InvalidateViewport();
}
}

public ScalingViewport()
{
IoCManager.InjectDependencies(this);
Expand Down Expand Up @@ -178,7 +190,19 @@ private UIBox2i GetDrawBox()
if (FixedStretchSize == null)
{
var (ratioX, ratioY) = ourSize / vpSize;
var ratio = Math.Min(ratioX, ratioY);
var ratio = 1f;
switch (_ignoreDimension)
{
case ScalingViewportIgnoreDimension.None:
ratio = Math.Min(ratioX, ratioY);
break;
case ScalingViewportIgnoreDimension.Vertical:
ratio = ratioX;
break;
case ScalingViewportIgnoreDimension.Horizontal:
ratio = ratioY;
break;
}

var size = vpSize * ratio;
// Size
Expand Down Expand Up @@ -357,4 +381,25 @@ public enum ScalingViewportRenderScaleMode
/// </summary>
CeilInt
}

/// <summary>
/// If the viewport is allowed to freely scale, this determines which dimensions should be ignored while fitting the viewport
/// </summary>
public enum ScalingViewportIgnoreDimension
{
/// <summary>
/// The viewport won't ignore any dimension.
/// </summary>
None = 0,

/// <summary>
/// The viewport will ignore the horizontal dimension, and will exclusively consider the vertical dimension for scaling.
/// </summary>
Horizontal,

/// <summary>
/// The viewport will ignore the vertical dimension, and will exclusively consider the horizontal dimension for scaling.
/// </summary>
Vertical
}
}
5 changes: 4 additions & 1 deletion Content.Shared/CCVar/CCVars.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1594,11 +1594,14 @@ public static readonly CVarDef<int>
CVarDef.Create("viewport.minimum_width", 15, CVar.REPLICATED);

public static readonly CVarDef<int> ViewportMaximumWidth =
CVarDef.Create("viewport.maximum_width", 21, CVar.REPLICATED);
CVarDef.Create("viewport.maximum_width", 26, CVar.REPLICATED);

public static readonly CVarDef<int> ViewportWidth =
CVarDef.Create("viewport.width", 21, CVar.CLIENTONLY | CVar.ARCHIVE);

public static readonly CVarDef<bool> ViewportVerticalFit =
CVarDef.Create("viewport.vertical_fit", true, CVar.CLIENTONLY | CVar.ARCHIVE);

/*
* UI
*/
Expand Down
4 changes: 4 additions & 0 deletions Resources/Locale/en-US/escape-menu/ui/options-menu.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,10 @@ 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-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
will cause the viewport to be cut off on the horizontal axis.
ui-options-vp-low-res = Low-resolution viewport
ui-options-parallax-low-quality = Low-quality Parallax (background)
ui-options-fps-counter = Show FPS counter
Expand Down
5 changes: 5 additions & 0 deletions Resources/Locale/ru-RU/escape-menu/ui/options-menu.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,11 @@ ui-options-vp-integer-scaling-tooltip =
используя целочисленное значение при определённых разрешениях. Хотя это и
приводит к чётким текстурам, это часто означает, что сверху/снизу экрана будут
чёрные полосы или что часть окна не будет видна.
ui-options-vp-vertical-fit = Вертикальное масштабирование экрана
ui-options-vp-vertical-fit-tooltip =
Если эта функция включена, основной экран просмотра будет полностью игнорировать горизонтальную ось при
настройке на ваш экран. Если ваш экран меньше, чем экран просмотра, это
приведет к тому, что экран просмотра будет обрезан по горизонтальной оси.
ui-options-vp-low-res = Изображение низкого разрешения
ui-options-parallax-low-quality = Низкокачественный параллакс (фон)
ui-options-fps-counter = Показать счётчик FPS
Expand Down
Loading