diff --git a/src/Artemis.Plugins.LayerBrushes.Chroma/Artemis.Plugins.LayerBrushes.Chroma.csproj b/src/Artemis.Plugins.LayerBrushes.Chroma/Artemis.Plugins.LayerBrushes.Chroma.csproj index aa268e2..9d54606 100644 --- a/src/Artemis.Plugins.LayerBrushes.Chroma/Artemis.Plugins.LayerBrushes.Chroma.csproj +++ b/src/Artemis.Plugins.LayerBrushes.Chroma/Artemis.Plugins.LayerBrushes.Chroma.csproj @@ -8,7 +8,7 @@ - + diff --git a/src/Artemis.Plugins.LayerBrushes.Chroma/DefaultChromaLedMap.cs b/src/Artemis.Plugins.LayerBrushes.Chroma/DefaultChromaLedMap.cs index 9c82ae5..4261a1e 100644 --- a/src/Artemis.Plugins.LayerBrushes.Chroma/DefaultChromaLedMap.cs +++ b/src/Artemis.Plugins.LayerBrushes.Chroma/DefaultChromaLedMap.cs @@ -1,341 +1,290 @@ -using RGB.NET.Core; +using System; +using RGB.NET.Core; using System.Collections.Generic; +using System.Linq; namespace Artemis.Plugins.LayerBrushes.Chroma; //https://developer.razer.com/works-with-chroma/razer-chroma-led-profiles/ public static class DefaultChromaLedMap { - public static readonly LedId[,] Keyboard = + private static readonly LedId[] Keyboard = { - { - LedId.Invalid, - LedId.Keyboard_Escape, - LedId.Invalid, - LedId.Keyboard_F1, - LedId.Keyboard_F2, - LedId.Keyboard_F3, - LedId.Keyboard_F4, - LedId.Keyboard_F5, - LedId.Keyboard_F6, - LedId.Keyboard_F7, - LedId.Keyboard_F8, - LedId.Keyboard_F9, - LedId.Keyboard_F10, - LedId.Keyboard_F11, - LedId.Keyboard_F12, - LedId.Keyboard_PrintScreen, - LedId.Keyboard_ScrollLock, - LedId.Keyboard_PauseBreak, - LedId.Invalid, - LedId.Invalid, - LedId.Logo, - LedId.Invalid - }, - { - LedId.Keyboard_Macro1, - LedId.Keyboard_GraveAccentAndTilde, - LedId.Keyboard_1, - LedId.Keyboard_2, - LedId.Keyboard_3, - LedId.Keyboard_4, - LedId.Keyboard_5, - LedId.Keyboard_6, - LedId.Keyboard_7, - LedId.Keyboard_8, - LedId.Keyboard_9, - LedId.Keyboard_0, - LedId.Keyboard_MinusAndUnderscore, - LedId.Keyboard_EqualsAndPlus, - LedId.Keyboard_Backspace, - LedId.Keyboard_Insert, - LedId.Keyboard_Home, - LedId.Keyboard_PageUp, - LedId.Keyboard_NumLock, - LedId.Keyboard_NumSlash, - LedId.Keyboard_NumAsterisk, - LedId.Keyboard_NumMinus - }, - { - LedId.Keyboard_Macro2, - LedId.Keyboard_Tab, - LedId.Keyboard_Q, - LedId.Keyboard_W, - LedId.Keyboard_E, - LedId.Keyboard_R, - LedId.Keyboard_T, - LedId.Keyboard_Y, - LedId.Keyboard_U, - LedId.Keyboard_I, - LedId.Keyboard_O, - LedId.Keyboard_P, - LedId.Keyboard_BracketLeft, - LedId.Keyboard_BracketRight, - LedId.Keyboard_Backslash, - LedId.Keyboard_Delete, - LedId.Keyboard_End, - LedId.Keyboard_PageDown, - LedId.Keyboard_Num7, - LedId.Keyboard_Num8, - LedId.Keyboard_Num9, - LedId.Keyboard_NumPlus - }, - { - LedId.Keyboard_Macro3, - LedId.Keyboard_CapsLock, - LedId.Keyboard_A, - LedId.Keyboard_S, - LedId.Keyboard_D, - LedId.Keyboard_F, - LedId.Keyboard_G, - LedId.Keyboard_H, - LedId.Keyboard_J, - LedId.Keyboard_K, - LedId.Keyboard_L, - LedId.Keyboard_SemicolonAndColon, - LedId.Keyboard_ApostropheAndDoubleQuote, - LedId.Keyboard_NonUsTilde, - LedId.Keyboard_Enter, - LedId.Invalid, - LedId.Invalid, - LedId.Invalid, - LedId.Keyboard_Num4, - LedId.Keyboard_Num5, - LedId.Keyboard_Num6, - LedId.Invalid - }, - { - LedId.Keyboard_Macro4, - LedId.Keyboard_LeftShift, - LedId.Keyboard_NonUsBackslash, - LedId.Keyboard_Z, - LedId.Keyboard_X, - LedId.Keyboard_C, - LedId.Keyboard_V, - LedId.Keyboard_B, - LedId.Keyboard_N, - LedId.Keyboard_M, - LedId.Keyboard_CommaAndLessThan, - LedId.Keyboard_PeriodAndBiggerThan, - LedId.Keyboard_SlashAndQuestionMark, - LedId.Invalid, - LedId.Keyboard_RightShift, - LedId.Invalid, - LedId.Keyboard_ArrowUp, - LedId.Invalid, - LedId.Keyboard_Num1, - LedId.Keyboard_Num2, - LedId.Keyboard_Num3, - LedId.Keyboard_NumEnter - }, - { - LedId.Keyboard_Macro5, - LedId.Keyboard_LeftCtrl, - LedId.Keyboard_LeftGui, - LedId.Keyboard_LeftAlt, - LedId.Invalid, - LedId.Invalid, - LedId.Invalid, - LedId.Keyboard_Space, - LedId.Invalid, - LedId.Invalid, - LedId.Invalid, - LedId.Keyboard_RightAlt, - LedId.Keyboard_Function, - LedId.Keyboard_Application, - LedId.Keyboard_RightCtrl, - LedId.Keyboard_ArrowLeft, - LedId.Keyboard_ArrowDown, - LedId.Keyboard_ArrowRight, - LedId.Invalid, - LedId.Keyboard_Num0, - LedId.Keyboard_NumPeriodAndDelete, - LedId.Invalid - } + LedId.Invalid, + LedId.Keyboard_Escape, + LedId.Invalid, + LedId.Keyboard_F1, + LedId.Keyboard_F2, + LedId.Keyboard_F3, + LedId.Keyboard_F4, + LedId.Keyboard_F5, + LedId.Keyboard_F6, + LedId.Keyboard_F7, + LedId.Keyboard_F8, + LedId.Keyboard_F9, + LedId.Keyboard_F10, + LedId.Keyboard_F11, + LedId.Keyboard_F12, + LedId.Keyboard_PrintScreen, + LedId.Keyboard_ScrollLock, + LedId.Keyboard_PauseBreak, + LedId.Invalid, + LedId.Invalid, + LedId.Logo, + LedId.Invalid, + LedId.Keyboard_Macro1, + LedId.Keyboard_GraveAccentAndTilde, + LedId.Keyboard_1, + LedId.Keyboard_2, + LedId.Keyboard_3, + LedId.Keyboard_4, + LedId.Keyboard_5, + LedId.Keyboard_6, + LedId.Keyboard_7, + LedId.Keyboard_8, + LedId.Keyboard_9, + LedId.Keyboard_0, + LedId.Keyboard_MinusAndUnderscore, + LedId.Keyboard_EqualsAndPlus, + LedId.Keyboard_Backspace, + LedId.Keyboard_Insert, + LedId.Keyboard_Home, + LedId.Keyboard_PageUp, + LedId.Keyboard_NumLock, + LedId.Keyboard_NumSlash, + LedId.Keyboard_NumAsterisk, + LedId.Keyboard_NumMinus, + LedId.Keyboard_Macro2, + LedId.Keyboard_Tab, + LedId.Keyboard_Q, + LedId.Keyboard_W, + LedId.Keyboard_E, + LedId.Keyboard_R, + LedId.Keyboard_T, + LedId.Keyboard_Y, + LedId.Keyboard_U, + LedId.Keyboard_I, + LedId.Keyboard_O, + LedId.Keyboard_P, + LedId.Keyboard_BracketLeft, + LedId.Keyboard_BracketRight, + LedId.Keyboard_Backslash, + LedId.Keyboard_Delete, + LedId.Keyboard_End, + LedId.Keyboard_PageDown, + LedId.Keyboard_Num7, + LedId.Keyboard_Num8, + LedId.Keyboard_Num9, + LedId.Keyboard_NumPlus, + LedId.Keyboard_Macro3, + LedId.Keyboard_CapsLock, + LedId.Keyboard_A, + LedId.Keyboard_S, + LedId.Keyboard_D, + LedId.Keyboard_F, + LedId.Keyboard_G, + LedId.Keyboard_H, + LedId.Keyboard_J, + LedId.Keyboard_K, + LedId.Keyboard_L, + LedId.Keyboard_SemicolonAndColon, + LedId.Keyboard_ApostropheAndDoubleQuote, + LedId.Keyboard_NonUsTilde, + LedId.Keyboard_Enter, + LedId.Invalid, + LedId.Invalid, + LedId.Invalid, + LedId.Keyboard_Num4, + LedId.Keyboard_Num5, + LedId.Keyboard_Num6, + LedId.Invalid, + LedId.Keyboard_Macro4, + LedId.Keyboard_LeftShift, + LedId.Keyboard_NonUsBackslash, + LedId.Keyboard_Z, + LedId.Keyboard_X, + LedId.Keyboard_C, + LedId.Keyboard_V, + LedId.Keyboard_B, + LedId.Keyboard_N, + LedId.Keyboard_M, + LedId.Keyboard_CommaAndLessThan, + LedId.Keyboard_PeriodAndBiggerThan, + LedId.Keyboard_SlashAndQuestionMark, + LedId.Invalid, + LedId.Keyboard_RightShift, + LedId.Invalid, + LedId.Keyboard_ArrowUp, + LedId.Invalid, + LedId.Keyboard_Num1, + LedId.Keyboard_Num2, + LedId.Keyboard_Num3, + LedId.Keyboard_NumEnter, + LedId.Keyboard_Macro5, + LedId.Keyboard_LeftCtrl, + LedId.Keyboard_LeftGui, + LedId.Keyboard_LeftAlt, + LedId.Invalid, + LedId.Invalid, + LedId.Invalid, + LedId.Keyboard_Space, + LedId.Invalid, + LedId.Invalid, + LedId.Invalid, + LedId.Keyboard_RightAlt, + LedId.Keyboard_Function, + LedId.Keyboard_Application, + LedId.Keyboard_RightCtrl, + LedId.Keyboard_ArrowLeft, + LedId.Keyboard_ArrowDown, + LedId.Keyboard_ArrowRight, + LedId.Invalid, + LedId.Keyboard_Num0, + LedId.Keyboard_NumPeriodAndDelete, + LedId.Invalid, }; - public static readonly LedId[,] Mouse = + private static readonly LedId[] Mouse = { - { - LedId.Invalid, - LedId.Invalid, - LedId.Invalid, - LedId.Invalid, - LedId.Invalid, - LedId.Invalid, - LedId.Invalid - }, - { - LedId.Mouse1, - LedId.Invalid, - LedId.Invalid, - LedId.Invalid, - LedId.Invalid, - LedId.Invalid, - LedId.Mouse2 - }, - { - LedId.Mouse3, - LedId.Invalid, - LedId.Invalid, - LedId.Mouse4, - LedId.Invalid, - LedId.Invalid, - LedId.Mouse5 - }, - { - LedId.Mouse6, - LedId.Invalid, - LedId.Invalid, - LedId.Invalid, - LedId.Invalid, - LedId.Invalid, - LedId.Mouse7 - }, - { - LedId.Mouse8, - LedId.Invalid, - LedId.Invalid, - LedId.Mouse9, - LedId.Invalid, - LedId.Invalid, - LedId.Mouse10 - }, - { - LedId.Mouse11, - LedId.Invalid, - LedId.Invalid, - LedId.Invalid, - LedId.Invalid, - LedId.Invalid, - LedId.Mouse12 - }, - { - LedId.Mouse13, - LedId.Invalid, - LedId.Invalid, - LedId.Invalid, - LedId.Invalid, - LedId.Invalid, - LedId.Mouse14 - }, - { - LedId.Mouse15, - LedId.Invalid, - LedId.Invalid, - LedId.Mouse16, - LedId.Invalid, - LedId.Invalid, - LedId.Mouse17 - }, - { - LedId.Invalid, - LedId.Mouse18, - LedId.Mouse19, - LedId.Mouse20, - LedId.Mouse21, - LedId.Mouse22, - LedId.Invalid - } + LedId.Invalid, + LedId.Invalid, + LedId.Invalid, + LedId.Invalid, + LedId.Invalid, + LedId.Invalid, + LedId.Invalid, + LedId.Mouse1, + LedId.Invalid, + LedId.Invalid, + LedId.Invalid, + LedId.Invalid, + LedId.Invalid, + LedId.Mouse2, + LedId.Mouse3, + LedId.Invalid, + LedId.Invalid, + LedId.Mouse4, + LedId.Invalid, + LedId.Invalid, + LedId.Mouse5, + LedId.Mouse6, + LedId.Invalid, + LedId.Invalid, + LedId.Invalid, + LedId.Invalid, + LedId.Invalid, + LedId.Mouse7, + LedId.Mouse8, + LedId.Invalid, + LedId.Invalid, + LedId.Mouse9, + LedId.Invalid, + LedId.Invalid, + LedId.Mouse10, + LedId.Mouse11, + LedId.Invalid, + LedId.Invalid, + LedId.Invalid, + LedId.Invalid, + LedId.Invalid, + LedId.Mouse12, + LedId.Mouse13, + LedId.Invalid, + LedId.Invalid, + LedId.Invalid, + LedId.Invalid, + LedId.Invalid, + LedId.Mouse14, + LedId.Mouse15, + LedId.Invalid, + LedId.Invalid, + LedId.Mouse16, + LedId.Invalid, + LedId.Invalid, + LedId.Mouse17, + LedId.Invalid, + LedId.Mouse18, + LedId.Mouse19, + LedId.Mouse20, + LedId.Mouse21, + LedId.Mouse22, + LedId.Invalid, }; - public static readonly LedId[,] Mousepad = + private static readonly LedId[] Mousepad = { - { - LedId.Mousepad20, - LedId.Mousepad19, - LedId.Mousepad18, - LedId.Mousepad17, - LedId.Mousepad16, - LedId.Mousepad15, - LedId.Mousepad14, - LedId.Mousepad13, - LedId.Mousepad12, - LedId.Mousepad11, - LedId.Mousepad10, - LedId.Mousepad9, - LedId.Mousepad8, - LedId.Mousepad7, - LedId.Mousepad6, - LedId.Mousepad5, - LedId.Mousepad4, - LedId.Mousepad3, - LedId.Mousepad2, - LedId.Mousepad1 - } + LedId.Mousepad20, + LedId.Mousepad19, + LedId.Mousepad18, + LedId.Mousepad17, + LedId.Mousepad16, + LedId.Mousepad15, + LedId.Mousepad14, + LedId.Mousepad13, + LedId.Mousepad12, + LedId.Mousepad11, + LedId.Mousepad10, + LedId.Mousepad9, + LedId.Mousepad8, + LedId.Mousepad7, + LedId.Mousepad6, + LedId.Mousepad5, + LedId.Mousepad4, + LedId.Mousepad3, + LedId.Mousepad2, + LedId.Mousepad1, }; - public static readonly LedId[,] Headset = + private static readonly LedId[] Headset = { - { - LedId.Headset1, - LedId.Headset2, - LedId.Headset3, - LedId.Headset4, - LedId.Headset5 - } + LedId.Headset1, + LedId.Headset2, + LedId.Headset3, + LedId.Headset4, + LedId.Headset5, }; - public static readonly LedId[,] Keypad = + private static readonly LedId[] Keypad = { - { - LedId.Keypad1, - LedId.Keypad2, - LedId.Keypad3, - LedId.Keypad4, - LedId.Keypad5 - }, - { - LedId.Keypad6, - LedId.Keypad7, - LedId.Keypad8, - LedId.Keypad9, - LedId.Keypad10 - }, - { - LedId.Keypad11, - LedId.Keypad12, - LedId.Keypad13, - LedId.Keypad14, - LedId.Keypad15 - }, - { - LedId.Keypad16, - LedId.Keypad17, - LedId.Keypad18, - LedId.Keypad19, - LedId.Keypad20 - } + LedId.Keypad1, + LedId.Keypad2, + LedId.Keypad3, + LedId.Keypad4, + LedId.Keypad5, + LedId.Keypad6, + LedId.Keypad7, + LedId.Keypad8, + LedId.Keypad9, + LedId.Keypad10, + LedId.Keypad11, + LedId.Keypad12, + LedId.Keypad13, + LedId.Keypad14, + LedId.Keypad15, + LedId.Keypad16, + LedId.Keypad17, + LedId.Keypad18, + LedId.Keypad19, + LedId.Keypad20, }; - public static readonly LedId[,] ChromaLink = + private static readonly LedId[] ChromaLink = { - { - LedId.LedStripe1, - LedId.LedStripe2, - LedId.LedStripe3, - LedId.LedStripe4, - LedId.LedStripe5 - } + LedId.LedStripe1, + LedId.LedStripe2, + LedId.LedStripe3, + LedId.LedStripe4, + LedId.LedStripe5, }; - public static readonly Dictionary DeviceTypes = new() + public static LedId[] GetDeviceMap(RzDeviceType r) => r switch { - [RzDeviceType.Keyboard] = Keyboard, - [RzDeviceType.Mouse] = Mouse, - [RzDeviceType.Mousepad] = Mousepad, - [RzDeviceType.Headset] = Headset, - [RzDeviceType.Keypad] = Keypad, - [RzDeviceType.ChromaLink] = ChromaLink + RzDeviceType.Mouse => Mouse, + RzDeviceType.Mousepad => Mousepad, + RzDeviceType.Headset => Headset, + RzDeviceType.Keypad => Keypad, + RzDeviceType.Keyboard => Keyboard, + RzDeviceType.ChromaLink => ChromaLink, + _ => throw new ArgumentOutOfRangeException(nameof(r), r, null) }; - - public static Dictionary Clone() => new() - { - [RzDeviceType.Keyboard] = (LedId[,])Keyboard.Clone(), - [RzDeviceType.Mouse] = (LedId[,])Mouse.Clone(), - [RzDeviceType.Mousepad] = (LedId[,])Mousepad.Clone(), - [RzDeviceType.Headset] = (LedId[,])Headset.Clone(), - [RzDeviceType.Keypad] = (LedId[,])Keypad.Clone(), - [RzDeviceType.ChromaLink] = (LedId[,])ChromaLink.Clone(), - }; -} +} \ No newline at end of file diff --git a/src/Artemis.Plugins.LayerBrushes.Chroma/LayerBrushes/ChromaLayerBrush.cs b/src/Artemis.Plugins.LayerBrushes.Chroma/LayerBrushes/ChromaLayerBrush.cs index f5301b5..ca9ac6c 100644 --- a/src/Artemis.Plugins.LayerBrushes.Chroma/LayerBrushes/ChromaLayerBrush.cs +++ b/src/Artemis.Plugins.LayerBrushes.Chroma/LayerBrushes/ChromaLayerBrush.cs @@ -12,16 +12,14 @@ namespace Artemis.Plugins.LayerBrushes.Chroma.LayerBrushes; public class ChromaLayerBrush : PerLedLayerBrush { private readonly ChromaService _chroma; - private readonly PluginSetting> _keyMapSetting; private readonly Dictionary _colors; private readonly object _lock; private bool _shouldRender; private bool _playingOverwatch; - public ChromaLayerBrush(ChromaService chroma, PluginSettings pluginSettings) + public ChromaLayerBrush(ChromaService chroma) { _chroma = chroma; - _keyMapSetting = pluginSettings.GetSetting("ChromaKeymap", DefaultChromaLedMap.Clone()); _colors = new(); _lock = new(); } @@ -45,24 +43,23 @@ public override void DisableLayerBrush() _chroma.AppListUpdated -= OnAppListUpdated; } - private void OnMatrixUpdated(object? sender, MatrixUpdatedEventArgs args) + private void OnMatrixUpdated(object? sender, RzDeviceType deviceType) { - var matrix = args.Matrix; - var dict = _keyMapSetting.Value![args.DeviceType]; + var dict = DefaultChromaLedMap.GetDeviceMap(deviceType); + var matrix = _chroma.Matrices[(int) deviceType]; lock (_lock) { - for (var i = 0; i < matrix.GetLength(0); i++) + for (var i = 0; i < matrix.Length; i++) { - for (var j = 0; j < matrix.GetLength(1); j++) - { - _colors[dict[i, j]] = matrix[i, j]; - } + _colors[dict[i]] = matrix[i]; } } } - public override void Update(double deltaTime) { } + public override void Update(double deltaTime) + { + } public override SKColor GetColor(ArtemisLed led, SKPoint renderPoint) { @@ -73,7 +70,7 @@ public override SKColor GetColor(ArtemisLed led, SKPoint renderPoint) { if (_colors.TryGetValue(led.RgbLed.Id, out var color)) return ProcessColor(color); - + //According to razer docs, chromaLink1 is the "catchall" ledId. If an LED doesn't have a mapping, use this color. if (Properties.UseDefaultLed && _colors.TryGetValue(LedId.LedStripe1, out var chromaLink1)) return ProcessColor(chromaLink1); @@ -86,7 +83,7 @@ private SKColor ProcessColor(SKColor color) { if (Properties.TransparentBlack && color == SKColors.Black) return SKColor.Empty; - + if (_playingOverwatch && Properties.OverwatchEnhanceColors && OverwatchColorCorrection.ColorMap.TryGetValue(color, out var correctedColor)) return correctedColor; diff --git a/src/Artemis.Plugins.LayerBrushes.Chroma/Module/ChromaModule.cs b/src/Artemis.Plugins.LayerBrushes.Chroma/Module/ChromaModule.cs index 581a88e..5dcb801 100644 --- a/src/Artemis.Plugins.LayerBrushes.Chroma/Module/ChromaModule.cs +++ b/src/Artemis.Plugins.LayerBrushes.Chroma/Module/ChromaModule.cs @@ -66,24 +66,19 @@ private void OnAppListUpdated(object? sender, EventArgs args) DataModel.PidList = _chroma.AppIds.Select(p => (int)p).ToList(); } - private void OnMatrixUpdated(object? sender, MatrixUpdatedEventArgs args) + private void OnMatrixUpdated(object? sender, RzDeviceType deviceType) { - var colors = args.Matrix; - var deviceType = args.DeviceType; + var colors = _chroma.Matrices[(int)deviceType]; - if (!IsPropertyInUse(deviceType.ToStringFast(), true)) - return; + var map = DefaultChromaLedMap.GetDeviceMap(deviceType); - for (var row = 0; row < colors.GetLength(0); row++) + for (var i = 0; i < colors.Length; i++) { - for (var col = 0; col < colors.GetLength(1); col++) - { - var ledId = DefaultChromaLedMap.DeviceTypes[deviceType][row, col]; - if (ledId == LedId.Invalid) - continue; - var ledDataModel = _colorsCache[ledId]; - ledDataModel.Value = colors[row, col]; - } + var ledId = map[i]; + if (ledId == LedId.Invalid) + continue; + + _colorsCache[ledId].Value = colors[i]; } } @@ -92,19 +87,16 @@ private void CreateStructure() DataModel.ClearDynamicChildren(); foreach (var rzDeviceType in Enum.GetValues()) { - var deviceDataModel = DataModel.AddDynamicChild(rzDeviceType.ToString(), new ChromaDeviceDataModel()); + var deviceDataModel = DataModel.AddDynamicChild(rzDeviceType.ToStringFast(), new ChromaDeviceDataModel()); - var map = DefaultChromaLedMap.DeviceTypes[rzDeviceType]; - for (var row = 0; row < map.GetLength(0); row++) + var map = DefaultChromaLedMap.GetDeviceMap(rzDeviceType); + for (var i = 0; i < map.Length; i++) { - for (var col = 0; col < map.GetLength(1); col++) - { - var ledId = map[row, col]; - if (ledId == LedId.Invalid) - continue; - - _colorsCache.Add(ledId, deviceDataModel.Value.AddDynamicChild(ledId.ToString(), default)); - } + var ledId = map[i]; + if (ledId == LedId.Invalid) + continue; + + _colorsCache.Add(ledId, deviceDataModel.Value.AddDynamicChild(ledId.ToString(), default)); } } } diff --git a/src/Artemis.Plugins.LayerBrushes.Chroma/RzDeviceType.cs b/src/Artemis.Plugins.LayerBrushes.Chroma/RzDeviceType.cs index 15e0485..0e00e6c 100644 --- a/src/Artemis.Plugins.LayerBrushes.Chroma/RzDeviceType.cs +++ b/src/Artemis.Plugins.LayerBrushes.Chroma/RzDeviceType.cs @@ -1,4 +1,6 @@ -namespace Artemis.Plugins.LayerBrushes.Chroma; +using RazerSdkReader.Structures; + +namespace Artemis.Plugins.LayerBrushes.Chroma; public enum RzDeviceType { @@ -7,7 +9,7 @@ public enum RzDeviceType Keypad, Keyboard, Headset, - ChromaLink + ChromaLink, } public static class EnumExtensions @@ -22,4 +24,15 @@ public static class EnumExtensions RzDeviceType.ChromaLink => nameof(RzDeviceType.ChromaLink), _ => value.ToString(), }; + + public static int GetLength(this RzDeviceType value) => value switch + { + RzDeviceType.Mousepad => ChromaMousepad.COUNT, + RzDeviceType.Mouse => ChromaMouse.COUNT, + RzDeviceType.Keypad => ChromaKeypad.COUNT, + RzDeviceType.Keyboard => ChromaKeyboard.COUNT, + RzDeviceType.Headset => ChromaHeadset.COUNT, + RzDeviceType.ChromaLink => ChromaLink.COUNT, + _ => 0, + }; } \ No newline at end of file diff --git a/src/Artemis.Plugins.LayerBrushes.Chroma/Services/ChromaService.cs b/src/Artemis.Plugins.LayerBrushes.Chroma/Services/ChromaService.cs index f908365..2cd3da0 100644 --- a/src/Artemis.Plugins.LayerBrushes.Chroma/Services/ChromaService.cs +++ b/src/Artemis.Plugins.LayerBrushes.Chroma/Services/ChromaService.cs @@ -2,6 +2,7 @@ using SkiaSharp; using System; using System.Collections.Generic; +using System.Runtime.InteropServices; using Artemis.Core; using RazerSdkReader; using RazerSdkReader.Structures; @@ -10,14 +11,14 @@ namespace Artemis.Plugins.LayerBrushes.Chroma.Services; public sealed class ChromaService : IPluginService, IDisposable { - private readonly Dictionary _matrices; + private readonly SKColor[][] _matrices; private readonly List _apps; private readonly List _pids; private readonly ChromaReader _reader; private readonly Profiler _profiler; private readonly object _lock; - public event EventHandler? MatrixUpdated; + public event EventHandler? MatrixUpdated; public event EventHandler? AppListUpdated; public bool IsActive => !string.IsNullOrWhiteSpace(CurrentApp) && CurrentApp != "Artemis.UI.Windows.exe"; @@ -26,13 +27,19 @@ public sealed class ChromaService : IPluginService, IDisposable public IEnumerable AppNames => _apps; public IEnumerable AppIds => _pids; + public SKColor[][] Matrices => _matrices; + public ChromaService(Plugin plugin) { _profiler = plugin.GetProfiler("Chroma Service"); _lock = new object(); - _matrices = new(); _apps = new(); _pids = new(); + + var deviceTypes = Enum.GetValues(); + _matrices = new SKColor[deviceTypes.Length][]; + for (var i = 0; i < _matrices.Length; i++) + _matrices[i] = new SKColor[deviceTypes[i].GetLength()]; _reader = new(); _reader.KeyboardUpdated += RazerEmulatorReaderOnKeyboardUpdated; @@ -66,26 +73,19 @@ public ChromaService(Plugin plugin) _profiler.StartMeasurement(profilerName); lock (_lock) { - if (!_matrices.TryGetValue(deviceType, out var matrix)) - { - matrix = new SKColor[data.Height, data.Width]; - _matrices.Add(deviceType, matrix); - } + var matrix = _matrices[(int) deviceType]; + + Span colors = stackalloc ChromaColor[matrix.Length]; + + data.GetColors(colors); - for (var i = 0; i < data.Height; i++) + for (var i = 0; i < colors.Length; i++) { - for (var j = 0; j < data.Width; j++) - { - // ReSharper disable once PossiblyImpureMethodCallOnReadonlyVariable - var clr = data.GetColor(i * data.Width + j); - matrix[i, j] = new SKColor(clr.R, clr.G, clr.B); - } + var rzColor = colors[i]; + matrix[i] = new SKColor(rzColor.R, rzColor.G, rzColor.B); } - MatrixUpdated?.Invoke(this, new MatrixUpdatedEventArgs - { - Matrix = matrix, - DeviceType = deviceType - }); + + MatrixUpdated?.Invoke(this, deviceType); } _profiler.StopMeasurement(profilerName); @@ -98,12 +98,9 @@ private void UpdateAppListData(in ChromaAppData app) CurrentAppId = app.CurrentAppId; CurrentApp = app.CurrentAppName; - - var span = app.AppInfo.AsSpan(); - for (var i = 0; i < app.AppCount; i++) + + foreach(ref readonly var appInfo in app.AppInfo) { - ref var appInfo = ref span[i]; - _apps.Add(appInfo.AppName); _pids.Add(appInfo.AppId); } diff --git a/src/Artemis.Plugins.LayerBrushes.Chroma/Services/MatrixUpdatedEventArgs.cs b/src/Artemis.Plugins.LayerBrushes.Chroma/Services/MatrixUpdatedEventArgs.cs deleted file mode 100644 index e657af7..0000000 --- a/src/Artemis.Plugins.LayerBrushes.Chroma/Services/MatrixUpdatedEventArgs.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; -using SkiaSharp; - -namespace Artemis.Plugins.LayerBrushes.Chroma.Services; - -public sealed class MatrixUpdatedEventArgs : EventArgs -{ - public required RzDeviceType DeviceType { get; init; } - public required SKColor[,] Matrix { get; init; } -} \ No newline at end of file