Data binding modifiers - Finished color saturate/desaturate

Data binding modifiers - Added color invert
Layer properties - Added FloatRange and IntRange layer properties
This commit is contained in:
SpoinkyNL committed 2020-11-06 23:40:25 +01:00
1 parent 925bedc0a6
commit 0795069af2
15 files changed
+460 -9

No files matched your search

@@ -1,4 +1,5 @@
using SkiaSharp;
using System;
using SkiaSharp;
namespace Artemis.Core.DefaultTypes
{
@@ -10,10 +11,11 @@ namespace Artemis.Core.DefaultTypes
public override SKColor Apply(SKColor currentValue, float parameterValue)
{
// TODO: Not so straightforward ^^
currentValue.ToHsl(out float h, out float s, out float l);
s *= (parameterValue * -1 + 100f) / 100f;
return SKColor.FromHsl(h, s, l);
s -= parameterValue;
s = Math.Clamp(s, 0, 100);
return SKColor.FromHsl(h, s, l, currentValue.Alpha);
}
}
}
@@ -0,0 +1,18 @@
using SkiaSharp;
namespace Artemis.Core.DefaultTypes
{
internal class SKColorInvertModifierType : DataBindingModifierType<SKColor>
{
public override string Name => "Invert color";
public override string Icon => "InvertColors";
public override string Description => "Inverts the color by rotating its hue by a 180°";
public override SKColor Apply(SKColor currentValue)
{
currentValue.ToHsl(out float h, out float s, out float l);
h += 180;
return SKColor.FromHsl(h % 360, s, l);
}
}
}
@@ -1,4 +1,5 @@
using SkiaSharp;
using System;
using SkiaSharp;
namespace Artemis.Core.DefaultTypes
{
@@ -10,9 +11,11 @@ namespace Artemis.Core.DefaultTypes
public override SKColor Apply(SKColor currentValue, float parameterValue)
{
// TODO: Not so straightforward ^^
currentValue.ToHsl(out float h, out float s, out float l);
return SKColor.FromHsl(h, parameterValue, l);
currentValue.ToHsv(out float h, out float s, out float v);
s += parameterValue;
s = Math.Clamp(s, 0, 100);
return SKColor.FromHsv(h, s, v, currentValue.Alpha);
}
}
}
@@ -1,4 +1,6 @@
namespace Artemis.Core.DefaultTypes
using System;
namespace Artemis.Core.DefaultTypes
{
/// <inheritdoc />
public class FloatLayerProperty : LayerProperty<float>
@@ -0,0 +1,31 @@
namespace Artemis.Core.DefaultTypes
{
/// <inheritdoc />
public class FloatRangeLayerProperty : LayerProperty<FloatRange>
{
internal FloatRangeLayerProperty()
{
RegisterDataBindingProperty(range => range.Start, new FloatDataBindingConverter<FloatRange>());
RegisterDataBindingProperty(range => range.End, new FloatDataBindingConverter<FloatRange>());
CurrentValueSet += OnCurrentValueSet;
}
/// <inheritdoc />
protected override void UpdateCurrentValue(float keyframeProgress, float keyframeProgressEased)
{
float startDiff = NextKeyframe.Value.Start - CurrentKeyframe.Value.Start;
float endDiff = NextKeyframe.Value.End - CurrentKeyframe.Value.End;
CurrentValue = new FloatRange(
(int) (CurrentKeyframe.Value.Start + startDiff * keyframeProgressEased),
(int) (CurrentKeyframe.Value.End + endDiff * keyframeProgressEased)
);
}
private void OnCurrentValueSet(object sender, LayerPropertyEventArgs<FloatRange> e)
{
// Don't allow the int range to be null
BaseValue ??= DefaultValue ?? new FloatRange(0, 0);
}
}
}
@@ -0,0 +1,33 @@
using System;
namespace Artemis.Core.DefaultTypes
{
/// <inheritdoc />
public class IntRangeLayerProperty : LayerProperty<IntRange>
{
internal IntRangeLayerProperty()
{
RegisterDataBindingProperty(range => range.Start, new IntDataBindingConverter<IntRange>());
RegisterDataBindingProperty(range => range.End, new IntDataBindingConverter<IntRange>());
CurrentValueSet += OnCurrentValueSet;
}
/// <inheritdoc />
protected override void UpdateCurrentValue(float keyframeProgress, float keyframeProgressEased)
{
float startDiff = NextKeyframe.Value.Start - CurrentKeyframe.Value.Start;
float endDiff = NextKeyframe.Value.End - CurrentKeyframe.Value.End;
CurrentValue = new IntRange(
(int) (CurrentKeyframe.Value.Start + startDiff * keyframeProgressEased),
(int) (CurrentKeyframe.Value.End + endDiff * keyframeProgressEased)
);
}
private void OnCurrentValueSet(object sender, LayerPropertyEventArgs<IntRange> e)
{
// Don't allow the int range to be null
BaseValue ??= DefaultValue ?? new IntRange(0, 0);
}
}
}
@@ -0,0 +1,63 @@
using System;
namespace Artemis.Core
{
/// <summary>
/// Represents a range between two single-precision floating point numbers
/// </summary>
public class FloatRange
{
private readonly Random _rand;
/// <summary>
/// Creates a new instance of the <see cref="FloatRange" /> class
/// </summary>
/// <param name="start">The start value of the range</param>
/// <param name="end">The end value of the range</param>
public FloatRange(float start, float end)
{
Start = start;
End = end;
_rand = new Random();
}
/// <summary>
/// Gets or sets the start value of the range
/// </summary>
public float Start { get; set; }
/// <summary>
/// Gets or sets the end value of the range
/// </summary>
public float End { get; set; }
/// <summary>
/// Determines whether the given value is in this range
/// </summary>
/// <param name="value">The value to check</param>
/// <param name="inclusive">
/// Whether the value may be equal to <see cref="Start" /> or <see cref="End" />
/// <para>Defaults to <see langword="true" /></para>
/// </param>
/// <returns></returns>
public bool IsInRange(float value, bool inclusive = true)
{
if (inclusive)
return value >= Start && value <= End;
return value > Start && value < End;
}
/// <summary>
/// Returns a pseudo-random value between <see cref="Start" /> and <see cref="End" />
/// </summary>
/// <param name="inclusive">Whether the value may be equal to <see cref="Start" /></param>
/// <returns>The pseudo-random value</returns>
public float GetRandomValue(bool inclusive = true)
{
if (inclusive)
return _rand.Next((int) (Start * 100), (int) (End * 100)) / 100f;
return _rand.Next((int) (Start * 100) + 1, (int) (End * 100)) / 100f;
}
}
}
@@ -0,0 +1,63 @@
using System;
namespace Artemis.Core
{
/// <summary>
/// Represents a range between two signed integers
/// </summary>
public class IntRange
{
private readonly Random _rand;
/// <summary>
/// Creates a new instance of the <see cref="IntRange" /> class
/// </summary>
/// <param name="start">The start value of the range</param>
/// <param name="end">The end value of the range</param>
public IntRange(int start, int end)
{
Start = start;
End = end;
_rand = new Random();
}
/// <summary>
/// Gets or sets the start value of the range
/// </summary>
public int Start { get; set; }
/// <summary>
/// Gets or sets the end value of the range
/// </summary>
public int End { get; set; }
/// <summary>
/// Determines whether the given value is in this range
/// </summary>
/// <param name="value">The value to check</param>
/// <param name="inclusive">
/// Whether the value may be equal to <see cref="Start" /> or <see cref="End" />
/// <para>Defaults to <see langword="true" /></para>
/// </param>
/// <returns></returns>
public bool IsInRange(int value, bool inclusive = true)
{
if (inclusive)
return value >= Start && value <= End;
return value > Start && value < End;
}
/// <summary>
/// Returns a pseudo-random value between <see cref="Start" /> and <see cref="End" />
/// </summary>
/// <param name="inclusive">Whether the value may be equal to <see cref="Start" /></param>
/// <returns>The pseudo-random value</returns>
public int GetRandomValue(bool inclusive = true)
{
if (inclusive)
return _rand.Next(Start, End + 1);
return _rand.Next(Start + 1, End);
}
}
}
@@ -77,6 +77,7 @@ namespace Artemis.Core.Services
RegisterModifierType(Constants.CorePluginInfo, new SKColorBrightenModifierType());
RegisterModifierType(Constants.CorePluginInfo, new SKColorDarkenModifierType());
RegisterModifierType(Constants.CorePluginInfo, new SKColorRotateHueModifierType());
RegisterModifierType(Constants.CorePluginInfo, new SKColorInvertModifierType());
}
}
}