diff --git a/src/Ryujinx.Common/Utilities/Rainbow.cs b/src/Ryujinx.Common/Utilities/Rainbow.cs index 42222f157..2c2ea7bfd 100644 --- a/src/Ryujinx.Common/Utilities/Rainbow.cs +++ b/src/Ryujinx.Common/Utilities/Rainbow.cs @@ -5,17 +5,29 @@ namespace Ryujinx.Common.Utilities { public class Rainbow { - public const float Speed = 1; + public static float Speed { get; set; } = 1; public static Color Color { get; private set; } = Color.Blue; + private static float _lastHue; + public static void Tick() { + float currentHue = Color.GetHue(); + float nextHue = currentHue; + + if (currentHue >= 360) + nextHue = 0; + else + nextHue += Speed; + Color = HsbToRgb( - (Color.GetHue() + Speed) / 360, + nextHue / 360, 1, 1 ); + + _lastHue = currentHue; RainbowColorUpdated?.Invoke(Color.ToArgb()); } diff --git a/src/Ryujinx.Input.SDL2/SDL2Gamepad.cs b/src/Ryujinx.Input.SDL2/SDL2Gamepad.cs index 00d079a2b..a73d7c730 100644 --- a/src/Ryujinx.Input.SDL2/SDL2Gamepad.cs +++ b/src/Ryujinx.Input.SDL2/SDL2Gamepad.cs @@ -226,6 +226,13 @@ namespace Ryujinx.Input.SDL2 private static Vector3 GsToMs2(Vector3 gs) => gs / SDL_STANDARD_GRAVITY; + private void RainbowColorChanged(int packedRgb) + { + if (!_configuration.Led.UseRainbow) return; + + SetLed((uint)packedRgb); + } + public void SetConfiguration(InputConfig configuration) { lock (_userMappingLock) @@ -237,10 +244,12 @@ namespace Ryujinx.Input.SDL2 if (_configuration.Led.TurnOffLed) (this as IGamepad).ClearLed(); else if (_configuration.Led.UseRainbow) - Rainbow.RainbowColorUpdated += clr => SetLed((uint)clr); + Rainbow.RainbowColorUpdated += RainbowColorChanged; else SetLed(_configuration.Led.LedColor); + if (!_configuration.Led.UseRainbow) + Rainbow.RainbowColorUpdated -= RainbowColorChanged; } _buttonsUserMapping.Clear();