From 220e940bbb9b7a52fb239391920229ac4f2fb05f Mon Sep 17 00:00:00 2001 From: Zhe Fang Date: Sun, 16 Nov 2025 20:26:31 -0500 Subject: [PATCH] chores: Import SnowEffect from shadertoy --- .../Controls/PlaybackSettingsControl.xaml | 4 +- .../LyricsSearchService.cs | 2 +- .../BetterLyrics.WinUI3/Shaders/SnowEffect.cs | 41 +++++++++++-------- .../Strings/en-US/Resources.resw | 3 ++ .../Strings/ja-JP/Resources.resw | 3 ++ .../Strings/ko-KR/Resources.resw | 3 ++ .../Strings/zh-CN/Resources.resw | 3 ++ .../Strings/zh-TW/Resources.resw | 3 ++ .../LyricsRendererViewModel.Draw.cs | 8 +--- .../LyricsRendererViewModel.Effects.cs | 11 +++++ .../LyricsRendererViewModel.Messages.cs | 4 ++ .../LyricsRendererViewModel.Update.cs | 23 +++++++++++ 12 files changed, 80 insertions(+), 28 deletions(-) diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/PlaybackSettingsControl.xaml b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/PlaybackSettingsControl.xaml index b652f7a..e2c7c1c 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/PlaybackSettingsControl.xaml +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Controls/PlaybackSettingsControl.xaml @@ -90,7 +90,7 @@ - + @@ -261,7 +261,7 @@ - + diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/LyricsSearchService/LyricsSearchService.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/LyricsSearchService/LyricsSearchService.cs index 5776882..4957b88 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/LyricsSearchService/LyricsSearchService.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Services/LyricsSearchService/LyricsSearchService.cs @@ -493,7 +493,7 @@ namespace BetterLyrics.WinUI3.Services.LyricsSearchService AlbumArtists = songInfo.Artists.ToList(), Artists = songInfo.Artists.ToList(), Title = songInfo.Title, - }, searcher, Lyricify.Lyrics.Searchers.Helpers.CompareHelper.MatchType.VeryHigh); + }, searcher, Lyricify.Lyrics.Searchers.Helpers.CompareHelper.MatchType.PrettyHigh); } if (result != null) diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Shaders/SnowEffect.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Shaders/SnowEffect.cs index 2aa227c..b617ad7 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Shaders/SnowEffect.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Shaders/SnowEffect.cs @@ -3,44 +3,49 @@ using ComputeSharp.D2D1; namespace BetterLyrics.WinUI3.Shaders { + /// + /// Ported from . + /// Credit/Copyright to the original author. + /// + /// + /// [D2DInputCount(0)] [D2DShaderProfile(D2D1ShaderProfile.PixelShader50)] [D2DGeneratedPixelShaderDescriptor] [D2DRequiresScenePosition] - public readonly partial struct SnowEffect(float time, Float2 resolution) : ID2D1PixelShader + public readonly partial struct SnowEffect(float time, float2 dispatchSize) : ID2D1PixelShader { - public Float4 Execute() + public float4 Execute() { - Float2 fragCoord = D2D.GetScenePosition().XY; + int2 xy = (int2)D2D.GetScenePosition().XY; + float2 fragCoord = new(xy.X, dispatchSize.Y - xy.Y); float snow = 0.0f; for (int k = 0; k < 6; k++) { - for (int i = 0; i < 12; i++) + for (int i = 1; i < 12; i++) { - float cellSize = 2.0f + ((float)i * 3.0f); - float downSpeed = 0.3f + (Hlsl.Sin(time * 0.4f + (float)(k + i * 20)) + 1.0f) * 0.00008f; - downSpeed /= 10; - downSpeed *= -1; + float cellSize = 2.0f + (i * 3.0f); + float downSpeed = 0.3f + (Hlsl.Sin(time * 0.4f + (k + i * 20)) + 1.0f) * 0.00008f; - Float2 uv = (fragCoord / resolution.X) + - new Float2( - 0.01f * Hlsl.Sin((time + (float)(k * 6185)) * 0.6f + (float)i) * (5.0f * i), - downSpeed * (time + (float)(k * 1352)) * i + float2 uv = (fragCoord / dispatchSize.X) + + new float2( + 0.01f * Hlsl.Sin((time + (k * 6185)) * 0.6f + i) * (5.0f / i), + downSpeed * (time + (k * 1352)) * (1.0f / i) ); - Float2 uvStep = (Hlsl.Ceil(uv * cellSize - new Float2(0.5f, 0.5f)) / cellSize); + float2 uvStep = (Hlsl.Ceil(uv * cellSize - new float2(0.5f, 0.5f)) / cellSize); - float x = Hlsl.Frac(Hlsl.Sin(Hlsl.Dot(uvStep, new Float2(12.9898f + (float)k * 12.0f, 78.233f + (float)k * 315.156f))) * 43758.5453f + (float)k * 12.0f) - 0.5f; - float y = Hlsl.Frac(Hlsl.Sin(Hlsl.Dot(uvStep, new Float2(62.2364f + (float)k * 23.0f, 94.674f + (float)k * 95.0f))) * 62159.8432f + (float)k * 12.0f) - 0.5f; + float x = Hlsl.Frac(Hlsl.Sin(Hlsl.Dot(uvStep, new float2(12.9898f + k * 12.0f, 78.233f + k * 315.156f))) * 43758.5453f + k * 12.0f) - 0.5f; + float y = Hlsl.Frac(Hlsl.Sin(Hlsl.Dot(uvStep, new float2(62.2364f + k * 23.0f, 94.674f + k * 95.0f))) * 62159.8432f + k * 12.0f) - 0.5f; float randomMagnitude1 = Hlsl.Sin(time * 2.5f) * 0.7f / cellSize; float randomMagnitude2 = Hlsl.Cos(time * 2.5f) * 0.7f / cellSize; - float d = 5.0f * Hlsl.Distance((uvStep + new Float2(x * Hlsl.Sin(y), y) * randomMagnitude1 + new Float2(y, x) * randomMagnitude2), uv); + float d = 5.0f * Hlsl.Distance((uvStep + new float2(x * Hlsl.Sin(y), y) * randomMagnitude1 + new float2(y, x) * randomMagnitude2), uv); - float omiVal = Hlsl.Frac(Hlsl.Sin(Hlsl.Dot(uvStep, new Float2(32.4691f, 94.615f))) * 31572.1684f); + float omiVal = Hlsl.Frac(Hlsl.Sin(Hlsl.Dot(uvStep, new float2(32.4691f, 94.615f))) * 31572.1684f); if (omiVal < 0.08f) { @@ -50,7 +55,7 @@ namespace BetterLyrics.WinUI3.Shaders } } - return (Float4)snow; + return (float4)snow; } } } diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/en-US/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/en-US/Resources.resw index bda9067..cb0662a 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/en-US/Resources.resw +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/en-US/Resources.resw @@ -691,6 +691,9 @@ If you encounter any problems, please go to the Settings page, About tab, and vi Discord + + Display listening status via Discord Presence + Layout mode diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ja-JP/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ja-JP/Resources.resw index 423b0e0..88f1289 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ja-JP/Resources.resw +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ja-JP/Resources.resw @@ -691,6 +691,9 @@ Discord + + Discord Presenceでリスニングステータスを表示 + レイアウトモード diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ko-KR/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ko-KR/Resources.resw index 8b4715e..f120606 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ko-KR/Resources.resw +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/ko-KR/Resources.resw @@ -691,6 +691,9 @@ Discord + + Discord 프레즌스를 통해 청취 상태를 표시합니다 + 레이아웃 모드 diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-CN/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-CN/Resources.resw index fa0d33d..c488ddb 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-CN/Resources.resw +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-CN/Resources.resw @@ -691,6 +691,9 @@ Discord + + 通过 Discord Presence 显示收听状态 + 布局模式 diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-TW/Resources.resw b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-TW/Resources.resw index e96ecf6..9ef8b50 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-TW/Resources.resw +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/Strings/zh-TW/Resources.resw @@ -691,6 +691,9 @@ Discord + + 透過 Discord Presence 顯示聆聽狀態 + 布局模式 diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Draw.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Draw.cs index acf4072..5933f26 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Draw.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Draw.cs @@ -405,14 +405,8 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel private void DrawSnowEffect(ICanvasAnimatedControl control, CanvasDrawingSession ds) { - if (_liveStatesService.LiveStates.LyricsWindowStatus.LyricsBackgroundSettings.IsSnowFlakeOverlayEnabled) + if (_snowEffect != null && _liveStatesService.LiveStates.LyricsWindowStatus.LyricsBackgroundSettings.IsSnowFlakeOverlayEnabled) { - _snowEffect ??= new PixelShaderEffect(); - - var width = (float)control.ConvertDipsToPixels((float)control.Size.Width, CanvasDpiRounding.Round); - var height = (float)control.ConvertDipsToPixels((float)control.Size.Height, CanvasDpiRounding.Round); - _snowEffect?.ConstantBuffer = new SnowEffect((float)TotalTime.TotalSeconds, new(width, height)); - ds.DrawImage(_snowEffect); } } diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Effects.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Effects.cs index 18b05b2..39ab8d4 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Effects.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Effects.cs @@ -278,5 +278,16 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel _fluidEffect.Properties["color4"] = _albumArtAccentColor4Transition.Value.ToVector3RGB(); _fluidEffect.Properties["EnableLightWave"] = false; } + + private void DisposeSnowEffect() + { + _snowEffect?.Dispose(); + _snowEffect = null; + } + + private void RecreateSnowEffect() + { + _snowEffect = new(); + } } } diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Messages.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Messages.cs index 5e71736..70d1860 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Messages.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Messages.cs @@ -138,6 +138,10 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel { _isFluidOverlayEnabledChanged = true; } + else if (message.PropertyName == nameof(LyricsBackgroundSettings.IsSnowFlakeOverlayEnabled)) + { + _isSnowOverlayEnabledChanged = true; + } } } diff --git a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Update.cs b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Update.cs index d94e022..08053eb 100644 --- a/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Update.cs +++ b/BetterLyrics.WinUI3/BetterLyrics.WinUI3/ViewModels/LyricsRendererViewModel/LyricsRendererViewModel.Update.cs @@ -2,6 +2,7 @@ using BetterLyrics.WinUI3.Extensions; using BetterLyrics.WinUI3.Helper; using BetterLyrics.WinUI3.Models; +using BetterLyrics.WinUI3.Shaders; using Microsoft.Graphics.Canvas; using Microsoft.Graphics.Canvas.Geometry; using Microsoft.Graphics.Canvas.UI.Xaml; @@ -57,6 +58,7 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel private bool _isSpectrumOverlayEnabledChanged = true; private bool _isFluidOverlayEnabledChanged = true; + private bool _isSnowOverlayEnabledChanged = true; private bool _isLyrics3DMatrixChanged = true; @@ -141,6 +143,27 @@ namespace BetterLyrics.WinUI3.ViewModels.LyricsRendererViewModel } } + if (_isDeviceChanged || _isLyricsWindowsStatusChanged || _isSnowOverlayEnabledChanged) + { + if (_liveStatesService.LiveStates.LyricsWindowStatus.LyricsBackgroundSettings.IsSnowFlakeOverlayEnabled) + { + RecreateSnowEffect(); + } + else + { + DisposeSnowEffect(); + } + + _isSnowOverlayEnabledChanged = false; + } + + if (_snowEffect != null) + { + var width = (float)control.ConvertDipsToPixels((float)control.Size.Width, CanvasDpiRounding.Round); + var height = (float)control.ConvertDipsToPixels((float)control.Size.Height, CanvasDpiRounding.Round); + _snowEffect.ConstantBuffer = new SnowEffect((float)TotalTime.TotalSeconds, new(width, height)); + } + // 检测播放行变更 var playingLineIndex = GetCurrentPlayingLineIndex(); _isPlayingLineChanged = _playingLineIndex != playingLineIndex;