diff --git a/osu.Android.props b/osu.Android.props
index c88bea8265..f4d08e443c 100644
--- a/osu.Android.props
+++ b/osu.Android.props
@@ -11,7 +11,7 @@
manifestmerger.jar
-
+
diff --git a/osu.Game.Rulesets.Mania/Scoring/ManiaScoreProcessor.cs b/osu.Game.Rulesets.Mania/Scoring/ManiaScoreProcessor.cs
index 3341f834dd..6292ed75cd 100644
--- a/osu.Game.Rulesets.Mania/Scoring/ManiaScoreProcessor.cs
+++ b/osu.Game.Rulesets.Mania/Scoring/ManiaScoreProcessor.cs
@@ -18,8 +18,8 @@ namespace osu.Game.Rulesets.Mania.Scoring
protected override double ComputeTotalScore(double comboProgress, double accuracyProgress, double bonusPortion)
{
- return 200000 * comboProgress
- + 800000 * Math.Pow(Accuracy.Value, 2 + 2 * Accuracy.Value) * accuracyProgress
+ return 10000 * comboProgress
+ + 990000 * Math.Pow(Accuracy.Value, 2 + 2 * Accuracy.Value) * accuracyProgress
+ bonusPortion;
}
diff --git a/osu.Game.Rulesets.Osu.Tests/Editor/TestSceneObjectObjectSnap.cs b/osu.Game.Rulesets.Osu.Tests/Editor/TestSceneObjectObjectSnap.cs
index 3b8a5a90a5..9af1855167 100644
--- a/osu.Game.Rulesets.Osu.Tests/Editor/TestSceneObjectObjectSnap.cs
+++ b/osu.Game.Rulesets.Osu.Tests/Editor/TestSceneObjectObjectSnap.cs
@@ -43,7 +43,7 @@ namespace osu.Game.Rulesets.Osu.Tests.Editor
AddStep("place first object", () => InputManager.Click(MouseButton.Left));
- AddStep("move mouse slightly", () => InputManager.MoveMouseTo(playfield.ScreenSpaceDrawQuad.Centre + new Vector2(playfield.ScreenSpaceDrawQuad.Width * 0.02f, 0)));
+ AddStep("move mouse slightly", () => InputManager.MoveMouseTo(playfield.ScreenSpaceDrawQuad.Centre + new Vector2(playfield.ScreenSpaceDrawQuad.Width * 0.01f, 0)));
AddStep("place second object", () => InputManager.Click(MouseButton.Left));
@@ -75,7 +75,7 @@ namespace osu.Game.Rulesets.Osu.Tests.Editor
AddStep("enter circle placement mode", () => InputManager.Key(Key.Number2));
- AddStep("move mouse slightly", () => InputManager.MoveMouseTo(playfield.ScreenSpaceDrawQuad.Centre + new Vector2(playfield.ScreenSpaceDrawQuad.Width * 0.235f, 0)));
+ AddStep("move mouse slightly", () => InputManager.MoveMouseTo(playfield.ScreenSpaceDrawQuad.Centre + new Vector2(playfield.ScreenSpaceDrawQuad.Width * 0.205f, 0)));
AddStep("place second object", () => InputManager.Click(MouseButton.Left));
@@ -122,7 +122,7 @@ namespace osu.Game.Rulesets.Osu.Tests.Editor
AddStep("begin drag", () => InputManager.PressButton(MouseButton.Left));
- AddStep("move mouse slightly off centre", () => InputManager.MoveMouseTo(playfield.ScreenSpaceDrawQuad.Centre + new Vector2(playfield.ScreenSpaceDrawQuad.Width * 0.02f, 0)));
+ AddStep("move mouse slightly off centre", () => InputManager.MoveMouseTo(playfield.ScreenSpaceDrawQuad.Centre + new Vector2(playfield.ScreenSpaceDrawQuad.Width * 0.01f, 0)));
AddAssert("object 3 snapped to 1", () =>
{
@@ -134,7 +134,7 @@ namespace osu.Game.Rulesets.Osu.Tests.Editor
return Precision.AlmostEquals(first.EndPosition, third.Position);
});
- AddStep("move mouse slightly off centre", () => InputManager.MoveMouseTo(playfield.ScreenSpaceDrawQuad.Centre + new Vector2(playfield.ScreenSpaceDrawQuad.Width * -0.22f, playfield.ScreenSpaceDrawQuad.Width * 0.21f)));
+ AddStep("move mouse slightly off centre", () => InputManager.MoveMouseTo(playfield.ScreenSpaceDrawQuad.Centre + new Vector2(playfield.ScreenSpaceDrawQuad.Width * -0.21f, playfield.ScreenSpaceDrawQuad.Width * 0.205f)));
AddAssert("object 2 snapped to 1", () =>
{
diff --git a/osu.Game.Rulesets.Osu/Edit/OsuHitObjectComposer.cs b/osu.Game.Rulesets.Osu/Edit/OsuHitObjectComposer.cs
index ad6af6d74e..aac5f6ffb1 100644
--- a/osu.Game.Rulesets.Osu/Edit/OsuHitObjectComposer.cs
+++ b/osu.Game.Rulesets.Osu/Edit/OsuHitObjectComposer.cs
@@ -187,7 +187,7 @@ namespace osu.Game.Rulesets.Osu.Edit
var playfield = PlayfieldAtScreenSpacePosition(screenSpacePosition);
float snapRadius =
- playfield.GamefieldToScreenSpace(new Vector2(OsuHitObject.OBJECT_RADIUS / 5)).X -
+ playfield.GamefieldToScreenSpace(new Vector2(OsuHitObject.OBJECT_RADIUS * 0.10f)).X -
playfield.GamefieldToScreenSpace(Vector2.Zero).X;
foreach (var b in blueprints)
diff --git a/osu.Game.Tests/Visual/Editing/TestSceneBeatDivisorControl.cs b/osu.Game.Tests/Visual/Editing/TestSceneBeatDivisorControl.cs
index c7b6d984ed..88b959a2a0 100644
--- a/osu.Game.Tests/Visual/Editing/TestSceneBeatDivisorControl.cs
+++ b/osu.Game.Tests/Visual/Editing/TestSceneBeatDivisorControl.cs
@@ -1,8 +1,6 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
-#nullable disable
-
using System;
using System.Diagnostics;
using System.Linq;
@@ -23,8 +21,8 @@ namespace osu.Game.Tests.Visual.Editing
{
public partial class TestSceneBeatDivisorControl : OsuManualInputManagerTestScene
{
- private BeatDivisorControl beatDivisorControl;
- private BindableBeatDivisor bindableBeatDivisor;
+ private BeatDivisorControl beatDivisorControl = null!;
+ private BindableBeatDivisor bindableBeatDivisor = null!;
private SliderBar tickSliderBar => beatDivisorControl.ChildrenOfType>().Single();
private Triangle tickMarkerHead => tickSliderBar.ChildrenOfType().Single();
@@ -169,9 +167,11 @@ namespace osu.Game.Tests.Visual.Editing
switchPresets(1);
assertPreset(BeatDivisorType.Triplets);
+ assertBeatSnap(6);
switchPresets(1);
assertPreset(BeatDivisorType.Common);
+ assertBeatSnap(4);
switchPresets(-1);
assertPreset(BeatDivisorType.Triplets);
@@ -187,6 +187,7 @@ namespace osu.Game.Tests.Visual.Editing
setDivisorViaInput(15);
assertPreset(BeatDivisorType.Custom, 15);
+ assertBeatSnap(15);
switchBeatSnap(-1);
assertBeatSnap(5);
@@ -196,12 +197,14 @@ namespace osu.Game.Tests.Visual.Editing
setDivisorViaInput(5);
assertPreset(BeatDivisorType.Custom, 15);
+ assertBeatSnap(5);
switchPresets(1);
assertPreset(BeatDivisorType.Common);
switchPresets(-1);
- assertPreset(BeatDivisorType.Triplets);
+ assertPreset(BeatDivisorType.Custom, 15);
+ assertBeatSnap(15);
}
private void switchBeatSnap(int direction) => AddRepeatStep($"move snap {(direction > 0 ? "forward" : "backward")}", () =>
@@ -225,7 +228,7 @@ namespace osu.Game.Tests.Visual.Editing
private void assertPreset(BeatDivisorType type, int? maxDivisor = null)
{
- AddAssert($"preset is {type}", () => bindableBeatDivisor.ValidDivisors.Value.Type == type);
+ AddAssert($"preset is {type}", () => bindableBeatDivisor.ValidDivisors.Value.Type, () => Is.EqualTo(type));
if (type == BeatDivisorType.Custom)
{
@@ -243,7 +246,7 @@ namespace osu.Game.Tests.Visual.Editing
InputManager.Click(MouseButton.Left);
});
- BeatDivisorControl.CustomDivisorPopover popover = null;
+ BeatDivisorControl.CustomDivisorPopover? popover = null;
AddUntilStep("wait for popover", () => (popover = this.ChildrenOfType().SingleOrDefault()) != null && popover.IsLoaded);
AddStep($"set divisor to {divisor}", () =>
{
diff --git a/osu.Game/Beatmaps/BeatmapPanelBackgroundTextureLoaderStore.cs b/osu.Game/Beatmaps/BeatmapPanelBackgroundTextureLoaderStore.cs
new file mode 100644
index 0000000000..6d5b90521e
--- /dev/null
+++ b/osu.Game/Beatmaps/BeatmapPanelBackgroundTextureLoaderStore.cs
@@ -0,0 +1,89 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+using System.Threading.Tasks;
+using osu.Framework.Graphics.Textures;
+using osu.Framework.IO.Stores;
+using SixLabors.ImageSharp;
+using SixLabors.ImageSharp.Processing;
+
+namespace osu.Game.Beatmaps
+{
+ // Implementation of this class is based off of `MaxDimensionLimitedTextureLoaderStore`.
+ // If issues are found it's worth checking to make sure similar issues exist there.
+ public class BeatmapPanelBackgroundTextureLoaderStore : IResourceStore
+ {
+ // These numbers are taken from the draw visualiser size requirements for song select panel textures at extreme aspect ratios.
+ private const int max_height = 130;
+ private const int max_width = 1280;
+
+ private readonly IResourceStore? textureStore;
+
+ public BeatmapPanelBackgroundTextureLoaderStore(IResourceStore? textureStore)
+ {
+ this.textureStore = textureStore;
+ }
+
+ public void Dispose()
+ {
+ textureStore?.Dispose();
+ }
+
+ public TextureUpload Get(string name)
+ {
+ var textureUpload = textureStore?.Get(name);
+
+ // NRT not enabled on framework side classes (IResourceStore / TextureLoaderStore), welp.
+ if (textureUpload == null)
+ return null!;
+
+ return limitTextureUploadSize(textureUpload);
+ }
+
+ public async Task GetAsync(string name, CancellationToken cancellationToken = new CancellationToken())
+ {
+ // NRT not enabled on framework side classes (IResourceStore / TextureLoaderStore), welp.
+ if (textureStore == null)
+ return null!;
+
+ var textureUpload = await textureStore.GetAsync(name, cancellationToken).ConfigureAwait(false);
+
+ if (textureUpload == null)
+ return null!;
+
+ return await Task.Run(() => limitTextureUploadSize(textureUpload), cancellationToken).ConfigureAwait(false);
+ }
+
+ private TextureUpload limitTextureUploadSize(TextureUpload textureUpload)
+ {
+ var image = Image.LoadPixelData(textureUpload.Data.ToArray(), textureUpload.Width, textureUpload.Height);
+
+ // The original texture upload will no longer be returned or used.
+ textureUpload.Dispose();
+
+ Size size = image.Size();
+ int usableWidth = Math.Min(max_width, size.Width);
+ int usableHeight = Math.Min(max_height, size.Height);
+
+ // Crop the centre region of the background for now.
+ Rectangle cropRectangle = new Rectangle(
+ (size.Width - usableWidth) / 2,
+ (size.Height - usableHeight) / 2,
+ usableWidth,
+ usableHeight
+ );
+
+ image.Mutate(i => i.Crop(cropRectangle));
+
+ return new TextureUpload(image);
+ }
+
+ public Stream? GetStream(string name) => textureStore?.GetStream(name);
+
+ public IEnumerable GetAvailableResources() => textureStore?.GetAvailableResources() ?? Array.Empty();
+ }
+}
diff --git a/osu.Game/Beatmaps/IBeatmapResourceProvider.cs b/osu.Game/Beatmaps/IBeatmapResourceProvider.cs
index 22ff7ce8c8..9e79e03785 100644
--- a/osu.Game/Beatmaps/IBeatmapResourceProvider.cs
+++ b/osu.Game/Beatmaps/IBeatmapResourceProvider.cs
@@ -9,13 +9,18 @@ using osu.Game.IO;
namespace osu.Game.Beatmaps
{
- public interface IBeatmapResourceProvider : IStorageResourceProvider
+ internal interface IBeatmapResourceProvider : IStorageResourceProvider
{
///
/// Retrieve a global large texture store, used for loading beatmap backgrounds.
///
TextureStore LargeTextureStore { get; }
+ ///
+ /// Retrieve a global large texture store, used specifically for retrieving cropped beatmap panel backgrounds.
+ ///
+ TextureStore BeatmapPanelTextureStore { get; }
+
///
/// Access a global track store for retrieving beatmap tracks from.
///
diff --git a/osu.Game/Beatmaps/IWorkingBeatmap.cs b/osu.Game/Beatmaps/IWorkingBeatmap.cs
index 4b0a498a56..bdfa6bdf6d 100644
--- a/osu.Game/Beatmaps/IWorkingBeatmap.cs
+++ b/osu.Game/Beatmaps/IWorkingBeatmap.cs
@@ -32,12 +32,12 @@ namespace osu.Game.Beatmaps
///
/// Whether the Beatmap has finished loading.
///
- public bool BeatmapLoaded { get; }
+ bool BeatmapLoaded { get; }
///
/// Whether the Track has finished loading.
///
- public bool TrackLoaded { get; }
+ bool TrackLoaded { get; }
///
/// Retrieves the which this represents.
@@ -49,6 +49,11 @@ namespace osu.Game.Beatmaps
///
Texture GetBackground();
+ ///
+ /// Retrieves a cropped background for this used for display on panels.
+ ///
+ Texture GetPanelBackground();
+
///
/// Retrieves the for the of this .
///
@@ -124,12 +129,12 @@ namespace osu.Game.Beatmaps
///
/// Beings loading the contents of this asynchronously.
///
- public void BeginAsyncLoad();
+ void BeginAsyncLoad();
///
/// Cancels the asynchronous loading of the contents of this .
///
- public void CancelAsyncLoad();
+ void CancelAsyncLoad();
///
/// Reads the correct track restart point from beatmap metadata and sets looping to enabled.
diff --git a/osu.Game/Beatmaps/WorkingBeatmap.cs b/osu.Game/Beatmaps/WorkingBeatmap.cs
index a69859f724..25159996f3 100644
--- a/osu.Game/Beatmaps/WorkingBeatmap.cs
+++ b/osu.Game/Beatmaps/WorkingBeatmap.cs
@@ -66,6 +66,7 @@ namespace osu.Game.Beatmaps
protected abstract IBeatmap GetBeatmap();
public abstract Texture GetBackground();
+ public virtual Texture GetPanelBackground() => GetBackground();
protected abstract Track GetBeatmapTrack();
///
diff --git a/osu.Game/Beatmaps/WorkingBeatmapCache.cs b/osu.Game/Beatmaps/WorkingBeatmapCache.cs
index 94865ed8d0..0f3d61f527 100644
--- a/osu.Game/Beatmaps/WorkingBeatmapCache.cs
+++ b/osu.Game/Beatmaps/WorkingBeatmapCache.cs
@@ -42,6 +42,7 @@ namespace osu.Game.Beatmaps
private readonly AudioManager audioManager;
private readonly IResourceStore resources;
private readonly LargeTextureStore largeTextureStore;
+ private readonly LargeTextureStore beatmapPanelTextureStore;
private readonly ITrackStore trackStore;
private readonly IResourceStore files;
@@ -58,6 +59,7 @@ namespace osu.Game.Beatmaps
this.host = host;
this.files = files;
largeTextureStore = new LargeTextureStore(host?.Renderer ?? new DummyRenderer(), host?.CreateTextureLoaderStore(files));
+ beatmapPanelTextureStore = new LargeTextureStore(host?.Renderer ?? new DummyRenderer(), new BeatmapPanelBackgroundTextureLoaderStore(host?.CreateTextureLoaderStore(files)));
this.trackStore = trackStore;
}
@@ -110,6 +112,7 @@ namespace osu.Game.Beatmaps
#region IResourceStorageProvider
TextureStore IBeatmapResourceProvider.LargeTextureStore => largeTextureStore;
+ TextureStore IBeatmapResourceProvider.BeatmapPanelTextureStore => beatmapPanelTextureStore;
ITrackStore IBeatmapResourceProvider.Tracks => trackStore;
IRenderer IStorageResourceProvider.Renderer => host?.Renderer ?? new DummyRenderer();
AudioManager IStorageResourceProvider.AudioManager => audioManager;
@@ -160,7 +163,11 @@ namespace osu.Game.Beatmaps
}
}
- public override Texture GetBackground()
+ public override Texture GetPanelBackground() => getBackgroundFromStore(resources.BeatmapPanelTextureStore);
+
+ public override Texture GetBackground() => getBackgroundFromStore(resources.LargeTextureStore);
+
+ private Texture getBackgroundFromStore(TextureStore store)
{
if (string.IsNullOrEmpty(Metadata?.BackgroundFile))
return null;
@@ -168,7 +175,7 @@ namespace osu.Game.Beatmaps
try
{
string fileStorePath = BeatmapSetInfo.GetPathForFile(Metadata.BackgroundFile);
- var texture = resources.LargeTextureStore.Get(fileStorePath);
+ var texture = store.Get(fileStorePath);
if (texture == null)
{
diff --git a/osu.Game/Screens/Edit/Compose/Components/BeatDivisorControl.cs b/osu.Game/Screens/Edit/Compose/Components/BeatDivisorControl.cs
index 5a1fbbee1e..f7159f8670 100644
--- a/osu.Game/Screens/Edit/Compose/Components/BeatDivisorControl.cs
+++ b/osu.Game/Screens/Edit/Compose/Components/BeatDivisorControl.cs
@@ -1,8 +1,6 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
-#nullable disable
-
using System;
using System.Diagnostics;
using System.Linq;
@@ -33,6 +31,8 @@ namespace osu.Game.Screens.Edit.Compose.Components
{
public partial class BeatDivisorControl : CompositeDrawable, IKeyBindingHandler
{
+ private int? lastCustomDivisor;
+
private readonly BindableBeatDivisor beatDivisor = new BindableBeatDivisor();
public BeatDivisorControl(BindableBeatDivisor beatDivisor)
@@ -186,29 +186,46 @@ namespace osu.Game.Screens.Edit.Compose.Components
};
}
+ protected override void LoadComplete()
+ {
+ base.LoadComplete();
+
+ beatDivisor.ValidDivisors.BindValueChanged(valid =>
+ {
+ if (valid.NewValue.Type == BeatDivisorType.Custom)
+ lastCustomDivisor = valid.NewValue.Presets.Last();
+ }, true);
+ }
+
private void cycleDivisorType(int direction)
{
- Debug.Assert(Math.Abs(direction) == 1);
- int nextDivisorType = (int)beatDivisor.ValidDivisors.Value.Type + direction;
- if (nextDivisorType > (int)BeatDivisorType.Triplets)
- nextDivisorType = (int)BeatDivisorType.Common;
- else if (nextDivisorType < (int)BeatDivisorType.Common)
- nextDivisorType = (int)BeatDivisorType.Triplets;
+ int totalTypes = Enum.GetValues().Length;
+ BeatDivisorType currentType = beatDivisor.ValidDivisors.Value.Type;
- switch ((BeatDivisorType)nextDivisorType)
+ Debug.Assert(Math.Abs(direction) == 1);
+
+ cycleOnce();
+
+ if (lastCustomDivisor == null && currentType == BeatDivisorType.Custom)
+ cycleOnce();
+
+ switch (currentType)
{
case BeatDivisorType.Common:
- beatDivisor.ValidDivisors.Value = BeatDivisorPresetCollection.COMMON;
+ beatDivisor.SetArbitraryDivisor(4);
break;
case BeatDivisorType.Triplets:
- beatDivisor.ValidDivisors.Value = BeatDivisorPresetCollection.TRIPLETS;
+ beatDivisor.SetArbitraryDivisor(6);
break;
case BeatDivisorType.Custom:
- beatDivisor.ValidDivisors.Value = BeatDivisorPresetCollection.Custom(beatDivisor.ValidDivisors.Value.Presets.Max());
+ Debug.Assert(lastCustomDivisor != null);
+ beatDivisor.SetArbitraryDivisor(lastCustomDivisor.Value);
break;
}
+
+ void cycleOnce() => currentType = (BeatDivisorType)(((int)currentType + totalTypes + direction) % totalTypes);
}
protected override bool OnKeyDown(KeyDownEvent e)
@@ -326,12 +343,12 @@ namespace osu.Game.Screens.Edit.Compose.Components
{
base.LoadComplete();
BeatDivisor.BindValueChanged(_ => updateState(), true);
- divisorTextBox.OnCommit += (_, _) => setPresets();
+ divisorTextBox.OnCommit += (_, _) => setPresetsFromTextBoxEntry();
Schedule(() => GetContainingInputManager().ChangeFocus(divisorTextBox));
}
- private void setPresets()
+ private void setPresetsFromTextBoxEntry()
{
if (!int.TryParse(divisorTextBox.Text, out int divisor) || divisor < 1 || divisor > 64)
{
@@ -394,10 +411,10 @@ namespace osu.Game.Screens.Edit.Compose.Components
private partial class TickSliderBar : SliderBar
{
- private Marker marker;
+ private Marker marker = null!;
[Resolved]
- private OsuColour colours { get; set; }
+ private OsuColour colours { get; set; } = null!;
private readonly BindableBeatDivisor beatDivisor;
@@ -539,7 +556,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
private partial class Marker : CompositeDrawable
{
[Resolved]
- private OverlayColourProvider colourProvider { get; set; }
+ private OverlayColourProvider colourProvider { get; set; } = null!;
[BackgroundDependencyLoader]
private void load()
diff --git a/osu.Game/Screens/Edit/EditorScreenWithTimeline.cs b/osu.Game/Screens/Edit/EditorScreenWithTimeline.cs
index 84cfac8f65..b8cbff047e 100644
--- a/osu.Game/Screens/Edit/EditorScreenWithTimeline.cs
+++ b/osu.Game/Screens/Edit/EditorScreenWithTimeline.cs
@@ -82,7 +82,7 @@ namespace osu.Game.Screens.Edit
AutoSizeAxes = Axes.Y,
Padding = new MarginPadding { Right = 5 },
},
- new BeatDivisorControl(beatDivisor) { RelativeSizeAxes = Axes.Both }
+ new BeatDivisorControl(this.beatDivisor) { RelativeSizeAxes = Axes.Both }
},
},
RowDimensions = new[]
diff --git a/osu.Game/Screens/Select/Carousel/SetPanelBackground.cs b/osu.Game/Screens/Select/Carousel/SetPanelBackground.cs
index 6f13a34bfc..b8729b7174 100644
--- a/osu.Game/Screens/Select/Carousel/SetPanelBackground.cs
+++ b/osu.Game/Screens/Select/Carousel/SetPanelBackground.cs
@@ -1,12 +1,14 @@
// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
+using System;
+using osu.Framework.Allocation;
using osu.Framework.Graphics;
using osu.Framework.Graphics.Colour;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes;
+using osu.Framework.Graphics.Sprites;
using osu.Game.Beatmaps;
-using osu.Game.Beatmaps.Drawables;
using osuTK;
using osuTK.Graphics;
@@ -21,7 +23,7 @@ namespace osu.Game.Screens.Select.Carousel
Children = new Drawable[]
{
- new BeatmapBackgroundSprite(working)
+ new PanelBeatmapBackground(working)
{
RelativeSizeAxes = Axes.Both,
Anchor = Anchor.Centre,
@@ -68,5 +70,23 @@ namespace osu.Game.Screens.Select.Carousel
},
};
}
+
+ public partial class PanelBeatmapBackground : Sprite
+ {
+ private readonly IWorkingBeatmap working;
+
+ public PanelBeatmapBackground(IWorkingBeatmap working)
+ {
+ ArgumentNullException.ThrowIfNull(working);
+
+ this.working = working;
+ }
+
+ [BackgroundDependencyLoader]
+ private void load()
+ {
+ Texture = working.GetPanelBackground();
+ }
+ }
}
}
diff --git a/osu.Game/osu.Game.csproj b/osu.Game/osu.Game.csproj
index 8a941ca6c1..b2faa7dfc2 100644
--- a/osu.Game/osu.Game.csproj
+++ b/osu.Game/osu.Game.csproj
@@ -36,7 +36,7 @@
runtime; build; native; contentfiles; analyzers; buildtransitive
-
+
diff --git a/osu.iOS.props b/osu.iOS.props
index 1dcece7741..9aafec6c50 100644
--- a/osu.iOS.props
+++ b/osu.iOS.props
@@ -16,6 +16,6 @@
iossimulator-x64
-
+