Move OmitFirstBarLine to TimingControlPoint

This commit is contained in:
Dean Herbert 2023-02-28 19:29:31 +09:00
parent 1250c1f0c1
commit 044b0604b2
12 changed files with 45 additions and 45 deletions

View File

@ -73,11 +73,10 @@ namespace osu.Game.Rulesets.Taiko.Tests
beatmap.ControlPointInfo.Add(start_time, new TimingControlPoint beatmap.ControlPointInfo.Add(start_time, new TimingControlPoint
{ {
BeatLength = beat_length, BeatLength = beat_length,
TimeSignature = new TimeSignature(time_signature_numerator) TimeSignature = new TimeSignature(time_signature_numerator),
OmitFirstBarLine = true
}); });
beatmap.ControlPointInfo.Add(start_time, new EffectControlPoint { OmitFirstBarLine = true });
var barlines = new BarLineGenerator<BarLine>(beatmap).BarLines; var barlines = new BarLineGenerator<BarLine>(beatmap).BarLines;
AddAssert("first barline ommited", () => barlines.All(b => b.StartTime != start_time)); AddAssert("first barline ommited", () => barlines.All(b => b.StartTime != start_time));

View File

@ -72,7 +72,6 @@ namespace osu.Game.Rulesets.Taiko.Beatmaps
converted.ControlPointInfo.Add(hitObject.StartTime, new EffectControlPoint converted.ControlPointInfo.Add(hitObject.StartTime, new EffectControlPoint
{ {
KiaiMode = currentEffectPoint.KiaiMode, KiaiMode = currentEffectPoint.KiaiMode,
OmitFirstBarLine = currentEffectPoint.OmitFirstBarLine,
ScrollSpeed = lastScrollSpeed = nextScrollSpeed, ScrollSpeed = lastScrollSpeed = nextScrollSpeed,
}); });
} }

View File

@ -13,15 +13,9 @@ namespace osu.Game.Beatmaps.ControlPoints
public static readonly EffectControlPoint DEFAULT = new EffectControlPoint public static readonly EffectControlPoint DEFAULT = new EffectControlPoint
{ {
KiaiModeBindable = { Disabled = true }, KiaiModeBindable = { Disabled = true },
OmitFirstBarLineBindable = { Disabled = true },
ScrollSpeedBindable = { Disabled = true } ScrollSpeedBindable = { Disabled = true }
}; };
/// <summary>
/// Whether the first bar line of this control point is ignored.
/// </summary>
public readonly BindableBool OmitFirstBarLineBindable = new BindableBool();
/// <summary> /// <summary>
/// The relative scroll speed at this control point. /// The relative scroll speed at this control point.
/// </summary> /// </summary>
@ -43,15 +37,6 @@ namespace osu.Game.Beatmaps.ControlPoints
public override Color4 GetRepresentingColour(OsuColour colours) => colours.Purple; public override Color4 GetRepresentingColour(OsuColour colours) => colours.Purple;
/// <summary>
/// Whether the first bar line of this control point is ignored.
/// </summary>
public bool OmitFirstBarLine
{
get => OmitFirstBarLineBindable.Value;
set => OmitFirstBarLineBindable.Value = value;
}
/// <summary> /// <summary>
/// Whether this control point enables Kiai mode. /// Whether this control point enables Kiai mode.
/// </summary> /// </summary>
@ -67,16 +52,13 @@ namespace osu.Game.Beatmaps.ControlPoints
} }
public override bool IsRedundant(ControlPoint? existing) public override bool IsRedundant(ControlPoint? existing)
=> !OmitFirstBarLine => existing is EffectControlPoint existingEffect
&& existing is EffectControlPoint existingEffect
&& KiaiMode == existingEffect.KiaiMode && KiaiMode == existingEffect.KiaiMode
&& OmitFirstBarLine == existingEffect.OmitFirstBarLine
&& ScrollSpeed == existingEffect.ScrollSpeed; && ScrollSpeed == existingEffect.ScrollSpeed;
public override void CopyFrom(ControlPoint other) public override void CopyFrom(ControlPoint other)
{ {
KiaiMode = ((EffectControlPoint)other).KiaiMode; KiaiMode = ((EffectControlPoint)other).KiaiMode;
OmitFirstBarLine = ((EffectControlPoint)other).OmitFirstBarLine;
ScrollSpeed = ((EffectControlPoint)other).ScrollSpeed; ScrollSpeed = ((EffectControlPoint)other).ScrollSpeed;
base.CopyFrom(other); base.CopyFrom(other);
@ -88,10 +70,9 @@ namespace osu.Game.Beatmaps.ControlPoints
public bool Equals(EffectControlPoint? other) public bool Equals(EffectControlPoint? other)
=> base.Equals(other) => base.Equals(other)
&& OmitFirstBarLine == other.OmitFirstBarLine
&& ScrollSpeed == other.ScrollSpeed && ScrollSpeed == other.ScrollSpeed
&& KiaiMode == other.KiaiMode; && KiaiMode == other.KiaiMode;
public override int GetHashCode() => HashCode.Combine(base.GetHashCode(), OmitFirstBarLine, ScrollSpeed, KiaiMode); public override int GetHashCode() => HashCode.Combine(base.GetHashCode(), ScrollSpeed, KiaiMode);
} }
} }

