From c4442f07dadc57c5c4121091d364d8837f29a4d7 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Fri, 16 Jul 2010 23:34:42 +1200 Subject: [PATCH] Sliders change the preview palette and update client data; Need a better algorithm for picking color2 --- OpenRA.FileFormats/Session.cs | 3 +- OpenRA.Game/Graphics/HardwarePalette.cs | 13 ++++- OpenRA.Game/Graphics/WorldRenderer.cs | 5 ++ OpenRA.Game/Network/UnitOrders.cs | 4 +- OpenRA.Game/Server/Server.cs | 6 ++- .../Widgets/Delegates/LobbyDelegate.cs | 49 ++++++++++++++----- mods/ra/chrome/gamelobby.yaml | 2 + 7 files changed, 63 insertions(+), 19 deletions(-) diff --git a/OpenRA.FileFormats/Session.cs b/OpenRA.FileFormats/Session.cs index f58f4e3da8..0922fb4745 100644 --- a/OpenRA.FileFormats/Session.cs +++ b/OpenRA.FileFormats/Session.cs @@ -37,7 +37,8 @@ namespace OpenRA.FileFormats public class Client { public int Index; - public System.Drawing.Color Color; + public System.Drawing.Color Color1; + public System.Drawing.Color Color2; public string Country; public int SpawnPoint; public string Name; diff --git a/OpenRA.Game/Graphics/HardwarePalette.cs b/OpenRA.Game/Graphics/HardwarePalette.cs index 440d284731..887ce90076 100644 --- a/OpenRA.Game/Graphics/HardwarePalette.cs +++ b/OpenRA.Game/Graphics/HardwarePalette.cs @@ -72,7 +72,18 @@ namespace OpenRA.Graphics } return allocated++; } - + + public void UpdatePalette(string name, Palette p) + { + palettes[name] = p; + var j = indices[name]; + + for (int i = 0; i < 256; i++) + { + this[new Point(i, j)] = p.GetColor(i); + } + } + public void Update(IEnumerable paletteMods) { var b = new Bitmap(Bitmap); diff --git a/OpenRA.Game/Graphics/WorldRenderer.cs b/OpenRA.Game/Graphics/WorldRenderer.cs index a834033442..251cc285e5 100644 --- a/OpenRA.Game/Graphics/WorldRenderer.cs +++ b/OpenRA.Game/Graphics/WorldRenderer.cs @@ -70,6 +70,11 @@ namespace OpenRA.Graphics palette.AddPalette(name, pal); } + public void UpdatePalette(string name, Palette pal) + { + palette.UpdatePalette(name, pal); + } + void DrawSpriteList(IEnumerable images) { foreach (var image in images) diff --git a/OpenRA.Game/Network/UnitOrders.cs b/OpenRA.Game/Network/UnitOrders.cs index a440049512..07feb55c85 100755 --- a/OpenRA.Game/Network/UnitOrders.cs +++ b/OpenRA.Game/Network/UnitOrders.cs @@ -34,7 +34,7 @@ namespace OpenRA.Network { var client = Game.LobbyInfo.Clients.FirstOrDefault(c => c.Index == clientId); if (client != null) - Game.AddChatLine(client.Color, + Game.AddChatLine(client.Color1, client.Name, order.TargetString); break; } @@ -49,7 +49,7 @@ namespace OpenRA.Network client == Game.LocalClient || (client.Team == Game.LocalClient.Team && client.Team != 0); if (isAlly) - Game.AddChatLine(client.Color, client.Name + " (Team)", order.TargetString); + Game.AddChatLine(client.Color1, client.Name + " (Team)", order.TargetString); } break; } diff --git a/OpenRA.Game/Server/Server.cs b/OpenRA.Game/Server/Server.cs index 52720c51c1..a555f296d5 100644 --- a/OpenRA.Game/Server/Server.cs +++ b/OpenRA.Game/Server/Server.cs @@ -148,7 +148,8 @@ namespace OpenRA.Server new Session.Client() { Index = newConn.PlayerIndex, - Color = System.Drawing.Color.FromArgb(93,194,165), + Color1 = System.Drawing.Color.FromArgb(246,214,121), + Color2 = System.Drawing.Color.FromArgb(40,32,8), Name = "Player {0}".F(1 + newConn.PlayerIndex), Country = "random", State = Session.ClientState.NotReady, @@ -324,7 +325,8 @@ namespace OpenRA.Server s => { var c = s.Split(',').Select(cc => int.Parse(cc)).ToArray(); - GetClient(conn).Color = System.Drawing.Color.FromArgb(c[0],c[1],c[2]); + GetClient(conn).Color1 = System.Drawing.Color.FromArgb(c[0],c[1],c[2]); + GetClient(conn).Color2 = System.Drawing.Color.FromArgb(c[3],c[4],c[5]); SyncLobbyInfo(); return true; }}, diff --git a/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs b/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs index 0a8309e05c..f36eaf886c 100644 --- a/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs @@ -22,6 +22,7 @@ using System.Collections.Generic; using System.Drawing; using System.Linq; using OpenRA.FileFormats; +using OpenRA.Traits; namespace OpenRA.Widgets.Delegates { @@ -32,7 +33,10 @@ namespace OpenRA.Widgets.Delegates Dictionary CountryNames; string MapUid; - MapStub Map; + MapStub Map; + + bool SplitPlayerPalette = false; + Palette BasePlayerPalette = null; public LobbyDelegate() { Game.LobbyInfoChanged += UpdateCurrentMap; @@ -65,7 +69,7 @@ namespace OpenRA.Widgets.Delegates var client = Game.LobbyInfo.Clients.FirstOrDefault(c => c.SpawnPoint == i); if (client == null) continue; - sc.Add(spawns.ElementAt(i - 1), client.Color); + sc.Add(spawns.ElementAt(i - 1), client.Color1); } return sc; }; @@ -128,20 +132,38 @@ namespace OpenRA.Widgets.Delegates var colorChooser = lobby.GetWidget("COLOR_CHOOSER"); var hueSlider = colorChooser.GetWidget("HUE_SLIDER"); var satSlider = colorChooser.GetWidget("SAT_SLIDER"); - var lumSlider = colorChooser.GetWidget("LUM_SLIDER"); - + var lumSlider = colorChooser.GetWidget("LUM_SLIDER"); + + hueSlider.OnChange += _ => UpdateColorPreview(360*hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset()); + satSlider.OnChange += _ => UpdateColorPreview(360*hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset()); + lumSlider.OnChange += _ => UpdateColorPreview(360*hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset()); + colorChooser.GetWidget("BUTTON_OK").OnMouseUp = mi => { colorChooser.IsVisible = () => false; - UpdatePlayerColor(hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset()); + UpdatePlayerColor(360*hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset()); return true; - }; + }; + + // Copy the base palette for the colorpicker + var info = Rules.Info["world"].Traits.Get(); + BasePlayerPalette = Game.world.WorldRenderer.GetPalette(info.BasePalette); + SplitPlayerPalette = info.SplitRamp; + Game.world.WorldRenderer.AddPalette("colorpicker",BasePlayerPalette); } void UpdatePlayerColor(float hf, float sf, float lf) { - var c = ColorFromHSL(hf*360, sf, lf); - Game.IssueOrder(Order.Command("color {0},{1},{2}".F(c.R,c.G,c.B))); + var c1 = ColorFromHSL(hf, sf, lf); + var c2 = ColorFromHSL(hf, sf, 0.5f*lf); + Game.IssueOrder(Order.Command("color {0},{1},{2},{3},{4},{5}".F(c1.R,c1.G,c1.B,c2.R,c2.G,c2.B))); + } + + void UpdateColorPreview(float hf, float sf, float lf) + { + var c1 = ColorFromHSL(hf, sf, lf); + var c2 = ColorFromHSL(hf, sf, 0.5f*lf); + Game.world.WorldRenderer.UpdatePalette("colorpicker", new Palette(BasePlayerPalette, new PlayerColorRemap(c1, c2, SplitPlayerPalette))); } Color ColorFromHSL(float h, float s, float l) @@ -220,20 +242,21 @@ namespace OpenRA.Widgets.Delegates { var colorChooser = Chrome.rootWidget.GetWidget("SERVER_LOBBY").GetWidget("COLOR_CHOOSER"); var hueSlider = colorChooser.GetWidget("HUE_SLIDER"); - hueSlider.Offset = Game.LocalClient.Color.GetHue()/360f; + hueSlider.Offset = Game.LocalClient.Color1.GetHue()/360f; var satSlider = colorChooser.GetWidget("SAT_SLIDER"); - satSlider.Offset = Game.LocalClient.Color.GetSaturation(); + satSlider.Offset = Game.LocalClient.Color1.GetSaturation(); var lumSlider = colorChooser.GetWidget("LUM_SLIDER"); - lumSlider.Offset = Game.LocalClient.Color.GetBrightness(); + lumSlider.Offset = Game.LocalClient.Color1.GetBrightness(); + UpdateColorPreview(360*hueSlider.GetOffset(), satSlider.GetOffset(), lumSlider.GetOffset()); colorChooser.IsVisible = () => true; return true; }; var colorBlock = color.GetWidget("COLORBLOCK"); - colorBlock.GetColor = () => c.Color; + colorBlock.GetColor = () => c.Color1; var faction = template.GetWidget("FACTION"); faction.OnMouseUp = CycleRace; @@ -256,7 +279,7 @@ namespace OpenRA.Widgets.Delegates template = RemotePlayerTemplate.Clone(); template.GetWidget("NAME").GetText = () => c.Name; var color = template.GetWidget("COLOR"); - color.GetColor = () => c.Color; + color.GetColor = () => c.Color1; var faction = template.GetWidget("FACTION"); var factionname = faction.GetWidget("FACTIONNAME"); diff --git a/mods/ra/chrome/gamelobby.yaml b/mods/ra/chrome/gamelobby.yaml index b24a3f2ec6..8d42b5367c 100644 --- a/mods/ra/chrome/gamelobby.yaml +++ b/mods/ra/chrome/gamelobby.yaml @@ -273,11 +273,13 @@ Container@ROOT: Y:20 Image:mcv Frame:8 + Palette:colorpicker ShpImage@FACT: Id:FACT X:PARENT_RIGHT - 100 Y:70 Image:fact + Palette:colorpicker Label@HUE_LABEL: X:0 Y:30