mirror of
https://github.com/ocornut/imgui.git
synced 2025-01-18 01:06:45 +01:00
ColorPicker: Rearrange code to introduce alternate HSV picker/selector with simpler diff. (#346)
This commit is contained in:
parent
cc3cce7567
commit
10ef5a63f0
40
imgui.cpp
40
imgui.cpp
@ -9385,13 +9385,15 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
|
|||||||
ColorConvertRGBtoHSV(col[0], col[1], col[2], H, S, V);
|
ColorConvertRGBtoHSV(col[0], col[1], col[2], H, S, V);
|
||||||
|
|
||||||
// Color matrix logic
|
// Color matrix logic
|
||||||
bool value_changed = false, hsv_changed = false, value_changed_from_matrix = false;
|
bool value_changed = false, value_changed_h = false, value_changed_sv = false;
|
||||||
|
|
||||||
|
{
|
||||||
InvisibleButton("sv", ImVec2(sv_picker_size, sv_picker_size));
|
InvisibleButton("sv", ImVec2(sv_picker_size, sv_picker_size));
|
||||||
if (IsItemActive())
|
if (IsItemActive())
|
||||||
{
|
{
|
||||||
S = ImSaturate((io.MousePos.x - picker_pos.x) / (sv_picker_size-1));
|
S = ImSaturate((io.MousePos.x - picker_pos.x) / (sv_picker_size-1));
|
||||||
V = 1.0f - ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size-1));
|
V = 1.0f - ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size-1));
|
||||||
value_changed = hsv_changed = value_changed_from_matrix = true;
|
value_changed = value_changed_sv = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hue bar logic
|
// Hue bar logic
|
||||||
@ -9400,7 +9402,8 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
|
|||||||
if (IsItemActive())
|
if (IsItemActive())
|
||||||
{
|
{
|
||||||
H = ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size-1));
|
H = ImSaturate((io.MousePos.y - picker_pos.y) / (sv_picker_size-1));
|
||||||
value_changed = hsv_changed = true;
|
value_changed = value_changed_h = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Alpha bar logic
|
// Alpha bar logic
|
||||||
@ -9453,7 +9456,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Convert back color to RGB
|
// Convert back color to RGB
|
||||||
if (hsv_changed)
|
if (value_changed_h || value_changed_sv)
|
||||||
ColorConvertHSVtoRGB(H >= 1.0f ? H - 10 * 1e-6f : H, S > 0.0f ? S : 10*1e-6f, V > 0.0f ? V : 1e-6f, col[0], col[1], col[2]);
|
ColorConvertHSVtoRGB(H >= 1.0f ? H - 10 * 1e-6f : H, S > 0.0f ? S : 10*1e-6f, V > 0.0f ? V : 1e-6f, col[0], col[1], col[2]);
|
||||||
|
|
||||||
// R,G,B and H,S,V slider color editor
|
// R,G,B and H,S,V slider color editor
|
||||||
@ -9493,27 +9496,30 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
|
|||||||
ImU32 hue_color32 = ColorConvertFloat4ToU32(hue_color_f);
|
ImU32 hue_color32 = ColorConvertFloat4ToU32(hue_color_f);
|
||||||
ImU32 col32_no_alpha = ColorConvertFloat4ToU32(ImVec4(col[0], col[1], col[2], 1.0f));
|
ImU32 col32_no_alpha = ColorConvertFloat4ToU32(ImVec4(col[0], col[1], col[2], 1.0f));
|
||||||
|
|
||||||
// Render color matrix
|
const ImU32 hue_colors[6+1] = { IM_COL32(255,0,0,255), IM_COL32(255,255,0,255), IM_COL32(0,255,0,255), IM_COL32(0,255,255,255), IM_COL32(0,0,255,255), IM_COL32(255,0,255,255), IM_COL32(255,0,0,255) };
|
||||||
|
ImVec2 sv_cursor_pos;
|
||||||
|
|
||||||
|
{
|
||||||
|
// Render SV Square
|
||||||
draw_list->AddRectFilledMultiColor(picker_pos, picker_pos + ImVec2(sv_picker_size,sv_picker_size), IM_COL32_WHITE, hue_color32, hue_color32, IM_COL32_WHITE);
|
draw_list->AddRectFilledMultiColor(picker_pos, picker_pos + ImVec2(sv_picker_size,sv_picker_size), IM_COL32_WHITE, hue_color32, hue_color32, IM_COL32_WHITE);
|
||||||
draw_list->AddRectFilledMultiColor(picker_pos, picker_pos + ImVec2(sv_picker_size,sv_picker_size), IM_COL32_BLACK_TRANS, IM_COL32_BLACK_TRANS, IM_COL32_BLACK, IM_COL32_BLACK);
|
draw_list->AddRectFilledMultiColor(picker_pos, picker_pos + ImVec2(sv_picker_size,sv_picker_size), IM_COL32_BLACK_TRANS, IM_COL32_BLACK_TRANS, IM_COL32_BLACK, IM_COL32_BLACK);
|
||||||
RenderFrameBorder(picker_pos, picker_pos + ImVec2(sv_picker_size,sv_picker_size), 0.0f);
|
RenderFrameBorder(picker_pos, picker_pos + ImVec2(sv_picker_size,sv_picker_size), 0.0f);
|
||||||
|
sv_cursor_pos.x = ImClamp((float)(int)(picker_pos.x + ImSaturate(S) * sv_picker_size + 0.5f), picker_pos.x + 2, picker_pos.x + sv_picker_size - 2); // Sneakily prevent the circle to stick out too much
|
||||||
|
sv_cursor_pos.y = ImClamp((float)(int)(picker_pos.y + ImSaturate(1 - V) * sv_picker_size + 0.5f), picker_pos.y + 2, picker_pos.y + sv_picker_size - 2);
|
||||||
|
|
||||||
// Render cursor/preview circle (clamp S/V within 0..1 range because floating points colors may lead HSV values to be out of range)
|
// Render Hue Bar
|
||||||
ImVec2 p((float)(int)(picker_pos.x + ImSaturate(S) * sv_picker_size + 0.5f), (float)(int)(picker_pos.y + ImSaturate(1 - V) * sv_picker_size + 0.5f));
|
|
||||||
p.x = ImClamp(p.x, picker_pos.x + 2, picker_pos.x + sv_picker_size - 2); // Sneakily prevent the circle to stick out too much
|
|
||||||
p.y = ImClamp(p.y, picker_pos.y + 2, picker_pos.y + sv_picker_size - 2);
|
|
||||||
float r = value_changed_from_matrix ? 10.0f : 6.0f;
|
|
||||||
draw_list->AddCircleFilled(p, r, col32_no_alpha, 12);
|
|
||||||
draw_list->AddCircle(p, r+1, IM_COL32(128,128,128,255), 12);
|
|
||||||
draw_list->AddCircle(p, r, IM_COL32_WHITE, 12);
|
|
||||||
|
|
||||||
// Render hue bar
|
|
||||||
ImU32 hue_bar_colors[6+1] = { IM_COL32(255,0,0,255), IM_COL32(255,255,0,255), IM_COL32(0,255,0,255), IM_COL32(0,255,255,255), IM_COL32(0,0,255,255), IM_COL32(255,0,255,255), IM_COL32(255,0,0,255) };
|
|
||||||
for (int i = 0; i < 6; ++i)
|
for (int i = 0; i < 6; ++i)
|
||||||
draw_list->AddRectFilledMultiColor(ImVec2(bar0_pos_x, picker_pos.y + i * (sv_picker_size / 6)), ImVec2(bar0_pos_x + bars_width, picker_pos.y + (i + 1) * (sv_picker_size / 6)), hue_bar_colors[i], hue_bar_colors[i], hue_bar_colors[i + 1], hue_bar_colors[i + 1]);
|
draw_list->AddRectFilledMultiColor(ImVec2(bar0_pos_x, picker_pos.y + i * (sv_picker_size / 6)), ImVec2(bar0_pos_x + bars_width, picker_pos.y + (i + 1) * (sv_picker_size / 6)), hue_colors[i], hue_colors[i], hue_colors[i + 1], hue_colors[i + 1]);
|
||||||
float bar0_line_y = (float)(int)(picker_pos.y + H * sv_picker_size + 0.5f);
|
float bar0_line_y = (float)(int)(picker_pos.y + H * sv_picker_size + 0.5f);
|
||||||
RenderFrameBorder(ImVec2(bar0_pos_x, picker_pos.y), ImVec2(bar0_pos_x + bars_width, picker_pos.y + sv_picker_size), 0.0f);
|
RenderFrameBorder(ImVec2(bar0_pos_x, picker_pos.y), ImVec2(bar0_pos_x + bars_width, picker_pos.y + sv_picker_size), 0.0f);
|
||||||
RenderArrowsForVerticalBar(draw_list, ImVec2(bar0_pos_x - 1, bar0_line_y), ImVec2(bars_triangles_half_sz + 1, bars_triangles_half_sz), bars_width + 2.0f);
|
RenderArrowsForVerticalBar(draw_list, ImVec2(bar0_pos_x - 1, bar0_line_y), ImVec2(bars_triangles_half_sz + 1, bars_triangles_half_sz), bars_width + 2.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Render cursor/preview circle (clamp S/V within 0..1 range because floating points colors may lead HSV values to be out of range)
|
||||||
|
float sv_cursor_rad = value_changed_sv ? 10.0f : 6.0f;
|
||||||
|
draw_list->AddCircleFilled(sv_cursor_pos, sv_cursor_rad, col32_no_alpha, 12);
|
||||||
|
draw_list->AddCircle(sv_cursor_pos, sv_cursor_rad+1, IM_COL32(128,128,128,255), 12);
|
||||||
|
draw_list->AddCircle(sv_cursor_pos, sv_cursor_rad, IM_COL32_WHITE, 12);
|
||||||
|
|
||||||
// Render alpha bar
|
// Render alpha bar
|
||||||
if (alpha_bar)
|
if (alpha_bar)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user