1
0
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:
Darth Affe 2023-03-05 19:26:26 +01:00
commit 3cdd62ab12
12 changed files with 146 additions and 23 deletions

View File

@ -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>

View File

@ -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;

View File

@ -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));
} }

View File

@ -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

View File

@ -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)

View File

@ -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.

View File

@ -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();

View File

@ -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()

View 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
}

View 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
}

View 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
}

View File

@ -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
} }