ColorPicker.cs 31 KB

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