From 34bcd22f8ce8c95d1953e3c9ce6d4b9a38661c50 Mon Sep 17 00:00:00 2001 From: SpoinkyNL Date: Tue, 16 Jun 2020 20:28:05 +0200 Subject: [PATCH] Blur effect - Some minor optimizations Profile editor - Properly update effects on render --- src/Artemis.Core/Models/Profile/Layer.cs | 1 + .../Services/ProfileEditorService.cs | 2 ++ .../LayerEffects/EffectsView.xaml | 4 +-- .../BlurEffect.cs | 29 +++++++++++++++---- .../FilterEffectProvider.cs | 6 +++- 5 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/Artemis.Core/Models/Profile/Layer.cs b/src/Artemis.Core/Models/Profile/Layer.cs index f363c3d03..6e7df90c0 100644 --- a/src/Artemis.Core/Models/Profile/Layer.cs +++ b/src/Artemis.Core/Models/Profile/Layer.cs @@ -287,6 +287,7 @@ namespace Artemis.Core.Models.Profile using (var paint = new SKPaint()) { + paint.FilterQuality = SKFilterQuality.Low; paint.BlendMode = General.BlendMode.CurrentValue; paint.Color = new SKColor(0, 0, 0, (byte) (Transform.Opacity.CurrentValue * 2.55f)); diff --git a/src/Artemis.UI.Shared/Services/ProfileEditorService.cs b/src/Artemis.UI.Shared/Services/ProfileEditorService.cs index ee23c561f..59b90bf56 100644 --- a/src/Artemis.UI.Shared/Services/ProfileEditorService.cs +++ b/src/Artemis.UI.Shared/Services/ProfileEditorService.cs @@ -102,6 +102,8 @@ namespace Artemis.UI.Shared.Services { layer.OverrideProgress(CurrentTime); layer.LayerBrush?.Update(delta.TotalSeconds); + foreach (var baseLayerEffect in layer.LayerEffects) + baseLayerEffect.Update(delta.TotalSeconds); } _lastUpdateTime = CurrentTime; diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerEffects/EffectsView.xaml b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerEffects/EffectsView.xaml index cb720b948..b08a06563 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerEffects/EffectsView.xaml +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/LayerProperties/LayerEffects/EffectsView.xaml @@ -40,8 +40,8 @@ - - + + diff --git a/src/Plugins/Artemis.Plugins.LayerEffects.Filter/BlurEffect.cs b/src/Plugins/Artemis.Plugins.LayerEffects.Filter/BlurEffect.cs index c7bf0cd25..b5c08913b 100644 --- a/src/Plugins/Artemis.Plugins.LayerEffects.Filter/BlurEffect.cs +++ b/src/Plugins/Artemis.Plugins.LayerEffects.Filter/BlurEffect.cs @@ -1,10 +1,15 @@ -using Artemis.Core.Plugins.LayerEffect.Abstract; +using System; +using Artemis.Core.Plugins.LayerEffect.Abstract; using SkiaSharp; namespace Artemis.Plugins.LayerEffects.Filter { public class BlurEffect : LayerEffect { + private double _lastWidth; + private double _lastHeight; + private SKImageFilter _imageFilter; + public override void EnableLayerEffect() { } @@ -15,15 +20,27 @@ namespace Artemis.Plugins.LayerEffects.Filter public override void Update(double deltaTime) { + if (Math.Abs(Properties.BlurAmount.CurrentValue.Width - _lastWidth) > 0.01 || Math.Abs(Properties.BlurAmount.CurrentValue.Height - _lastHeight) > 0.01) + { + if (Properties.BlurAmount.CurrentValue.Width <= 0 && Properties.BlurAmount.CurrentValue.Height <= 0) + _imageFilter = null; + else + { + _imageFilter = SKImageFilter.CreateBlur( + Properties.BlurAmount.CurrentValue.Width, + Properties.BlurAmount.CurrentValue.Height + ); + } + + _lastWidth = Properties.BlurAmount.CurrentValue.Width; + _lastHeight = Properties.BlurAmount.CurrentValue.Height; + } } public override void PreProcess(SKCanvas canvas, SKImageInfo canvasInfo, SKPath path, SKPaint paint) { - paint.ImageFilter = SKImageFilter.CreateBlur( - Properties.BlurAmount.CurrentValue.Width, - Properties.BlurAmount.CurrentValue.Height, - paint.ImageFilter - ); + if (_imageFilter != null) + paint.ImageFilter = SKImageFilter.CreateMerge(paint.ImageFilter, _imageFilter); } public override void PostProcess(SKCanvas canvas, SKImageInfo canvasInfo, SKPath path, SKPaint paint) diff --git a/src/Plugins/Artemis.Plugins.LayerEffects.Filter/FilterEffectProvider.cs b/src/Plugins/Artemis.Plugins.LayerEffects.Filter/FilterEffectProvider.cs index ca1fe61d1..f1973786d 100644 --- a/src/Plugins/Artemis.Plugins.LayerEffects.Filter/FilterEffectProvider.cs +++ b/src/Plugins/Artemis.Plugins.LayerEffects.Filter/FilterEffectProvider.cs @@ -6,7 +6,11 @@ namespace Artemis.Plugins.LayerEffects.Filter { public override void EnablePlugin() { - AddLayerEffectDescriptor("Blur", "A layer effect providing a blur filter effect", "BlurOn"); + AddLayerEffectDescriptor( + "Blur", + "A layer effect providing a blur filter effect. \r\nNote: CPU intensive, best to only use on small layers or for a short period of time.", + "BlurOn" + ); AddLayerEffectDescriptor("Dilate", "A layer effect providing a dilation filter effect", "EyePlus"); AddLayerEffectDescriptor("Erode", "A layer effect providing an erode filter effect", "EyeMinus"); AddLayerEffectDescriptor("Glow", "A layer effect providing a glow filter effect", "BoxShadow");