mirror of
https://github.com/Artemis-RGB/Artemis
synced 2026-11-12 03:48:56 +00:00
Color brush - Added configurable gradient repeat
Color brush - Fixed gradient positioning in the clip render mode Color brush - Added gradient tile modes in clip render mode Layer properties - Allow disabling support of keyframes via the description decorator
This commit is contained in:
1 parent
aa7c914b92
commit
b659be1f48
8 files changed
+86
-19
No files matched your search
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.ComponentModel;
|
||||
using Artemis.Core.Models.Profile;
|
||||
using Artemis.Core.Plugins.LayerBrush.Abstract;
|
||||
using SkiaSharp;
|
||||
|
||||
@@ -17,6 +18,8 @@ namespace Artemis.Plugins.LayerBrushes.Color
|
||||
Layer.RenderPropertiesUpdated += HandleShaderChange;
|
||||
Properties.GradientType.BaseValueChanged += HandleShaderChange;
|
||||
Properties.Color.BaseValueChanged += HandleShaderChange;
|
||||
Properties.GradientTileMode.BaseValueChanged += HandleShaderChange;
|
||||
Properties.GradientRepeat.BaseValueChanged += HandleShaderChange;
|
||||
Properties.Gradient.BaseValue.PropertyChanged += BaseValueOnPropertyChanged;
|
||||
}
|
||||
|
||||
@@ -25,6 +28,8 @@ namespace Artemis.Plugins.LayerBrushes.Color
|
||||
Layer.RenderPropertiesUpdated -= HandleShaderChange;
|
||||
Properties.GradientType.BaseValueChanged -= HandleShaderChange;
|
||||
Properties.Color.BaseValueChanged -= HandleShaderChange;
|
||||
Properties.GradientTileMode.BaseValueChanged -= HandleShaderChange;
|
||||
Properties.GradientRepeat.BaseValueChanged -= HandleShaderChange;
|
||||
Properties.Gradient.BaseValue.PropertyChanged -= BaseValueOnPropertyChanged;
|
||||
|
||||
_paint?.Dispose();
|
||||
@@ -46,10 +51,22 @@ namespace Artemis.Plugins.LayerBrushes.Color
|
||||
|
||||
public override void Render(SKCanvas canvas, SKImageInfo canvasInfo, SKPath path, SKPaint paint)
|
||||
{
|
||||
if (path.Bounds != _shaderBounds)
|
||||
if (Layer.General.FillType.CurrentValue == LayerFillType.Clip)
|
||||
{
|
||||
_shaderBounds = path.Bounds;
|
||||
CreateShader();
|
||||
var layerBounds = new SKRect(0, 0, Layer.Bounds.Width, Layer.Bounds.Height);
|
||||
if (layerBounds != _shaderBounds)
|
||||
{
|
||||
_shaderBounds = layerBounds;
|
||||
CreateShader();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (path.Bounds != _shaderBounds)
|
||||
{
|
||||
_shaderBounds = path.Bounds;
|
||||
CreateShader();
|
||||
}
|
||||
}
|
||||
|
||||
paint.Shader = _shader;
|
||||
@@ -69,26 +86,27 @@ namespace Artemis.Plugins.LayerBrushes.Color
|
||||
private void CreateShader()
|
||||
{
|
||||
var center = new SKPoint(_shaderBounds.MidX, _shaderBounds.MidY);
|
||||
var repeat = Properties.GradientRepeat.CurrentValue;
|
||||
var shader = Properties.GradientType.CurrentValue switch
|
||||
{
|
||||
GradientType.Solid => SKShader.CreateColor(_color),
|
||||
GradientType.LinearGradient => SKShader.CreateLinearGradient(
|
||||
new SKPoint(_shaderBounds.Left, _shaderBounds.Top),
|
||||
new SKPoint(_shaderBounds.Right, _shaderBounds.Top),
|
||||
Properties.Gradient.BaseValue.GetColorsArray(),
|
||||
Properties.Gradient.BaseValue.GetPositionsArray(),
|
||||
SKShaderTileMode.Clamp),
|
||||
Properties.Gradient.BaseValue.GetColorsArray(repeat),
|
||||
Properties.Gradient.BaseValue.GetPositionsArray(repeat),
|
||||
Properties.GradientTileMode.CurrentValue),
|
||||
GradientType.RadialGradient => SKShader.CreateRadialGradient(
|
||||
center,
|
||||
Math.Max(_shaderBounds.Width, _shaderBounds.Height) / 2f,
|
||||
Properties.Gradient.BaseValue.GetColorsArray(),
|
||||
Properties.Gradient.BaseValue.GetPositionsArray(),
|
||||
SKShaderTileMode.Clamp),
|
||||
Properties.Gradient.BaseValue.GetColorsArray(repeat),
|
||||
Properties.Gradient.BaseValue.GetPositionsArray(repeat),
|
||||
Properties.GradientTileMode.CurrentValue),
|
||||
GradientType.SweepGradient => SKShader.CreateSweepGradient(
|
||||
center,
|
||||
Properties.Gradient.BaseValue.GetColorsArray(),
|
||||
Properties.Gradient.BaseValue.GetPositionsArray(),
|
||||
SKShaderTileMode.Clamp,
|
||||
Properties.Gradient.BaseValue.GetColorsArray(repeat),
|
||||
Properties.Gradient.BaseValue.GetPositionsArray(repeat),
|
||||
Properties.GradientTileMode.CurrentValue,
|
||||
0,
|
||||
360),
|
||||
_ => throw new ArgumentOutOfRangeException()
|
||||
|
||||
@@ -12,22 +12,32 @@ namespace Artemis.Plugins.LayerBrushes.Color
|
||||
[PropertyDescription(Description = "The type of color brush to draw")]
|
||||
public EnumLayerProperty<GradientType> GradientType { get; set; }
|
||||
|
||||
[PropertyDescription(Description = "How to handle the layer having to stretch beyond it's regular size")]
|
||||
public EnumLayerProperty<SKShaderTileMode> GradientTileMode { get; set; }
|
||||
|
||||
[PropertyDescription(Description = "The color of the brush")]
|
||||
public SKColorLayerProperty Color { get; set; }
|
||||
|
||||
[PropertyDescription(Description = "The gradient of the brush")]
|
||||
public ColorGradientLayerProperty Gradient { get; set; }
|
||||
|
||||
[PropertyDescription(KeyframesSupported = false, Description = "How many times to repeat the colors in the selected gradient", MinInputValue = 0, MaxInputValue = 10)]
|
||||
public IntLayerProperty GradientRepeat { get; set; }
|
||||
|
||||
protected override void PopulateDefaults()
|
||||
{
|
||||
GradientType.DefaultValue = LayerBrushes.Color.GradientType.Solid;
|
||||
Color.DefaultValue = new SKColor(255, 0, 0);
|
||||
Gradient.DefaultValue = ColorGradient.GetUnicornBarf();
|
||||
GradientRepeat.DefaultValue = 0;
|
||||
}
|
||||
|
||||
protected override void OnPropertiesInitialized()
|
||||
{
|
||||
GradientType.BaseValueChanged += (sender, args) => UpdateVisibility();
|
||||
if (ProfileElement is Layer layer)
|
||||
layer.General.FillType.BaseValueChanged += (sender, args) => UpdateVisibility();
|
||||
|
||||
UpdateVisibility();
|
||||
}
|
||||
|
||||
@@ -35,6 +45,12 @@ namespace Artemis.Plugins.LayerBrushes.Color
|
||||
{
|
||||
Color.IsHidden = GradientType.BaseValue != LayerBrushes.Color.GradientType.Solid;
|
||||
Gradient.IsHidden = GradientType.BaseValue == LayerBrushes.Color.GradientType.Solid;
|
||||
GradientRepeat.IsHidden = GradientType.BaseValue == LayerBrushes.Color.GradientType.Solid;
|
||||
|
||||
if (ProfileElement is Layer layer)
|
||||
GradientTileMode.IsHidden = layer.General.FillType.CurrentValue != LayerFillType.Clip;
|
||||
else
|
||||
GradientTileMode.IsHidden = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user