ColorPicker.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761
  1. using System;
  2. using BansheeEngine;
  3. namespace BansheeEditor
  4. {
  5. public class ColorPicker : ModalWindow
  6. {
  7. private const int SliderIndividualWidth = 150;
  8. private const int SliderIndividualHeight = 20;
  9. private const int ColorBoxWidth = 150;
  10. private const int ColorBoxHeight = 150;
  11. private const int SliderSideWidth = 40;
  12. private const int SliderSideHeight = 150;
  13. private float colRed, colGreen, colBlue;
  14. private float colHue, colSaturation, colValue;
  15. private float colAlpha = 1.0f;
  16. private ColorSlider1DHorz sliderR, sliderG, sliderB;
  17. private ColorSlider2D colorBox;
  18. private ColorSlider1DVert sideSlider;
  19. private ColorBoxMode colorBoxMode;
  20. private SliderMode sliderMode;
  21. private GUIColorField guiColor;
  22. private GUITexture guiSlider2DTex;
  23. private GUITexture guiSliderVertTex;
  24. private GUITexture guiSliderRHorzTex;
  25. private GUITexture guiSliderGHorzTex;
  26. private GUITexture guiSliderBHorzTex;
  27. private GUIButton guiColorBoxBtn;
  28. private GUIButton guiColorModeBtn;
  29. private GUISliderV guiSliderVert;
  30. private GUISliderH guiSliderRHorz;
  31. private GUISliderH guiSliderGHorz;
  32. private GUISliderH guiSliderBHorz;
  33. private GUITexture guiSlider2DHandle;
  34. private GUILabel guiLabelR;
  35. private GUILabel guiLabelG;
  36. private GUILabel guiLabelB;
  37. private GUIIntField guiInputR;
  38. private GUIIntField guiInputG;
  39. private GUIIntField guiInputB;
  40. public enum ColorBoxMode
  41. {
  42. BG_R,
  43. BR_G,
  44. RG_B,
  45. SV_H,
  46. HV_S,
  47. HS_V
  48. }
  49. public enum SliderMode
  50. {
  51. RGB,
  52. HSV
  53. }
  54. public Color SelectedColor
  55. {
  56. get
  57. {
  58. return new Color(colRed, colGreen, colBlue, colAlpha);
  59. }
  60. }
  61. public static ColorPicker Show()
  62. {
  63. return new ColorPicker();
  64. }
  65. protected ColorPicker()
  66. : base(false)
  67. {
  68. Title = "Color Picker";
  69. Width = 250;
  70. Height = 75;
  71. }
  72. private void OnInitialize()
  73. {
  74. guiColor = new GUIColorField();
  75. guiSlider2DTex = new GUITexture(null);
  76. guiSliderVertTex = new GUITexture(null);
  77. guiSliderRHorzTex = new GUITexture(null);
  78. guiSliderGHorzTex = new GUITexture(null);
  79. guiSliderBHorzTex = new GUITexture(null);
  80. guiColorBoxBtn = new GUIButton(colorBoxMode.ToString());
  81. guiColorModeBtn = new GUIButton(sliderMode.ToString());
  82. guiSliderVert = new GUISliderV();
  83. guiSliderRHorz = new GUISliderH();
  84. guiSliderGHorz = new GUISliderH();
  85. guiSliderBHorz = new GUISliderH();
  86. guiSlider2DHandle = new GUITexture(null);
  87. guiLabelR = new GUILabel("R");
  88. guiLabelG = new GUILabel("G");
  89. guiLabelB = new GUILabel("B");
  90. guiInputR = new GUIIntField();
  91. guiInputG = new GUIIntField();
  92. guiInputB = new GUIIntField();
  93. guiColorBoxBtn.OnClick += OnColorBoxModeChanged;
  94. guiColorModeBtn.OnClick += OnSliderModeChanged;
  95. guiSliderVert.OnChanged += OnSliderVertChanged;
  96. guiSliderRHorz.OnChanged += OnSliderRHorzChanged;
  97. guiSliderGHorz.OnChanged += OnSliderGHorzChanged;
  98. guiSliderBHorz.OnChanged += OnSliderBHorzChanged;
  99. guiInputR.OnChanged += OnInputRChanged;
  100. guiInputG.OnChanged += OnInputGChanged;
  101. guiInputB.OnChanged += OnInputBChanged;
  102. GUILayout v0 = GUI.layout.AddLayoutY();
  103. GUILayout h0 = v0.AddLayoutX();
  104. h0.AddElement(guiColor);
  105. h0.AddFlexibleSpace();
  106. h0.AddElement(guiColorBoxBtn);
  107. h0.AddElement(guiColorModeBtn);
  108. v0.AddSpace(20);
  109. GUILayout h1 = v0.AddLayoutX();
  110. h1.AddElement(guiSlider2DTex);
  111. h1.AddFlexibleSpace();
  112. h1.AddElement(guiSliderVertTex);
  113. h1.AddSpace(10);
  114. v0.AddSpace(30);
  115. GUILayout h2 = v0.AddLayoutX();
  116. h2.AddElement(guiLabelR);
  117. h2.AddFlexibleSpace();
  118. h2.AddElement(guiSliderRHorzTex);
  119. h2.AddFlexibleSpace();
  120. h2.AddElement(guiInputR);
  121. GUILayout h3 = v0.AddLayoutX();
  122. h3.AddElement(guiLabelG);
  123. h3.AddFlexibleSpace();
  124. h3.AddElement(guiSliderGHorzTex);
  125. h3.AddFlexibleSpace();
  126. h3.AddElement(guiInputG);
  127. GUILayout h4 = v0.AddLayoutX();
  128. h4.AddElement(guiLabelB);
  129. h4.AddFlexibleSpace();
  130. h4.AddElement(guiSliderBHorzTex);
  131. h4.AddFlexibleSpace();
  132. h4.AddElement(guiInputB);
  133. GUIArea overlay = GUI.AddArea(0, 0, Width, Height, -1); // TODO - Create an area with explicit layout here
  134. overlay.layout.AddElement(guiSliderVert);
  135. overlay.layout.AddElement(guiSliderRHorz);
  136. overlay.layout.AddElement(guiSliderGHorz);
  137. overlay.layout.AddElement(guiSliderBHorz);
  138. overlay.layout.AddElement(guiSlider2DHandle);
  139. colorBox = new ColorSlider2D(guiSlider2DTex, guiSlider2DHandle, ColorBoxWidth, ColorBoxHeight);
  140. sideSlider = new ColorSlider1DVert(guiSliderVertTex, guiSliderVert, SliderSideWidth, SliderSideHeight);
  141. sliderR = new ColorSlider1DHorz(guiSliderRHorzTex, guiSliderRHorz, SliderIndividualWidth, SliderIndividualHeight);
  142. sliderG = new ColorSlider1DHorz(guiSliderGHorzTex, guiSliderGHorz, SliderIndividualWidth, SliderIndividualHeight);
  143. sliderB = new ColorSlider1DHorz(guiSliderBHorzTex, guiSliderBHorz, SliderIndividualWidth, SliderIndividualHeight);
  144. colorBox.OnValueChanged += OnColorBoxValueChanged;
  145. // TODO
  146. //WHen slider value changes convert RGB->HSV and vice versa as needed
  147. //Actually position overlay elements
  148. //Add alpha slider
  149. }
  150. private static void FillArea(int width, int height, Color[] colors, Color start, Color rightGradient, Color downGradient)
  151. {
  152. Color rightDelta = new Color(0, 0, 0, 0);
  153. if (width > 1)
  154. rightDelta = rightGradient / (width - 1);
  155. Color downDelta = new Color(0, 0, 0, 0);
  156. if (height > 1)
  157. downDelta = downGradient / (height - 1);
  158. Color verticalColor = start;
  159. int idx = 0;
  160. for (int y = 0; y < height; y++)
  161. {
  162. Color currentColor = verticalColor;
  163. for (int x = 0; x < width; x++)
  164. {
  165. colors[idx++] = currentColor;
  166. currentColor += rightDelta;
  167. }
  168. verticalColor += downDelta;
  169. }
  170. }
  171. void HSVToRGB()
  172. {
  173. Color hsv = new Color(colHue, colSaturation, colValue);
  174. Color rgb = Color.HSV2RGB(hsv);
  175. colRed = rgb.r;
  176. colGreen = rgb.g;
  177. colBlue = rgb.b;
  178. }
  179. void RGBToHSV()
  180. {
  181. Color rgb = new Color(colRed, colGreen, colBlue);
  182. Color hsv = Color.RGB2HSV(rgb);
  183. colHue = hsv.r;
  184. colSaturation = hsv.g;
  185. colValue = hsv.b;
  186. }
  187. void OnColorBoxModeChanged()
  188. {
  189. int maxModes = Enum.GetNames(colorBoxMode.GetType()).Length;
  190. colorBoxMode = (ColorBoxMode)(((int)colorBoxMode + 1) % maxModes);
  191. guiColorBoxBtn.SetContent(colorBoxMode.ToString());
  192. Update2DSliderTextures();
  193. Update2DSliderValues();
  194. }
  195. void OnSliderModeChanged()
  196. {
  197. int maxModes = Enum.GetNames(sliderMode.GetType()).Length;
  198. sliderMode = (SliderMode)(((int)sliderMode + 1) % maxModes);
  199. if (sliderMode == SliderMode.RGB)
  200. {
  201. guiLabelR.SetContent("R");
  202. guiLabelG.SetContent("G");
  203. guiLabelB.SetContent("B");
  204. guiInputR.SetRange(0, 255);
  205. guiInputG.SetRange(0, 255);
  206. guiInputB.SetRange(0, 255);
  207. }
  208. else
  209. {
  210. guiLabelR.SetContent("H");
  211. guiLabelG.SetContent("S");
  212. guiLabelB.SetContent("V");
  213. guiInputR.SetRange(0, 359);
  214. guiInputG.SetRange(0, 255);
  215. guiInputB.SetRange(0, 255);
  216. }
  217. guiColorModeBtn.SetContent(sliderMode.ToString());
  218. UpdateInputBoxValues();
  219. Update1DSliderTextures();
  220. Update1DSliderValues();
  221. }
  222. void OnColorBoxValueChanged(Vector2 value)
  223. {
  224. switch (colorBoxMode)
  225. {
  226. case ColorBoxMode.BG_R:
  227. colGreen = value.x;
  228. colBlue = value.y;
  229. RGBToHSV();
  230. break;
  231. case ColorBoxMode.BR_G:
  232. colRed = value.x;
  233. colBlue = value.y;
  234. RGBToHSV();
  235. break;
  236. case ColorBoxMode.RG_B:
  237. colRed = value.x;
  238. colGreen = value.y;
  239. RGBToHSV();
  240. break;
  241. case ColorBoxMode.SV_H:
  242. colSaturation = value.x;
  243. colValue = value.y;
  244. HSVToRGB();
  245. break;
  246. case ColorBoxMode.HV_S:
  247. colHue = value.x;
  248. colValue = value.y;
  249. HSVToRGB();
  250. break;
  251. case ColorBoxMode.HS_V:
  252. colHue = value.x;
  253. colSaturation = value.y;
  254. HSVToRGB();
  255. break;
  256. }
  257. guiColor.Value = SelectedColor;
  258. UpdateInputBoxValues();
  259. Update1DSliderTextures();
  260. Update1DSliderValues();
  261. }
  262. void OnSliderVertChanged(float percent)
  263. {
  264. switch (colorBoxMode)
  265. {
  266. case ColorBoxMode.BG_R:
  267. colRed = percent;
  268. RGBToHSV();
  269. break;
  270. case ColorBoxMode.BR_G:
  271. colGreen = percent;
  272. RGBToHSV();
  273. break;
  274. case ColorBoxMode.RG_B:
  275. colBlue = percent;
  276. RGBToHSV();
  277. break;
  278. case ColorBoxMode.SV_H:
  279. colHue = percent;
  280. HSVToRGB();
  281. break;
  282. case ColorBoxMode.HV_S:
  283. colSaturation = percent;
  284. HSVToRGB();
  285. break;
  286. case ColorBoxMode.HS_V:
  287. colValue = percent;
  288. HSVToRGB();
  289. break;
  290. }
  291. guiColor.Value = SelectedColor;
  292. UpdateInputBoxValues();
  293. Update1DSliderTextures();
  294. Update1DSliderValues();
  295. }
  296. void OnSliderRHorzChanged(float percent)
  297. {
  298. bool isHSV = sliderMode == SliderMode.HSV;
  299. if (isHSV)
  300. {
  301. colHue = percent;
  302. HSVToRGB();
  303. }
  304. else
  305. {
  306. colRed = percent;
  307. RGBToHSV();
  308. }
  309. guiColor.Value = SelectedColor;
  310. UpdateInputBoxValues();
  311. Update2DSliderTextures();
  312. Update2DSliderValues();
  313. }
  314. void OnSliderGHorzChanged(float percent)
  315. {
  316. bool isHSV = sliderMode == SliderMode.HSV;
  317. if (isHSV)
  318. {
  319. colSaturation = percent;
  320. HSVToRGB();
  321. }
  322. else
  323. {
  324. colGreen = percent;
  325. RGBToHSV();
  326. }
  327. guiColor.Value = SelectedColor;
  328. UpdateInputBoxValues();
  329. Update2DSliderTextures();
  330. Update2DSliderValues();
  331. }
  332. void OnSliderBHorzChanged(float percent)
  333. {
  334. bool isHSV = sliderMode == SliderMode.HSV;
  335. if (isHSV)
  336. {
  337. colValue = percent;
  338. HSVToRGB();
  339. }
  340. else
  341. {
  342. colBlue = percent;
  343. RGBToHSV();
  344. }
  345. guiColor.Value = SelectedColor;
  346. UpdateInputBoxValues();
  347. Update2DSliderTextures();
  348. Update2DSliderValues();
  349. }
  350. void OnInputRChanged(int value)
  351. {
  352. bool isHSV = sliderMode == SliderMode.HSV;
  353. if (isHSV)
  354. {
  355. colHue = value/359.0f;
  356. HSVToRGB();
  357. }
  358. else
  359. {
  360. colRed = value/255.0f;
  361. RGBToHSV();
  362. }
  363. guiColor.Value = SelectedColor;
  364. Update1DSliderValues();
  365. Update2DSliderTextures();
  366. Update2DSliderValues();
  367. }
  368. void OnInputGChanged(int value)
  369. {
  370. bool isHSV = sliderMode == SliderMode.HSV;
  371. if (isHSV)
  372. {
  373. colSaturation = value / 255.0f;
  374. HSVToRGB();
  375. }
  376. else
  377. {
  378. colGreen = value / 255.0f;
  379. RGBToHSV();
  380. }
  381. guiColor.Value = SelectedColor;
  382. Update1DSliderValues();
  383. Update2DSliderTextures();
  384. Update2DSliderValues();
  385. }
  386. void OnInputBChanged(int value)
  387. {
  388. bool isHSV = sliderMode == SliderMode.HSV;
  389. if (isHSV)
  390. {
  391. colValue = value / 255.0f;
  392. HSVToRGB();
  393. }
  394. else
  395. {
  396. colBlue = value / 255.0f;
  397. RGBToHSV();
  398. }
  399. guiColor.Value = SelectedColor;
  400. Update1DSliderValues();
  401. Update2DSliderTextures();
  402. Update2DSliderValues();
  403. }
  404. void UpdateInputBoxValues()
  405. {
  406. bool isHSV = sliderMode == SliderMode.HSV;
  407. if (isHSV)
  408. {
  409. guiInputR.Value = MathEx.RoundToInt(colHue * 359.0f);
  410. guiInputG.Value = MathEx.RoundToInt(colSaturation * 255.0f);
  411. guiInputB.Value = MathEx.RoundToInt(colValue * 255.0f);
  412. }
  413. else
  414. {
  415. guiInputR.Value = MathEx.RoundToInt(colRed * 255.0f);
  416. guiInputG.Value = MathEx.RoundToInt(colGreen * 255.0f);
  417. guiInputB.Value = MathEx.RoundToInt(colBlue * 255.0f);
  418. }
  419. }
  420. void Update1DSliderValues()
  421. {
  422. bool isHSV = sliderMode == SliderMode.HSV;
  423. if (isHSV)
  424. {
  425. guiSliderRHorz.Percent = colHue;
  426. guiSliderGHorz.Percent = colSaturation;
  427. guiSliderBHorz.Percent = colValue;
  428. }
  429. else
  430. {
  431. guiSliderRHorz.Percent = colRed;
  432. guiSliderGHorz.Percent = colGreen;
  433. guiSliderBHorz.Percent = colBlue;
  434. }
  435. }
  436. void Update2DSliderValues()
  437. {
  438. Vector2 xy = Vector2.zero;
  439. float z = 0.0f;
  440. switch (colorBoxMode)
  441. {
  442. case ColorBoxMode.BG_R:
  443. xy.x = colBlue;
  444. xy.y = colGreen;
  445. z = colRed;
  446. break;
  447. case ColorBoxMode.BR_G:
  448. xy.x = colRed;
  449. xy.y = colBlue;
  450. z = colGreen;
  451. break;
  452. case ColorBoxMode.RG_B:
  453. xy.x = colRed;
  454. xy.y = colGreen;
  455. z = colBlue;
  456. break;
  457. case ColorBoxMode.SV_H:
  458. xy.x = colSaturation;
  459. xy.y = colValue;
  460. z = colHue;
  461. break;
  462. case ColorBoxMode.HV_S:
  463. xy.x = colHue;
  464. xy.y = colValue;
  465. z = colSaturation;
  466. break;
  467. case ColorBoxMode.HS_V:
  468. xy.x = colHue;
  469. xy.y = colSaturation;
  470. z = colValue;
  471. break;
  472. }
  473. colorBox.SetValue(xy);
  474. guiSliderVert.Percent = z;
  475. }
  476. void Update1DSliderTextures()
  477. {
  478. bool isHSV = sliderMode == SliderMode.HSV;
  479. if (isHSV)
  480. {
  481. Color startH = new Color(0, 1, 1);
  482. Color stepH = new Color(1, 0, 0, 0);
  483. sliderR.UpdateTexture(startH, stepH, false);
  484. Color startS = new Color(colHue, 0, MathEx.Max(colValue, 0.2f));
  485. Color stepS = new Color(0, 1, 0, 0);
  486. sliderG.UpdateTexture(startS, stepS, false);
  487. Color startV = new Color(colHue, colSaturation, 0);
  488. Color stepV = new Color(0, 0, 1, 0);
  489. sliderB.UpdateTexture(startV, stepV, false);
  490. }
  491. else
  492. {
  493. Color startR = new Color(0, colGreen, colBlue);
  494. Color stepR = new Color(1, 0, 0, 0);
  495. sliderR.UpdateTexture(startR, stepR, false);
  496. Color startG = new Color(colRed, 0, colBlue);
  497. Color stepG = new Color(0, 1, 0, 0);
  498. sliderG.UpdateTexture(startG, stepG, false);
  499. Color startB = new Color(colRed, colGreen, 0);
  500. Color stepB = new Color(0, 0, 1, 0);
  501. sliderB.UpdateTexture(startB, stepB, false);
  502. }
  503. }
  504. void Update2DSliderTextures()
  505. {
  506. switch (colorBoxMode)
  507. {
  508. case ColorBoxMode.BG_R:
  509. sideSlider.UpdateTexture(new Color(0, colGreen, colBlue, 1), new Color(1, 0, 0, 0), false);
  510. break;
  511. case ColorBoxMode.BR_G:
  512. sideSlider.UpdateTexture(new Color(colRed, 0, colBlue, 1), new Color(0, 1, 0, 0), false);
  513. break;
  514. case ColorBoxMode.RG_B:
  515. sideSlider.UpdateTexture(new Color(colRed, colGreen, 0, 1), new Color(0, 0, 1, 0), false);
  516. break;
  517. case ColorBoxMode.SV_H:
  518. sideSlider.UpdateTexture(new Color(0, 1, 1, 1), new Color(1, 0, 0, 0), true);
  519. break;
  520. case ColorBoxMode.HV_S:
  521. sideSlider.UpdateTexture(new Color(colHue, 0, MathEx.Max(colValue, 0.2f), 1), new Color(0, 1, 0, 0), true);
  522. break;
  523. case ColorBoxMode.HS_V:
  524. sideSlider.UpdateTexture(new Color(colHue, colSaturation, 0, 1), new Color(0, 0, 1, 0), true);
  525. break;
  526. }
  527. float[] valueLookup = new float[] { colRed, colGreen, colBlue, colHue, colSaturation, colValue };
  528. colorBox.UpdateTexture(colorBoxMode, valueLookup[(int)colorBoxMode]);
  529. }
  530. public class ColorSlider1DHorz
  531. {
  532. private int width, height;
  533. private Texture2D texture;
  534. private SpriteTexture spriteTexture;
  535. private GUITexture guiTexture;
  536. private GUISliderH guiSlider;
  537. public ColorSlider1DHorz(GUITexture guiTexture, GUISliderH guiSlider, int width, int height)
  538. {
  539. this.width = width;
  540. this.height = height;
  541. this.guiTexture = guiTexture;
  542. this.guiSlider = guiSlider;
  543. texture = new Texture2D(width, height);
  544. spriteTexture = new SpriteTexture(texture);
  545. }
  546. public void UpdateTexture(Color start, Color step, bool isHSV)
  547. {
  548. Color[] colors = new Color[width * height];
  549. FillArea(width, height, colors, start, step, new Color(0, 0, 0, 0));
  550. if (isHSV)
  551. {
  552. for (int i = 0; i < colors.Length; i++)
  553. colors[i] = Color.HSV2RGB(colors[i]);
  554. }
  555. texture.SetPixels(colors);
  556. guiTexture.SetTexture(spriteTexture);
  557. }
  558. }
  559. public class ColorSlider1DVert
  560. {
  561. private int width, height;
  562. private Texture2D texture;
  563. private SpriteTexture spriteTexture;
  564. private GUITexture guiTexture;
  565. private GUISliderV guiSlider;
  566. public ColorSlider1DVert(GUITexture guiTexture, GUISliderV guiSlider, int width, int height)
  567. {
  568. this.width = width;
  569. this.height = height;
  570. this.guiTexture = guiTexture;
  571. this.guiSlider = guiSlider;
  572. texture = new Texture2D(width, height);
  573. spriteTexture = new SpriteTexture(texture);
  574. }
  575. public void UpdateTexture(Color start, Color step, bool isHSV)
  576. {
  577. Color[] colors = new Color[width * height];
  578. FillArea(width, height, colors, start, new Color(0, 0, 0, 0), step);
  579. if (isHSV)
  580. {
  581. for (int i = 0; i < colors.Length; i++)
  582. colors[i] = Color.HSV2RGB(colors[i]);
  583. }
  584. texture.SetPixels(colors);
  585. guiTexture.SetTexture(spriteTexture);
  586. }
  587. }
  588. public class ColorSlider2D
  589. {
  590. private int width, height;
  591. private Texture2D texture;
  592. private SpriteTexture spriteTexture;
  593. private GUITexture guiTexture;
  594. private GUITexture guiSliderHandle;
  595. public delegate void OnValueChangedDelegate(Vector2 value);
  596. public event OnValueChangedDelegate OnValueChanged;
  597. public ColorSlider2D(GUITexture guiTexture, GUITexture guiSliderHandle, int width, int height)
  598. {
  599. this.width = width;
  600. this.height = height;
  601. this.guiTexture = guiTexture;
  602. this.guiSliderHandle = guiSliderHandle;
  603. texture = new Texture2D(width, height);
  604. spriteTexture = new SpriteTexture(texture);
  605. }
  606. public void UpdateTexture(ColorBoxMode mode, float value)
  607. {
  608. Color[] colors = new Color[width * height];
  609. switch (mode)
  610. {
  611. case ColorBoxMode.BG_R:
  612. FillArea(width, height, colors, new Color(value, 0, 0, 1), new Color(0, 0, 1, 0), new Color(0, 1, 0, 0));
  613. break;
  614. case ColorBoxMode.BR_G:
  615. FillArea(width, height, colors, new Color(0, value, 0, 1), new Color(0, 0, 1, 0), new Color(1, 0, 0, 0));
  616. break;
  617. case ColorBoxMode.RG_B:
  618. FillArea(width, height, colors, new Color(0, 0, value, 1), new Color(1, 0, 0, 0), new Color(0, 1, 0, 0));
  619. break;
  620. case ColorBoxMode.SV_H:
  621. FillArea(width, height, colors, new Color(value, 0, 0, 1), new Color(0, 1, 0, 0), new Color(0, 0, 1, 0));
  622. for (int i = 0; i < colors.Length; i++)
  623. colors[i] = Color.HSV2RGB(colors[i]);
  624. break;
  625. case ColorBoxMode.HV_S:
  626. FillArea(width, height, colors, new Color(0, value, 0, 1), new Color(1, 0, 0, 0), new Color(0, 0, 1, 0));
  627. for (int i = 0; i < colors.Length; i++)
  628. colors[i] = Color.HSV2RGB(colors[i]);
  629. break;
  630. case ColorBoxMode.HS_V:
  631. FillArea(width, height, colors, new Color(0, 0, value, 1), new Color(1, 0, 0, 0), new Color(0, 1, 0, 0));
  632. for (int i = 0; i < colors.Length; i++)
  633. colors[i] = Color.HSV2RGB(colors[i]);
  634. break;
  635. }
  636. texture.SetPixels(colors);
  637. guiTexture.SetTexture(spriteTexture);
  638. }
  639. public void UpdateInput()
  640. {
  641. // TODO - Detect mouse input over GUITexture, detect coordinates and update gui slider handle position
  642. // TODO - Trigger OnValueChanged as needed
  643. }
  644. public void SetValue(Vector2 value)
  645. {
  646. // TODO - Move the handle to this position
  647. }
  648. }
  649. }
  650. }