Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rewrite osu!taiko playfield adjustment container to keep playfield height constant #26631

Merged
merged 7 commits into from
Jan 26, 2024
27 changes: 18 additions & 9 deletions osu.Game.Rulesets.Taiko/UI/TaikoPlayfieldAdjustmentContainer.cs
Original file line number Diff line number Diff line change
@@ -5,23 +5,31 @@
using osu.Framework.Bindables;
using osu.Framework.Graphics;
using osu.Game.Rulesets.UI;
using osuTK;

namespace osu.Game.Rulesets.Taiko.UI
{
public partial class TaikoPlayfieldAdjustmentContainer : PlayfieldAdjustmentContainer
{
private const float default_relative_height = TaikoPlayfield.DEFAULT_HEIGHT / 768;

public const float MAXIMUM_ASPECT = 16f / 9f;
public const float MINIMUM_ASPECT = 5f / 4f;

public readonly IBindable<bool> LockPlayfieldAspectRange = new BindableBool(true);

public TaikoPlayfieldAdjustmentContainer()
{
RelativeSizeAxes = Axes.X;
RelativePositionAxes = Axes.Y;
Height = TaikoPlayfield.BASE_HEIGHT;
}

protected override void Update()
{
base.Update();

float height = default_relative_height;
const float base_relative_height = TaikoPlayfield.BASE_HEIGHT / 768;

float relativeHeight = base_relative_height;

// Players coming from stable expect to be able to change the aspect ratio regardless of the window size.
// We originally wanted to limit this more, but there was considerable pushback from the community.
@@ -33,19 +41,20 @@ protected override void Update()
float currentAspect = Parent!.ChildSize.X / Parent!.ChildSize.Y;

if (currentAspect > MAXIMUM_ASPECT)
height *= currentAspect / MAXIMUM_ASPECT;
relativeHeight *= currentAspect / MAXIMUM_ASPECT;
else if (currentAspect < MINIMUM_ASPECT)
height *= currentAspect / MINIMUM_ASPECT;
relativeHeight *= currentAspect / MINIMUM_ASPECT;
}

// Limit the maximum relative height of the playfield to one-third of available area to avoid it masking out on extreme resolutions.
height = Math.Min(height, 1f / 3f);
Height = height;
relativeHeight = Math.Min(relativeHeight, 1f / 3f);

// Position the taiko playfield exactly one playfield from the top of the screen, if there is enough space for it.
// Note that the relative height cannot exceed one-third - if that limit is hit, the playfield will be exactly centered.
RelativePositionAxes = Axes.Y;
Y = height;
Y = relativeHeight;

Scale = new Vector2(Math.Max(relativeHeight / base_relative_height, 1f));
Width = 1 / Scale.X;
}
}
}