mirror of
https://github.com/ppy/osu.git
synced 2024-12-15 01:52:55 +08:00
Merge pull request #20983 from peppy/safe-area-toggle
Add setting to allow forcing the game to draw over notches / cameras
This commit is contained in:
commit
933d1d549b
@ -8,6 +8,7 @@ using osu.Framework.Bindables;
|
|||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
using osu.Framework.Graphics.Containers;
|
using osu.Framework.Graphics.Containers;
|
||||||
using osu.Framework.Graphics.Shapes;
|
using osu.Framework.Graphics.Shapes;
|
||||||
|
using osu.Game.Configuration;
|
||||||
using osu.Game.Overlays.Settings;
|
using osu.Game.Overlays.Settings;
|
||||||
using osuTK.Graphics;
|
using osuTK.Graphics;
|
||||||
|
|
||||||
@ -24,6 +25,8 @@ namespace osu.Game.Tests.Visual.UserInterface
|
|||||||
private readonly Bindable<float> safeAreaPaddingLeft = new BindableFloat { MinValue = 0, MaxValue = 200 };
|
private readonly Bindable<float> safeAreaPaddingLeft = new BindableFloat { MinValue = 0, MaxValue = 200 };
|
||||||
private readonly Bindable<float> safeAreaPaddingRight = new BindableFloat { MinValue = 0, MaxValue = 200 };
|
private readonly Bindable<float> safeAreaPaddingRight = new BindableFloat { MinValue = 0, MaxValue = 200 };
|
||||||
|
|
||||||
|
private readonly Bindable<bool> applySafeAreaConsiderations = new Bindable<bool>(true);
|
||||||
|
|
||||||
protected override void LoadComplete()
|
protected override void LoadComplete()
|
||||||
{
|
{
|
||||||
base.LoadComplete();
|
base.LoadComplete();
|
||||||
@ -84,6 +87,11 @@ namespace osu.Game.Tests.Visual.UserInterface
|
|||||||
Current = safeAreaPaddingRight,
|
Current = safeAreaPaddingRight,
|
||||||
LabelText = "Right"
|
LabelText = "Right"
|
||||||
},
|
},
|
||||||
|
new SettingsCheckbox
|
||||||
|
{
|
||||||
|
LabelText = "Apply",
|
||||||
|
Current = applySafeAreaConsiderations,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -93,6 +101,7 @@ namespace osu.Game.Tests.Visual.UserInterface
|
|||||||
safeAreaPaddingBottom.BindValueChanged(_ => updateSafeArea());
|
safeAreaPaddingBottom.BindValueChanged(_ => updateSafeArea());
|
||||||
safeAreaPaddingLeft.BindValueChanged(_ => updateSafeArea());
|
safeAreaPaddingLeft.BindValueChanged(_ => updateSafeArea());
|
||||||
safeAreaPaddingRight.BindValueChanged(_ => updateSafeArea());
|
safeAreaPaddingRight.BindValueChanged(_ => updateSafeArea());
|
||||||
|
applySafeAreaConsiderations.BindValueChanged(_ => updateSafeArea());
|
||||||
});
|
});
|
||||||
|
|
||||||
base.SetUpSteps();
|
base.SetUpSteps();
|
||||||
@ -107,6 +116,8 @@ namespace osu.Game.Tests.Visual.UserInterface
|
|||||||
Left = safeAreaPaddingLeft.Value,
|
Left = safeAreaPaddingLeft.Value,
|
||||||
Right = safeAreaPaddingRight.Value,
|
Right = safeAreaPaddingRight.Value,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Game.LocalConfig.SetValue(OsuSetting.SafeAreaConsiderations, applySafeAreaConsiderations.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
@ -152,6 +152,7 @@ namespace osu.Game.Configuration
|
|||||||
SetDefault(OsuSetting.SongSelectRightMouseScroll, false);
|
SetDefault(OsuSetting.SongSelectRightMouseScroll, false);
|
||||||
|
|
||||||
SetDefault(OsuSetting.Scaling, ScalingMode.Off);
|
SetDefault(OsuSetting.Scaling, ScalingMode.Off);
|
||||||
|
SetDefault(OsuSetting.SafeAreaConsiderations, true);
|
||||||
|
|
||||||
SetDefault(OsuSetting.ScalingSizeX, 0.8f, 0.2f, 1f);
|
SetDefault(OsuSetting.ScalingSizeX, 0.8f, 0.2f, 1f);
|
||||||
SetDefault(OsuSetting.ScalingSizeY, 0.8f, 0.2f, 1f);
|
SetDefault(OsuSetting.ScalingSizeY, 0.8f, 0.2f, 1f);
|
||||||
@ -362,6 +363,7 @@ namespace osu.Game.Configuration
|
|||||||
DiscordRichPresence,
|
DiscordRichPresence,
|
||||||
AutomaticallyDownloadWhenSpectating,
|
AutomaticallyDownloadWhenSpectating,
|
||||||
ShowOnlineExplicitContent,
|
ShowOnlineExplicitContent,
|
||||||
LastProcessedMetadataId
|
LastProcessedMetadataId,
|
||||||
|
SafeAreaConsiderations,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,7 @@ namespace osu.Game.Graphics.Containers
|
|||||||
private Bindable<float> sizeY;
|
private Bindable<float> sizeY;
|
||||||
private Bindable<float> posX;
|
private Bindable<float> posX;
|
||||||
private Bindable<float> posY;
|
private Bindable<float> posY;
|
||||||
|
private Bindable<bool> applySafeAreaPadding;
|
||||||
|
|
||||||
private Bindable<MarginPadding> safeAreaPadding;
|
private Bindable<MarginPadding> safeAreaPadding;
|
||||||
|
|
||||||
@ -132,6 +133,9 @@ namespace osu.Game.Graphics.Containers
|
|||||||
posY = config.GetBindable<float>(OsuSetting.ScalingPositionY);
|
posY = config.GetBindable<float>(OsuSetting.ScalingPositionY);
|
||||||
posY.ValueChanged += _ => Scheduler.AddOnce(updateSize);
|
posY.ValueChanged += _ => Scheduler.AddOnce(updateSize);
|
||||||
|
|
||||||
|
applySafeAreaPadding = config.GetBindable<bool>(OsuSetting.SafeAreaConsiderations);
|
||||||
|
applySafeAreaPadding.BindValueChanged(_ => Scheduler.AddOnce(updateSize));
|
||||||
|
|
||||||
safeAreaPadding = safeArea.SafeAreaPadding.GetBoundCopy();
|
safeAreaPadding = safeArea.SafeAreaPadding.GetBoundCopy();
|
||||||
safeAreaPadding.BindValueChanged(_ => Scheduler.AddOnce(updateSize));
|
safeAreaPadding.BindValueChanged(_ => Scheduler.AddOnce(updateSize));
|
||||||
}
|
}
|
||||||
@ -192,7 +196,7 @@ namespace osu.Game.Graphics.Containers
|
|||||||
bool requiresMasking = targetRect.Size != Vector2.One
|
bool requiresMasking = targetRect.Size != Vector2.One
|
||||||
// For the top level scaling container, for now we apply masking if safe areas are in use.
|
// For the top level scaling container, for now we apply masking if safe areas are in use.
|
||||||
// In the future this can likely be removed as more of the actual UI supports overflowing into the safe areas.
|
// In the future this can likely be removed as more of the actual UI supports overflowing into the safe areas.
|
||||||
|| (targetMode == ScalingMode.Everything && safeAreaPadding.Value.Total != Vector2.Zero);
|
|| (targetMode == ScalingMode.Everything && (applySafeAreaPadding.Value && safeAreaPadding.Value.Total != Vector2.Zero));
|
||||||
|
|
||||||
if (requiresMasking)
|
if (requiresMasking)
|
||||||
sizableContainer.Masking = true;
|
sizableContainer.Masking = true;
|
||||||
@ -225,6 +229,9 @@ namespace osu.Game.Graphics.Containers
|
|||||||
[Resolved]
|
[Resolved]
|
||||||
private ISafeArea safeArea { get; set; }
|
private ISafeArea safeArea { get; set; }
|
||||||
|
|
||||||
|
[Resolved]
|
||||||
|
private OsuConfigManager config { get; set; }
|
||||||
|
|
||||||
private readonly bool confineHostCursor;
|
private readonly bool confineHostCursor;
|
||||||
private readonly LayoutValue cursorRectCache = new LayoutValue(Invalidation.RequiredParentSizeToFit);
|
private readonly LayoutValue cursorRectCache = new LayoutValue(Invalidation.RequiredParentSizeToFit);
|
||||||
|
|
||||||
@ -259,7 +266,7 @@ namespace osu.Game.Graphics.Containers
|
|||||||
{
|
{
|
||||||
if (host.Window == null) return;
|
if (host.Window == null) return;
|
||||||
|
|
||||||
bool coversWholeScreen = Size == Vector2.One && safeArea.SafeAreaPadding.Value.Total == Vector2.Zero;
|
bool coversWholeScreen = Size == Vector2.One && (!config.Get<bool>(OsuSetting.SafeAreaConsiderations) || safeArea.SafeAreaPadding.Value.Total == Vector2.Zero);
|
||||||
host.Window.CursorConfineRect = coversWholeScreen ? null : ToScreenSpace(DrawRectangle).AABBFloat;
|
host.Window.CursorConfineRect = coversWholeScreen ? null : ToScreenSpace(DrawRectangle).AABBFloat;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -179,6 +179,8 @@ namespace osu.Game
|
|||||||
|
|
||||||
private Bindable<string> configRuleset;
|
private Bindable<string> configRuleset;
|
||||||
|
|
||||||
|
private Bindable<bool> applySafeAreaConsiderations;
|
||||||
|
|
||||||
private Bindable<float> uiScale;
|
private Bindable<float> uiScale;
|
||||||
|
|
||||||
private Bindable<string> configSkin;
|
private Bindable<string> configSkin;
|
||||||
@ -309,6 +311,9 @@ namespace osu.Game
|
|||||||
|
|
||||||
SelectedMods.BindValueChanged(modsChanged);
|
SelectedMods.BindValueChanged(modsChanged);
|
||||||
Beatmap.BindValueChanged(beatmapChanged, true);
|
Beatmap.BindValueChanged(beatmapChanged, true);
|
||||||
|
|
||||||
|
applySafeAreaConsiderations = LocalConfig.GetBindable<bool>(OsuSetting.SafeAreaConsiderations);
|
||||||
|
applySafeAreaConsiderations.BindValueChanged(apply => SafeAreaContainer.SafeAreaOverrideEdges = apply.NewValue ? SafeAreaOverrideEdges : Edges.All);
|
||||||
}
|
}
|
||||||
|
|
||||||
private ExternalLinkOpener externalLinkOpener;
|
private ExternalLinkOpener externalLinkOpener;
|
||||||
|
@ -194,6 +194,8 @@ namespace osu.Game
|
|||||||
|
|
||||||
private RealmAccess realm;
|
private RealmAccess realm;
|
||||||
|
|
||||||
|
protected SafeAreaContainer SafeAreaContainer { get; private set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// For now, this is used as a source specifically for beat synced components.
|
/// For now, this is used as a source specifically for beat synced components.
|
||||||
/// Going forward, it could potentially be used as the single source-of-truth for beatmap timing.
|
/// Going forward, it could potentially be used as the single source-of-truth for beatmap timing.
|
||||||
@ -346,7 +348,7 @@ namespace osu.Game
|
|||||||
|
|
||||||
GlobalActionContainer globalBindings;
|
GlobalActionContainer globalBindings;
|
||||||
|
|
||||||
base.Content.Add(new SafeAreaContainer
|
base.Content.Add(SafeAreaContainer = new SafeAreaContainer
|
||||||
{
|
{
|
||||||
SafeAreaOverrideEdges = SafeAreaOverrideEdges,
|
SafeAreaOverrideEdges = SafeAreaOverrideEdges,
|
||||||
RelativeSizeAxes = Axes.Both,
|
RelativeSizeAxes = Axes.Both,
|
||||||
|
@ -20,6 +20,7 @@ using osu.Game.Configuration;
|
|||||||
using osu.Game.Graphics.Containers;
|
using osu.Game.Graphics.Containers;
|
||||||
using osu.Game.Graphics.UserInterface;
|
using osu.Game.Graphics.UserInterface;
|
||||||
using osu.Game.Localisation;
|
using osu.Game.Localisation;
|
||||||
|
using osuTK;
|
||||||
using osuTK.Graphics;
|
using osuTK.Graphics;
|
||||||
|
|
||||||
namespace osu.Game.Overlays.Settings.Sections.Graphics
|
namespace osu.Game.Overlays.Settings.Sections.Graphics
|
||||||
@ -50,6 +51,7 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
|
|||||||
private SettingsDropdown<Size> resolutionDropdown = null!;
|
private SettingsDropdown<Size> resolutionDropdown = null!;
|
||||||
private SettingsDropdown<Display> displayDropdown = null!;
|
private SettingsDropdown<Display> displayDropdown = null!;
|
||||||
private SettingsDropdown<WindowMode> windowModeDropdown = null!;
|
private SettingsDropdown<WindowMode> windowModeDropdown = null!;
|
||||||
|
private SettingsCheckbox safeAreaConsiderationsCheckbox = null!;
|
||||||
|
|
||||||
private Bindable<float> scalingPositionX = null!;
|
private Bindable<float> scalingPositionX = null!;
|
||||||
private Bindable<float> scalingPositionY = null!;
|
private Bindable<float> scalingPositionY = null!;
|
||||||
@ -101,6 +103,11 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
|
|||||||
ItemSource = resolutions,
|
ItemSource = resolutions,
|
||||||
Current = sizeFullscreen
|
Current = sizeFullscreen
|
||||||
},
|
},
|
||||||
|
safeAreaConsiderationsCheckbox = new SettingsCheckbox
|
||||||
|
{
|
||||||
|
LabelText = "Shrink game to avoid cameras and notches",
|
||||||
|
Current = osuConfig.GetBindable<bool>(OsuSetting.SafeAreaConsiderations),
|
||||||
|
},
|
||||||
new SettingsSlider<float, UIScaleSlider>
|
new SettingsSlider<float, UIScaleSlider>
|
||||||
{
|
{
|
||||||
LabelText = GraphicsSettingsStrings.UIScaling,
|
LabelText = GraphicsSettingsStrings.UIScaling,
|
||||||
@ -166,7 +173,7 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
|
|||||||
|
|
||||||
windowModeDropdown.Current.BindValueChanged(_ =>
|
windowModeDropdown.Current.BindValueChanged(_ =>
|
||||||
{
|
{
|
||||||
updateDisplayModeDropdowns();
|
updateDisplaySettingsVisibility();
|
||||||
updateScreenModeWarning();
|
updateScreenModeWarning();
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
@ -191,7 +198,7 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
|
|||||||
.Distinct());
|
.Distinct());
|
||||||
}
|
}
|
||||||
|
|
||||||
updateDisplayModeDropdowns();
|
updateDisplaySettingsVisibility();
|
||||||
}), true);
|
}), true);
|
||||||
|
|
||||||
scalingMode.BindValueChanged(_ =>
|
scalingMode.BindValueChanged(_ =>
|
||||||
@ -221,11 +228,11 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
|
|||||||
Scheduler.AddOnce(d =>
|
Scheduler.AddOnce(d =>
|
||||||
{
|
{
|
||||||
displayDropdown.Items = d;
|
displayDropdown.Items = d;
|
||||||
updateDisplayModeDropdowns();
|
updateDisplaySettingsVisibility();
|
||||||
}, displays);
|
}, displays);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateDisplayModeDropdowns()
|
private void updateDisplaySettingsVisibility()
|
||||||
{
|
{
|
||||||
if (resolutions.Count > 1 && windowModeDropdown.Current.Value == WindowMode.Fullscreen)
|
if (resolutions.Count > 1 && windowModeDropdown.Current.Value == WindowMode.Fullscreen)
|
||||||
resolutionDropdown.Show();
|
resolutionDropdown.Show();
|
||||||
@ -236,6 +243,11 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
|
|||||||
displayDropdown.Show();
|
displayDropdown.Show();
|
||||||
else
|
else
|
||||||
displayDropdown.Hide();
|
displayDropdown.Hide();
|
||||||
|
|
||||||
|
if (host.Window?.SafeAreaPadding.Value.Total != Vector2.Zero)
|
||||||
|
safeAreaConsiderationsCheckbox.Show();
|
||||||
|
else
|
||||||
|
safeAreaConsiderationsCheckbox.Hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateScreenModeWarning()
|
private void updateScreenModeWarning()
|
||||||
|
Loading…
Reference in New Issue
Block a user