From 8dc15f68945a11b9da4c706cd18171591a39fcb0 Mon Sep 17 00:00:00 2001 From: SpoinkyNL Date: Tue, 17 Dec 2019 22:42:17 +0100 Subject: [PATCH] Implemented ellipse shape application --- src/Artemis.Core/Models/Profile/Layer.cs | 6 +- .../Models/Profile/LayerShapes/LayerShape.cs | 65 ++++++++++++++++-- .../Artemis.Plugins.Devices.Wooting.csproj | 9 ++- .../WootingDeviceProvider.cs | 9 ++- .../x64/wooting-rgb-sdk64.dll | Bin 0 -> 24064 bytes .../x86/wooting-rgb-sdk.dll | Bin 0 -> 19456 bytes .../Visualization/ProfileLayerView.xaml | 8 +-- .../Visualization/ProfileLayerViewModel.cs | 21 +++--- .../Visualization/ProfileViewModel.cs | 5 +- .../Tools/EllipseToolViewModel.cs | 26 ++----- .../Tools/SelectionToolViewModel.cs | 9 +++ 11 files changed, 104 insertions(+), 54 deletions(-) create mode 100644 src/Artemis.Plugins.Devices.Wooting/x64/wooting-rgb-sdk64.dll create mode 100644 src/Artemis.Plugins.Devices.Wooting/x86/wooting-rgb-sdk.dll diff --git a/src/Artemis.Core/Models/Profile/Layer.cs b/src/Artemis.Core/Models/Profile/Layer.cs index 1c802d465..77d179b2f 100644 --- a/src/Artemis.Core/Models/Profile/Layer.cs +++ b/src/Artemis.Core/Models/Profile/Layer.cs @@ -39,6 +39,8 @@ namespace Artemis.Core.Models.Profile Name = layerEntity.Name; Order = layerEntity.Order; + _leds = new List(); + switch (layerEntity.ShapeEntity?.Type) { case ShapeEntityType.Ellipse: @@ -59,8 +61,6 @@ namespace Artemis.Core.Models.Profile default: throw new ArgumentOutOfRangeException(); } - - _leds = new List(); } internal LayerEntity LayerEntity { get; set; } @@ -243,7 +243,7 @@ namespace Artemis.Core.Models.Profile path.AddRect(artemisLed.AbsoluteRenderRectangle); Path = path; - LayerShape.CalculateRenderProperties(); + LayerShape?.CalculateRenderProperties(); OnRenderPropertiesUpdated(); } diff --git a/src/Artemis.Core/Models/Profile/LayerShapes/LayerShape.cs b/src/Artemis.Core/Models/Profile/LayerShapes/LayerShape.cs index c65552f68..1a9ec275d 100644 --- a/src/Artemis.Core/Models/Profile/LayerShapes/LayerShape.cs +++ b/src/Artemis.Core/Models/Profile/LayerShapes/LayerShape.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using Artemis.Storage.Entities.Profile; using SkiaSharp; @@ -6,6 +7,9 @@ namespace Artemis.Core.Models.Profile.LayerShapes { public abstract class LayerShape { + private SKPoint _position; + private SKSize _size; + protected LayerShape(Layer layer) { Layer = layer; @@ -33,12 +37,28 @@ namespace Artemis.Core.Models.Profile.LayerShapes /// /// The position of the shape /// - public SKPoint Position { get; set; } + public SKPoint Position + { + get => _position; + set + { + _position = value; + Layer.CalculateRenderProperties(); + } + } /// /// The size of the shape /// - public SKSize Size { get; set; } + public SKSize Size + { + get => _size; + set + { + _size = value; + Layer.CalculateRenderProperties(); + } + } /// /// A render rectangle relative to the layer @@ -56,11 +76,48 @@ namespace Artemis.Core.Models.Profile.LayerShapes { Layer.LayerEntity.ShapeEntity = new ShapeEntity { - Anchor = new ShapePointEntity { X = Anchor.X, Y = Anchor.Y }, - Position = new ShapePointEntity { X = Position.X, Y = Position.Y }, + Anchor = new ShapePointEntity {X = Anchor.X, Y = Anchor.Y}, + Position = new ShapePointEntity {X = Position.X, Y = Position.Y}, Width = Size.Width, Height = Size.Height }; } + + /// + /// Updates Position and Size using the provided unscaled rectangle + /// + /// An unscaled rectangle where 1px = 1mm + public void SetFromUnscaledRectangle(SKRect rect) + { + if (!Layer.Leds.Any()) + { + Position = SKPoint.Empty; + Size = SKSize.Empty; + return; + } + + var x = Layer.Leds.Min(l => l.RgbLed.AbsoluteLedRectangle.Location.X); + var y = Layer.Leds.Min(l => l.RgbLed.AbsoluteLedRectangle.Location.Y); + var width = Layer.Leds.Max(l => l.RgbLed.AbsoluteLedRectangle.Location.X + l.RgbLed.AbsoluteLedRectangle.Size.Width) - x; + var height = Layer.Leds.Max(l => l.RgbLed.AbsoluteLedRectangle.Location.Y + l.RgbLed.AbsoluteLedRectangle.Size.Height) - y; + + Position = new SKPoint((float) (100f / width * (rect.Left - x)) / 100f, (float) (100f / height * (rect.Top - y)) / 100f); + Size = new SKSize((float) (100f / width * rect.Width) / 100f, (float) (100f / height * rect.Height) / 100f); + } + + public SKRect GetUnscaledRectangle() + { + var x = Layer.Leds.Min(l => l.RgbLed.AbsoluteLedRectangle.Location.X); + var y = Layer.Leds.Min(l => l.RgbLed.AbsoluteLedRectangle.Location.Y); + var width = Layer.Leds.Max(l => l.RgbLed.AbsoluteLedRectangle.Location.X + l.RgbLed.AbsoluteLedRectangle.Size.Width) - x; + var height = Layer.Leds.Max(l => l.RgbLed.AbsoluteLedRectangle.Location.Y + l.RgbLed.AbsoluteLedRectangle.Size.Height) - y; + + return SKRect.Create( + (float) (x + width * Position.X), + (float) (y + height * Position.Y), + (float) (width * Size.Width), + (float) (height * Size.Height) + ); + } } } \ No newline at end of file diff --git a/src/Artemis.Plugins.Devices.Wooting/Artemis.Plugins.Devices.Wooting.csproj b/src/Artemis.Plugins.Devices.Wooting/Artemis.Plugins.Devices.Wooting.csproj index 2189fd57f..b59e9e83d 100644 --- a/src/Artemis.Plugins.Devices.Wooting/Artemis.Plugins.Devices.Wooting.csproj +++ b/src/Artemis.Plugins.Devices.Wooting/Artemis.Plugins.Devices.Wooting.csproj @@ -61,9 +61,14 @@ Artemis.Core + - - + + PreserveNewest + + + PreserveNewest + diff --git a/src/Artemis.Plugins.Devices.Wooting/WootingDeviceProvider.cs b/src/Artemis.Plugins.Devices.Wooting/WootingDeviceProvider.cs index a92dddf86..01ac495f0 100644 --- a/src/Artemis.Plugins.Devices.Wooting/WootingDeviceProvider.cs +++ b/src/Artemis.Plugins.Devices.Wooting/WootingDeviceProvider.cs @@ -19,11 +19,10 @@ namespace Artemis.Plugins.Devices.Wooting public override void EnablePlugin() { - // Disabled for now because the DLLs aren't on the repo - // PathHelper.ResolvingAbsolutePath += (sender, args) => ResolveAbsolutePath(typeof(WootingRGBDevice<>), sender, args); - // RGB.NET.Devices.Wooting.WootingDeviceProvider.PossibleX64NativePaths.Add(Path.Combine(PluginInfo.Directory.FullName, "x64", "wooting-rgb-sdk64.dll")); - // RGB.NET.Devices.Wooting.WootingDeviceProvider.PossibleX86NativePaths.Add(Path.Combine(PluginInfo.Directory.FullName, "x86", "wooting-rgb-sdk.dll")); - // _rgbService.AddDeviceProvider(RgbDeviceProvider); + PathHelper.ResolvingAbsolutePath += (sender, args) => ResolveAbsolutePath(typeof(WootingRGBDevice<>), sender, args); + RGB.NET.Devices.Wooting.WootingDeviceProvider.PossibleX64NativePaths.Add(Path.Combine(PluginInfo.Directory.FullName, "x64", "wooting-rgb-sdk64.dll")); + RGB.NET.Devices.Wooting.WootingDeviceProvider.PossibleX86NativePaths.Add(Path.Combine(PluginInfo.Directory.FullName, "x86", "wooting-rgb-sdk.dll")); + _rgbService.AddDeviceProvider(RgbDeviceProvider); } public override void DisablePlugin() diff --git a/src/Artemis.Plugins.Devices.Wooting/x64/wooting-rgb-sdk64.dll b/src/Artemis.Plugins.Devices.Wooting/x64/wooting-rgb-sdk64.dll new file mode 100644 index 0000000000000000000000000000000000000000..4e2894dc9d9e6325e6387fbfb285646e7b20df5c GIT binary patch literal 24064 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 P&3~BD{c9k9M+5&2s7Q;W literal 0 HcmV?d00001 diff --git a/src/Artemis.Plugins.Devices.Wooting/x86/wooting-rgb-sdk.dll b/src/Artemis.Plugins.Devices.Wooting/x86/wooting-rgb-sdk.dll new file mode 100644 index 0000000000000000000000000000000000000000..cc3b64898d0c3272f49077c84e5fca76e02d8796 GIT binary patch literal 19456 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 v+w1K - + - + - + - + diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLayerViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLayerViewModel.cs index 93d0609fd..a84b45958 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLayerViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileLayerViewModel.cs @@ -7,6 +7,7 @@ using Artemis.Core.Models.Profile.LayerShapes; using Artemis.Core.Models.Surface; using Artemis.UI.Extensions; using RGB.NET.Core; +using SkiaSharp.Views.WPF; using Rectangle = Artemis.Core.Models.Profile.LayerShapes.Rectangle; namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization @@ -85,17 +86,8 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization return; } - var x = Layer.Leds.Min(l => l.RgbLed.AbsoluteLedRectangle.Location.X); - var y = Layer.Leds.Min(l => l.RgbLed.AbsoluteLedRectangle.Location.Y); - var width = Layer.Leds.Max(l => l.RgbLed.AbsoluteLedRectangle.Location.X + l.RgbLed.AbsoluteLedRectangle.Size.Width) - x; - var height = Layer.Leds.Max(l => l.RgbLed.AbsoluteLedRectangle.Location.Y + l.RgbLed.AbsoluteLedRectangle.Size.Height) - y; - - var rect = new Rect( - x + width * Layer.LayerShape.Position.X, - y + height * Layer.LayerShape.Position.Y, - width * Layer.LayerShape.Size.Width, - height * Layer.LayerShape.Size.Height - ); + var skRect = Layer.LayerShape.GetUnscaledRectangle(); + var rect = new Rect(skRect.Left, skRect.Top, skRect.Width, skRect.Height); var shapeGeometry = Geometry.Empty; switch (Layer.LayerShape) { @@ -121,17 +113,20 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization private void CreateViewportRectangle() { - if (!Layer.Leds.Any()) + if (!Layer.Leds.Any() || Layer.LayerShape == null) { ViewportRectangle = Rect.Empty; return; } + var x = Layer.Leds.Min(l => l.RgbLed.AbsoluteLedRectangle.Location.X); var y = Layer.Leds.Min(l => l.RgbLed.AbsoluteLedRectangle.Location.Y); var width = Layer.Leds.Max(l => l.RgbLed.AbsoluteLedRectangle.Location.X + l.RgbLed.AbsoluteLedRectangle.Size.Width) - x; var height = Layer.Leds.Max(l => l.RgbLed.AbsoluteLedRectangle.Location.Y + l.RgbLed.AbsoluteLedRectangle.Size.Height) - y; - ViewportRectangle = new Rect(x - x * Layer.LayerShape.Position.X, y - y * Layer.LayerShape.Position.Y, width, height); + + var rect = new Rect(x, y, width, height); + ViewportRectangle = rect; } private Geometry CreateRectangleGeometry(ArtemisLed led) diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileViewModel.cs index 46ba29001..a8d553288 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/ProfileViewModel.cs @@ -183,7 +183,10 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization lock (CanvasViewModels) { foreach (var device in Devices.OrderBy(d => d.ZIndex).ToList()) - CanvasViewModels.Move(CanvasViewModels.IndexOf(device), device.ZIndex - 1); + { + var newIndex = Math.Max(device.ZIndex - 1, CanvasViewModels.Count - 1); + CanvasViewModels.Move(CanvasViewModels.IndexOf(device), newIndex); + } } }); } diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/EllipseToolViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/EllipseToolViewModel.cs index 1f0972b3d..7c066c34d 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/EllipseToolViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/EllipseToolViewModel.cs @@ -7,6 +7,7 @@ using Artemis.Core.Models.Profile.LayerShapes; using Artemis.UI.Properties; using Artemis.UI.Services.Interfaces; using SkiaSharp; +using SkiaSharp.Views.WPF; namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools { @@ -44,8 +45,9 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools if (ProfileEditorService.SelectedProfileElement is Layer layer) { - GetShapePosition(out var point, out var size); - layer.LayerShape = new Ellipse(layer) {Size = size, Position = point}; + if (!(layer.LayerShape is Ellipse)) + layer.LayerShape = new Ellipse(layer); + layer.LayerShape.SetFromUnscaledRectangle(DragRectangle.ToSKRect()); ProfileEditorService.UpdateSelectedProfileElement(); } } @@ -65,25 +67,5 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools if (e.Key == Key.LeftShift || e.Key == Key.RightShift) _shiftDown = true; } - - private void GetShapePosition(out SKPoint point, out SKSize size) - { - var layer = (Layer) ProfileEditorService.SelectedProfileElement; - var x = layer.Leds.Min(l => l.RgbLed.AbsoluteLedRectangle.Location.X); - var y = layer.Leds.Min(l => l.RgbLed.AbsoluteLedRectangle.Location.Y); - var width = layer.Leds.Max(l => l.RgbLed.AbsoluteLedRectangle.Location.X + l.RgbLed.AbsoluteLedRectangle.Size.Width) - x; - var height = layer.Leds.Max(l => l.RgbLed.AbsoluteLedRectangle.Location.Y + l.RgbLed.AbsoluteLedRectangle.Size.Height) - y; - - var widthScale = width / 100f; - var heightScale = height / 100f; - var rect = new Rect( - x - width / DragRectangle.X, - y - height / DragRectangle.Y, - width / DragRectangle.Width, - height / DragRectangle.Height - ); - point = new SKPoint(0.5f,0.5f); - size = new SKSize((float) (DragRectangle.Width * widthScale), (float) (DragRectangle.Height * heightScale)); - } } } \ No newline at end of file diff --git a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionToolViewModel.cs b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionToolViewModel.cs index 7ccd141e3..c01d09a22 100644 --- a/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionToolViewModel.cs +++ b/src/Artemis.UI/Screens/Module/ProfileEditor/Visualization/Tools/SelectionToolViewModel.cs @@ -7,6 +7,7 @@ using Artemis.Core.Models.Surface; using Artemis.UI.Extensions; using Artemis.UI.Properties; using Artemis.UI.Services.Interfaces; +using SkiaSharp; namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools { @@ -46,8 +47,16 @@ namespace Artemis.UI.Screens.Module.ProfileEditor.Visualization.Tools // Apply the selection to the selected layer layer if (ProfileEditorService.SelectedProfileElement is Layer layer) { + // If the layer has a shape, save it's size + var shapeSize = SKRect.Empty; + if (layer.LayerShape != null) + shapeSize = layer.LayerShape.GetUnscaledRectangle(); layer.ClearLeds(); layer.AddLeds(selectedLeds); + // Restore the saved size + if (layer.LayerShape != null) + layer.LayerShape.SetFromUnscaledRectangle(shapeSize); + ProfileEditorService.UpdateSelectedProfileElement(); } // If no layer selected, apply it to a new layer in the selected folder