From 52538dc7083f2063149c8f08a249921c3c429acc Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Thu, 16 Jun 2022 19:46:04 +0300 Subject: [PATCH 1/5] Refactor `LatencyCursorContainer` to become a cursor container --- .../LatencyCursorContainer.cs | 48 +++++++++---------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/osu.Game/Screens/Utility/SampleComponents/LatencyCursorContainer.cs b/osu.Game/Screens/Utility/SampleComponents/LatencyCursorContainer.cs index e4c2b504cb..ecd3837512 100644 --- a/osu.Game/Screens/Utility/SampleComponents/LatencyCursorContainer.cs +++ b/osu.Game/Screens/Utility/SampleComponents/LatencyCursorContainer.cs @@ -2,55 +2,51 @@ // See the LICENCE file in the repository root for full licence text. #nullable enable -using osu.Framework.Allocation; + using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Cursor; using osu.Framework.Graphics.Shapes; using osu.Framework.Input.Events; using osu.Framework.Input.States; -using osu.Game.Overlays; using osuTK; using osuTK.Input; namespace osu.Game.Screens.Utility.SampleComponents { - public class LatencyCursorContainer : LatencySampleComponent + public class LatencyCursorContainer : CursorContainer { - private Circle cursor = null!; + protected override Drawable CreateCursor() => new LatencyCursor(); - [Resolved] - private OverlayColourProvider overlayColourProvider { get; set; } = null!; + public override bool IsPresent => base.IsPresent || Scheduler.HasPendingTasks; public LatencyCursorContainer() { - Masking = true; + State.Value = Visibility.Hidden; } - protected override void LoadComplete() + protected override bool OnMouseMove(MouseMoveEvent e) { - base.LoadComplete(); - - InternalChild = cursor = new Circle - { - Size = new Vector2(40), - Origin = Anchor.Centre, - Colour = overlayColourProvider.Colour2, - }; + // CursorContainer implements IRequireHighFrequencyMousePosition, which bypasses limited rate updating, therefore scheduling is required. + // We can alternatively solve this by a PassThroughInputManager layer inside LatencyArea, + // but that would mean including input lag to this test, which may not be desired. + Schedule(() => base.OnMouseMove(e)); + return false; } - protected override bool OnHover(HoverEvent e) => false; - - protected override void UpdateAtLimitedRate(InputState inputState) + private class LatencyCursor : LatencySampleComponent { - cursor.Colour = inputState.Mouse.IsPressed(MouseButton.Left) ? overlayColourProvider.Content1 : overlayColourProvider.Colour2; - - if (IsActive.Value) + public LatencyCursor() { - cursor.Position = ToLocalSpace(inputState.Mouse.Position); - cursor.Alpha = 1; + AutoSizeAxes = Axes.Both; + Origin = Anchor.Centre; + + InternalChild = new Circle { Size = new Vector2(40) }; } - else + + protected override void UpdateAtLimitedRate(InputState inputState) { - cursor.Alpha = 0; + Colour = inputState.Mouse.IsPressed(MouseButton.Left) ? OverlayColourProvider.Content1 : OverlayColourProvider.Colour2; } } } From ed6817ae6a68b2385b8f0591453367d88a423459 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Thu, 16 Jun 2022 19:46:31 +0300 Subject: [PATCH 2/5] Allow switching between latency and menu cursor using `IProvideCursor` --- osu.Game/Screens/Utility/LatencyArea.cs | 14 ++++++++++---- osu.Game/Screens/Utility/LatencyCertifierScreen.cs | 2 -- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/osu.Game/Screens/Utility/LatencyArea.cs b/osu.Game/Screens/Utility/LatencyArea.cs index 21688f0b0c..86cdbd39b9 100644 --- a/osu.Game/Screens/Utility/LatencyArea.cs +++ b/osu.Game/Screens/Utility/LatencyArea.cs @@ -8,8 +8,10 @@ using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; +using osu.Framework.Graphics.Cursor; using osu.Framework.Graphics.Shapes; using osu.Framework.Input.Events; +using osu.Game.Graphics.Cursor; using osu.Game.Overlays; using osu.Game.Screens.Utility.SampleComponents; using osuTK.Input; @@ -17,7 +19,7 @@ using osuTK.Input; namespace osu.Game.Screens.Utility { [Cached] - public class LatencyArea : CompositeDrawable + public class LatencyArea : CompositeDrawable, IProvideCursor { [Resolved] private OverlayColourProvider overlayColourProvider { get; set; } = null!; @@ -36,6 +38,10 @@ namespace osu.Game.Screens.Utility public readonly Bindable VisualMode = new Bindable(); + public CursorContainer? Cursor { get; private set; } + + public bool ProvidingUserCursor => IsActiveArea.Value; + public LatencyArea(Key key, int? targetFrameRate) { this.key = key; @@ -87,7 +93,7 @@ namespace osu.Game.Screens.Utility { RelativeSizeAxes = Axes.Both, }, - new LatencyCursorContainer + Cursor = new LatencyCursorContainer { RelativeSizeAxes = Axes.Both, }, @@ -101,7 +107,7 @@ namespace osu.Game.Screens.Utility { RelativeSizeAxes = Axes.Both, }, - new LatencyCursorContainer + Cursor = new LatencyCursorContainer { RelativeSizeAxes = Axes.Both, }, @@ -115,7 +121,7 @@ namespace osu.Game.Screens.Utility { RelativeSizeAxes = Axes.Both, }, - new LatencyCursorContainer + Cursor = new LatencyCursorContainer { RelativeSizeAxes = Axes.Both, }, diff --git a/osu.Game/Screens/Utility/LatencyCertifierScreen.cs b/osu.Game/Screens/Utility/LatencyCertifierScreen.cs index 8210e6825a..f8587e166c 100644 --- a/osu.Game/Screens/Utility/LatencyCertifierScreen.cs +++ b/osu.Game/Screens/Utility/LatencyCertifierScreen.cs @@ -41,8 +41,6 @@ namespace osu.Game.Screens.Utility public override bool HideOverlaysOnEnter => true; - public override bool CursorVisible => mainArea.Count == 0; - public override float BackgroundParallaxAmount => 0; private readonly LinkFlowContainer explanatoryText; From beb03316400ddbffecdf84943fb5e6f0a486d165 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Thu, 16 Jun 2022 19:56:56 +0300 Subject: [PATCH 3/5] Let latency certifier buttons steal hover from area --- osu.Game/Screens/Utility/ButtonWithKeyBind.cs | 2 ++ osu.Game/Screens/Utility/LatencyArea.cs | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/osu.Game/Screens/Utility/ButtonWithKeyBind.cs b/osu.Game/Screens/Utility/ButtonWithKeyBind.cs index ef87e0bca7..ad60baafab 100644 --- a/osu.Game/Screens/Utility/ButtonWithKeyBind.cs +++ b/osu.Game/Screens/Utility/ButtonWithKeyBind.cs @@ -38,6 +38,8 @@ namespace osu.Game.Screens.Utility return base.OnKeyDown(e); } + protected override bool OnHover(HoverEvent e) => true; + [Resolved] private OverlayColourProvider overlayColourProvider { get; set; } = null!; diff --git a/osu.Game/Screens/Utility/LatencyArea.cs b/osu.Game/Screens/Utility/LatencyArea.cs index 86cdbd39b9..da37cab334 100644 --- a/osu.Game/Screens/Utility/LatencyArea.cs +++ b/osu.Game/Screens/Utility/LatencyArea.cs @@ -62,6 +62,10 @@ namespace osu.Game.Screens.Utility Colour = overlayColourProvider.Background6, RelativeSizeAxes = Axes.Both, }, + visualContent = new Container + { + RelativeSizeAxes = Axes.Both, + }, new ButtonWithKeyBind(key) { Text = "Feels better", @@ -71,10 +75,6 @@ namespace osu.Game.Screens.Utility Origin = Anchor.TopCentre, Action = () => ReportUserBest?.Invoke(), }, - visualContent = new Container - { - RelativeSizeAxes = Axes.Both, - }, }; IsActiveArea.BindValueChanged(active => From 8e088140b2c7709a8e5a49aa1efcec8c19815db9 Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Thu, 16 Jun 2022 20:09:10 +0300 Subject: [PATCH 4/5] Reword comment since `IRequireHighFrequencyMousePosition` isn't the issue --- .../Screens/Utility/SampleComponents/LatencyCursorContainer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game/Screens/Utility/SampleComponents/LatencyCursorContainer.cs b/osu.Game/Screens/Utility/SampleComponents/LatencyCursorContainer.cs index ecd3837512..656aa6a8b3 100644 --- a/osu.Game/Screens/Utility/SampleComponents/LatencyCursorContainer.cs +++ b/osu.Game/Screens/Utility/SampleComponents/LatencyCursorContainer.cs @@ -27,7 +27,7 @@ namespace osu.Game.Screens.Utility.SampleComponents protected override bool OnMouseMove(MouseMoveEvent e) { - // CursorContainer implements IRequireHighFrequencyMousePosition, which bypasses limited rate updating, therefore scheduling is required. + // Scheduling is required to ensure updating of cursor position happens in limited rate. // We can alternatively solve this by a PassThroughInputManager layer inside LatencyArea, // but that would mean including input lag to this test, which may not be desired. Schedule(() => base.OnMouseMove(e)); From f7a27b412a18e8db958266e49df116c3ebfb8d7f Mon Sep 17 00:00:00 2001 From: Salman Ahmed Date: Thu, 16 Jun 2022 20:35:30 +0300 Subject: [PATCH 5/5] Revert "Let latency certifier buttons steal hover from area" This reverts commit beb03316400ddbffecdf84943fb5e6f0a486d165. --- osu.Game/Screens/Utility/ButtonWithKeyBind.cs | 2 -- osu.Game/Screens/Utility/LatencyArea.cs | 8 ++++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/osu.Game/Screens/Utility/ButtonWithKeyBind.cs b/osu.Game/Screens/Utility/ButtonWithKeyBind.cs index ad60baafab..ef87e0bca7 100644 --- a/osu.Game/Screens/Utility/ButtonWithKeyBind.cs +++ b/osu.Game/Screens/Utility/ButtonWithKeyBind.cs @@ -38,8 +38,6 @@ namespace osu.Game.Screens.Utility return base.OnKeyDown(e); } - protected override bool OnHover(HoverEvent e) => true; - [Resolved] private OverlayColourProvider overlayColourProvider { get; set; } = null!; diff --git a/osu.Game/Screens/Utility/LatencyArea.cs b/osu.Game/Screens/Utility/LatencyArea.cs index da37cab334..86cdbd39b9 100644 --- a/osu.Game/Screens/Utility/LatencyArea.cs +++ b/osu.Game/Screens/Utility/LatencyArea.cs @@ -62,10 +62,6 @@ namespace osu.Game.Screens.Utility Colour = overlayColourProvider.Background6, RelativeSizeAxes = Axes.Both, }, - visualContent = new Container - { - RelativeSizeAxes = Axes.Both, - }, new ButtonWithKeyBind(key) { Text = "Feels better", @@ -75,6 +71,10 @@ namespace osu.Game.Screens.Utility Origin = Anchor.TopCentre, Action = () => ReportUserBest?.Invoke(), }, + visualContent = new Container + { + RelativeSizeAxes = Axes.Both, + }, }; IsActiveArea.BindValueChanged(active =>