public void UpdateZoneTypes() { //This delay is needed due to a threading bug in OpenRGB //https://gitlab.com/CalcProgrammer1/OpenRGB/-/issues/376 //https://gitlab.com/CalcProgrammer1/OpenRGB/-/issues/350 Thread.Sleep(150); Stopwatch sw = Stopwatch.StartNew(); var client = new OpenRGBClient(name: "OpenRGB.NET Test: UpdateZoneTypes"); var controllerCount = client.GetControllerCount(); var devices = new Device[controllerCount]; for (int i = 0; i < controllerCount; i++) { devices[i] = client.GetControllerData(i); } for (int i = 0; i < controllerCount; i++) { var device = devices[i]; for (int j = 0; j < device.Zones.Length; j++) { var zone = device.Zones[j]; switch (zone.Type) { case Enums.ZoneType.Linear: var colors = Color.GetHueRainbow((int)zone.LedCount); client.UpdateZone(i, j, colors.ToArray()); break; case Enums.ZoneType.Single: client.UpdateZone(i, j, new[] { new Color(255, 0, 0) }); break; case Enums.ZoneType.Matrix: var yeet = 2 * Math.PI / zone.MatrixMap.Width; var rainbow = Color.GetHueRainbow((int)zone.MatrixMap.Width).ToArray(); //var rainbow = Color.GetSinRainbow((int)zone.MatrixMap.Width).ToArray(); var matrix = Enumerable.Range(0, (int)zone.LedCount).Select(_ => new Color()).ToArray(); for (int k = 0; k < zone.MatrixMap.Width; k++) { for (int l = 0; l < zone.MatrixMap.Height; l++) { var index = zone.MatrixMap.Matrix[l, k]; if (index != uint.MaxValue) { matrix[index] = rainbow[k].Clone(); } } } client.UpdateZone(i, j, matrix); break; } } } client.Dispose(); sw.Stop(); Output.WriteLine($"Time elapsed: {(double)sw.ElapsedTicks / Stopwatch.Frequency * 1000} ms."); }