From 27da43ba86a8160a5bcb52b9d4a214f80800db25 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 22 Mar 2019 14:01:11 +1100 Subject: UI: refactor color picker flags out of buttons These are specialized color picker options which don't need to be stored in the button (frees of flags for buttons too). --- .../blender/editors/interface/interface_handlers.c | 21 +++++++++------- .../blender/editors/interface/interface_intern.h | 9 +++++-- .../editors/interface/interface_templates.c | 11 ++++----- .../blender/editors/interface/interface_widgets.c | 28 +++++++++++++--------- 4 files changed, 41 insertions(+), 28 deletions(-) (limited to 'source/blender/editors/interface') diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index 5c8099eb205..ed0a9192c8f 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -6130,7 +6130,7 @@ static bool ui_numedit_but_HSVCIRCLE( /* exception, when using color wheel in 'locked' value state: * allow choosing a hue for black values, by giving a tiny increment */ - if (but->flag & UI_BUT_COLOR_LOCK) { + if (cpicker->use_color_lock) { if (U.color_picker_type == USER_CP_CIRCLE_HSV) { // lock if (hsv[2] == 0.f) hsv[2] = 0.0001f; } @@ -6151,7 +6151,7 @@ static bool ui_numedit_but_HSVCIRCLE( ui_rgb_to_color_picker_compat_v(rgbo, hsvo); /* and original position */ - ui_hsvcircle_pos_from_vals(but, &rect, hsvo, &xpos, &ypos); + ui_hsvcircle_pos_from_vals(cpicker, &rect, hsvo, &xpos, &ypos); mx_fl = xpos - (data->dragstartx - mx_fl); my_fl = ypos - (data->dragstarty - my_fl); @@ -6160,8 +6160,9 @@ static bool ui_numedit_but_HSVCIRCLE( ui_hsvcircle_vals_from_pos(hsv, hsv + 1, &rect, mx_fl, my_fl); - if ((but->flag & UI_BUT_COLOR_CUBIC) && (U.color_picker_type == USER_CP_CIRCLE_HSV)) + if ((cpicker->use_color_cubic) && (U.color_picker_type == USER_CP_CIRCLE_HSV)) { hsv[1] = 1.0f - sqrt3f(1.0f - hsv[1]); + } if (snap != SNAP_OFF) { ui_color_snap_hue(snap, &hsv[0]); @@ -6169,8 +6170,10 @@ static bool ui_numedit_but_HSVCIRCLE( ui_color_picker_to_rgb_v(hsv, rgb); - if ((but->flag & UI_BUT_VEC_SIZE_LOCK) && (rgb[0] || rgb[1] || rgb[2])) { - normalize_v3_length(rgb, but->a2); + if ((cpicker->use_luminosity_lock)) { + if (!is_zero_v3(rgb)) { + normalize_v3_length(rgb, cpicker->luminosity_lock_value); + } } ui_color_picker_to_scene_linear_space(but, rgb); @@ -6224,7 +6227,7 @@ static void ui_ndofedit_but_HSVCIRCLE( /* exception, when using color wheel in 'locked' value state: * allow choosing a hue for black values, by giving a tiny increment */ - if (but->flag & UI_BUT_COLOR_LOCK) { + if (cpicker->use_color_lock) { if (U.color_picker_type == USER_CP_CIRCLE_HSV) { // lock if (hsv[2] == 0.f) hsv[2] = 0.0001f; } @@ -6242,8 +6245,10 @@ static void ui_ndofedit_but_HSVCIRCLE( ui_color_picker_to_rgb_v(hsv, data->vec); - if ((but->flag & UI_BUT_VEC_SIZE_LOCK) && (data->vec[0] || data->vec[1] || data->vec[2])) { - normalize_v3_length(data->vec, but->a2); + if (cpicker->use_luminosity_lock) { + if (!is_zero_v3(data->vec)) { + normalize_v3_length(data->vec, cpicker->luminosity_lock_value); + } } ui_color_picker_to_scene_linear_space(but, data->vec); diff --git a/source/blender/editors/interface/interface_intern.h b/source/blender/editors/interface/interface_intern.h index 369a067f7a3..1ca83b929e7 100644 --- a/source/blender/editors/interface/interface_intern.h +++ b/source/blender/editors/interface/interface_intern.h @@ -341,6 +341,11 @@ typedef struct ColorPicker { /** Initial color data (detect changes). */ float color_data_init[3]; bool is_init; + /** Cubic saturation for the color wheel. */ + bool use_color_cubic; + bool use_color_lock; + bool use_luminosity_lock; + float luminosity_lock_value; } ColorPicker; typedef struct ColorPickerData { @@ -506,8 +511,8 @@ extern void ui_but_v3_set(uiBut *but, const float vec[3]); extern void ui_hsvcircle_vals_from_pos( float *val_rad, float *val_dist, const rcti *rect, const float mx, const float my); -extern void ui_hsvcircle_pos_from_vals(struct uiBut *but, const rcti *rect, float *hsv, float *xpos, float *ypos); -extern void ui_hsvcube_pos_from_vals(struct uiBut *but, const rcti *rect, float *hsv, float *xp, float *yp); +extern void ui_hsvcircle_pos_from_vals(const ColorPicker *cpicker, const rcti *rect, const float *hsv, float *xpos, float *ypos); +extern void ui_hsvcube_pos_from_vals(const struct uiBut *but, const rcti *rect, const float *hsv, float *xp, float *yp); extern void ui_but_string_get_ex( uiBut *but, char *str, const size_t maxlen, diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index e63b4572894..f0763b71d7e 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -3347,20 +3347,17 @@ void uiTemplateColorPicker( but->custom_data = cpicker; - if (lock) { - but->flag |= UI_BUT_COLOR_LOCK; - } + cpicker->use_color_lock = lock; + cpicker->use_color_cubic = cubic; + cpicker->use_luminosity_lock = lock_luminosity; if (lock_luminosity) { float color[4]; /* in case of alpha */ - but->flag |= UI_BUT_VEC_SIZE_LOCK; RNA_property_float_get_array(ptr, prop, color); but->a2 = len_v3(color); + cpicker->luminosity_lock_value = len_v3(color); } - if (cubic) - but->flag |= UI_BUT_COLOR_CUBIC; - if (value_slider) { switch (U.color_picker_type) { diff --git a/source/blender/editors/interface/interface_widgets.c b/source/blender/editors/interface/interface_widgets.c index 47f29eaed2f..4c92ca14bce 100644 --- a/source/blender/editors/interface/interface_widgets.c +++ b/source/blender/editors/interface/interface_widgets.c @@ -2575,7 +2575,9 @@ void ui_hsvcircle_vals_from_pos( } /* cursor in hsv circle, in float units -1 to 1, to map on radius */ -void ui_hsvcircle_pos_from_vals(uiBut *but, const rcti *rect, float *hsv, float *xpos, float *ypos) +void ui_hsvcircle_pos_from_vals( + const ColorPicker *cpicker, const rcti *rect, const float *hsv, + float *r_xpos, float *r_ypos) { /* duplication of code... well, simple is better now */ const float centx = BLI_rcti_cent_x_fl(rect); @@ -2585,14 +2587,14 @@ void ui_hsvcircle_pos_from_vals(uiBut *but, const rcti *rect, float *hsv, float ang = 2.0f * (float)M_PI * hsv[0] + (float)M_PI_2; - if ((but->flag & UI_BUT_COLOR_CUBIC) && (U.color_picker_type == USER_CP_CIRCLE_HSV)) + if (cpicker->use_color_cubic && (U.color_picker_type == USER_CP_CIRCLE_HSV)) radius_t = (1.0f - pow3f(1.0f - hsv[1])); else radius_t = hsv[1]; radius = clamp_f(radius_t, 0.0f, 1.0f) * radius; - *xpos = centx + cosf(-ang) * radius; - *ypos = centy + sinf(-ang) * radius; + *r_xpos = centx + cosf(-ang) * radius; + *r_ypos = centy + sinf(-ang) * radius; } static void ui_draw_but_HSVCIRCLE(uiBut *but, const uiWidgetColors *wcol, const rcti *rect) @@ -2622,11 +2624,13 @@ static void ui_draw_but_HSVCIRCLE(uiBut *but, const uiWidgetColors *wcol, const /* exception: if 'lock' is set * lock the value of the color wheel to 1. * Useful for color correction tools where you're only interested in hue. */ - if (but->flag & UI_BUT_COLOR_LOCK) { - if (U.color_picker_type == USER_CP_CIRCLE_HSV) + if (cpicker->use_color_lock) { + if (U.color_picker_type == USER_CP_CIRCLE_HSV) { hsv[2] = 1.0f; - else + } + else { hsv[2] = 0.5f; + } } const float hsv_center[3] = {0.0f, 0.0f, hsv[2]}; @@ -2694,7 +2698,7 @@ static void ui_draw_but_HSVCIRCLE(uiBut *but, const uiWidgetColors *wcol, const ui_rgb_to_color_picker_compat_v(rgb, hsv); float xpos, ypos; - ui_hsvcircle_pos_from_vals(but, rect, hsv, &xpos, &ypos); + ui_hsvcircle_pos_from_vals(cpicker, rect, hsv, &xpos, &ypos); ui_hsv_cursor(xpos, ypos); } @@ -2851,7 +2855,9 @@ void ui_draw_gradient(const rcti *rect, const float hsv[3], const int type, cons immUnbindProgram(); } -void ui_hsvcube_pos_from_vals(uiBut *but, const rcti *rect, float *hsv, float *xp, float *yp) +void ui_hsvcube_pos_from_vals( + const uiBut *but, const rcti *rect, const float *hsv, + float *r_xp, float *r_yp) { float x = 0.0f, y = 0.0f; @@ -2881,8 +2887,8 @@ void ui_hsvcube_pos_from_vals(uiBut *but, const rcti *rect, float *hsv, float *x } /* cursor */ - *xp = rect->xmin + x * BLI_rcti_size_x(rect); - *yp = rect->ymin + y * BLI_rcti_size_y(rect); + *r_xp = rect->xmin + x * BLI_rcti_size_x(rect); + *r_yp = rect->ymin + y * BLI_rcti_size_y(rect); } static void ui_draw_but_HSVCUBE(uiBut *but, const rcti *rect) -- cgit v1.2.3