From cc4ca839d997bebd8fc8d5ede94c82913c68848f Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Tue, 26 Jan 2016 23:46:28 +0000 Subject: [PATCH] Bind color mixer to validator range. --- .../Widgets/ColorMixerWidget.cs | 48 ++++++++++++++----- .../Widgets/Logic/ColorPickerLogic.cs | 3 ++ 2 files changed, 40 insertions(+), 11 deletions(-) diff --git a/OpenRA.Mods.Common/Widgets/ColorMixerWidget.cs b/OpenRA.Mods.Common/Widgets/ColorMixerWidget.cs index f9ba46404f..a83ff43c71 100644 --- a/OpenRA.Mods.Common/Widgets/ColorMixerWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ColorMixerWidget.cs @@ -18,8 +18,9 @@ namespace OpenRA.Mods.Common.Widgets { public class ColorMixerWidget : Widget { - public float[] SRange = { 0.0f, 1.0f }; - public float[] VRange = { 0.2f, 1.0f }; + public float STrim = 0.025f; + public float VTrim = 0.025f; + public event Action OnChange = () => { }; public float H { get; private set; } @@ -36,6 +37,9 @@ namespace OpenRA.Mods.Common.Widgets Thread workerThread; bool workerAlive; + float[] sRange = { 0.0f, 1.0f }; + float[] vRange = { 0.0f, 1.0f }; + public ColorMixerWidget() { } public ColorMixerWidget(ColorMixerWidget other) : base(other) @@ -44,17 +48,39 @@ namespace OpenRA.Mods.Common.Widgets H = other.H; S = other.S; V = other.V; + + sRange = (float[])other.sRange.Clone(); + vRange = (float[])other.vRange.Clone(); + + STrim = other.STrim; + VTrim = other.VTrim; + } + + public void SetPaletteRange(float sMin, float sMax, float vMin, float vMax) + { + sRange[0] = sMin + STrim; + sRange[1] = sMax - STrim; + vRange[0] = vMin + VTrim; + vRange[1] = vMax - VTrim; + + var rect = new Rectangle((int)(255 * sRange[0]), (int)(255 * (1 - vRange[1])), (int)(255 * (sRange[1] - sRange[0])) + 1, (int)(255 * (vRange[1] - vRange[0])) + 1); + mixerSprite = new Sprite(mixerSprite.Sheet, rect, TextureChannel.Alpha); } public override void Initialize(WidgetArgs args) { base.Initialize(args); + sRange[0] += STrim; + sRange[1] -= STrim; + vRange[0] += VTrim; + vRange[1] -= VTrim; + // Bitmap data is generated in a background thread and then flipped front = new byte[4 * 256 * 256]; back = new byte[4 * 256 * 256]; - var rect = new Rectangle((int)(255 * SRange[0]), (int)(255 * (1 - VRange[1])), (int)(255 * (SRange[1] - SRange[0])) + 1, (int)(255 * (VRange[1] - VRange[0])) + 1); + var rect = new Rectangle((int)(255 * sRange[0]), (int)(255 * (1 - vRange[1])), (int)(255 * (sRange[1] - sRange[0])) + 1, (int)(255 * (vRange[1] - vRange[0])) + 1); var mixerSheet = new Sheet(SheetType.BGRA, new Size(256, 256)); mixerSheet.GetTexture().SetData(front, 256, 256); mixerSprite = new Sprite(mixerSheet, rect, TextureChannel.Alpha); @@ -145,17 +171,17 @@ namespace OpenRA.Mods.Common.Widgets void SetValueFromPx(int2 xy) { var rb = RenderBounds; - var s = SRange[0] + xy.X * (SRange[1] - SRange[0]) / rb.Width; - var v = SRange[1] - xy.Y * (VRange[1] - VRange[0]) / rb.Height; - S = s.Clamp(SRange[0], SRange[1]); - V = v.Clamp(VRange[0], VRange[1]); + var s = sRange[0] + xy.X * (sRange[1] - sRange[0]) / rb.Width; + var v = sRange[1] - xy.Y * (vRange[1] - vRange[0]) / rb.Height; + S = s.Clamp(sRange[0], sRange[1]); + V = v.Clamp(vRange[0], vRange[1]); } int2 PxFromValue() { var rb = RenderBounds; - var x = RenderBounds.Width * (S - SRange[0]) / (SRange[1] - SRange[0]); - var y = RenderBounds.Height * (1 - (V - VRange[0]) / (VRange[1] - VRange[0])); + var x = RenderBounds.Width * (S - sRange[0]) / (sRange[1] - sRange[0]); + var y = RenderBounds.Height * (1 - (V - vRange[0]) / (vRange[1] - vRange[0])); return new int2((int)x.Clamp(0, rb.Width), (int)y.Clamp(0, rb.Height)); } @@ -219,8 +245,8 @@ namespace OpenRA.Mods.Common.Widgets GenerateBitmap(); } - S = s.Clamp(SRange[0], SRange[1]); - V = v.Clamp(VRange[0], VRange[1]); + S = s.Clamp(sRange[0], sRange[1]); + V = v.Clamp(vRange[0], vRange[1]); OnChange(); } } diff --git a/OpenRA.Mods.Common/Widgets/Logic/ColorPickerLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/ColorPickerLogic.cs index a9c97f4cf2..ea73ee9bee 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/ColorPickerLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/ColorPickerLogic.cs @@ -56,7 +56,10 @@ namespace OpenRA.Mods.Common.Widgets.Logic }; // Set the initial state + var validator = Game.ModData.Manifest.Get(); + mixer.SetPaletteRange(validator.HsvSaturationRange[0], validator.HsvSaturationRange[1], validator.HsvValueRange[0], validator.HsvValueRange[1]); mixer.Set(initialColor); + hueSlider.Value = initialColor.H / 255f; onChange(mixer.Color); }