View File

@ -16,6 +16,11 @@ namespace osu.Game.Beatmaps.ControlPoints
/// </summary> /// </summary>
public readonly Bindable<TimeSignature> TimeSignatureBindable = new Bindable<TimeSignature>(TimeSignature.SimpleQuadruple); public readonly Bindable<TimeSignature> TimeSignatureBindable = new Bindable<TimeSignature>(TimeSignature.SimpleQuadruple);
/// <summary>
/// Whether the first bar line of this control point is ignored.
/// </summary>
public readonly BindableBool OmitFirstBarLineBindable = new BindableBool();
/// <summary> /// <summary>
/// Default length of a beat in milliseconds. Used whenever there is no beatmap or track playing. /// Default length of a beat in milliseconds. Used whenever there is no beatmap or track playing.
/// </summary> /// </summary>
@ -30,6 +35,7 @@ namespace osu.Game.Beatmaps.ControlPoints
Value = default_beat_length, Value = default_beat_length,
Disabled = true Disabled = true
}, },
OmitFirstBarLineBindable = { Disabled = true },
TimeSignatureBindable = { Disabled = true } TimeSignatureBindable = { Disabled = true }
}; };
@ -42,6 +48,15 @@ namespace osu.Game.Beatmaps.ControlPoints
set => TimeSignatureBindable.Value = value; set => TimeSignatureBindable.Value = value;
} }
/// <summary>
/// Whether the first bar line of this control point is ignored.
/// </summary>
public bool OmitFirstBarLine
{
get => OmitFirstBarLineBindable.Value;
set => OmitFirstBarLineBindable.Value = value;
}
public const double DEFAULT_BEAT_LENGTH = 1000; public const double DEFAULT_BEAT_LENGTH = 1000;
/// <summary> /// <summary>
@ -73,6 +88,7 @@ namespace osu.Game.Beatmaps.ControlPoints
public override void CopyFrom(ControlPoint other) public override void CopyFrom(ControlPoint other)
{ {
TimeSignature = ((TimingControlPoint)other).TimeSignature; TimeSignature = ((TimingControlPoint)other).TimeSignature;
OmitFirstBarLine = ((TimingControlPoint)other).OmitFirstBarLine;
BeatLength = ((TimingControlPoint)other).BeatLength; BeatLength = ((TimingControlPoint)other).BeatLength;
base.CopyFrom(other); base.CopyFrom(other);
@ -85,8 +101,9 @@ namespace osu.Game.Beatmaps.ControlPoints
public bool Equals(TimingControlPoint? other) public bool Equals(TimingControlPoint? other)
=> base.Equals(other) => base.Equals(other)
&& TimeSignature.Equals(other.TimeSignature) && TimeSignature.Equals(other.TimeSignature)
&& OmitFirstBarLine == other.OmitFirstBarLine
&& BeatLength.Equals(other.BeatLength); && BeatLength.Equals(other.BeatLength);
public override int GetHashCode() => HashCode.Combine(base.GetHashCode(), TimeSignature, BeatLength); public override int GetHashCode() => HashCode.Combine(base.GetHashCode(), TimeSignature, BeatLength, OmitFirstBarLine);
} }
} }

