Advertisement
Guest User

Untitled

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