From 598c6fcbad58333eee5f0ab6e515989ba53ae308 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 24 Jan 2023 15:48:57 +0900 Subject: [PATCH] Add basic support for stupidly long hold note skin textures --- .../special-skin/LongNoteTailWang.png | Bin 0 -> 101181 bytes .../Resources/special-skin/skin.ini | 4 +- .../Skinning/Legacy/LegacyBodyPiece.cs | 6 +- osu.Game/Skinning/Skin.cs | 56 +++++++++++++++++- 4 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 osu.Game.Rulesets.Mania.Tests/Resources/special-skin/LongNoteTailWang.png diff --git a/osu.Game.Rulesets.Mania.Tests/Resources/special-skin/LongNoteTailWang.png b/osu.Game.Rulesets.Mania.Tests/Resources/special-skin/LongNoteTailWang.png new file mode 100644 index 0000000000000000000000000000000000000000..982cc1d259efcd670f0e7baf338a11059c7b098c GIT binary patch literal 101181 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
  • m@nicEnXm?)|Fu4vV*{ZH((wm)g|Fp## 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 literal 0 HcmV?d00001 diff --git a/osu.Game.Rulesets.Mania.Tests/Resources/special-skin/skin.ini b/osu.Game.Rulesets.Mania.Tests/Resources/special-skin/skin.ini index 9c987efc60..7c51036d69 100644 --- a/osu.Game.Rulesets.Mania.Tests/Resources/special-skin/skin.ini +++ b/osu.Game.Rulesets.Mania.Tests/Resources/special-skin/skin.ini @@ -14,4 +14,6 @@ Hit200: mania/hit200@2x Hit300: mania/hit300@2x Hit300g: mania/hit300g@2x StageLeft: mania/stage-left -StageRight: mania/stage-right \ No newline at end of file +StageRight: mania/stage-right +NoteImage0L: LongNoteTailWang +NoteImage1L: LongNoteTailWang diff --git a/osu.Game.Rulesets.Mania/Skinning/Legacy/LegacyBodyPiece.cs b/osu.Game.Rulesets.Mania/Skinning/Legacy/LegacyBodyPiece.cs index c928ebb3e0..6887674a1f 100644 --- a/osu.Game.Rulesets.Mania/Skinning/Legacy/LegacyBodyPiece.cs +++ b/osu.Game.Rulesets.Mania/Skinning/Legacy/LegacyBodyPiece.cs @@ -54,6 +54,9 @@ namespace osu.Game.Rulesets.Mania.Skinning.Legacy float lightScale = GetColumnSkinConfig(skin, LegacyManiaSkinConfigurationLookups.HoldNoteLightScale)?.Value ?? 1; + float minimumColumnWidth = GetColumnSkinConfig(skin, LegacyManiaSkinConfigurationLookups.MinimumColumnWidth)?.Value + ?? 1; + // Create a temporary animation to retrieve the number of frames, in an effort to calculate the intended frame length. // This animation is discarded and re-queried with the appropriate frame length afterwards. var tmp = skin.GetAnimation(lightImage, true, false); @@ -92,7 +95,8 @@ namespace osu.Game.Rulesets.Mania.Skinning.Legacy d.RelativeSizeAxes = Axes.Both; d.Size = Vector2.One; d.FillMode = FillMode.Stretch; - // Todo: Wrap + d.Height = minimumColumnWidth / d.DrawWidth * 1.6f; + // Todo: Wrap? }); if (bodySprite != null) diff --git a/osu.Game/Skinning/Skin.cs b/osu.Game/Skinning/Skin.cs index 19e8bc7092..2761a93290 100644 --- a/osu.Game/Skinning/Skin.cs +++ b/osu.Game/Skinning/Skin.cs @@ -7,9 +7,12 @@ using System.Diagnostics; using System.IO; using System.Linq; using System.Text; +using System.Threading; +using System.Threading.Tasks; using Newtonsoft.Json; using osu.Framework.Audio.Sample; using osu.Framework.Bindables; +using osu.Framework.Extensions.ObjectExtensions; using osu.Framework.Graphics; using osu.Framework.Graphics.Textures; using osu.Framework.IO.Stores; @@ -18,6 +21,8 @@ using osu.Game.Audio; using osu.Game.Database; using osu.Game.IO; using osu.Game.Screens.Play.HUD; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Processing; namespace osu.Game.Skinning { @@ -77,7 +82,7 @@ namespace osu.Game.Skinning (storage as ResourceStore)?.AddExtension("ogg"); Samples = samples; - Textures = new TextureStore(resources.Renderer, resources.CreateTextureLoaderStore(storage)); + Textures = new TextureStore(resources.Renderer, new SquishingTextureLoaderStore(resources.CreateTextureLoaderStore(storage))); } else { @@ -210,5 +215,54 @@ namespace osu.Game.Skinning } #endregion + + public class SquishingTextureLoaderStore : IResourceStore + { + private readonly IResourceStore textureStore; + + public SquishingTextureLoaderStore(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.IsNull()) + return null!; + + // So there's a thing where some users have taken it upon themselves to create skin elements of insane dimensions. + // To the point where GPUs cannot load the textures (along with most image editor apps). + // To work around this, let's look out for any stupid images and shrink them down into a usable size. + const int max_supported_texture_size = 16384; + + if (textureUpload.Height > max_supported_texture_size || textureUpload.Width > max_supported_texture_size) + { + var image = Image.LoadPixelData(textureUpload.Data.ToArray(), textureUpload.Width, textureUpload.Height); + + image.Mutate(i => i.Resize(new Size( + Math.Min(textureUpload.Width, max_supported_texture_size), + Math.Min(textureUpload.Height, max_supported_texture_size) + ))); + + return new TextureUpload(image); + } + + return textureUpload; + } + + public Task GetAsync(string name, CancellationToken cancellationToken = new CancellationToken()) => textureStore.GetAsync(name, cancellationToken); + + public Stream GetStream(string name) => textureStore.GetStream(name); + + public IEnumerable GetAvailableResources() => textureStore.GetAvailableResources(); + } } }