ColorPicker.cs 30 KB

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