mirror of
https://github.com/Artemis-RGB/Artemis
synced 2026-11-11 11:26:27 +00:00
Merge branch 'development' into feature/avalonia
Code cleanup
This commit is contained in:
1 parent
6f75683c4d
commit
35f83e58e5
22 files changed
+176
-95
No files matched your search
@@ -73,9 +73,8 @@ public class ColorGradient : IList<ColorGradientStop>, IList, INotifyCollectionC
|
||||
}
|
||||
else
|
||||
{
|
||||
List<SKColor> colors = this.Select(c => c.Color).ToList();
|
||||
for (int i = 0; i <= timesToRepeat; i++)
|
||||
result.AddRange(colors);
|
||||
result.AddRange(this.Select(c => c.Color));
|
||||
}
|
||||
|
||||
if (seamless && !IsSeamless())
|
||||
@@ -87,9 +86,7 @@ public class ColorGradient : IList<ColorGradientStop>, IList, INotifyCollectionC
|
||||
/// <summary>
|
||||
/// Gets all the positions in the color gradient
|
||||
/// </summary>
|
||||
/// <param name="timesToRepeat">
|
||||
/// The amount of times to repeat the positions
|
||||
/// </param>
|
||||
/// <param name="timesToRepeat">The amount of times to repeat the positions</param>
|
||||
/// <param name="seamless">
|
||||
/// A boolean indicating whether to make the gradient seamless by adding the first color behind the
|
||||
/// last color
|
||||
@@ -120,7 +117,7 @@ public class ColorGradient : IList<ColorGradientStop>, IList, INotifyCollectionC
|
||||
// Compress current points evenly
|
||||
float compression = 1f - 1f / result.Count;
|
||||
for (int index = 0; index < result.Count; index++)
|
||||
result[index] = result[index] * compression;
|
||||
result[index] *= compression;
|
||||
// Add one extra point at the end
|
||||
result.Add(1f);
|
||||
}
|
||||
@@ -132,19 +129,30 @@ public class ColorGradient : IList<ColorGradientStop>, IList, INotifyCollectionC
|
||||
/// Gets a color at any position between 0.0 and 1.0 using interpolation
|
||||
/// </summary>
|
||||
/// <param name="position">A position between 0.0 and 1.0</param>
|
||||
public SKColor GetColor(float position)
|
||||
/// <param name="timesToRepeat">The amount of times to repeat the positions</param>
|
||||
/// <param name="seamless">
|
||||
/// A boolean indicating whether to make the gradient seamless by adding the first color behind the
|
||||
/// last color
|
||||
/// </param>
|
||||
public SKColor GetColor(float position, int timesToRepeat = 0, bool seamless = false)
|
||||
{
|
||||
if (!this.Any())
|
||||
return new SKColor(255, 255, 255);
|
||||
|
||||
ColorGradientStop[] stops = this.ToArray();
|
||||
if (position <= 0) return stops[0].Color;
|
||||
if (position >= 1) return stops[^1].Color;
|
||||
ColorGradientStop left = stops[0];
|
||||
ColorGradientStop? right = null;
|
||||
foreach (ColorGradientStop stop in stops)
|
||||
SKColor[] colors = GetColorsArray(timesToRepeat, seamless);
|
||||
float[] stops = GetPositionsArray(timesToRepeat, seamless);
|
||||
|
||||
// If at or over the edges, return the corresponding edge
|
||||
if (position <= 0) return colors[0];
|
||||
if (position >= 1) return colors[^1];
|
||||
|
||||
// Walk through the stops until we find the one at or after the requested position, that becomes the right stop
|
||||
// The left stop is the previous stop before the right one was found.
|
||||
float left = stops[0];
|
||||
float? right = null;
|
||||
foreach (float stop in stops)
|
||||
{
|
||||
if (stop.Position >= position)
|
||||
if (stop >= position)
|
||||
{
|
||||
right = stop;
|
||||
break;
|
||||
@@ -153,14 +161,22 @@ public class ColorGradient : IList<ColorGradientStop>, IList, INotifyCollectionC
|
||||
left = stop;
|
||||
}
|
||||
|
||||
if (right == null || left == right)
|
||||
return left.Color;
|
||||
// Get the left stop's color
|
||||
SKColor leftColor = colors[Array.IndexOf(stops, left)];
|
||||
|
||||
position = (float) Math.Round((position - left.Position) / (right.Position - left.Position), 2);
|
||||
byte a = (byte) ((right.Color.Alpha - left.Color.Alpha) * position + left.Color.Alpha);
|
||||
byte r = (byte) ((right.Color.Red - left.Color.Red) * position + left.Color.Red);
|
||||
byte g = (byte) ((right.Color.Green - left.Color.Green) * position + left.Color.Green);
|
||||
byte b = (byte) ((right.Color.Blue - left.Color.Blue) * position + left.Color.Blue);
|
||||
// If no right stop was found or the left and right stops are on the same spot, return the left stop's color
|
||||
if (right == null || left == right)
|
||||
return leftColor;
|
||||
|
||||
// Get the right stop's color
|
||||
SKColor rightColor = colors[Array.IndexOf(stops, right)];
|
||||
|
||||
// Interpolate the position between the left and right color
|
||||
position = MathF.Round((position - left) / (right.Value - left), 2);
|
||||
byte a = (byte) ((rightColor.Alpha - leftColor.Alpha) * position + leftColor.Alpha);
|
||||
byte r = (byte) ((rightColor.Red - leftColor.Red) * position + leftColor.Red);
|
||||
byte g = (byte) ((rightColor.Green - leftColor.Green) * position + leftColor.Green);
|
||||
byte b = (byte) ((rightColor.Blue - leftColor.Blue) * position + leftColor.Blue);
|
||||
return new SKColor(r, g, b, a);
|
||||
}
|
||||
|
||||
@@ -561,7 +577,8 @@ public class ColorGradient : IList<ColorGradientStop>, IList, INotifyCollectionC
|
||||
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, index));
|
||||
}
|
||||
|
||||
public bool IsFixedSize { get; }
|
||||
/// <inheritdoc />
|
||||
public bool IsFixedSize => false;
|
||||
|
||||
/// <inheritdoc />
|
||||
public ColorGradientStop this[int index]
|
||||
|
||||
@@ -4,14 +4,26 @@ using Artemis.Storage.Entities.Profile.Conditions;
|
||||
|
||||
namespace Artemis.Core
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents a condition that is always true.
|
||||
/// </summary>
|
||||
public class AlwaysOnCondition : ICondition
|
||||
{
|
||||
/// <summary>
|
||||
/// Creates a new instance of the <see cref="AlwaysOnCondition" /> class.
|
||||
/// </summary>
|
||||
/// <param name="profileElement">The profile element this condition applies to.</param>
|
||||
public AlwaysOnCondition(RenderProfileElement profileElement)
|
||||
{
|
||||
ProfileElement = profileElement;
|
||||
Entity = new AlwaysOnConditionEntity();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new instance of the <see cref="AlwaysOnCondition" /> class.
|
||||
/// </summary>
|
||||
/// <param name="alwaysOnConditionEntity">The entity used to store this condition.</param>
|
||||
/// <param name="profileElement">The profile element this condition applies to.</param>
|
||||
public AlwaysOnCondition(AlwaysOnConditionEntity alwaysOnConditionEntity, RenderProfileElement profileElement)
|
||||
{
|
||||
ProfileElement = profileElement;
|
||||
|
||||
@@ -34,6 +34,9 @@ public interface ICondition : IDisposable, IStorageModel
|
||||
/// </summary>
|
||||
void UpdateTimeline(double deltaTime);
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the timeline to the provided <paramref name="position"/> as the display condition sees fit.
|
||||
/// </summary>
|
||||
void OverrideTimeline(TimeSpan position);
|
||||
}
|
||||
|
||||
|
||||
@@ -4,14 +4,26 @@ using Artemis.Storage.Entities.Profile.Conditions;
|
||||
|
||||
namespace Artemis.Core
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents a condition that plays once when its script evaluates to <see langword="true"/>.
|
||||
/// </summary>
|
||||
public class PlayOnceCondition : ICondition
|
||||
{
|
||||
/// <summary>
|
||||
/// Creates a new instance of the <see cref="PlayOnceCondition" /> class.
|
||||
/// </summary>
|
||||
/// <param name="profileElement">The profile element this condition applies to.</param>
|
||||
public PlayOnceCondition(RenderProfileElement profileElement)
|
||||
{
|
||||
ProfileElement = profileElement;
|
||||
Entity = new PlayOnceConditionEntity();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new instance of the <see cref="PlayOnceCondition" /> class.
|
||||
/// </summary>
|
||||
/// <param name="entity">The entity used to store this condition.</param>
|
||||
/// <param name="profileElement">The profile element this condition applies to.</param>
|
||||
public PlayOnceCondition(PlayOnceConditionEntity entity, RenderProfileElement profileElement)
|
||||
{
|
||||
ProfileElement = profileElement;
|
||||
|
||||
@@ -30,6 +30,7 @@ namespace Artemis.Core
|
||||
protected LayerPropertyGroup()
|
||||
{
|
||||
// These are set right after construction to keep the constructor (and inherited constructs) clean
|
||||
ProfileElement = null!;
|
||||
GroupDescription = null!;
|
||||
Path = "";
|
||||
|
||||
|
||||
Reference in new issue
Block a user