Anti-hide

Untitled

Dec 13th, 2017
236
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.69 KB | None | 0 0
  1. {
  2. static const float HUE_PICKER_WIDTH = 20.0f;
  3. static const float CROSSHAIR_SIZE = 7.0f;
  4. static const ImVec2 SV_PICKER_SIZE = ImVec2(200, 200);
  5.  
  6. bool value_changed = false;
  7.  
  8. ImDrawList* draw_list = ImGui::GetWindowDrawList();
  9.  
  10. ImVec2 picker_pos = ImGui::GetCursorScreenPos();
  11.  
  12. ImColor colors[] = {ImColor(255, 0, 0),
  13. ImColor(255, 255, 0),
  14. ImColor(0, 255, 0),
  15. ImColor(0, 255, 255),
  16. ImColor(0, 0, 255),
  17. ImColor(255, 0, 255),
  18. ImColor(255, 0, 0)};
  19.  
  20. for (int i = 0; i < 6; ++i)
  21. {
  22. draw_list->AddRectFilledMultiColor(
  23. ImVec2(picker_pos.x + SV_PICKER_SIZE.x + 10, picker_pos.y + i * (SV_PICKER_SIZE.y / 6)),
  24. ImVec2(picker_pos.x + SV_PICKER_SIZE.x + 10 + HUE_PICKER_WIDTH,
  25. picker_pos.y + (i + 1) * (SV_PICKER_SIZE.y / 6)),
  26. colors[i],
  27. colors[i],
  28. colors[i + 1],
  29. colors[i + 1]);
  30. }
  31.  
  32. float hue, saturation, value;
  33. ImGui::ColorConvertRGBtoHSV(
  34. color->Value.x, color->Value.y, color->Value.z, hue, saturation, value);
  35. auto hue_color = ImColor::HSV(hue, 1, 1);
  36.  
  37. draw_list->AddLine(
  38. ImVec2(picker_pos.x + SV_PICKER_SIZE.x + 8, picker_pos.y + hue * SV_PICKER_SIZE.y),
  39. ImVec2(picker_pos.x + SV_PICKER_SIZE.x + 12 + HUE_PICKER_WIDTH,
  40. picker_pos.y + hue * SV_PICKER_SIZE.y),
  41. ImColor(255, 255, 255));
  42.  
  43. draw_list->AddTriangleFilledMultiColor(picker_pos,
  44. ImVec2(picker_pos.x + SV_PICKER_SIZE.x, picker_pos.y + SV_PICKER_SIZE.y),
  45. ImVec2(picker_pos.x, picker_pos.y + SV_PICKER_SIZE.y),
  46. ImColor(0, 0, 0),
  47. hue_color,
  48. ImColor(255, 255, 255));
  49.  
  50. float x = saturation * value;
  51. ImVec2 p(picker_pos.x + x * SV_PICKER_SIZE.x, picker_pos.y + value * SV_PICKER_SIZE.y);
  52. draw_list->AddLine(ImVec2(p.x - CROSSHAIR_SIZE, p.y), ImVec2(p.x - 2, p.y), ImColor(255, 255, 255));
  53. draw_list->AddLine(ImVec2(p.x + CROSSHAIR_SIZE, p.y), ImVec2(p.x + 2, p.y), ImColor(255, 255, 255));
  54. draw_list->AddLine(ImVec2(p.x, p.y + CROSSHAIR_SIZE), ImVec2(p.x, p.y + 2), ImColor(255, 255, 255));
  55. draw_list->AddLine(ImVec2(p.x, p.y - CROSSHAIR_SIZE), ImVec2(p.x, p.y - 2), ImColor(255, 255, 255));
  56.  
  57. ImGui::InvisibleButton("saturation_value_selector", SV_PICKER_SIZE);
  58. if (ImGui::IsItemHovered())
  59. {
  60. ImVec2 mouse_pos_in_canvas = ImVec2(
  61. ImGui::GetIO().MousePos.x - picker_pos.x, ImGui::GetIO().MousePos.y - picker_pos.y);
  62. if (ImGui::GetIO().MouseDown[0])
  63. {
  64. mouse_pos_in_canvas.x =
  65. ImMin(mouse_pos_in_canvas.x, mouse_pos_in_canvas.y);
  66.  
  67. value = mouse_pos_in_canvas.y / SV_PICKER_SIZE.y;
  68. saturation = value == 0 ? 0 : (mouse_pos_in_canvas.x / SV_PICKER_SIZE.x) / value;
  69. value_changed = true;
  70. }
  71. }
  72.  
  73. ImGui::SetCursorScreenPos(ImVec2(picker_pos.x + SV_PICKER_SIZE.x + 10, picker_pos.y));
  74. ImGui::InvisibleButton("hue_selector", ImVec2(HUE_PICKER_WIDTH, SV_PICKER_SIZE.y));
  75.  
  76. if (ImGui::IsItemHovered())
  77. {
  78. if (ImGui::GetIO().MouseDown[0])
  79. {
  80. hue = ((ImGui::GetIO().MousePos.y - picker_pos.y) / SV_PICKER_SIZE.y);
  81. value_changed = true;
  82. }
  83. }
  84.  
  85. *color = ImColor::HSV(hue, saturation, value);
  86. return value_changed | ImGui::ColorEdit3(label, &color->Value.x);
  87. }
Advertisement
Add Comment
Please, Sign In to add comment