ColorPicker.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904
  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, sliderA;
  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 GUITexture guiSliderAHorzTex;
  28. private GUIButton guiColorBoxBtn;
  29. private GUIButton guiColorModeBtn;
  30. private GUISliderV guiSliderVert;
  31. private GUISliderH guiSliderRHorz;
  32. private GUISliderH guiSliderGHorz;
  33. private GUISliderH guiSliderBHorz;
  34. private GUISliderH guiSliderAHorz;
  35. private GUITexture guiSlider2DHandle;
  36. private GUILabel guiLabelR;
  37. private GUILabel guiLabelG;
  38. private GUILabel guiLabelB;
  39. private GUILabel guiLabelA;
  40. private GUIIntField guiInputR;
  41. private GUIIntField guiInputG;
  42. private GUIIntField guiInputB;
  43. private GUIIntField guiInputA;
  44. private GUIButton guiOK;
  45. private GUIButton guiCancel;
  46. private Action<bool, Color> closedCallback;
  47. public enum ColorBoxMode
  48. {
  49. BG_R,
  50. BR_G,
  51. RG_B,
  52. SV_H,
  53. HV_S,
  54. HS_V
  55. }
  56. public enum SliderMode
  57. {
  58. RGB,
  59. HSV
  60. }
  61. public Color SelectedColor
  62. {
  63. get
  64. {
  65. return new Color(colRed, colGreen, colBlue, colAlpha);
  66. }
  67. }
  68. public static ColorPicker Show(Action<bool, Color> closedCallback = null)
  69. {
  70. ColorPicker picker = new ColorPicker();
  71. picker.closedCallback = closedCallback;
  72. return picker;
  73. }
  74. protected ColorPicker()
  75. : base(false)
  76. {
  77. Title = "Color Picker";
  78. Width = 400;
  79. Height = 800;
  80. }
  81. private void OnInitialize()
  82. {
  83. guiColor = new GUIColorField();
  84. guiSlider2DTex = new GUITexture(null);
  85. guiSliderVertTex = new GUITexture(null);
  86. guiSliderRHorzTex = new GUITexture(null);
  87. guiSliderGHorzTex = new GUITexture(null);
  88. guiSliderBHorzTex = new GUITexture(null);
  89. guiSliderAHorzTex = new GUITexture(null);
  90. guiColorBoxBtn = new GUIButton(colorBoxMode.ToString());
  91. guiColorModeBtn = new GUIButton(sliderMode.ToString());
  92. guiSliderVert = new GUISliderV(EditorStyles.ColorSliderVert);
  93. guiSliderRHorz = new GUISliderH(EditorStyles.ColorSliderHorz);
  94. guiSliderGHorz = new GUISliderH(EditorStyles.ColorSliderHorz);
  95. guiSliderBHorz = new GUISliderH(EditorStyles.ColorSliderHorz);
  96. guiSliderAHorz = new GUISliderH(EditorStyles.ColorSliderHorz);
  97. guiSlider2DHandle = new GUITexture(null, EditorStyles.ColorSlider2DHandle);
  98. guiLabelR = new GUILabel("R");
  99. guiLabelG = new GUILabel("G");
  100. guiLabelB = new GUILabel("B");
  101. guiLabelA = new GUILabel("A");
  102. guiInputR = new GUIIntField();
  103. guiInputG = new GUIIntField();
  104. guiInputB = new GUIIntField();
  105. guiInputA = new GUIIntField();
  106. guiOK = new GUIButton("OK");
  107. guiCancel = new GUIButton("Cancel");
  108. guiColorBoxBtn.OnClick += OnColorBoxModeChanged;
  109. guiColorModeBtn.OnClick += OnSliderModeChanged;
  110. guiSliderVert.OnChanged += OnSliderVertChanged;
  111. guiSliderRHorz.OnChanged += OnSliderRHorzChanged;
  112. guiSliderGHorz.OnChanged += OnSliderGHorzChanged;
  113. guiSliderBHorz.OnChanged += OnSliderBHorzChanged;
  114. guiSliderAHorz.OnChanged += OnSliderAHorzChanged;
  115. guiInputR.OnChanged += OnInputRChanged;
  116. guiInputG.OnChanged += OnInputGChanged;
  117. guiInputB.OnChanged += OnInputBChanged;
  118. guiInputA.OnChanged += OnInputAChanged;
  119. guiOK.OnClick += OnOK;
  120. guiCancel.OnClick += OnCancel;
  121. GUILayout v0 = GUI.layout.AddLayoutY();
  122. GUILayout h0 = v0.AddLayoutX();
  123. h0.AddElement(guiColor);
  124. h0.AddFlexibleSpace();
  125. h0.AddElement(guiColorBoxBtn);
  126. h0.AddElement(guiColorModeBtn);
  127. v0.AddSpace(20);
  128. GUILayout h1 = v0.AddLayoutX();
  129. h1.AddElement(guiSlider2DTex);
  130. h1.AddFlexibleSpace();
  131. h1.AddElement(guiSliderVertTex);
  132. h1.AddSpace(10);
  133. v0.AddSpace(30);
  134. GUILayout h2 = v0.AddLayoutX();
  135. h2.AddElement(guiLabelR);
  136. h2.AddFlexibleSpace();
  137. h2.AddElement(guiSliderRHorzTex);
  138. h2.AddFlexibleSpace();
  139. h2.AddElement(guiInputR);
  140. v0.AddSpace(15);
  141. GUILayout h3 = v0.AddLayoutX();
  142. h3.AddElement(guiLabelG);
  143. h3.AddFlexibleSpace();
  144. h3.AddElement(guiSliderGHorzTex);
  145. h3.AddFlexibleSpace();
  146. h3.AddElement(guiInputG);
  147. v0.AddSpace(15);
  148. GUILayout h4 = v0.AddLayoutX();
  149. h4.AddElement(guiLabelB);
  150. h4.AddFlexibleSpace();
  151. h4.AddElement(guiSliderBHorzTex);
  152. h4.AddFlexibleSpace();
  153. h4.AddElement(guiInputB);
  154. v0.AddSpace(15);
  155. GUILayout h5 = v0.AddLayoutX();
  156. h5.AddElement(guiLabelA);
  157. h5.AddFlexibleSpace();
  158. h5.AddElement(guiSliderAHorzTex);
  159. h5.AddFlexibleSpace();
  160. h5.AddElement(guiInputA);
  161. v0.AddSpace(20);
  162. GUILayout h6 = v0.AddLayoutX();
  163. h6.AddFlexibleSpace();
  164. h6.AddElement(guiOK);
  165. h6.AddSpace(10);
  166. h6.AddElement(guiCancel);
  167. h6.AddFlexibleSpace();
  168. GUIArea overlay = GUI.AddArea(0, 0, Width, Height, -1, GUILayoutType.Explicit);
  169. overlay.layout.AddElement(guiSliderVert);
  170. overlay.layout.AddElement(guiSliderRHorz);
  171. overlay.layout.AddElement(guiSliderGHorz);
  172. overlay.layout.AddElement(guiSliderBHorz);
  173. overlay.layout.AddElement(guiSliderAHorz);
  174. overlay.layout.AddElement(guiSlider2DHandle);
  175. colorBox = new ColorSlider2D(guiSlider2DTex, guiSlider2DHandle, ColorBoxWidth, ColorBoxHeight);
  176. sideSlider = new ColorSlider1DVert(guiSliderVertTex, guiSliderVert, SliderSideWidth, SliderSideHeight);
  177. sliderR = new ColorSlider1DHorz(guiSliderRHorzTex, guiSliderRHorz, SliderIndividualWidth, SliderIndividualHeight);
  178. sliderG = new ColorSlider1DHorz(guiSliderGHorzTex, guiSliderGHorz, SliderIndividualWidth, SliderIndividualHeight);
  179. sliderB = new ColorSlider1DHorz(guiSliderBHorzTex, guiSliderBHorz, SliderIndividualWidth, SliderIndividualHeight);
  180. sliderA = new ColorSlider1DHorz(guiSliderAHorzTex, guiSliderAHorz, SliderIndividualWidth, SliderIndividualHeight);
  181. colorBox.OnValueChanged += OnColorBoxValueChanged;
  182. guiColor.Value = SelectedColor;
  183. UpdateInputBoxValues();
  184. Update2DSliderTextures();
  185. Update2DSliderValues();
  186. Update1DSliderTextures();
  187. Update1DSliderValues();
  188. UpdateSliderMode();
  189. Color startA = new Color(0, 0, 0, 1);
  190. Color stepA = new Color(1, 1, 1, 0);
  191. sliderA.UpdateTexture(startA, stepA, false);
  192. guiInputA.SetRange(0, 255);
  193. }
  194. private void OnEditorUpdate()
  195. {
  196. Vector2I windowPos = ScreenToWindowPos(Input.PointerPosition);
  197. colorBox.UpdateInput(windowPos);
  198. }
  199. private static void FillArea(int width, int height, Color[] colors, Color start, Color rightGradient, Color downGradient)
  200. {
  201. Color rightDelta = new Color(0, 0, 0, 0);
  202. if (width > 1)
  203. rightDelta = rightGradient / (width - 1);
  204. Color downDelta = new Color(0, 0, 0, 0);
  205. if (height > 1)
  206. downDelta = downGradient / (height - 1);
  207. Color verticalColor = start;
  208. int idx = 0;
  209. for (int y = 0; y < height; y++)
  210. {
  211. Color currentColor = verticalColor;
  212. for (int x = 0; x < width; x++)
  213. {
  214. colors[idx++] = currentColor;
  215. currentColor += rightDelta;
  216. }
  217. verticalColor += downDelta;
  218. }
  219. }
  220. void HSVToRGB()
  221. {
  222. Color hsv = new Color(colHue, colSaturation, colValue);
  223. Color rgb = Color.HSV2RGB(hsv);
  224. colRed = rgb.r;
  225. colGreen = rgb.g;
  226. colBlue = rgb.b;
  227. }
  228. void RGBToHSV()
  229. {
  230. Color rgb = new Color(colRed, colGreen, colBlue);
  231. Color hsv = Color.RGB2HSV(rgb);
  232. colHue = hsv.r;
  233. colSaturation = hsv.g;
  234. colValue = hsv.b;
  235. }
  236. void OnColorBoxModeChanged()
  237. {
  238. int maxModes = Enum.GetNames(colorBoxMode.GetType()).Length;
  239. colorBoxMode = (ColorBoxMode)(((int)colorBoxMode + 1) % maxModes);
  240. guiColorBoxBtn.SetContent(colorBoxMode.ToString());
  241. Update2DSliderTextures();
  242. Update2DSliderValues();
  243. }
  244. void OnSliderModeChanged()
  245. {
  246. int maxModes = Enum.GetNames(sliderMode.GetType()).Length;
  247. sliderMode = (SliderMode)(((int)sliderMode + 1) % maxModes);
  248. UpdateSliderMode();
  249. guiColorModeBtn.SetContent(sliderMode.ToString());
  250. UpdateInputBoxValues();
  251. Update1DSliderTextures();
  252. Update1DSliderValues();
  253. }
  254. void OnColorBoxValueChanged(Vector2 value)
  255. {
  256. switch (colorBoxMode)
  257. {
  258. case ColorBoxMode.BG_R:
  259. colGreen = value.x;
  260. colBlue = value.y;
  261. RGBToHSV();
  262. break;
  263. case ColorBoxMode.BR_G:
  264. colRed = value.x;
  265. colBlue = value.y;
  266. RGBToHSV();
  267. break;
  268. case ColorBoxMode.RG_B:
  269. colRed = value.x;
  270. colGreen = value.y;
  271. RGBToHSV();
  272. break;
  273. case ColorBoxMode.SV_H:
  274. colSaturation = value.x;
  275. colValue = value.y;
  276. HSVToRGB();
  277. break;
  278. case ColorBoxMode.HV_S:
  279. colHue = value.x;
  280. colValue = value.y;
  281. HSVToRGB();
  282. break;
  283. case ColorBoxMode.HS_V:
  284. colHue = value.x;
  285. colSaturation = value.y;
  286. HSVToRGB();
  287. break;
  288. }
  289. guiColor.Value = SelectedColor;
  290. UpdateInputBoxValues();
  291. Update1DSliderTextures();
  292. Update1DSliderValues();
  293. }
  294. void OnSliderVertChanged(float percent)
  295. {
  296. switch (colorBoxMode)
  297. {
  298. case ColorBoxMode.BG_R:
  299. colRed = percent;
  300. RGBToHSV();
  301. break;
  302. case ColorBoxMode.BR_G:
  303. colGreen = percent;
  304. RGBToHSV();
  305. break;
  306. case ColorBoxMode.RG_B:
  307. colBlue = percent;
  308. RGBToHSV();
  309. break;
  310. case ColorBoxMode.SV_H:
  311. colHue = percent;
  312. HSVToRGB();
  313. break;
  314. case ColorBoxMode.HV_S:
  315. colSaturation = percent;
  316. HSVToRGB();
  317. break;
  318. case ColorBoxMode.HS_V:
  319. colValue = percent;
  320. HSVToRGB();
  321. break;
  322. }
  323. guiColor.Value = SelectedColor;
  324. UpdateInputBoxValues();
  325. Update1DSliderTextures();
  326. Update1DSliderValues();
  327. }
  328. void OnSliderRHorzChanged(float percent)
  329. {
  330. bool isHSV = sliderMode == SliderMode.HSV;
  331. if (isHSV)
  332. {
  333. colHue = percent;
  334. HSVToRGB();
  335. }
  336. else
  337. {
  338. colRed = percent;
  339. RGBToHSV();
  340. }
  341. guiColor.Value = SelectedColor;
  342. UpdateInputBoxValues();
  343. Update2DSliderTextures();
  344. Update2DSliderValues();
  345. }
  346. void OnSliderGHorzChanged(float percent)
  347. {
  348. bool isHSV = sliderMode == SliderMode.HSV;
  349. if (isHSV)
  350. {
  351. colSaturation = percent;
  352. HSVToRGB();
  353. }
  354. else
  355. {
  356. colGreen = percent;
  357. RGBToHSV();
  358. }
  359. guiColor.Value = SelectedColor;
  360. UpdateInputBoxValues();
  361. Update2DSliderTextures();
  362. Update2DSliderValues();
  363. }
  364. void OnSliderBHorzChanged(float percent)
  365. {
  366. bool isHSV = sliderMode == SliderMode.HSV;
  367. if (isHSV)
  368. {
  369. colValue = percent;
  370. HSVToRGB();
  371. }
  372. else
  373. {
  374. colBlue = percent;
  375. RGBToHSV();
  376. }
  377. guiColor.Value = SelectedColor;
  378. UpdateInputBoxValues();
  379. Update2DSliderTextures();
  380. Update2DSliderValues();
  381. }
  382. void OnSliderAHorzChanged(float percent)
  383. {
  384. colAlpha = percent;
  385. guiColor.Value = SelectedColor;
  386. guiInputA.Value = MathEx.RoundToInt(colValue * 255.0f);
  387. }
  388. void OnInputRChanged(int value)
  389. {
  390. bool isHSV = sliderMode == SliderMode.HSV;
  391. if (isHSV)
  392. {
  393. colHue = value/359.0f;
  394. HSVToRGB();
  395. }
  396. else
  397. {
  398. colRed = value/255.0f;
  399. RGBToHSV();
  400. }
  401. guiColor.Value = SelectedColor;
  402. Update1DSliderValues();
  403. Update2DSliderTextures();
  404. Update2DSliderValues();
  405. }
  406. void OnInputGChanged(int value)
  407. {
  408. bool isHSV = sliderMode == SliderMode.HSV;
  409. if (isHSV)
  410. {
  411. colSaturation = value / 255.0f;
  412. HSVToRGB();
  413. }
  414. else
  415. {
  416. colGreen = value / 255.0f;
  417. RGBToHSV();
  418. }
  419. guiColor.Value = SelectedColor;
  420. Update1DSliderValues();
  421. Update2DSliderTextures();
  422. Update2DSliderValues();
  423. }
  424. void OnInputBChanged(int value)
  425. {
  426. bool isHSV = sliderMode == SliderMode.HSV;
  427. if (isHSV)
  428. {
  429. colValue = value / 255.0f;
  430. HSVToRGB();
  431. }
  432. else
  433. {
  434. colBlue = value / 255.0f;
  435. RGBToHSV();
  436. }
  437. guiColor.Value = SelectedColor;
  438. Update1DSliderValues();
  439. Update2DSliderTextures();
  440. Update2DSliderValues();
  441. }
  442. void OnInputAChanged(int value)
  443. {
  444. colAlpha = value/255.0f;
  445. guiColor.Value = SelectedColor;
  446. guiSliderAHorz.Percent = colAlpha;
  447. }
  448. void OnOK()
  449. {
  450. if (closedCallback != null)
  451. closedCallback(true, SelectedColor);
  452. Close();
  453. }
  454. void OnCancel()
  455. {
  456. if (closedCallback != null)
  457. closedCallback(false, SelectedColor);
  458. Close();
  459. }
  460. void UpdateSliderMode()
  461. {
  462. if (sliderMode == SliderMode.RGB)
  463. {
  464. guiLabelR.SetContent("R");
  465. guiLabelG.SetContent("G");
  466. guiLabelB.SetContent("B");
  467. guiInputR.SetRange(0, 255);
  468. guiInputG.SetRange(0, 255);
  469. guiInputB.SetRange(0, 255);
  470. }
  471. else
  472. {
  473. guiLabelR.SetContent("H");
  474. guiLabelG.SetContent("S");
  475. guiLabelB.SetContent("V");
  476. guiInputR.SetRange(0, 359);
  477. guiInputG.SetRange(0, 255);
  478. guiInputB.SetRange(0, 255);
  479. }
  480. }
  481. void UpdateInputBoxValues()
  482. {
  483. bool isHSV = sliderMode == SliderMode.HSV;
  484. if (isHSV)
  485. {
  486. guiInputR.Value = MathEx.RoundToInt(colHue * 359.0f);
  487. guiInputG.Value = MathEx.RoundToInt(colSaturation * 255.0f);
  488. guiInputB.Value = MathEx.RoundToInt(colValue * 255.0f);
  489. }
  490. else
  491. {
  492. guiInputR.Value = MathEx.RoundToInt(colRed * 255.0f);
  493. guiInputG.Value = MathEx.RoundToInt(colGreen * 255.0f);
  494. guiInputB.Value = MathEx.RoundToInt(colBlue * 255.0f);
  495. }
  496. }
  497. void Update1DSliderValues()
  498. {
  499. bool isHSV = sliderMode == SliderMode.HSV;
  500. if (isHSV)
  501. {
  502. guiSliderRHorz.Percent = colHue;
  503. guiSliderGHorz.Percent = colSaturation;
  504. guiSliderBHorz.Percent = colValue;
  505. }
  506. else
  507. {
  508. guiSliderRHorz.Percent = colRed;
  509. guiSliderGHorz.Percent = colGreen;
  510. guiSliderBHorz.Percent = colBlue;
  511. }
  512. }
  513. void Update2DSliderValues()
  514. {
  515. Vector2 xy = Vector2.zero;
  516. float z = 0.0f;
  517. switch (colorBoxMode)
  518. {
  519. case ColorBoxMode.BG_R:
  520. xy.x = colBlue;
  521. xy.y = colGreen;
  522. z = colRed;
  523. break;
  524. case ColorBoxMode.BR_G:
  525. xy.x = colRed;
  526. xy.y = colBlue;
  527. z = colGreen;
  528. break;
  529. case ColorBoxMode.RG_B:
  530. xy.x = colRed;
  531. xy.y = colGreen;
  532. z = colBlue;
  533. break;
  534. case ColorBoxMode.SV_H:
  535. xy.x = colSaturation;
  536. xy.y = colValue;
  537. z = colHue;
  538. break;
  539. case ColorBoxMode.HV_S:
  540. xy.x = colHue;
  541. xy.y = colValue;
  542. z = colSaturation;
  543. break;
  544. case ColorBoxMode.HS_V:
  545. xy.x = colHue;
  546. xy.y = colSaturation;
  547. z = colValue;
  548. break;
  549. }
  550. colorBox.SetValue(xy);
  551. guiSliderVert.Percent = z;
  552. }
  553. void Update1DSliderTextures()
  554. {
  555. bool isHSV = sliderMode == SliderMode.HSV;
  556. if (isHSV)
  557. {
  558. Color startH = new Color(0, 1, 1);
  559. Color stepH = new Color(1, 0, 0, 0);
  560. sliderR.UpdateTexture(startH, stepH, false);
  561. Color startS = new Color(colHue, 0, MathEx.Max(colValue, 0.2f));
  562. Color stepS = new Color(0, 1, 0, 0);
  563. sliderG.UpdateTexture(startS, stepS, false);
  564. Color startV = new Color(colHue, colSaturation, 0);
  565. Color stepV = new Color(0, 0, 1, 0);
  566. sliderB.UpdateTexture(startV, stepV, false);
  567. }
  568. else
  569. {
  570. Color startR = new Color(0, colGreen, colBlue);
  571. Color stepR = new Color(1, 0, 0, 0);
  572. sliderR.UpdateTexture(startR, stepR, false);
  573. Color startG = new Color(colRed, 0, colBlue);
  574. Color stepG = new Color(0, 1, 0, 0);
  575. sliderG.UpdateTexture(startG, stepG, false);
  576. Color startB = new Color(colRed, colGreen, 0);
  577. Color stepB = new Color(0, 0, 1, 0);
  578. sliderB.UpdateTexture(startB, stepB, false);
  579. }
  580. }
  581. void Update2DSliderTextures()
  582. {
  583. switch (colorBoxMode)
  584. {
  585. case ColorBoxMode.BG_R:
  586. sideSlider.UpdateTexture(new Color(0, colGreen, colBlue, 1), new Color(1, 0, 0, 0), false);
  587. break;
  588. case ColorBoxMode.BR_G:
  589. sideSlider.UpdateTexture(new Color(colRed, 0, colBlue, 1), new Color(0, 1, 0, 0), false);
  590. break;
  591. case ColorBoxMode.RG_B:
  592. sideSlider.UpdateTexture(new Color(colRed, colGreen, 0, 1), new Color(0, 0, 1, 0), false);
  593. break;
  594. case ColorBoxMode.SV_H:
  595. sideSlider.UpdateTexture(new Color(0, 1, 1, 1), new Color(1, 0, 0, 0), true);
  596. break;
  597. case ColorBoxMode.HV_S:
  598. sideSlider.UpdateTexture(new Color(colHue, 0, MathEx.Max(colValue, 0.2f), 1), new Color(0, 1, 0, 0), true);
  599. break;
  600. case ColorBoxMode.HS_V:
  601. sideSlider.UpdateTexture(new Color(colHue, colSaturation, 0, 1), new Color(0, 0, 1, 0), true);
  602. break;
  603. }
  604. float[] valueLookup = new float[] { colRed, colGreen, colBlue, colHue, colSaturation, colValue };
  605. colorBox.UpdateTexture(colorBoxMode, valueLookup[(int)colorBoxMode]);
  606. }
  607. public class ColorSlider1DHorz
  608. {
  609. private const int SLIDER_HEIGHT = 8;
  610. private int width, height;
  611. private Texture2D texture;
  612. private SpriteTexture spriteTexture;
  613. private GUITexture guiTexture;
  614. private GUISliderH guiSlider;
  615. public ColorSlider1DHorz(GUITexture guiTexture, GUISliderH guiSlider, int width, int height)
  616. {
  617. this.width = width;
  618. this.height = height;
  619. this.guiTexture = guiTexture;
  620. this.guiSlider = guiSlider;
  621. texture = new Texture2D(width, height);
  622. spriteTexture = new SpriteTexture(texture);
  623. Rect2I sliderBounds = guiTexture.Bounds;
  624. sliderBounds.y -= SLIDER_HEIGHT;
  625. sliderBounds.height += SLIDER_HEIGHT;
  626. guiSlider.Bounds = sliderBounds;
  627. }
  628. public void UpdateTexture(Color start, Color step, bool isHSV)
  629. {
  630. Color[] colors = new Color[width * height];
  631. FillArea(width, height, colors, start, step, new Color(0, 0, 0, 0));
  632. if (isHSV)
  633. {
  634. for (int i = 0; i < colors.Length; i++)
  635. colors[i] = Color.HSV2RGB(colors[i]);
  636. }
  637. texture.SetPixels(colors);
  638. guiTexture.SetTexture(spriteTexture);
  639. }
  640. }
  641. public class ColorSlider1DVert
  642. {
  643. private const int SLIDER_WIDTH = 7;
  644. private int width, height;
  645. private Texture2D texture;
  646. private SpriteTexture spriteTexture;
  647. private GUITexture guiTexture;
  648. private GUISliderV guiSlider;
  649. public ColorSlider1DVert(GUITexture guiTexture, GUISliderV guiSlider, int width, int height)
  650. {
  651. this.width = width;
  652. this.height = height;
  653. this.guiTexture = guiTexture;
  654. this.guiSlider = guiSlider;
  655. texture = new Texture2D(width, height);
  656. spriteTexture = new SpriteTexture(texture);
  657. Rect2I sliderBounds = guiTexture.Bounds;
  658. sliderBounds.x -= SLIDER_WIDTH;
  659. sliderBounds.width += SLIDER_WIDTH;
  660. guiSlider.Bounds = sliderBounds;
  661. }
  662. public void UpdateTexture(Color start, Color step, bool isHSV)
  663. {
  664. Color[] colors = new Color[width * height];
  665. FillArea(width, height, colors, start, new Color(0, 0, 0, 0), step);
  666. if (isHSV)
  667. {
  668. for (int i = 0; i < colors.Length; i++)
  669. colors[i] = Color.HSV2RGB(colors[i]);
  670. }
  671. texture.SetPixels(colors);
  672. guiTexture.SetTexture(spriteTexture);
  673. }
  674. }
  675. public class ColorSlider2D
  676. {
  677. private int width, height;
  678. private Texture2D texture;
  679. private SpriteTexture spriteTexture;
  680. private GUITexture guiTexture;
  681. private GUITexture guiSliderHandle;
  682. private Vector2 oldValue;
  683. public delegate void OnValueChangedDelegate(Vector2 value);
  684. public event OnValueChangedDelegate OnValueChanged;
  685. public ColorSlider2D(GUITexture guiTexture, GUITexture guiSliderHandle, int width, int height)
  686. {
  687. this.width = width;
  688. this.height = height;
  689. this.guiTexture = guiTexture;
  690. this.guiSliderHandle = guiSliderHandle;
  691. texture = new Texture2D(width, height);
  692. spriteTexture = new SpriteTexture(texture);
  693. }
  694. public void UpdateTexture(ColorBoxMode mode, float value)
  695. {
  696. Color[] colors = new Color[width * height];
  697. switch (mode)
  698. {
  699. case ColorBoxMode.BG_R:
  700. FillArea(width, height, colors, new Color(value, 0, 0, 1), new Color(0, 0, 1, 0), new Color(0, 1, 0, 0));
  701. break;
  702. case ColorBoxMode.BR_G:
  703. FillArea(width, height, colors, new Color(0, value, 0, 1), new Color(0, 0, 1, 0), new Color(1, 0, 0, 0));
  704. break;
  705. case ColorBoxMode.RG_B:
  706. FillArea(width, height, colors, new Color(0, 0, value, 1), new Color(1, 0, 0, 0), new Color(0, 1, 0, 0));
  707. break;
  708. case ColorBoxMode.SV_H:
  709. FillArea(width, height, colors, new Color(value, 0, 0, 1), new Color(0, 1, 0, 0), new Color(0, 0, 1, 0));
  710. for (int i = 0; i < colors.Length; i++)
  711. colors[i] = Color.HSV2RGB(colors[i]);
  712. break;
  713. case ColorBoxMode.HV_S:
  714. FillArea(width, height, colors, new Color(0, value, 0, 1), new Color(1, 0, 0, 0), new Color(0, 0, 1, 0));
  715. for (int i = 0; i < colors.Length; i++)
  716. colors[i] = Color.HSV2RGB(colors[i]);
  717. break;
  718. case ColorBoxMode.HS_V:
  719. FillArea(width, height, colors, new Color(0, 0, value, 1), new Color(1, 0, 0, 0), new Color(0, 1, 0, 0));
  720. for (int i = 0; i < colors.Length; i++)
  721. colors[i] = Color.HSV2RGB(colors[i]);
  722. break;
  723. }
  724. texture.SetPixels(colors);
  725. guiTexture.SetTexture(spriteTexture);
  726. }
  727. public void UpdateInput(Vector2I windowPos)
  728. {
  729. if (Input.IsPointerButtonHeld(PointerButton.Left))
  730. {
  731. Rect2I bounds = guiTexture.Bounds;
  732. if (bounds.Contains(windowPos))
  733. {
  734. Vector2 newValue = Vector2.zero;
  735. newValue.x = (windowPos.x - bounds.x) / (float)bounds.width;
  736. newValue.y = (windowPos.y - bounds.y) / (float)bounds.height;
  737. SetValue(newValue);
  738. }
  739. }
  740. }
  741. public void SetValue(Vector2 value)
  742. {
  743. if (oldValue == value)
  744. return;
  745. Rect2I handleBounds = guiSliderHandle.Bounds;
  746. Rect2I boxBounds = guiTexture.Bounds;
  747. handleBounds.x = boxBounds.x + MathEx.RoundToInt(value.x * boxBounds.width) - handleBounds.width / 2;
  748. handleBounds.y = boxBounds.y + MathEx.RoundToInt(value.y * boxBounds.height) - handleBounds.height / 2;
  749. guiSliderHandle.Bounds = handleBounds;
  750. oldValue = value;
  751. if (OnValueChanged != null)
  752. OnValueChanged(value);
  753. }
  754. }
  755. }
  756. }