From 16158710f9567a1641c272dd21f6d70a33d8338e Mon Sep 17 00:00:00 2001 From: Darius Wattimena Date: Mon, 18 Nov 2024 23:48:26 +0100 Subject: [PATCH 1/4] Made reading of ReadCurrentDistanceSnap public --- osu.Game.Rulesets.Catch/Edit/CatchDistanceSnapProvider.cs | 2 +- osu.Game.Rulesets.Osu/Edit/OsuDistanceSnapProvider.cs | 2 +- osu.Game/Rulesets/Edit/ComposerDistanceSnapProvider.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Game.Rulesets.Catch/Edit/CatchDistanceSnapProvider.cs b/osu.Game.Rulesets.Catch/Edit/CatchDistanceSnapProvider.cs index 6f5b32a41d..ae4025aa2f 100644 --- a/osu.Game.Rulesets.Catch/Edit/CatchDistanceSnapProvider.cs +++ b/osu.Game.Rulesets.Catch/Edit/CatchDistanceSnapProvider.cs @@ -10,7 +10,7 @@ namespace osu.Game.Rulesets.Catch.Edit { public partial class CatchDistanceSnapProvider : ComposerDistanceSnapProvider { - protected override double ReadCurrentDistanceSnap(HitObject before, HitObject after) + public override double ReadCurrentDistanceSnap(HitObject before, HitObject after) { // osu!catch's distance snap implementation is limited, in that a custom spacing cannot be specified. // Therefore this functionality is not currently used. diff --git a/osu.Game.Rulesets.Osu/Edit/OsuDistanceSnapProvider.cs b/osu.Game.Rulesets.Osu/Edit/OsuDistanceSnapProvider.cs index 522943df7d..4042cfa0e2 100644 --- a/osu.Game.Rulesets.Osu/Edit/OsuDistanceSnapProvider.cs +++ b/osu.Game.Rulesets.Osu/Edit/OsuDistanceSnapProvider.cs @@ -12,7 +12,7 @@ namespace osu.Game.Rulesets.Osu.Edit { public partial class OsuDistanceSnapProvider : ComposerDistanceSnapProvider { - protected override double ReadCurrentDistanceSnap(HitObject before, HitObject after) + public override double ReadCurrentDistanceSnap(HitObject before, HitObject after) { float expectedDistance = DurationToDistance(before, after.StartTime - before.GetEndTime()); float actualDistance = Vector2.Distance(((OsuHitObject)before).EndPosition, ((OsuHitObject)after).Position); diff --git a/osu.Game/Rulesets/Edit/ComposerDistanceSnapProvider.cs b/osu.Game/Rulesets/Edit/ComposerDistanceSnapProvider.cs index cf41c8e108..5bf15aee8b 100644 --- a/osu.Game/Rulesets/Edit/ComposerDistanceSnapProvider.cs +++ b/osu.Game/Rulesets/Edit/ComposerDistanceSnapProvider.cs @@ -163,7 +163,7 @@ namespace osu.Game.Rulesets.Edit return (lastBefore, firstAfter); } - protected abstract double ReadCurrentDistanceSnap(HitObject before, HitObject after); + public abstract double ReadCurrentDistanceSnap(HitObject before, HitObject after); protected override void Update() { From 111f029ead5d5130904bcae1e463d0a330039eec Mon Sep 17 00:00:00 2001 From: Darius Wattimena Date: Mon, 18 Nov 2024 23:53:01 +0100 Subject: [PATCH 2/4] Added a custom hitobject inspector for catch additionally show the x value of prev and next --- .../Edit/CatchHitObjectComposer.cs | 2 + .../Edit/CatchHitObjectInspector.cs | 43 +++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 osu.Game.Rulesets.Catch/Edit/CatchHitObjectInspector.cs diff --git a/osu.Game.Rulesets.Catch/Edit/CatchHitObjectComposer.cs b/osu.Game.Rulesets.Catch/Edit/CatchHitObjectComposer.cs index 09d1ff663d..aae3369d40 100644 --- a/osu.Game.Rulesets.Catch/Edit/CatchHitObjectComposer.cs +++ b/osu.Game.Rulesets.Catch/Edit/CatchHitObjectComposer.cs @@ -70,6 +70,8 @@ namespace osu.Game.Rulesets.Catch.Edit })); } + protected override Drawable CreateHitObjectInspector() => new CatchHitObjectInspector(DistanceSnapProvider); + protected override IEnumerable CreateTernaryButtons() => base.CreateTernaryButtons() .Concat(DistanceSnapProvider.CreateTernaryButtons()); diff --git a/osu.Game.Rulesets.Catch/Edit/CatchHitObjectInspector.cs b/osu.Game.Rulesets.Catch/Edit/CatchHitObjectInspector.cs new file mode 100644 index 0000000000..6ff7e9c6a0 --- /dev/null +++ b/osu.Game.Rulesets.Catch/Edit/CatchHitObjectInspector.cs @@ -0,0 +1,43 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System.Linq; +using osu.Game.Rulesets.Objects; +using osu.Game.Screens.Edit.Compose.Components; + +namespace osu.Game.Rulesets.Catch.Edit +{ + public partial class CatchHitObjectInspector(CatchDistanceSnapProvider snapProvider) : HitObjectInspector + { + protected override void AddInspectorValues(HitObject[] objects) + { + base.AddInspectorValues(objects); + + if (objects.Length > 0) + { + HitObject firstSelectedHitObject = objects.MinBy(ho => ho.StartTime)!; + HitObject lastSelectedHitObject = objects.MaxBy(ho => ho.GetEndTime())!; + + HitObject? precedingObject = EditorBeatmap.HitObjects.LastOrDefault(ho => ho.GetEndTime() < firstSelectedHitObject.StartTime); + HitObject? nextObject = EditorBeatmap.HitObjects.FirstOrDefault(ho => ho.StartTime > lastSelectedHitObject.GetEndTime()); + + if (precedingObject != null || nextObject != null) + { + AddHeader("Snapping"); + } + + if (precedingObject != null) + { + double previousSnap = snapProvider.ReadCurrentDistanceSnap(precedingObject, firstSelectedHitObject); + AddValue($"Previous: {previousSnap:#,0.##}x"); + } + + if (nextObject != null) + { + double nextSnap = snapProvider.ReadCurrentDistanceSnap(lastSelectedHitObject, nextObject); + AddValue($"Next: {nextSnap:#,0.##}x"); + } + } + } + } +} From a8e14b6625552e35687bb6bf347898ad5deb552e Mon Sep 17 00:00:00 2001 From: Darius Wattimena Date: Tue, 19 Nov 2024 19:54:12 +0100 Subject: [PATCH 3/4] Align inspector info more to how it is shown for osu --- .../Edit/CatchHitObjectInspector.cs | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/osu.Game.Rulesets.Catch/Edit/CatchHitObjectInspector.cs b/osu.Game.Rulesets.Catch/Edit/CatchHitObjectInspector.cs index 6ff7e9c6a0..c279354d9a 100644 --- a/osu.Game.Rulesets.Catch/Edit/CatchHitObjectInspector.cs +++ b/osu.Game.Rulesets.Catch/Edit/CatchHitObjectInspector.cs @@ -21,21 +21,18 @@ namespace osu.Game.Rulesets.Catch.Edit HitObject? precedingObject = EditorBeatmap.HitObjects.LastOrDefault(ho => ho.GetEndTime() < firstSelectedHitObject.StartTime); HitObject? nextObject = EditorBeatmap.HitObjects.FirstOrDefault(ho => ho.StartTime > lastSelectedHitObject.GetEndTime()); - if (precedingObject != null || nextObject != null) - { - AddHeader("Snapping"); - } - if (precedingObject != null) { double previousSnap = snapProvider.ReadCurrentDistanceSnap(precedingObject, firstSelectedHitObject); - AddValue($"Previous: {previousSnap:#,0.##}x"); + AddHeader("To previous"); + AddValue($"{previousSnap:#,0.##}x"); } if (nextObject != null) { double nextSnap = snapProvider.ReadCurrentDistanceSnap(lastSelectedHitObject, nextObject); - AddValue($"Next: {nextSnap:#,0.##}x"); + AddHeader("To next"); + AddValue($"{nextSnap:#,0.##}x"); } } } From 2138729c02fda9b619a3298a7ec3b63628141073 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Thu, 21 Nov 2024 12:17:43 +0100 Subject: [PATCH 4/4] Do not show distance to next/previous object if said object is a banana shower The results of such a display were a little bit nonsensical. --- osu.Game.Rulesets.Catch/Edit/CatchHitObjectInspector.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Catch/Edit/CatchHitObjectInspector.cs b/osu.Game.Rulesets.Catch/Edit/CatchHitObjectInspector.cs index c279354d9a..bfabcbdb83 100644 --- a/osu.Game.Rulesets.Catch/Edit/CatchHitObjectInspector.cs +++ b/osu.Game.Rulesets.Catch/Edit/CatchHitObjectInspector.cs @@ -2,6 +2,7 @@ // See the LICENCE file in the repository root for full licence text. using System.Linq; +using osu.Game.Rulesets.Catch.Objects; using osu.Game.Rulesets.Objects; using osu.Game.Screens.Edit.Compose.Components; @@ -21,14 +22,14 @@ namespace osu.Game.Rulesets.Catch.Edit HitObject? precedingObject = EditorBeatmap.HitObjects.LastOrDefault(ho => ho.GetEndTime() < firstSelectedHitObject.StartTime); HitObject? nextObject = EditorBeatmap.HitObjects.FirstOrDefault(ho => ho.StartTime > lastSelectedHitObject.GetEndTime()); - if (precedingObject != null) + if (precedingObject != null && precedingObject is not BananaShower) { double previousSnap = snapProvider.ReadCurrentDistanceSnap(precedingObject, firstSelectedHitObject); AddHeader("To previous"); AddValue($"{previousSnap:#,0.##}x"); } - if (nextObject != null) + if (nextObject != null && nextObject is not BananaShower) { double nextSnap = snapProvider.ReadCurrentDistanceSnap(lastSelectedHitObject, nextObject); AddHeader("To next");