diff --git a/src/Artemis.Core/Models/Profile/Layer.cs b/src/Artemis.Core/Models/Profile/Layer.cs index 35ef188ed..15ec80610 100644 --- a/src/Artemis.Core/Models/Profile/Layer.cs +++ b/src/Artemis.Core/Models/Profile/Layer.cs @@ -77,7 +77,7 @@ namespace Artemis.Core.Models.Profile foreach (var layerElement in LayerElements) layerElement.Render(surface, layerCanvas); - var baseShader = SKShader.CreateBitmap(bitmap, SKShaderTileMode.Repeat, SKShaderTileMode.Repeat); + var baseShader = SKShader.CreateBitmap(bitmap, SKShaderTileMode.Repeat, SKShaderTileMode.Repeat, SKMatrix.MakeTranslation(RenderRectangle.Left, RenderRectangle.Top)); foreach (var layerElement in LayerElements) { var newBaseShader = layerElement.RenderPostProcess(surface, bitmap, baseShader); @@ -91,7 +91,7 @@ namespace Artemis.Core.Models.Profile baseShader = newBaseShader; } - canvas.ClipPath(RenderPath); + //canvas.ClipPath(RenderPath); canvas.DrawRect(RenderRectangle, new SKPaint {Shader = baseShader, FilterQuality = SKFilterQuality.Low}); baseShader.Dispose(); } diff --git a/src/Artemis.Plugins.LayerElements.Animations/AnimationLayerElementProvider.cs b/src/Artemis.Plugins.LayerElements.Animations/AnimationLayerElementProvider.cs new file mode 100644 index 000000000..11ed3bf09 --- /dev/null +++ b/src/Artemis.Plugins.LayerElements.Animations/AnimationLayerElementProvider.cs @@ -0,0 +1,26 @@ +using Artemis.Core.Plugins.LayerElement; +using Artemis.Core.Plugins.Models; + +namespace Artemis.Plugins.LayerElements.Animations +{ + public class AnimationLayerElementProvider : LayerElementProvider + { + public AnimationLayerElementProvider(PluginInfo pluginInfo) : base(pluginInfo) + { + AddLayerElementDescriptor("Slide animation", "A sliding animation", "ArrowAll"); + AddLayerElementDescriptor("Rotation animation", "A rotation animation", "CropRotate"); + } + + public override void Dispose() + { + } + + public override void EnablePlugin() + { + } + + public override void DisablePlugin() + { + } + } +} \ No newline at end of file diff --git a/src/Artemis.Plugins.LayerElements.Animations/Artemis.Plugins.LayerElements.Animations.csproj b/src/Artemis.Plugins.LayerElements.Animations/Artemis.Plugins.LayerElements.Animations.csproj new file mode 100644 index 000000000..d8e14bc49 --- /dev/null +++ b/src/Artemis.Plugins.LayerElements.Animations/Artemis.Plugins.LayerElements.Animations.csproj @@ -0,0 +1,92 @@ + + + + + Debug + AnyCPU + {6FE5DED5-D62E-4811-985F-644124FCEEFE} + Library + Properties + Artemis.Plugins.LayerElements.Animations + Artemis.Plugins.LayerElements.Animations + v4.7.2 + 512 + true + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\SkiaSharp.1.68.1\lib\net45\SkiaSharp.dll + + + + ..\packages\System.Buffers.4.5.0\lib\netstandard2.0\System.Buffers.dll + + + + ..\packages\System.Memory.4.5.3\lib\netstandard2.0\System.Memory.dll + + + + ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + + + ..\packages\System.Runtime.CompilerServices.Unsafe.4.6.0\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll + + + + + + + + + + + + + + + + + {9b811f9b-86b9-4771-87af-72bae7078a36} + Artemis.Core + + + + + + + PreserveNewest + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + echo Copying plugin to Artemis.UI output directory +XCOPY "$(TargetDir.TrimEnd('\'))" "$(SolutionDir)\Artemis.UI\$(OutDir)Plugins\$(ProjectName)" /s /q /i /y + + \ No newline at end of file diff --git a/src/Artemis.Plugins.LayerElements.Animations/Properties/AssemblyInfo.cs b/src/Artemis.Plugins.LayerElements.Animations/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..3bd9cdaa0 --- /dev/null +++ b/src/Artemis.Plugins.LayerElements.Animations/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Artemis.Plugins.LayerElements.Animations")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Artemis.Plugins.LayerElements.Animations")] +[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("6fe5ded5-d62e-4811-985f-644124fceefe")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/src/Artemis.Plugins.LayerElements.Animations/RotationLayerElement.cs b/src/Artemis.Plugins.LayerElements.Animations/RotationLayerElement.cs new file mode 100644 index 000000000..ade9daa5f --- /dev/null +++ b/src/Artemis.Plugins.LayerElements.Animations/RotationLayerElement.cs @@ -0,0 +1,36 @@ +using Artemis.Core.Models.Profile; +using Artemis.Core.Models.Surface; +using Artemis.Core.Plugins.LayerElement; +using SkiaSharp; + +namespace Artemis.Plugins.LayerElements.Animations +{ + public class RotationLayerElement : LayerElement + { + public RotationLayerElement(Layer layer, LayerElementSettings settings, LayerElementDescriptor descriptor) : base(layer, settings, descriptor) + { + } + + public float Rotation { get; set; } + + public override LayerElementViewModel GetViewModel() + { + return null; + } + + public override void Update(double deltaTime) + { + Rotation += (float)(deltaTime * 100); + if (Rotation > 360) + Rotation = 0; + } + + public override SKShader RenderPostProcess(ArtemisSurface surface, SKBitmap bitmap, SKShader shader) + { + var center = new SKPoint(Layer.AbsoluteRenderRectangle.MidX, Layer.AbsoluteRenderRectangle.MidY); + + // TODO Scale so that the rectangle is covered in every rotation, instead of just putting it at 2 + return SKShader.CreateLocalMatrix(SKShader.CreateLocalMatrix(shader, SKMatrix.MakeScale(2, 2, center.X, center.Y)), SKMatrix.MakeRotationDegrees(Rotation, center.X, center.Y)); + } + } +} \ No newline at end of file diff --git a/src/Artemis.Plugins.LayerElements.Animations/SlideLayerElement.cs b/src/Artemis.Plugins.LayerElements.Animations/SlideLayerElement.cs new file mode 100644 index 000000000..17f308e93 --- /dev/null +++ b/src/Artemis.Plugins.LayerElements.Animations/SlideLayerElement.cs @@ -0,0 +1,33 @@ +using Artemis.Core.Models.Profile; +using Artemis.Core.Models.Surface; +using Artemis.Core.Plugins.LayerElement; +using SkiaSharp; + +namespace Artemis.Plugins.LayerElements.Animations +{ + public class SlideLayerElement : LayerElement + { + public SlideLayerElement(Layer layer, LayerElementSettings settings, LayerElementDescriptor descriptor) : base(layer, settings, descriptor) + { + } + + public int MovePercentage { get; set; } + + public override LayerElementViewModel GetViewModel() + { + return null; + } + + public override void Update(double deltaTime) + { + MovePercentage++; + if (MovePercentage > 100) + MovePercentage = 0; + } + + public override SKShader RenderPostProcess(ArtemisSurface surface, SKBitmap bitmap, SKShader shader) + { + return SKShader.CreateLocalMatrix(shader, SKMatrix.MakeTranslation(Layer.RenderRectangle.Width / 100 * MovePercentage * -1, 0)); + } + } +} \ No newline at end of file diff --git a/src/Artemis.Plugins.LayerElements.Animations/app.config b/src/Artemis.Plugins.LayerElements.Animations/app.config new file mode 100644 index 000000000..03a8d9e5d --- /dev/null +++ b/src/Artemis.Plugins.LayerElements.Animations/app.config @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Artemis.Plugins.LayerElements.Animations/packages.config b/src/Artemis.Plugins.LayerElements.Animations/packages.config new file mode 100644 index 000000000..97d48701a --- /dev/null +++ b/src/Artemis.Plugins.LayerElements.Animations/packages.config @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/src/Artemis.Plugins.LayerElements.Animations/plugin.json b/src/Artemis.Plugins.LayerElements.Animations/plugin.json new file mode 100644 index 000000000..a5e4bbb6f --- /dev/null +++ b/src/Artemis.Plugins.LayerElements.Animations/plugin.json @@ -0,0 +1,10 @@ +{ + "Guid": "a3b94380-6592-44f9-8717-3053ca9b4799", + "Name": "Animation layer elements", + "Version": { + "Major": 1, + "Minor": 0, + "Build": 0 + }, + "Main": "Artemis.Plugins.LayerElements.Animations.dll" +} \ No newline at end of file diff --git a/src/Artemis.Plugins.LayerTypes.Brush/BrushLayerElement.cs b/src/Artemis.Plugins.LayerTypes.Brush/BrushLayerElement.cs index 0ef34561a..607ed2f86 100644 --- a/src/Artemis.Plugins.LayerTypes.Brush/BrushLayerElement.cs +++ b/src/Artemis.Plugins.LayerTypes.Brush/BrushLayerElement.cs @@ -30,12 +30,8 @@ namespace Artemis.Plugins.LayerElements.Brush private void CreateShader() { - var shader = SKShader.CreateLinearGradient( - new SKPoint(0, 0), - new SKPoint(Layer.AbsoluteRenderRectangle.Width, 0), - _testColors.ToArray(), - null, - SKShaderTileMode.Clamp); + var center = new SKPoint(Layer.AbsoluteRenderRectangle.MidX, Layer.AbsoluteRenderRectangle.MidY); + var shader = SKShader.CreateSweepGradient(center, _testColors.ToArray(), null, SKShaderTileMode.Clamp, 0, 360); var oldShader = _shader; _shader = shader; @@ -52,7 +48,7 @@ namespace Artemis.Plugins.LayerElements.Brush public override void Render(ArtemisSurface surface, SKCanvas canvas) { - using (var paint = new SKPaint { Shader = _shader, FilterQuality = SKFilterQuality.Low }) + using (var paint = new SKPaint {Shader = _shader, FilterQuality = SKFilterQuality.Low}) { canvas.DrawRect(Layer.AbsoluteRenderRectangle, paint); } diff --git a/src/Artemis.sln b/src/Artemis.sln index 71bccf436..437dd44f4 100644 --- a/src/Artemis.sln +++ b/src/Artemis.sln @@ -8,6 +8,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Artemis.UI", "Artemis.UI\Ar {E592F239-FAA0-4840-9C85-46E5867D06D5} = {E592F239-FAA0-4840-9C85-46E5867D06D5} {0F288A66-6EB0-4589-8595-E33A3A3EAEA2} = {0F288A66-6EB0-4589-8595-E33A3A3EAEA2} {235A45C7-24AD-4F47-B9D4-CD67E610A04D} = {235A45C7-24AD-4F47-B9D4-CD67E610A04D} + {6FE5DED5-D62E-4811-985F-644124FCEEFE} = {6FE5DED5-D62E-4811-985F-644124FCEEFE} {A779B2F8-C253-4C4B-8634-6EB8F594E96D} = {A779B2F8-C253-4C4B-8634-6EB8F594E96D} EndProjectSection EndProject @@ -25,6 +26,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Artemis.Plugins.Devices.Cor EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Artemis.Plugins.Devices.Logitech", "Artemis.Plugins.Devices.Logitech\Artemis.Plugins.Devices.Logitech.csproj", "{235A45C7-24AD-4F47-B9D4-CD67E610A04D}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Artemis.Plugins.LayerElements.Animations", "Artemis.Plugins.LayerElements.Animations\Artemis.Plugins.LayerElements.Animations.csproj", "{6FE5DED5-D62E-4811-985F-644124FCEEFE}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -89,6 +92,14 @@ Global {235A45C7-24AD-4F47-B9D4-CD67E610A04D}.Release|Any CPU.Build.0 = Release|Any CPU {235A45C7-24AD-4F47-B9D4-CD67E610A04D}.Release|x64.ActiveCfg = Release|Any CPU {235A45C7-24AD-4F47-B9D4-CD67E610A04D}.Release|x64.Build.0 = Release|Any CPU + {6FE5DED5-D62E-4811-985F-644124FCEEFE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6FE5DED5-D62E-4811-985F-644124FCEEFE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6FE5DED5-D62E-4811-985F-644124FCEEFE}.Debug|x64.ActiveCfg = Debug|Any CPU + {6FE5DED5-D62E-4811-985F-644124FCEEFE}.Debug|x64.Build.0 = Debug|Any CPU + {6FE5DED5-D62E-4811-985F-644124FCEEFE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6FE5DED5-D62E-4811-985F-644124FCEEFE}.Release|Any CPU.Build.0 = Release|Any CPU + {6FE5DED5-D62E-4811-985F-644124FCEEFE}.Release|x64.ActiveCfg = Release|Any CPU + {6FE5DED5-D62E-4811-985F-644124FCEEFE}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -98,6 +109,7 @@ Global {0F288A66-6EB0-4589-8595-E33A3A3EAEA2} = {E830A02B-A7E5-4A6B-943F-76B0A542630C} {A779B2F8-C253-4C4B-8634-6EB8F594E96D} = {E830A02B-A7E5-4A6B-943F-76B0A542630C} {235A45C7-24AD-4F47-B9D4-CD67E610A04D} = {E830A02B-A7E5-4A6B-943F-76B0A542630C} + {6FE5DED5-D62E-4811-985F-644124FCEEFE} = {E830A02B-A7E5-4A6B-943F-76B0A542630C} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C203080A-4473-4CC2-844B-F552EA43D66A}