Replace ColorRamp with HSLColor everywhere.

Fixes:
* Nuclear-purple color exploit.
* #3247.
* Removes a bunch of unnecessary color conversions every frame.

Caveats:
* The ramp range is now defined on the palette, so ramps can no longer be set per-player (may impact maps which define custom colors).
* It's no longer possible to perfectly recreate the original WW color ramps (I doubt we care).
* The old ColorRamp setting isn't migrated, so players will lose their color settings.
This commit is contained in:
Paul Chote
2013-05-10 17:14:22 +12:00
parent abcc30f0b7
commit 656476991f
41 changed files with 112 additions and 168 deletions

View File

@@ -106,7 +106,7 @@ namespace OpenRA.Mods.RA.Widgets
// Generate palette in HSV
for (var v = 0; v < 256; v++)
for (var s = 0; s < 256; s++)
*(c + (v * bitmapData.Stride >> 2) + s) = HSLColor.FromHSV(hue, s / 255f, (255 - v) / 255f).ToColor().ToArgb();
*(c + (v * bitmapData.Stride >> 2) + s) = HSLColor.FromHSV(hue, s / 255f, (255 - v) / 255f).RGB.ToArgb();
}
backBitmap.UnlockBits(bitmapData);
@@ -139,7 +139,7 @@ namespace OpenRA.Mods.RA.Widgets
var sprite = ChromeProvider.GetImage("lobby-bits", "colorpicker");
var pos = RenderOrigin + PxFromValue() - new int2(sprite.bounds.Width/2, sprite.bounds.Height/2);
WidgetUtils.FillRectWithColor(new Rectangle(pos.X + 3, pos.Y + 3, 10, 10), Color.ToColor());
WidgetUtils.FillRectWithColor(new Rectangle(pos.X + 3, pos.Y + 3, 10, 10), Color.RGB);
Game.Renderer.RgbaSpriteRenderer.DrawSprite(sprite, pos);
}

View File

@@ -22,9 +22,10 @@ namespace OpenRA.Mods.RA.Widgets
{
public readonly string Palette = "colorpicker";
public readonly int[] RemapIndices = {};
public ColorRamp Ramp;
public readonly float Ramp = 0.05f;
public HSLColor Color;
ColorRamp cachedRamp;
HSLColor cachedColor;
WorldRenderer worldRenderer;
Palette preview;
@@ -43,11 +44,11 @@ namespace OpenRA.Mods.RA.Widgets
public override void Tick()
{
if (cachedRamp == Ramp)
if (cachedColor == Color)
return;
preview.ApplyRemap(new PlayerColorRemap(RemapIndices, Ramp));
cachedRamp = Ramp;
preview.ApplyRemap(new PlayerColorRemap(RemapIndices, Color, Ramp));
cachedColor = Color;
}
}
}

View File

@@ -38,7 +38,7 @@ namespace OpenRA.Mods.RA.Widgets
{
int* c = (int*)bitmapData.Scan0;
for (var h = 0; h < 256; h++)
*(c + h) = HSLColor.FromHSV(h/255f, 1, 1).ToColor().ToArgb();
*(c + h) = HSLColor.FromHSV(h/255f, 1, 1).RGB.ToArgb();
}
hueBitmap.UnlockBits(bitmapData);

View File

@@ -89,7 +89,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
Text = p.PlayerName,
Align = TextAlign.Left,
Font = "Bold",
Color = p.ColorRamp.GetColor(0),
Color = p.Color.RGB,
};
bg.AddChild(label);

View File

@@ -106,7 +106,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
NonEditableSpectatorTemplate = Players.Get("TEMPLATE_NONEDITABLE_SPECTATOR");
NewSpectatorTemplate = Players.Get("TEMPLATE_NEW_SPECTATOR");
colorPreview = lobby.Get<ColorPreviewManagerWidget>("COLOR_MANAGER");
colorPreview.Ramp = Game.Settings.Player.ColorRamp;
colorPreview.Color = Game.Settings.Player.Color;
var mapPreview = lobby.Get<MapPreviewWidget>("MAP_PREVIEW");
mapPreview.IsVisible = () => Map != null;

View File

@@ -107,20 +107,20 @@ namespace OpenRA.Mods.RA.Widgets.Logic
{
if (client.Bot == null)
{
Game.Settings.Player.ColorRamp = preview.Ramp;
Game.Settings.Player.Color = preview.Color;
Game.Settings.Save();
}
color.RemovePanel();
orderManager.IssueOrder(Order.Command("color {0} {1}".F(client.Index, preview.Ramp)));
orderManager.IssueOrder(Order.Command("color {0} {1}".F(client.Index, preview.Color)));
};
Action<HSLColor> onChange = c => preview.Ramp = new ColorRamp(c, 10);
Action<HSLColor> onChange = c => preview.Color = c;
var colorChooser = Game.LoadWidget(orderManager.world, "COLOR_CHOOSER", null, new WidgetArgs()
{
{ "onChange", onChange },
{ "initialColor", client.ColorRamp.Color }
{ "initialColor", client.Color }
});
color.AttachPanel(colorChooser, onExit);
@@ -282,7 +282,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
public static void SetupColorWidget(Widget parent, Session.Slot s, Session.Client c)
{
var color = parent.Get<ColorBlockWidget>("COLORBLOCK");
color.GetColor = () => c.ColorRamp.GetColor(0);
color.GetColor = () => c.Color.RGB;
}
public static void SetupEditableFactionWidget(Widget parent, Session.Slot s, Session.Client c, OrderManager orderManager, Dictionary<string,string> countryNames)

View File

@@ -155,7 +155,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
graph.GetSeries = () =>
players.Select(p => new LineGraphSeries(
p.PlayerName,
p.ColorRamp.GetColor(0),
p.Color.RGB,
(p.PlayerActor.TraitOrDefault<PlayerStatistics>() ?? new PlayerStatistics(p.PlayerActor)).EarnedSamples.Select(s => (float)s)
));
@@ -302,7 +302,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
var playerName = template.Get<LabelWidget>("PLAYER");
playerName.GetText = () => player.PlayerName + (player.WinState == WinState.Undefined ? "" : " (" + player.WinState + ")");
playerName.GetColor = () => player.ColorRamp.GetColor(0);
playerName.GetColor = () => player.Color.RGB;
}
static Color GetPowerColor(PowerState state)

View File

@@ -80,7 +80,7 @@ namespace OpenRA.Mods.RA.Widgets
if (ownerText != "")
{
Game.Renderer.Fonts["Regular"].DrawText(ownerText,
new float2(Viewport.LastMousePos.X + 65, Viewport.LastMousePos.Y + 50), actor.Owner.ColorRamp.GetColor(0));
new float2(Viewport.LastMousePos.X + 65, Viewport.LastMousePos.Y + 50), actor.Owner.Color.RGB);
Game.Renderer.Fonts["Regular"].DrawText(stanceText,
new float2(Viewport.LastMousePos.X + 65 + ownerSize.X, Viewport.LastMousePos.Y + 50), Color.White);