From a86dfa10b096fc2fa74c20f158a686f6ff3bc955 Mon Sep 17 00:00:00 2001 From: Adam Baxter Date: Wed, 23 Sep 2015 00:10:08 +1000 Subject: [PATCH 1/3] Make NuGet package automatically copy native dependencies --- CUE.NET.csproj | 12 +---- CUE.NET.nuspec | 1 + CUE.NET.sln | 6 +++ CUE.NET.targets | 132 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 140 insertions(+), 11 deletions(-) create mode 100644 CUE.NET.targets diff --git a/CUE.NET.csproj b/CUE.NET.csproj index 316c99b..03ab634 100644 --- a/CUE.NET.csproj +++ b/CUE.NET.csproj @@ -108,15 +108,5 @@ - - if $(PlatformName) == x86 copy "$(SolutionDir)libs\CUESDK_2013.dll" "$(TargetDir)CUESDK_2013.dll" -if $(PlatformName) == x64 copy "$(SolutionDir)libs\CUESDK.x64_2013.dll" "$(TargetDir)CUESDK.x64_2013.dll" - - + \ No newline at end of file diff --git a/CUE.NET.nuspec b/CUE.NET.nuspec index e9b4b65..5a3028d 100644 --- a/CUE.NET.nuspec +++ b/CUE.NET.nuspec @@ -18,5 +18,6 @@ I'm currently working on this library and it's far from being finished. Please b + \ No newline at end of file diff --git a/CUE.NET.sln b/CUE.NET.sln index 377c477..9cebe01 100644 --- a/CUE.NET.sln +++ b/CUE.NET.sln @@ -9,6 +9,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Examples", "Examples", "{1F EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleDevTest", "Examples\SimpleDevTest\SimpleDevTest.csproj", "{7FD88256-5E14-4D7C-862B-7BC2CD04081A}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{FF50AF6A-D2AC-4772-B013-C10D127DBE29}" + ProjectSection(SolutionItems) = preProject + CUE.NET.nuspec = CUE.NET.nuspec + CUE.NET.targets = CUE.NET.targets + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 diff --git a/CUE.NET.targets b/CUE.NET.targets new file mode 100644 index 0000000..aaf674f --- /dev/null +++ b/CUE.NET.targets @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + %(RecursiveDir)%(FileName)%(Extension) + Always + + + + + + + + + + + + + + + + + + + + + + + + + + + + + bin\%(RecursiveDir)%(Filename)%(Extension) + + + + + + + + + $(PostBuildEventDependsOn); + CopySQLiteInteropFiles; + + + $(BuildDependsOn); + CopySQLiteInteropFiles; + + + $(CleanDependsOn); + CleanSQLiteInteropFiles; + + + + + + + + CollectSQLiteInteropFiles; + $(PipelineCollectFilesPhaseDependsOn); + + + From ca65581f6dbcfe74c1c153089627a850f0fb7a4a Mon Sep 17 00:00:00 2001 From: Darth Affe Date: Thu, 24 Sep 2015 21:42:29 +0200 Subject: [PATCH 2/3] Refactored LinearGradientBrush --- Devices/Keyboard/Brushes/GradientStop.cs | 1 - .../Keyboard/Brushes/LinearGradientBrush.cs | 93 +++++++++---------- 2 files changed, 42 insertions(+), 52 deletions(-) diff --git a/Devices/Keyboard/Brushes/GradientStop.cs b/Devices/Keyboard/Brushes/GradientStop.cs index 761eb05..48e428c 100644 --- a/Devices/Keyboard/Brushes/GradientStop.cs +++ b/Devices/Keyboard/Brushes/GradientStop.cs @@ -4,7 +4,6 @@ namespace CUE.NET.Devices.Keyboard.Brushes { public class GradientStop { - #region Properties & Fields public float Offset { get; set; } diff --git a/Devices/Keyboard/Brushes/LinearGradientBrush.cs b/Devices/Keyboard/Brushes/LinearGradientBrush.cs index 31a169a..8751c40 100644 --- a/Devices/Keyboard/Brushes/LinearGradientBrush.cs +++ b/Devices/Keyboard/Brushes/LinearGradientBrush.cs @@ -42,89 +42,80 @@ namespace CUE.NET.Devices.Keyboard.Brushes #endregion #region Methods - + public Color GetColorAtPoint(RectangleF rectangle, PointF point) { if (!GradientStops.Any()) return Color.Transparent; if (GradientStops.Count == 1) return GradientStops.First().Color; - // Taken from https://dotupdate.wordpress.com/2008/01/28/find-the-color-of-a-point-in-a-lineargradientbrush/ + // Based on https://dotupdate.wordpress.com/2008/01/28/find-the-color-of-a-point-in-a-lineargradientbrush/ - float x3 = point.X; - float y3 = point.Y; + PointF startPoint = new PointF(StartPoint.X * rectangle.Width, StartPoint.Y * rectangle.Height); + PointF endPoint = new PointF(EndPoint.X * rectangle.Width, EndPoint.Y * rectangle.Height); - float x1 = StartPoint.X * rectangle.Width; - float y1 = StartPoint.Y * rectangle.Height; - PointF p1 = new PointF(x1, y1); // Starting point + PointF intersectingPoint; + if (startPoint.Y.Equals(endPoint.Y)) // Horizontal case + intersectingPoint = new PointF(point.X, startPoint.Y); - float x2 = EndPoint.X * rectangle.Width; - float y2 = EndPoint.Y * rectangle.Height; - PointF p2 = new PointF(x2, y2); //End point - - // Calculate intersecting points - PointF p4; - - if (y1.Equals(y2)) // Horizontal case - p4 = new PointF(x3, y1); - - else if (x1.Equals(x2)) // Vertical case - p4 = new PointF(x1, y3); + else if (startPoint.X.Equals(endPoint.X)) // Vertical case + intersectingPoint = new PointF(startPoint.X, point.Y); else // Diagnonal case { - float m = (y2 - y1) / (x2 - x1); - float m2 = -1 / m; - float b = y1 - m * x1; - float c = y3 - m2 * x3; + float slope = (endPoint.Y - startPoint.Y) / (endPoint.X - startPoint.X); + float orthogonalSlope = -1 / slope; + + float startYIntercept = startPoint.Y - slope * startPoint.X; + float pointYIntercept = point.Y - orthogonalSlope * point.X; - float x4 = (c - b) / (m - m2); - float y4 = m * x4 + b; - p4 = new PointF(x4, y4); + float intersectingPointX = (pointYIntercept - startYIntercept) / (slope - orthogonalSlope); + float intersectingPointY = slope * intersectingPointX + startYIntercept; + intersectingPoint = new PointF(intersectingPointX, intersectingPointY); } // Calculate distances relative to the vector start - float d4 = Dist(p4, p1, p2); - float d2 = Dist(p2, p1, p2); + float intersectDistance = CalculateDistance(intersectingPoint, startPoint, endPoint); + float gradientLength = CalculateDistance(endPoint, startPoint, endPoint); - float x = d4 / d2; + float offset = intersectDistance / gradientLength; // Clip the input if before or after the max/min offset values float max = GradientStops.Max(n => n.Offset); - if (x > max) - x = max; + if (offset > max) + offset = max; float min = GradientStops.Min(n => n.Offset); - if (x < min) - x = min; + if (offset < min) + offset = min; // Find gradient stops that surround the input value - GradientStop gs0 = GradientStops.Where(n => n.Offset <= x).OrderBy(n => n.Offset).Last(); - GradientStop gs1 = GradientStops.Where(n => n.Offset >= x).OrderBy(n => n.Offset).First(); + GradientStop gsBefore = GradientStops.Where(n => n.Offset <= offset).OrderBy(n => n.Offset).Last(); + GradientStop gsAfter = GradientStops.Where(n => n.Offset >= offset).OrderBy(n => n.Offset).First(); - float y = 0f; - if (!gs0.Offset.Equals(gs1.Offset)) - y = ((x - gs0.Offset) / (gs1.Offset - gs0.Offset)); + float blendFactor = 0f; + if (!gsBefore.Offset.Equals(gsAfter.Offset)) + blendFactor = ((offset - gsBefore.Offset) / (gsAfter.Offset - gsBefore.Offset)); - byte colA = (byte)((gs1.Color.A - gs0.Color.A) * y + gs0.Color.A); - byte colR = (byte)((gs1.Color.R - gs0.Color.R) * y + gs0.Color.R); - byte colG = (byte)((gs1.Color.G - gs0.Color.G) * y + gs0.Color.G); - byte colB = (byte)((gs1.Color.B - gs0.Color.B) * y + gs0.Color.B); + byte colA = (byte)((gsAfter.Color.A - gsBefore.Color.A) * blendFactor + gsBefore.Color.A); + byte colR = (byte)((gsAfter.Color.R - gsBefore.Color.R) * blendFactor + gsBefore.Color.R); + byte colG = (byte)((gsAfter.Color.G - gsBefore.Color.G) * blendFactor + gsBefore.Color.G); + byte colB = (byte)((gsAfter.Color.B - gsBefore.Color.B) * blendFactor + gsBefore.Color.B); return Color.FromArgb(colA, colR, colG, colB); } - // Taken from https://dotupdate.wordpress.com/2008/01/28/find-the-color-of-a-point-in-a-lineargradientbrush/ + // Based on https://dotupdate.wordpress.com/2008/01/28/find-the-color-of-a-point-in-a-lineargradientbrush/ /// - /// Returns the signed magnitude of a point on a vector with origin po and pointing to pf + /// Returns the signed magnitude of a point on a vector /// - private float Dist(PointF px, PointF po, PointF pf) + private float CalculateDistance(PointF point, PointF origin, PointF direction) { - float d = (float)Math.Sqrt((px.Y - po.Y) * (px.Y - po.Y) + (px.X - po.X) * (px.X - po.X)); + float distance = (float)Math.Sqrt((point.Y - origin.Y) * (point.Y - origin.Y) + (point.X - origin.X) * (point.X - origin.X)); - return (((px.Y < po.Y) && (pf.Y > po.Y)) || - ((px.Y > po.Y) && (pf.Y < po.Y)) || - ((px.Y.Equals(po.Y)) && (px.X < po.X) && (pf.X > po.X)) || - ((px.Y.Equals(po.Y)) && (px.X > po.X) && (pf.X < po.X))) - ? -d : d; + return (((point.Y < origin.Y) && (direction.Y > origin.Y)) || + ((point.Y > origin.Y) && (direction.Y < origin.Y)) || + ((point.Y.Equals(origin.Y)) && (point.X < origin.X) && (direction.X > origin.X)) || + ((point.Y.Equals(origin.Y)) && (point.X > origin.X) && (direction.X < origin.X))) + ? -distance : distance; } #endregion From 6a926f82b56717209d4109fad187be53be7e9d60 Mon Sep 17 00:00:00 2001 From: Darth Affe Date: Thu, 24 Sep 2015 22:46:25 +0200 Subject: [PATCH 3/3] Added RainbowBrush --- CUE.NET.csproj | 2 + .../Keyboard/Brushes/LinearGradientBrush.cs | 44 +----------- Devices/Keyboard/Brushes/RainbowBrush.cs | 71 +++++++++++++++++++ Examples/SimpleDevTest/Program.cs | 27 ++++++- Helper/GradientHelper.cs | 53 ++++++++++++++ 5 files changed, 153 insertions(+), 44 deletions(-) create mode 100644 Devices/Keyboard/Brushes/RainbowBrush.cs create mode 100644 Helper/GradientHelper.cs diff --git a/CUE.NET.csproj b/CUE.NET.csproj index 61448c7..8a536c0 100644 --- a/CUE.NET.csproj +++ b/CUE.NET.csproj @@ -66,6 +66,7 @@ + @@ -91,6 +92,7 @@ + diff --git a/Devices/Keyboard/Brushes/LinearGradientBrush.cs b/Devices/Keyboard/Brushes/LinearGradientBrush.cs index 8751c40..7ab8482 100644 --- a/Devices/Keyboard/Brushes/LinearGradientBrush.cs +++ b/Devices/Keyboard/Brushes/LinearGradientBrush.cs @@ -6,6 +6,7 @@ using System; using System.Collections.Generic; using System.Drawing; using System.Linq; +using CUE.NET.Helper; namespace CUE.NET.Devices.Keyboard.Brushes { @@ -48,36 +49,10 @@ namespace CUE.NET.Devices.Keyboard.Brushes if (!GradientStops.Any()) return Color.Transparent; if (GradientStops.Count == 1) return GradientStops.First().Color; - // Based on https://dotupdate.wordpress.com/2008/01/28/find-the-color-of-a-point-in-a-lineargradientbrush/ - PointF startPoint = new PointF(StartPoint.X * rectangle.Width, StartPoint.Y * rectangle.Height); PointF endPoint = new PointF(EndPoint.X * rectangle.Width, EndPoint.Y * rectangle.Height); - PointF intersectingPoint; - if (startPoint.Y.Equals(endPoint.Y)) // Horizontal case - intersectingPoint = new PointF(point.X, startPoint.Y); - - else if (startPoint.X.Equals(endPoint.X)) // Vertical case - intersectingPoint = new PointF(startPoint.X, point.Y); - - else // Diagnonal case - { - float slope = (endPoint.Y - startPoint.Y) / (endPoint.X - startPoint.X); - float orthogonalSlope = -1 / slope; - - float startYIntercept = startPoint.Y - slope * startPoint.X; - float pointYIntercept = point.Y - orthogonalSlope * point.X; - - float intersectingPointX = (pointYIntercept - startYIntercept) / (slope - orthogonalSlope); - float intersectingPointY = slope * intersectingPointX + startYIntercept; - intersectingPoint = new PointF(intersectingPointX, intersectingPointY); - } - - // Calculate distances relative to the vector start - float intersectDistance = CalculateDistance(intersectingPoint, startPoint, endPoint); - float gradientLength = CalculateDistance(endPoint, startPoint, endPoint); - - float offset = intersectDistance / gradientLength; + float offset = GradientHelper.CalculateGradientOffset(startPoint, endPoint, point); // Clip the input if before or after the max/min offset values float max = GradientStops.Max(n => n.Offset); @@ -103,21 +78,6 @@ namespace CUE.NET.Devices.Keyboard.Brushes return Color.FromArgb(colA, colR, colG, colB); } - // Based on https://dotupdate.wordpress.com/2008/01/28/find-the-color-of-a-point-in-a-lineargradientbrush/ - /// - /// Returns the signed magnitude of a point on a vector - /// - private float CalculateDistance(PointF point, PointF origin, PointF direction) - { - float distance = (float)Math.Sqrt((point.Y - origin.Y) * (point.Y - origin.Y) + (point.X - origin.X) * (point.X - origin.X)); - - return (((point.Y < origin.Y) && (direction.Y > origin.Y)) || - ((point.Y > origin.Y) && (direction.Y < origin.Y)) || - ((point.Y.Equals(origin.Y)) && (point.X < origin.X) && (direction.X > origin.X)) || - ((point.Y.Equals(origin.Y)) && (point.X > origin.X) && (direction.X < origin.X))) - ? -distance : distance; - } - #endregion } } diff --git a/Devices/Keyboard/Brushes/RainbowBrush.cs b/Devices/Keyboard/Brushes/RainbowBrush.cs new file mode 100644 index 0000000..9bb0481 --- /dev/null +++ b/Devices/Keyboard/Brushes/RainbowBrush.cs @@ -0,0 +1,71 @@ +using System; +using System.Drawing; +using CUE.NET.Helper; + +namespace CUE.NET.Devices.Keyboard.Brushes +{ + public class RainbowBrush : IBrush + { + #region Properties & Fields + + public PointF StartPoint { get; set; } = new PointF(0f, 0.5f); + public PointF EndPoint { get; set; } = new PointF(1f, 0.5f); + public float StartHue { get; set; } + public float EndHue { get; set; } + + #endregion + + #region Constructors + + public RainbowBrush(float startHue = 0f, float endHue = 360f) + { + this.StartHue = startHue; + this.EndHue = endHue; + } + + public RainbowBrush(PointF startPoint, PointF endPoint, float startHue = 0f, float endHue = 360f) + { + this.StartPoint = startPoint; + this.EndPoint = endPoint; + this.StartHue = startHue; + this.EndHue = endHue; + } + + #endregion + + #region Methods + + public Color GetColorAtPoint(RectangleF rectangle, PointF point) + { + PointF startPoint = new PointF(StartPoint.X * rectangle.Width, StartPoint.Y * rectangle.Height); + PointF endPoint = new PointF(EndPoint.X * rectangle.Width, EndPoint.Y * rectangle.Height); + + float offset = GradientHelper.CalculateGradientOffset(startPoint, endPoint, point); + float range = EndHue - StartHue; + float progress = (StartHue + (range * offset)) / 360f; + + float div = (Math.Abs(progress % 1) * 6); + int value = (int)((div % 1) * 255); + + switch ((int)div) + { + case 0: + return Color.FromArgb(255, 255, value, 0); + case 1: + return Color.FromArgb(255, 255 - value, 255, 0); + case 2: + return Color.FromArgb(255, 0, 255, value); + case 3: + return Color.FromArgb(255, 0, 255 - value, 255); + case 4: + return Color.FromArgb(255, value, 0, 255); + case 5: + return Color.FromArgb(255, 255, 0, 255 - value); + default: + return Color.Transparent; + } + } + + #endregion + } +} diff --git a/Examples/SimpleDevTest/Program.cs b/Examples/SimpleDevTest/Program.cs index 687ac9e..aa661a8 100644 --- a/Examples/SimpleDevTest/Program.cs +++ b/Examples/SimpleDevTest/Program.cs @@ -85,8 +85,8 @@ namespace SimpleDevTest // Create our gradient stop to play with GradientStop moveableStop = new GradientStop(0, Color.FromArgb(0, 255, 0)); - //Create a basic (by default horizontal) brush ... - LinearGradientBrush linearBrush = new LinearGradientBrush(new GradientStop(0, Color.Blue), moveableStop, new GradientStop(1f, Color.Red)); + // Create a basic (by default horizontal) brush ... + LinearGradientBrush linearBrush = new LinearGradientBrush(new GradientStop(0, Color.Blue), moveableStop, new GradientStop(1f, Color.White)); // ... and add it as the keyboard background keyboard.Brush = linearBrush; @@ -122,6 +122,29 @@ namespace SimpleDevTest Wait(2); + // --------------------------------------------------------------------------- + // Time for an even better brush: rainbow + + Console.WriteLine("rainbow-test"); + + // Create an simple horizontal rainbow containing two times the full spectrum + RainbowBrush rainbowBrush = new RainbowBrush(0, 720); + + // Add the rainbow to the keyboard and perform an initial update + keyboard.Brush = rainbowBrush; + keyboard.UpdateLeds(); + + // Let the rainbow move around for 10 secs + for (int i = 0; i < 100; i++) + { + rainbowBrush.StartHue += 10f; + rainbowBrush.EndHue += 10f; + keyboard.UpdateLeds(); + Thread.Sleep(100); + } + + Wait(2); + // --------------------------------------------------------------------------- // Now let us move some points random over the keyboard diff --git a/Helper/GradientHelper.cs b/Helper/GradientHelper.cs new file mode 100644 index 0000000..8b866f0 --- /dev/null +++ b/Helper/GradientHelper.cs @@ -0,0 +1,53 @@ +using System; +using System.Drawing; + +namespace CUE.NET.Helper +{ + public static class GradientHelper + { + // Based on https://dotupdate.wordpress.com/2008/01/28/find-the-color-of-a-point-in-a-lineargradientbrush/ + public static float CalculateGradientOffset(PointF startPoint, PointF endPoint, PointF point) + { + PointF intersectingPoint; + if (startPoint.Y.Equals(endPoint.Y)) // Horizontal case + intersectingPoint = new PointF(point.X, startPoint.Y); + + else if (startPoint.X.Equals(endPoint.X)) // Vertical case + intersectingPoint = new PointF(startPoint.X, point.Y); + + else // Diagnonal case + { + float slope = (endPoint.Y - startPoint.Y) / (endPoint.X - startPoint.X); + float orthogonalSlope = -1 / slope; + + float startYIntercept = startPoint.Y - slope * startPoint.X; + float pointYIntercept = point.Y - orthogonalSlope * point.X; + + float intersectingPointX = (pointYIntercept - startYIntercept) / (slope - orthogonalSlope); + float intersectingPointY = slope * intersectingPointX + startYIntercept; + intersectingPoint = new PointF(intersectingPointX, intersectingPointY); + } + + // Calculate distances relative to the vector start + float intersectDistance = CalculateDistance(intersectingPoint, startPoint, endPoint); + float gradientLength = CalculateDistance(endPoint, startPoint, endPoint); + + return intersectDistance / gradientLength; + } + + // Based on https://dotupdate.wordpress.com/2008/01/28/find-the-color-of-a-point-in-a-lineargradientbrush/ + /// + /// Returns the signed magnitude of a point on a vector + /// + private static float CalculateDistance(PointF point, PointF origin, PointF direction) + { + float distance = (float)Math.Sqrt((point.Y - origin.Y) * (point.Y - origin.Y) + (point.X - origin.X) * (point.X - origin.X)); + + return (((point.Y < origin.Y) && (direction.Y > origin.Y)) || + ((point.Y > origin.Y) && (direction.Y < origin.Y)) || + ((point.Y.Equals(origin.Y)) && (point.X < origin.X) && (direction.X > origin.X)) || + ((point.Y.Equals(origin.Y)) && (point.X > origin.X) && (direction.X < origin.X))) + ? -distance : distance; + } + } +}