mirror of
https://github.com/Artemis-RGB/Artemis
synced 2025-12-13 05:48:35 +00:00
Merge branch 'development' into RGB.NET-Update
This commit is contained in:
commit
3cdd62ab12
@ -1,4 +1,5 @@
|
|||||||
using System.ComponentModel;
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
using Artemis.Core.Properties;
|
using Artemis.Core.Properties;
|
||||||
|
|
||||||
@ -26,7 +27,7 @@ public abstract class CorePropertyChanged : INotifyPropertyChanged
|
|||||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
protected bool RequiresUpdate<T>(ref T storage, T value)
|
protected bool RequiresUpdate<T>(ref T storage, T value)
|
||||||
{
|
{
|
||||||
return !Equals(storage, value);
|
return !EqualityComparer<T>.Default.Equals(storage, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@ -28,6 +28,8 @@ public abstract class PerLedLayerBrush<T> : PropertiesLayerBrush<T> where T : La
|
|||||||
/// <returns>The color the LED will receive</returns>
|
/// <returns>The color the LED will receive</returns>
|
||||||
public abstract SKColor GetColor(ArtemisLed led, SKPoint renderPoint);
|
public abstract SKColor GetColor(ArtemisLed led, SKPoint renderPoint);
|
||||||
|
|
||||||
|
private readonly SKPoint[] _points = new SKPoint[2];
|
||||||
|
|
||||||
internal override void InternalRender(SKCanvas canvas, SKRect bounds, SKPaint paint)
|
internal override void InternalRender(SKCanvas canvas, SKRect bounds, SKPaint paint)
|
||||||
{
|
{
|
||||||
// We don't want rotation on this canvas because that'll displace the LEDs, translations are applied to the points of each LED instead
|
// We don't want rotation on this canvas because that'll displace the LEDs, translations are applied to the points of each LED instead
|
||||||
@ -37,25 +39,21 @@ public abstract class PerLedLayerBrush<T> : PropertiesLayerBrush<T> where T : La
|
|||||||
using SKPath pointsPath = new();
|
using SKPath pointsPath = new();
|
||||||
foreach (ArtemisLed artemisLed in Layer.Leds)
|
foreach (ArtemisLed artemisLed in Layer.Leds)
|
||||||
{
|
{
|
||||||
pointsPath.AddPoly(new[]
|
_points[0] = new SKPoint(0, 0);
|
||||||
{
|
_points[1] = new SKPoint(artemisLed.AbsoluteRectangle.Left - Layer.Bounds.Left, artemisLed.AbsoluteRectangle.Top - Layer.Bounds.Top);
|
||||||
new SKPoint(0, 0),
|
pointsPath.AddPoly(_points);
|
||||||
new SKPoint(artemisLed.AbsoluteRectangle.Left - Layer.Bounds.Left, artemisLed.AbsoluteRectangle.Top - Layer.Bounds.Top)
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply the translation to the points of each LED instead
|
// Apply the translation to the points of each LED instead
|
||||||
if (Layer.General.TransformMode.CurrentValue == LayerTransformMode.Normal && SupportsTransformation)
|
if (Layer.General.TransformMode.CurrentValue == LayerTransformMode.Normal && SupportsTransformation)
|
||||||
pointsPath.Transform(Layer.GetTransformMatrix(true, true, true, true).Invert());
|
pointsPath.Transform(Layer.GetTransformMatrix(true, true, true, true).Invert());
|
||||||
|
|
||||||
SKPoint[] points = pointsPath.Points;
|
|
||||||
|
|
||||||
TryOrBreak(() =>
|
TryOrBreak(() =>
|
||||||
{
|
{
|
||||||
for (int index = 0; index < Layer.Leds.Count; index++)
|
for (int index = 0; index < Layer.Leds.Count; index++)
|
||||||
{
|
{
|
||||||
ArtemisLed artemisLed = Layer.Leds[index];
|
ArtemisLed artemisLed = Layer.Leds[index];
|
||||||
SKPoint renderPoint = points[index * 2 + 1];
|
SKPoint renderPoint = pointsPath.GetPoint(index * 2 + 1);
|
||||||
if (!float.IsFinite(renderPoint.X) || !float.IsFinite(renderPoint.Y))
|
if (!float.IsFinite(renderPoint.X) || !float.IsFinite(renderPoint.Y))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|||||||
@ -10,12 +10,25 @@ namespace Artemis.Core;
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static class LogStore
|
public static class LogStore
|
||||||
{
|
{
|
||||||
|
private static readonly object _lock = new();
|
||||||
|
|
||||||
private static readonly LinkedList<LogEvent> LinkedList = new();
|
private static readonly LinkedList<LogEvent> LinkedList = new();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets a list containing the last 500 log events.
|
/// Gets a list containing the last 500 log events.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static List<LogEvent> Events => LinkedList.ToList();
|
public static List<LogEvent> Events
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
List<LogEvent> events;
|
||||||
|
|
||||||
|
lock (_lock)
|
||||||
|
events = LinkedList.ToList();
|
||||||
|
|
||||||
|
return events;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Occurs when a new <see cref="LogEvent" /> was received.
|
/// Occurs when a new <see cref="LogEvent" /> was received.
|
||||||
@ -24,9 +37,13 @@ public static class LogStore
|
|||||||
|
|
||||||
internal static void Emit(LogEvent logEvent)
|
internal static void Emit(LogEvent logEvent)
|
||||||
{
|
{
|
||||||
LinkedList.AddLast(logEvent);
|
lock (_lock)
|
||||||
while (LinkedList.Count > 500)
|
{
|
||||||
LinkedList.RemoveFirst();
|
LinkedList.AddLast(logEvent);
|
||||||
|
while (LinkedList.Count > 500)
|
||||||
|
LinkedList.RemoveFirst();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
OnEventAdded(new LogEventEventArgs(logEvent));
|
OnEventAdded(new LogEventEventArgs(logEvent));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -56,7 +56,7 @@ public class DuplicateNode : INodeEditorCommand, IDisposable
|
|||||||
if (targetCollection == null)
|
if (targetCollection == null)
|
||||||
continue;
|
continue;
|
||||||
while (targetCollection.Count() < sourceCollection.Count())
|
while (targetCollection.Count() < sourceCollection.Count())
|
||||||
targetCollection.CreatePin();
|
targetCollection.Add(targetCollection.CreatePin());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy the storage
|
// Copy the storage
|
||||||
|
|||||||
@ -14,7 +14,7 @@ namespace Artemis.UI.Screens.Debugger.Logs;
|
|||||||
public class LogsDebugView : ReactiveUserControl<LogsDebugViewModel>
|
public class LogsDebugView : ReactiveUserControl<LogsDebugViewModel>
|
||||||
{
|
{
|
||||||
private int _lineCount;
|
private int _lineCount;
|
||||||
private TextEditor _textEditor;
|
private TextEditor? _textEditor;
|
||||||
|
|
||||||
public LogsDebugView()
|
public LogsDebugView()
|
||||||
{
|
{
|
||||||
@ -31,7 +31,7 @@ public class LogsDebugView : ReactiveUserControl<LogsDebugViewModel>
|
|||||||
protected override void OnInitialized()
|
protected override void OnInitialized()
|
||||||
{
|
{
|
||||||
base.OnInitialized();
|
base.OnInitialized();
|
||||||
Dispatcher.UIThread.Post(() => _textEditor.ScrollToEnd(), DispatcherPriority.ApplicationIdle);
|
Dispatcher.UIThread.Post(() => _textEditor?.ScrollToEnd(), DispatcherPriority.ApplicationIdle);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnTextChanged(object? sender, EventArgs e)
|
private void OnTextChanged(object? sender, EventArgs e)
|
||||||
|
|||||||
@ -48,8 +48,11 @@ public class LogsDebugViewModel : ActivatableViewModelBase
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddLogEvent(LogEvent logEvent)
|
private void AddLogEvent(LogEvent? logEvent)
|
||||||
{
|
{
|
||||||
|
if (logEvent is null)
|
||||||
|
return;
|
||||||
|
|
||||||
using StringWriter writer = new();
|
using StringWriter writer = new();
|
||||||
_formatter.Format(logEvent, writer);
|
_formatter.Format(logEvent, writer);
|
||||||
string line = writer.ToString();
|
string line = writer.ToString();
|
||||||
@ -60,7 +63,7 @@ public class LogsDebugViewModel : ActivatableViewModelBase
|
|||||||
|
|
||||||
private void RemoveOldestLine()
|
private void RemoveOldestLine()
|
||||||
{
|
{
|
||||||
int firstNewLine = Document.Text.IndexOf('\n');
|
int firstNewLine = Document.IndexOf('\n', 0, Document.TextLength);
|
||||||
if (firstNewLine == -1)
|
if (firstNewLine == -1)
|
||||||
{
|
{
|
||||||
//this should never happen.
|
//this should never happen.
|
||||||
|
|||||||
@ -52,7 +52,7 @@ public class StartupWizardViewModel : DialogViewModelBase<bool>
|
|||||||
DeviceProviders = new ObservableCollection<PluginViewModel>(pluginManagementService.GetAllPlugins()
|
DeviceProviders = new ObservableCollection<PluginViewModel>(pluginManagementService.GetAllPlugins()
|
||||||
.Where(p => p.Info.IsCompatible && p.Features.Any(f => f.AlwaysEnabled && f.FeatureType.IsAssignableTo(typeof(DeviceProvider))))
|
.Where(p => p.Info.IsCompatible && p.Features.Any(f => f.AlwaysEnabled && f.FeatureType.IsAssignableTo(typeof(DeviceProvider))))
|
||||||
.OrderBy(p => p.Info.Name)
|
.OrderBy(p => p.Info.Name)
|
||||||
.Select(p => settingsVmFactory.PluginViewModel(p, null)));
|
.Select(p => settingsVmFactory.PluginViewModel(p, ReactiveCommand.Create(() => new Unit()))));
|
||||||
|
|
||||||
CurrentStep = 1;
|
CurrentStep = 1;
|
||||||
SetupButtons();
|
SetupButtons();
|
||||||
|
|||||||
@ -3,7 +3,7 @@ using SkiaSharp;
|
|||||||
|
|
||||||
namespace Artemis.VisualScripting.Nodes.Color;
|
namespace Artemis.VisualScripting.Nodes.Color;
|
||||||
|
|
||||||
[Node("HSL Color", "Creates a color from hue, saturation and lightness values", "Color", InputType = typeof(Numeric), OutputType = typeof(SKColor))]
|
[Node("HSL Color", "Creates a color from hue, saturation and lightness numbers", "Color", InputType = typeof(Numeric), OutputType = typeof(SKColor))]
|
||||||
public class HslSKColorNode : Node
|
public class HslSKColorNode : Node
|
||||||
{
|
{
|
||||||
public HslSKColorNode()
|
public HslSKColorNode()
|
||||||
|
|||||||
31
src/Artemis.VisualScripting/Nodes/Color/HsvSKColorNode.cs
Normal file
31
src/Artemis.VisualScripting/Nodes/Color/HsvSKColorNode.cs
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
using Artemis.Core;
|
||||||
|
using SkiaSharp;
|
||||||
|
|
||||||
|
namespace Artemis.VisualScripting.Nodes.Color;
|
||||||
|
|
||||||
|
[Node("HSV Color", "Creates a color from hue, saturation and value numbers", "Color", InputType = typeof(Numeric), OutputType = typeof(SKColor))]
|
||||||
|
public class HsvSKColorNode : Node
|
||||||
|
{
|
||||||
|
public HsvSKColorNode()
|
||||||
|
{
|
||||||
|
H = CreateInputPin<Numeric>("H");
|
||||||
|
S = CreateInputPin<Numeric>("S");
|
||||||
|
V = CreateInputPin<Numeric>("V");
|
||||||
|
Output = CreateOutputPin<SKColor>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public InputPin<Numeric> H { get; set; }
|
||||||
|
public InputPin<Numeric> S { get; set; }
|
||||||
|
public InputPin<Numeric> V { get; set; }
|
||||||
|
public OutputPin<SKColor> Output { get; }
|
||||||
|
|
||||||
|
#region Overrides of Node
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override void Evaluate()
|
||||||
|
{
|
||||||
|
Output.Value = SKColor.FromHsv(H.Value, S.Value, V.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
36
src/Artemis.VisualScripting/Nodes/Color/SkColorHsl.cs
Normal file
36
src/Artemis.VisualScripting/Nodes/Color/SkColorHsl.cs
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
using Artemis.Core;
|
||||||
|
using SkiaSharp;
|
||||||
|
|
||||||
|
namespace Artemis.VisualScripting.Nodes.Color;
|
||||||
|
|
||||||
|
[Node("Color to HSL", "Outputs H, S and L values from a color", "Color", InputType = typeof(SKColor), OutputType = typeof(Numeric))]
|
||||||
|
public class SkColorHsl : Node
|
||||||
|
{
|
||||||
|
|
||||||
|
public SkColorHsl()
|
||||||
|
{
|
||||||
|
Input = CreateInputPin<SKColor>();
|
||||||
|
H = CreateOutputPin<Numeric>("H");
|
||||||
|
S = CreateOutputPin<Numeric>("S");
|
||||||
|
L = CreateOutputPin<Numeric>("L");
|
||||||
|
}
|
||||||
|
|
||||||
|
public InputPin<SKColor> Input { get; }
|
||||||
|
public OutputPin<Numeric> H { get; }
|
||||||
|
public OutputPin<Numeric> S { get; }
|
||||||
|
public OutputPin<Numeric> L { get; }
|
||||||
|
|
||||||
|
#region Overrides of Node
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override void Evaluate()
|
||||||
|
{
|
||||||
|
Input.Value.ToHsl(out float h, out float s, out float l);
|
||||||
|
|
||||||
|
H.Value = h;
|
||||||
|
S.Value = s;
|
||||||
|
L.Value = l;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
36
src/Artemis.VisualScripting/Nodes/Color/SkColorHsv.cs
Normal file
36
src/Artemis.VisualScripting/Nodes/Color/SkColorHsv.cs
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
using Artemis.Core;
|
||||||
|
using SkiaSharp;
|
||||||
|
|
||||||
|
namespace Artemis.VisualScripting.Nodes.Color;
|
||||||
|
|
||||||
|
[Node("Color to HSV", "Outputs H, S and L values from a color", "Color", InputType = typeof(SKColor), OutputType = typeof(Numeric))]
|
||||||
|
public class SkColorHsv : Node
|
||||||
|
{
|
||||||
|
|
||||||
|
public SkColorHsv()
|
||||||
|
{
|
||||||
|
Input = CreateInputPin<SKColor>();
|
||||||
|
H = CreateOutputPin<Numeric>("H");
|
||||||
|
S = CreateOutputPin<Numeric>("S");
|
||||||
|
V = CreateOutputPin<Numeric>("V");
|
||||||
|
}
|
||||||
|
|
||||||
|
public InputPin<SKColor> Input { get; }
|
||||||
|
public OutputPin<Numeric> H { get; }
|
||||||
|
public OutputPin<Numeric> S { get; }
|
||||||
|
public OutputPin<Numeric> V { get; }
|
||||||
|
|
||||||
|
#region Overrides of Node
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override void Evaluate()
|
||||||
|
{
|
||||||
|
Input.Value.ToHsv(out float h, out float s, out float v);
|
||||||
|
|
||||||
|
H.Value = h;
|
||||||
|
S.Value = s;
|
||||||
|
V.Value = v;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
@ -1,4 +1,4 @@
|
|||||||
using Artemis.Core;
|
using Artemis.Core;
|
||||||
|
|
||||||
namespace Artemis.VisualScripting.Nodes.Conversion;
|
namespace Artemis.VisualScripting.Nodes.Conversion;
|
||||||
|
|
||||||
@ -33,6 +33,7 @@ public class ConvertToNumericNode : Node
|
|||||||
double input => new Numeric(input),
|
double input => new Numeric(input),
|
||||||
float input => new Numeric(input),
|
float input => new Numeric(input),
|
||||||
byte input => new Numeric(input),
|
byte input => new Numeric(input),
|
||||||
|
bool input => new Numeric(input ? 1 : 0),
|
||||||
_ => TryParse(Input.Value)
|
_ => TryParse(Input.Value)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -44,4 +45,4 @@ public class ConvertToNumericNode : Node
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user