diff --git a/OpenRA.FileFormats/PlayerColorRemap.cs b/OpenRA.FileFormats/PlayerColorRemap.cs index 2f35f7fa13..44acb62f51 100644 --- a/OpenRA.FileFormats/PlayerColorRemap.cs +++ b/OpenRA.FileFormats/PlayerColorRemap.cs @@ -46,5 +46,34 @@ namespace OpenRA.FileFormats return remapColors.TryGetValue(index, out c) ? c : original; } + + // hk is hue in the range [0,1] instead of [0,360] + public static Color ColorFromHSL(float hk, float s, float l) + { + // Convert from HSL to RGB + var q = (l < 0.5f) ? l * (1 + s) : l + s - (l * s); + var p = 2 * l - q; + + float[] trgb = { hk + 1 / 3.0f, + hk, + hk - 1/3.0f }; + float[] rgb = { 0, 0, 0 }; + + for (int k = 0; k < 3; k++) + { + while (trgb[k] < 0) trgb[k] += 1.0f; + while (trgb[k] > 1) trgb[k] -= 1.0f; + } + + for (int k = 0; k < 3; k++) + { + if (trgb[k] < 1 / 6.0f) { rgb[k] = (p + ((q - p) * 6 * trgb[k])); } + else if (trgb[k] >= 1 / 6.0f && trgb[k] < 0.5) { rgb[k] = q; } + else if (trgb[k] >= 0.5f && trgb[k] < 2.0f / 3) { rgb[k] = (p + ((q - p) * 6 * (2.0f / 3 - trgb[k]))); } + else { rgb[k] = p; } + } + + return Color.FromArgb((int)(rgb[0] * 255), (int)(rgb[1] * 255), (int)(rgb[2] * 255)); + } } } diff --git a/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs b/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs index f2d7c6c28e..c72a0bb1f3 100755 --- a/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs @@ -157,8 +157,8 @@ namespace OpenRA.Widgets.Delegates void UpdatePlayerColor(float hf, float sf, float lf, float r) { - var c1 = ColorFromHSL(hf, sf, lf); - var c2 = ColorFromHSL(hf, sf, r*lf); + var c1 = PlayerColorRemap.ColorFromHSL(hf, sf, lf); + var c2 = PlayerColorRemap.ColorFromHSL(hf, sf, r * lf); Game.Settings.Player.Color1 = c1; Game.Settings.Player.Color2 = c2; @@ -168,40 +168,10 @@ namespace OpenRA.Widgets.Delegates void UpdateColorPreview(float hf, float sf, float lf, float r) { - CurrentColorPreview1 = ColorFromHSL(hf, sf, lf); - CurrentColorPreview2 = ColorFromHSL(hf, sf, r*lf); + CurrentColorPreview1 = PlayerColorRemap.ColorFromHSL(hf, sf, lf); + CurrentColorPreview2 = PlayerColorRemap.ColorFromHSL(hf, sf, r * lf); Game.viewport.RefreshPalette(); } - - // hk is hue in the range [0,1] instead of [0,360] - public static Color ColorFromHSL(float hk, float s, float l) - { - // Convert from HSL to RGB - var q = (l < 0.5f) ? l * (1 + s) : l + s - (l * s); - var p = 2 * l - q; - - float[] trgb = { hk + 1 / 3.0f, - hk, - hk - 1/3.0f }; - float[] rgb = { 0, 0, 0 }; - - for (int k = 0; k < 3; k++) - { - while (trgb[k] < 0) trgb[k] += 1.0f; - while (trgb[k] > 1) trgb[k] -= 1.0f; - } - - for (int k = 0; k < 3; k++) - { - if (trgb[k] < 1 / 6.0f) { rgb[k] = (p + ((q - p) * 6 * trgb[k])); } - else if (trgb[k] >= 1 / 6.0f && trgb[k] < 0.5) { rgb[k] = q; } - else if (trgb[k] >= 0.5f && trgb[k] < 2.0f / 3) { rgb[k] = (p + ((q - p) * 6 * (2.0f / 3 - trgb[k]))); } - else { rgb[k] = p; } - } - - return Color.FromArgb((int)(rgb[0] * 255), (int)(rgb[1] * 255), (int)(rgb[2] * 255)); - } - void UpdateCurrentMap() { diff --git a/OpenRA.Mods.RA/CreateMPPlayers.cs b/OpenRA.Mods.RA/CreateMPPlayers.cs index c6414c2ae3..c8a6320ee4 100644 --- a/OpenRA.Mods.RA/CreateMPPlayers.cs +++ b/OpenRA.Mods.RA/CreateMPPlayers.cs @@ -9,9 +9,9 @@ #endregion using System.Linq; +using OpenRA.FileFormats; using OpenRA.Network; -using OpenRA.Traits; -using OpenRA.Widgets.Delegates; +using OpenRA.Traits; namespace OpenRA.Mods.RA { @@ -51,8 +51,8 @@ namespace OpenRA.Mods.RA /* pick a random color for the bot */ var hue = (float)w.SharedRandom.NextDouble(); - w.Map.Players[slot.MapPlayer].Color = LobbyDelegate.ColorFromHSL(hue, 1.0f, 0.7f); - w.Map.Players[slot.MapPlayer].Color2 = LobbyDelegate.ColorFromHSL(hue, 1.0f, 0.2f); + w.Map.Players[slot.MapPlayer].Color = PlayerColorRemap.ColorFromHSL(hue, 1.0f, 0.7f); + w.Map.Players[slot.MapPlayer].Color2 = PlayerColorRemap.ColorFromHSL(hue, 1.0f, 0.2f); /* todo: pick a random name from the pool */