Bind color mixer to validator range.

This commit is contained in:
Paul Chote
2016-01-26 23:46:28 +00:00
parent 7638746069
commit cc4ca839d9
2 changed files with 40 additions and 11 deletions

View File

@@ -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();
}
}

View File

@@ -56,7 +56,10 @@ namespace OpenRA.Mods.Common.Widgets.Logic
};
// Set the initial state
var validator = Game.ModData.Manifest.Get<ColorValidator>();
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);
}