Tanoda
HSVPicker/UI/SVBoxSlider.cs
Go to the documentation of this file.
1using UnityEngine;
2using UnityEngine.UI;
3
4[RequireComponent(typeof(BoxSlider), typeof(RawImage))]
5[ExecuteInEditMode]
6public class SVBoxSlider : MonoBehaviour
7{
9
10 private BoxSlider slider;
11 private RawImage image;
12
13 private ComputeShader compute;
14 private int kernelID;
15 private RenderTexture renderTexture;
16 private readonly int textureWidth = 100;
17 private readonly int textureHeight = 100;
18
19 private float lastH = -1;
20 private bool listen = true;
21
22 [SerializeField] private bool overrideComputeShader;
23 private bool supportsComputeShaders;
24
25 public RectTransform rectTransform => transform as RectTransform;
26
27 private void Awake()
28 {
29 slider = GetComponent<BoxSlider>();
30 image = GetComponent<RawImage>();
31 if (Application.isPlaying)
32 {
33 supportsComputeShaders = SystemInfo.supportsComputeShaders; //check for compute shader support
34
35#if PLATFORM_ANDROID
36 supportsComputeShaders = false; //disable on android for now. Issue with compute shader
37 #endif
38
39 if (overrideComputeShader) supportsComputeShaders = false;
40 if (supportsComputeShaders)
41 InitializeCompute();
42 RegenerateSVTexture();
43 }
44 }
45
46 private void InitializeCompute()
47 {
48 if (renderTexture == null)
49 {
50 renderTexture = new RenderTexture(textureWidth, textureHeight, 0, RenderTextureFormat.RGB111110Float);
51 renderTexture.enableRandomWrite = true;
52 renderTexture.Create();
53 }
54
55 compute = Resources.Load<ComputeShader>("Shaders/Compute/GenerateSVTexture");
56 kernelID = compute.FindKernel("CSMain");
57
58 image.texture = renderTexture;
59 }
60
61
62 private void OnEnable()
63 {
64 if (Application.isPlaying && picker != null)
65 {
66 slider.onValueChanged.AddListener(SliderChanged);
67 picker.onHSVChanged.AddListener(HSVChanged);
68 }
69 }
70
71 private void OnDisable()
72 {
73 if (picker != null)
74 {
75 slider.onValueChanged.RemoveListener(SliderChanged);
76 picker.onHSVChanged.RemoveListener(HSVChanged);
77 }
78 }
79
80 private void OnDestroy()
81 {
82 if (image.texture != null)
83 if (supportsComputeShaders)
84 renderTexture.Release();
85 else
86 DestroyImmediate(image.texture);
87 }
88
89 private void SliderChanged(float saturation, float value)
90 {
91 if (listen)
92 {
93 picker.AssignColor(ColorValues.Saturation, saturation);
94 picker.AssignColor(ColorValues.Value, value);
95 }
96
97 listen = true;
98 }
99
100 private void HSVChanged(float h, float s, float v)
101 {
102 if (!lastH.Equals(h))
103 {
104 lastH = h;
105 RegenerateSVTexture();
106 }
107
108 if (!s.Equals(slider.normalizedValue))
109 {
110 listen = false;
111 slider.normalizedValue = s;
112 }
113
114 if (!v.Equals(slider.normalizedValueY))
115 {
116 listen = false;
117 slider.normalizedValueY = v;
118 }
119 }
120
121 private void RegenerateSVTexture()
122 {
123 if (supportsComputeShaders)
124 {
125 var hue = picker != null ? picker.H : 0;
126
127 compute.SetTexture(kernelID, "Texture", renderTexture);
128 compute.SetFloats("TextureSize", textureWidth, textureHeight);
129 compute.SetFloat("Hue", hue);
130
131 compute.SetBool("linearColorSpace", QualitySettings.activeColorSpace == ColorSpace.Linear);
132
133 var threadGroupsX = Mathf.CeilToInt(textureWidth / 32f);
134 var threadGroupsY = Mathf.CeilToInt(textureHeight / 32f);
135 compute.Dispatch(kernelID, threadGroupsX, threadGroupsY, 1);
136 }
137 else
138 {
139 double h = picker != null ? picker.H * 360 : 0;
140
141 if (image.texture != null)
142 DestroyImmediate(image.texture);
143
144 var texture = new Texture2D(textureWidth, textureHeight);
145 texture.hideFlags = HideFlags.DontSave;
146
147 for (var s = 0; s < textureWidth; s++)
148 {
149 var colors = new Color32[textureHeight];
150 for (var v = 0; v < textureHeight; v++)
151 colors[v] = HSVUtil.ConvertHsvToRgb(h, (float) s / 100, (float) v / 100, 1);
152 texture.SetPixels32(s, 0, 1, textureHeight, colors);
153 }
154
155 texture.Apply();
156
157 image.texture = texture;
158 }
159 }
160}
HSVChangedEvent onHSVChanged
Definition: ColorPicker.cs:20
void AssignColor(ColorValues type, float value)
Definition: ColorPicker.cs:190
RectTransform rectTransform