ColorPicker.cs 31 KB

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