1
0
mirror of https://github.com/ppy/osu.git synced 2024-11-08 06:00:05 +08:00

Merge pull request #18117 from peppy/distance-snap-grid-current-tiume

Highlight distance snap grid rings that are close to the current time value
This commit is contained in:
Bartłomiej Dach 2022-05-07 11:13:13 +02:00 committed by GitHub
commit e8518a3a1a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 50 additions and 7 deletions

View File

@ -2,11 +2,15 @@
// See the LICENCE file in the repository root for full licence text.
using System;
using osu.Framework.Allocation;
using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Shapes;
using osu.Framework.Graphics.UserInterface;
using osu.Game.Rulesets.Edit;
using osu.Game.Rulesets.Objects;
using osuTK;
using osuTK.Graphics;
namespace osu.Game.Screens.Edit.Compose.Components
{
@ -51,14 +55,12 @@ namespace osu.Game.Screens.Edit.Compose.Components
{
float diameter = (i + 1) * DistanceBetweenTicks * 2;
AddInternal(new CircularProgress
AddInternal(new Ring(ReferenceObject, GetColourForIndexFromPlacement(i))
{
Origin = Anchor.Centre,
Position = StartPosition,
Current = { Value = 1 },
Origin = Anchor.Centre,
Size = new Vector2(diameter),
InnerRadius = 4 * 1f / diameter,
Colour = GetColourForIndexFromPlacement(i)
});
}
}
@ -100,5 +102,45 @@ namespace osu.Game.Screens.Edit.Compose.Components
return (snappedPosition, snappedTime);
}
private class Ring : CircularProgress
{
[Resolved]
private IDistanceSnapProvider snapProvider { get; set; }
[Resolved(canBeNull: true)]
private EditorClock editorClock { get; set; }
private readonly HitObject referenceObject;
private readonly Color4 baseColour;
public Ring(HitObject referenceObject, Color4 baseColour)
{
this.referenceObject = referenceObject;
Colour = this.baseColour = baseColour;
Current.Value = 1;
}
protected override void Update()
{
base.Update();
if (editorClock == null)
return;
float distanceSpacingMultiplier = (float)snapProvider.DistanceSpacingMultiplier.Value;
double timeFromReferencePoint = editorClock.CurrentTime - referenceObject.GetEndTime();
float distanceForCurrentTime = snapProvider.DurationToDistance(referenceObject, timeFromReferencePoint)
* distanceSpacingMultiplier;
float timeBasedAlpha = 1 - Math.Clamp(Math.Abs(distanceForCurrentTime - Size.X / 2) / 30, 0, 1);
Colour = baseColour.Opacity(Math.Max(baseColour.A, timeBasedAlpha));
}
}
}
}

View File

@ -4,14 +4,15 @@
using System;
using osu.Framework.Allocation;
using osu.Framework.Bindables;
using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Colour;
using osu.Framework.Graphics.Containers;
using osu.Framework.Layout;
using osu.Game.Graphics;
using osu.Game.Rulesets.Edit;
using osu.Game.Rulesets.Objects;
using osuTK;
using osuTK.Graphics;
namespace osu.Game.Screens.Edit.Compose.Components
{
@ -135,7 +136,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
/// </summary>
/// <param name="placementIndex">The 0-based beat index from the point of placement.</param>
/// <returns>The applicable colour.</returns>
protected ColourInfo GetColourForIndexFromPlacement(int placementIndex)
protected Color4 GetColourForIndexFromPlacement(int placementIndex)
{
var timingPoint = Beatmap.ControlPointInfo.TimingPointAt(StartTime);
double beatLength = timingPoint.BeatLength / beatDivisor.Value;
@ -144,7 +145,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
var colour = BindableBeatDivisor.GetColourFor(BindableBeatDivisor.GetDivisorForBeatIndex(beatIndex + placementIndex + 1, beatDivisor.Value), Colours);
int repeatIndex = placementIndex / beatDivisor.Value;
return ColourInfo.SingleColour(colour).MultiplyAlpha(0.5f / (repeatIndex + 1));
return colour.Opacity(0.5f / (repeatIndex + 1));
}
}
}