com.unity.uiextensions.nosa.../Scripts/HSVPicker/HSVPicker.cs

228 lines
5.5 KiB
C#

///Credit judah4
///Sourced from - http://forum.unity3d.com/threads/color-picker.267043/
namespace UnityEngine.UI.Extensions
{
public class HSVPicker : MonoBehaviour
{
public HexRGB hexrgb;
public Color currentColor;
public Image colorImage;
public Image pointer;
public Image cursor;
public RawImage hsvSlider;
public RawImage hsvImage;
//public InputField inputR;
//public InputField inputG;
//public InputField inputB;
public Slider sliderR;
public Slider sliderG;
public Slider sliderB;
public Text sliderRText;
public Text sliderGText;
public Text sliderBText;
public float pointerPos = 0;
public float cursorX = 0;
public float cursorY = 0;
public HSVSliderEvent onValueChanged = new HSVSliderEvent();
private bool dontAssignUpdate = false;
void Awake()
{
hsvSlider.texture = HSVUtil.GenerateHSVTexture((int)hsvSlider.rectTransform.rect.width, (int)hsvSlider.rectTransform.rect.height);
sliderR.onValueChanged.AddListener(newValue =>
{
currentColor.r = newValue;
if (dontAssignUpdate == false)
{
AssignColor(currentColor);
}
sliderRText.text = "R:" + (int)(currentColor.r * 255f);
hexrgb.ManipulateViaRGB2Hex();
});
sliderG.onValueChanged.AddListener(newValue =>
{
currentColor.g = newValue;
if (dontAssignUpdate == false)
{
AssignColor(currentColor);
}
sliderGText.text = "G:" + (int)(currentColor.g * 255f);
hexrgb.ManipulateViaRGB2Hex();
});
sliderB.onValueChanged.AddListener(newValue =>
{
currentColor.b = newValue;
if (dontAssignUpdate == false)
{
AssignColor(currentColor);
}
sliderBText.text = "B:" + (int)(currentColor.b * 255f);
hexrgb.ManipulateViaRGB2Hex();
});
hsvImage.texture = HSVUtil.GenerateColorTexture((int)hsvImage.rectTransform.rect.width, (int)hsvImage.rectTransform.rect.height, ((Texture2D)hsvSlider.texture).GetPixelBilinear(0, 0));
MoveCursor(cursorX, cursorY);
}
// Update is called once per frame
void Update()
{
//if (Input.GetKeyDown(KeyCode.R))
//{
// var color = new Color(45f / 255, 200f / 255, 255f / 255);
// Debug.Log(color);
// AssignColor(color);
// }
}
public void AssignColor(Color color)
{
var hsv = HSVUtil.ConvertRgbToHsv(color);
// Debug.Log(hsv.ToString());
float hOffset = (float)(hsv.H / 360);
//if (hsv.S > 1)
//{
// hsv.S %= 1f;
//}
//if (hsv.V > 1)
//{
// hsv.V %= 1f;
//}
MovePointer(hOffset, false);
MoveCursor((float)hsv.S, (float)hsv.V, false);
currentColor = color;
colorImage.color = currentColor;
onValueChanged.Invoke(currentColor);
}
public Color MoveCursor(float posX, float posY, bool updateInputs = true)
{
dontAssignUpdate = updateInputs;
if (posX > 1)
{
posX %= 1;
}
if (posY > 1)
{
posY %= 1;
}
posY = Mathf.Clamp(posY, 0, .9999f);
posX = Mathf.Clamp(posX, 0, .9999f);
cursorX = posX;
cursorY = posY;
cursor.rectTransform.anchoredPosition = new Vector2(posX * hsvImage.rectTransform.rect.width, posY * hsvImage.rectTransform.rect.height - hsvImage.rectTransform.rect.height);
currentColor = GetColor(cursorX, cursorY);
colorImage.color = currentColor;
if (updateInputs)
{
UpdateInputs();
onValueChanged.Invoke(currentColor);
}
dontAssignUpdate = false;
return currentColor;
}
public Color GetColor(float posX, float posY)
{
//Debug.Log(posX + " " + posY);
return ((Texture2D)hsvImage.texture).GetPixel((int)(cursorX * hsvImage.texture.width), (int)(cursorY * hsvImage.texture.height));
}
public Color MovePointer(float newPos, bool updateInputs = true)
{
dontAssignUpdate = updateInputs;
if (newPos > 1)
{
newPos %= 1f;//hsv
}
pointerPos = newPos;
var mainColor = ((Texture2D)hsvSlider.texture).GetPixelBilinear(0, pointerPos);
if (hsvImage.texture != null)
{
if ((int)hsvImage.rectTransform.rect.width != hsvImage.texture.width || (int)hsvImage.rectTransform.rect.height != hsvImage.texture.height)
{
Destroy(hsvImage.texture);
hsvImage.texture = null;
hsvImage.texture = HSVUtil.GenerateColorTexture((int)hsvImage.rectTransform.rect.width, (int)hsvImage.rectTransform.rect.height, mainColor);
}
else
{
HSVUtil.GenerateColorTexture(mainColor, (Texture2D)hsvImage.texture);
}
}
else
{
hsvImage.texture = HSVUtil.GenerateColorTexture((int)hsvImage.rectTransform.rect.width, (int)hsvImage.rectTransform.rect.height, mainColor);
}
pointer.rectTransform.anchoredPosition = new Vector2(0, -pointerPos * hsvSlider.rectTransform.rect.height);
currentColor = GetColor(cursorX, cursorY);
colorImage.color = currentColor;
if (updateInputs)
{
UpdateInputs();
onValueChanged.Invoke(currentColor);
}
dontAssignUpdate = false;
return currentColor;
}
public void UpdateInputs()
{
sliderR.value = currentColor.r;
sliderG.value = currentColor.g;
sliderB.value = currentColor.b;
sliderRText.text = "R:" + (currentColor.r * 255f);
sliderGText.text = "G:" + (currentColor.g * 255f);
sliderBText.text = "B:" + (currentColor.b * 255f);
}
void OnDestroy()
{
if (hsvSlider.texture != null)
{
Destroy(hsvSlider.texture);
}
if (hsvImage.texture != null)
{
Destroy(hsvImage.texture);
}
}
}
}