View File

@ -431,6 +431,7 @@ namespace osu.Game.Beatmaps.Formats
controlPoint.BeatLength = beatLength; controlPoint.BeatLength = beatLength;
controlPoint.TimeSignature = timeSignature; controlPoint.TimeSignature = timeSignature;
controlPoint.OmitFirstBarLine = omitFirstBarSignature;
addControlPoint(time, controlPoint, true); addControlPoint(time, controlPoint, true);
} }
@ -447,7 +448,6 @@ namespace osu.Game.Beatmaps.Formats
var effectPoint = new EffectControlPoint var effectPoint = new EffectControlPoint
{ {
KiaiMode = kiaiMode, KiaiMode = kiaiMode,
OmitFirstBarLine = omitFirstBarSignature,
}; };
// osu!taiko and osu!mania use effect points rather than difficulty points for scroll speed adjustments. // osu!taiko and osu!mania use effect points rather than difficulty points for scroll speed adjustments.

View File

@ -222,6 +222,7 @@ namespace osu.Game.Beatmaps.Formats
{ {
var samplePoint = legacyControlPoints.SamplePointAt(time); var samplePoint = legacyControlPoints.SamplePointAt(time);
var effectPoint = legacyControlPoints.EffectPointAt(time); var effectPoint = legacyControlPoints.EffectPointAt(time);
var timingPoint = legacyControlPoints.TimingPointAt(time);
// Apply the control point to a hit sample to uncover legacy properties (e.g. suffix) // Apply the control point to a hit sample to uncover legacy properties (e.g. suffix)
HitSampleInfo tempHitSample = samplePoint.ApplyTo(new ConvertHitObjectParser.LegacyHitSampleInfo(string.Empty)); HitSampleInfo tempHitSample = samplePoint.ApplyTo(new ConvertHitObjectParser.LegacyHitSampleInfo(string.Empty));
@ -230,10 +231,10 @@ namespace osu.Game.Beatmaps.Formats
LegacyEffectFlags effectFlags = LegacyEffectFlags.None; LegacyEffectFlags effectFlags = LegacyEffectFlags.None;
if (effectPoint.KiaiMode) if (effectPoint.KiaiMode)
effectFlags |= LegacyEffectFlags.Kiai; effectFlags |= LegacyEffectFlags.Kiai;
if (effectPoint.OmitFirstBarLine) if (timingPoint.OmitFirstBarLine)
effectFlags |= LegacyEffectFlags.OmitFirstBarLine; effectFlags |= LegacyEffectFlags.OmitFirstBarLine;
writer.Write(FormattableString.Invariant($"{legacyControlPoints.TimingPointAt(time).TimeSignature.Numerator},")); writer.Write(FormattableString.Invariant($"{timingPoint.TimeSignature.Numerator},"));
writer.Write(FormattableString.Invariant($"{(int)toLegacySampleBank(tempHitSample.Bank)},")); writer.Write(FormattableString.Invariant($"{(int)toLegacySampleBank(tempHitSample.Bank)},"));
writer.Write(FormattableString.Invariant($"{toLegacyCustomSampleBank(tempHitSample)},")); writer.Write(FormattableString.Invariant($"{toLegacyCustomSampleBank(tempHitSample)},"));
writer.Write(FormattableString.Invariant($"{tempHitSample.Volume},")); writer.Write(FormattableString.Invariant($"{tempHitSample.Volume},"));

View File

@ -114,7 +114,7 @@ namespace osu.Game.Graphics.Containers
while (beatLength < MinimumBeatLength) while (beatLength < MinimumBeatLength)
beatLength *= 2; beatLength *= 2;
int beatIndex = (int)((currentTrackTime - timingPoint.Time) / beatLength) - (effectPoint.OmitFirstBarLine ? 1 : 0); int beatIndex = (int)((currentTrackTime - timingPoint.Time) / beatLength) - (timingPoint.OmitFirstBarLine ? 1 : 0);
// The beats before the start of the first control point are off by 1, this should do the trick // The beats before the start of the first control point are off by 1, this should do the trick
if (currentTrackTime < timingPoint.Time) if (currentTrackTime < timingPoint.Time)

View File

@ -38,7 +38,6 @@ namespace osu.Game.Rulesets.Objects
for (int i = 0; i < timingPoints.Count; i++) for (int i = 0; i < timingPoints.Count; i++)
{ {
TimingControlPoint currentTimingPoint = timingPoints[i]; TimingControlPoint currentTimingPoint = timingPoints[i];
EffectControlPoint currentEffectPoint = beatmap.ControlPointInfo.EffectPointAt(currentTimingPoint.Time);
int currentBeat = 0; int currentBeat = 0;
// Don't generate barlines before the hit object or t=0 (whichever is earliest). Some beatmaps use very unrealistic values here (although none are ranked). // Don't generate barlines before the hit object or t=0 (whichever is earliest). Some beatmaps use very unrealistic values here (although none are ranked).
@ -66,7 +65,7 @@ namespace osu.Game.Rulesets.Objects
startTime = currentTimingPoint.Time + barCount * barLength; startTime = currentTimingPoint.Time + barCount * barLength;
} }
if (currentEffectPoint.OmitFirstBarLine) if (currentTimingPoint.OmitFirstBarLine)
{ {
startTime += barLength; startTime += barLength;
} }

View File

@ -14,7 +14,6 @@ namespace osu.Game.Screens.Edit.Timing
internal partial class EffectSection : Section<EffectControlPoint> internal partial class EffectSection : Section<EffectControlPoint>
{ {
private LabelledSwitchButton kiai = null!; private LabelledSwitchButton kiai = null!;
private LabelledSwitchButton omitBarLine = null!;
private SliderWithTextBoxInput<double> scrollSpeedSlider = null!; private SliderWithTextBoxInput<double> scrollSpeedSlider = null!;
@ -24,7 +23,6 @@ namespace osu.Game.Screens.Edit.Timing
Flow.AddRange(new Drawable[] Flow.AddRange(new Drawable[]
{ {
kiai = new LabelledSwitchButton { Label = "Kiai Time" }, kiai = new LabelledSwitchButton { Label = "Kiai Time" },
omitBarLine = new LabelledSwitchButton { Label = "Skip Bar Line" },
scrollSpeedSlider = new SliderWithTextBoxInput<double>("Scroll Speed") scrollSpeedSlider = new SliderWithTextBoxInput<double>("Scroll Speed")
{ {
Current = new EffectControlPoint().ScrollSpeedBindable, Current = new EffectControlPoint().ScrollSpeedBindable,
@ -38,7 +36,6 @@ namespace osu.Game.Screens.Edit.Timing
base.LoadComplete(); base.LoadComplete();
kiai.Current.BindValueChanged(_ => saveChanges()); kiai.Current.BindValueChanged(_ => saveChanges());
omitBarLine.Current.BindValueChanged(_ => saveChanges());
scrollSpeedSlider.Current.BindValueChanged(_ => saveChanges()); scrollSpeedSlider.Current.BindValueChanged(_ => saveChanges());
var drawableRuleset = Beatmap.BeatmapInfo.Ruleset.CreateInstance().CreateDrawableRulesetWith(Beatmap.PlayableBeatmap); var drawableRuleset = Beatmap.BeatmapInfo.Ruleset.CreateInstance().CreateDrawableRulesetWith(Beatmap.PlayableBeatmap);
@ -60,7 +57,6 @@ namespace osu.Game.Screens.Edit.Timing
isRebinding = true; isRebinding = true;
kiai.Current = point.NewValue.KiaiModeBindable; kiai.Current = point.NewValue.KiaiModeBindable;
omitBarLine.Current = point.NewValue.OmitFirstBarLineBindable;
scrollSpeedSlider.Current = point.NewValue.ScrollSpeedBindable; scrollSpeedSlider.Current = point.NewValue.ScrollSpeedBindable;
isRebinding = false; isRebinding = false;
@ -74,7 +70,6 @@ namespace osu.Game.Screens.Edit.Timing
return new EffectControlPoint return new EffectControlPoint
{ {
KiaiMode = reference.KiaiMode, KiaiMode = reference.KiaiMode,
OmitFirstBarLine = reference.OmitFirstBarLine,
ScrollSpeed = reference.ScrollSpeed, ScrollSpeed = reference.ScrollSpeed,
}; };
} }

View File

@ -11,18 +11,15 @@ namespace osu.Game.Screens.Edit.Timing.RowAttributes
public partial class EffectRowAttribute : RowAttribute public partial class EffectRowAttribute : RowAttribute
{ {
private readonly Bindable<bool> kiaiMode; private readonly Bindable<bool> kiaiMode;
private readonly Bindable<bool> omitBarLine;
private readonly BindableNumber<double> scrollSpeed; private readonly BindableNumber<double> scrollSpeed;
private AttributeText kiaiModeBubble = null!; private AttributeText kiaiModeBubble = null!;
private AttributeText omitBarLineBubble = null!;
private AttributeText text = null!; private AttributeText text = null!;
public EffectRowAttribute(EffectControlPoint effect) public EffectRowAttribute(EffectControlPoint effect)
: base(effect, "effect") : base(effect, "effect")
{ {
kiaiMode = effect.KiaiModeBindable.GetBoundCopy(); kiaiMode = effect.KiaiModeBindable.GetBoundCopy();
omitBarLine = effect.OmitFirstBarLineBindable.GetBoundCopy();
scrollSpeed = effect.ScrollSpeedBindable.GetBoundCopy(); scrollSpeed = effect.ScrollSpeedBindable.GetBoundCopy();
} }
@ -37,11 +34,9 @@ namespace osu.Game.Screens.Edit.Timing.RowAttributes
}, },
text = new AttributeText(Point) { Width = 45 }, text = new AttributeText(Point) { Width = 45 },
kiaiModeBubble = new AttributeText(Point) { Text = "kiai" }, kiaiModeBubble = new AttributeText(Point) { Text = "kiai" },
omitBarLineBubble = new AttributeText(Point) { Text = "no barline" },
}); });
kiaiMode.BindValueChanged(enabled => kiaiModeBubble.FadeTo(enabled.NewValue ? 1 : 0), true); kiaiMode.BindValueChanged(enabled => kiaiModeBubble.FadeTo(enabled.NewValue ? 1 : 0), true);
omitBarLine.BindValueChanged(enabled => omitBarLineBubble.FadeTo(enabled.NewValue ? 1 : 0), true);
scrollSpeed.BindValueChanged(_ => updateText(), true); scrollSpeed.BindValueChanged(_ => updateText(), true);
} }

View File

@ -4,6 +4,7 @@
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Bindables; using osu.Framework.Bindables;
using osu.Framework.Extensions; using osu.Framework.Extensions;
using osu.Framework.Graphics;
using osu.Game.Beatmaps.ControlPoints; using osu.Game.Beatmaps.ControlPoints;
using osu.Game.Beatmaps.Timing; using osu.Game.Beatmaps.Timing;
using osu.Game.Graphics.Sprites; using osu.Game.Graphics.Sprites;
@ -14,24 +15,32 @@ namespace osu.Game.Screens.Edit.Timing.RowAttributes
public partial class TimingRowAttribute : RowAttribute public partial class TimingRowAttribute : RowAttribute
{ {
private readonly BindableNumber<double> beatLength; private readonly BindableNumber<double> beatLength;
private readonly Bindable<bool> omitBarLine;
private readonly Bindable<TimeSignature> timeSignature; private readonly Bindable<TimeSignature> timeSignature;
private AttributeText omitBarLineBubble = null!;
private OsuSpriteText text = null!; private OsuSpriteText text = null!;
public TimingRowAttribute(TimingControlPoint timing) public TimingRowAttribute(TimingControlPoint timing)
: base(timing, "timing") : base(timing, "timing")
{ {
timeSignature = timing.TimeSignatureBindable.GetBoundCopy(); timeSignature = timing.TimeSignatureBindable.GetBoundCopy();
omitBarLine = timing.OmitFirstBarLineBindable.GetBoundCopy();
beatLength = timing.BeatLengthBindable.GetBoundCopy(); beatLength = timing.BeatLengthBindable.GetBoundCopy();
} }
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
private void load(OverlayColourProvider colourProvider) private void load(OverlayColourProvider colourProvider)
{ {
Content.Add(text = new AttributeText(Point)); Content.AddRange(new[]
{
text = new AttributeText(Point),
omitBarLineBubble = new AttributeText(Point) { Text = "no barline" },
});
Background.Colour = colourProvider.Background4; Background.Colour = colourProvider.Background4;
timeSignature.BindValueChanged(_ => updateText()); timeSignature.BindValueChanged(_ => updateText());
omitBarLine.BindValueChanged(enabled => omitBarLineBubble.FadeTo(enabled.NewValue ? 1 : 0), true);
beatLength.BindValueChanged(_ => updateText(), true); beatLength.BindValueChanged(_ => updateText(), true);
} }

View File

@ -12,6 +12,7 @@ namespace osu.Game.Screens.Edit.Timing
internal partial class TimingSection : Section<TimingControlPoint> internal partial class TimingSection : Section<TimingControlPoint>
{ {
private LabelledTimeSignature timeSignature = null!; private LabelledTimeSignature timeSignature = null!;
private LabelledSwitchButton omitBarLine = null!;
private BPMTextBox bpmTextEntry = null!; private BPMTextBox bpmTextEntry = null!;
[BackgroundDependencyLoader] [BackgroundDependencyLoader]
@ -24,7 +25,8 @@ namespace osu.Game.Screens.Edit.Timing
timeSignature = new LabelledTimeSignature timeSignature = new LabelledTimeSignature
{ {
Label = "Time Signature" Label = "Time Signature"
} },
omitBarLine = new LabelledSwitchButton { Label = "Skip Bar Line" },
}); });
} }
@ -33,6 +35,7 @@ namespace osu.Game.Screens.Edit.Timing
base.LoadComplete(); base.LoadComplete();
bpmTextEntry.Current.BindValueChanged(_ => saveChanges()); bpmTextEntry.Current.BindValueChanged(_ => saveChanges());
omitBarLine.Current.BindValueChanged(_ => saveChanges());
timeSignature.Current.BindValueChanged(_ => saveChanges()); timeSignature.Current.BindValueChanged(_ => saveChanges());
void saveChanges() void saveChanges()
@ -51,6 +54,7 @@ namespace osu.Game.Screens.Edit.Timing
bpmTextEntry.Bindable = point.NewValue.BeatLengthBindable; bpmTextEntry.Bindable = point.NewValue.BeatLengthBindable;
timeSignature.Current = point.NewValue.TimeSignatureBindable; timeSignature.Current = point.NewValue.TimeSignatureBindable;
omitBarLine.Current = point.NewValue.OmitFirstBarLineBindable;
isRebinding = false; isRebinding = false;
} }
@ -63,7 +67,8 @@ namespace osu.Game.Screens.Edit.Timing
return new TimingControlPoint return new TimingControlPoint
{ {
BeatLength = reference.BeatLength, BeatLength = reference.BeatLength,
TimeSignature = reference.TimeSignature TimeSignature = reference.TimeSignature,
OmitFirstBarLine = reference.OmitFirstBarLine,
}; };
} }