2
0

ColorPicker.cs 27 KB

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