diff --git a/osu.Game.Rulesets.Osu/Judgements/OsuSpinnerJudgementResult.cs b/osu.Game.Rulesets.Osu/Judgements/OsuSpinnerJudgementResult.cs
index e58aacd86e..9f77175398 100644
--- a/osu.Game.Rulesets.Osu/Judgements/OsuSpinnerJudgementResult.cs
+++ b/osu.Game.Rulesets.Osu/Judgements/OsuSpinnerJudgementResult.cs
@@ -38,6 +38,11 @@ namespace osu.Game.Rulesets.Osu.Judgements
///
public float RateAdjustedRotation;
+ ///
+ /// Time instant at which the spin was started (the first user input which caused an increase in spin).
+ ///
+ public double? TimeStarted;
+
///
/// Time instant at which the spinner has been completed (the user has executed all required spins).
/// Will be null if all required spins haven't been completed.
diff --git a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
index e6940f0985..3d614c2dbd 100644
--- a/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
+++ b/osu.Game.Rulesets.Osu/Objects/Drawables/DrawableSpinner.cs
@@ -109,9 +109,6 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
base.OnFree();
spinningSample.Samples = null;
-
- // the counter handles its own fade in (when spinning begins) so we should only be responsible for resetting it here, for pooling.
- SpmCounter.Hide();
}
protected override void LoadSamples()
@@ -161,6 +158,17 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
}
}
+ protected override void UpdateStartTimeStateTransforms()
+ {
+ base.UpdateStartTimeStateTransforms();
+
+ if (Result?.TimeStarted is double startTime)
+ {
+ using (BeginAbsoluteSequence(startTime))
+ fadeInCounter();
+ }
+ }
+
protected override void UpdateHitStateTransforms(ArmedState state)
{
base.UpdateHitStateTransforms(state);
@@ -265,7 +273,10 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
base.UpdateAfterChildren();
if (!SpmCounter.IsPresent && RotationTracker.Tracking)
- SpmCounter.FadeIn(HitObject.TimeFadeIn);
+ {
+ Result.TimeStarted ??= Time.Current;
+ fadeInCounter();
+ }
// don't update after end time to avoid the rate display dropping during fade out.
// this shouldn't be limited to StartTime as it causes weirdness with the underlying calculation, which is expecting updates during that period.
@@ -275,6 +286,8 @@ namespace osu.Game.Rulesets.Osu.Objects.Drawables
updateBonusScore();
}
+ private void fadeInCounter() => SpmCounter.FadeIn(HitObject.TimeFadeIn);
+
private int wholeSpins;
private void updateBonusScore()
diff --git a/osu.Game.Rulesets.Osu/Skinning/Default/SpinnerSpmCounter.cs b/osu.Game.Rulesets.Osu/Skinning/Default/SpinnerSpmCounter.cs
index f3e013c759..69355f624b 100644
--- a/osu.Game.Rulesets.Osu/Skinning/Default/SpinnerSpmCounter.cs
+++ b/osu.Game.Rulesets.Osu/Skinning/Default/SpinnerSpmCounter.cs
@@ -21,11 +21,6 @@ namespace osu.Game.Rulesets.Osu.Skinning.Default
private readonly OsuSpriteText spmText;
- public override void ApplyTransformsAt(double time, bool propagateChildren = false)
- {
- // handles own fade in state.
- }
-
public SpinnerSpmCounter()
{
Children = new Drawable[]