diff --git a/client/shader/ui.frag b/client/shader/ui.frag index 57f951f..eb7e3f8 100644 --- a/client/shader/ui.frag +++ b/client/shader/ui.frag @@ -21,7 +21,7 @@ layout(location = 0) out vec4 outColor; vec4 hsv_to_rgb(vec4 hsv) { float C = hsv[1] * hsv[2]; - float H = hsv[0]*6; + float H = hsv[0]*6; float X = C * (1 - abs(mod(H, 2) - 1)); vec4 temp; if(0 <= H && H <= 1) { diff --git a/client/src/main.c b/client/src/main.c index 10df48d..876fd11 100644 --- a/client/src/main.c +++ b/client/src/main.c @@ -97,12 +97,45 @@ uint32_t add_hex_region(ClientContext* context) { #define COLOR_PICK_CONTAINER_ID 0x03 -void rgb_string_set(ClientContext* context, float r, float g, float b) { +void hsv_to_rgb(vec3 hsv, vec3 rgb) { + float C = hsv[1] * hsv[2]; + float H = hsv[0]*6; + float X = C * (1 - fabs((H - 2 * floor( H / 2 )) - 1)); + vec4 temp = {0, 0, 0, 0}; + if(0 <= H && H <= 1) { + temp[0] = C; + temp[1] = X; + } else if(1 <= H && H <= 2) { + temp[0] = X; + temp[1] = C; + } else if(2 <= H && H <= 3) { + temp[1] = C; + temp[2] = X; + } else if(3 <= H && H <= 4) { + temp[1] = X; + temp[2] = C; + } else if(4 <= H && H <= 5) { + temp[0] = X; + temp[2] = C; + } else if(5 <= H && H <= 6) { + temp[0] = C; + temp[2] = X; + } + + float m = hsv[2] - C; + rgb[0] = temp[0] + m; + rgb[1] = temp[1] + m; + rgb[2] = temp[2] + m; +} + +void rgb_string_set(ClientContext* context, vec3 hsv) { + vec3 rgb; + hsv_to_rgb(hsv, rgb); char temp[10]; snprintf(temp, 10, "#%02x%02x%02x", - (uint)(r*255), - (uint)(g*255), - (uint)(b*255)); + (uint)(rgb[0]*255), + (uint)(rgb[1]*255), + (uint)(rgb[2]*255)); update_ui_string(temp, COLOR_PICK_CONTAINER_ID, 0, 0, context->ui, context->render); } @@ -157,7 +190,7 @@ void sv_square_pick(ClientContext* context, float s, float v) { 4*sizeof(vec4), context->render); - rgb_string_set(context, select->color[0][0], select->color[0][1], select->color[0][2]); + rgb_string_set(context, select->color[0]); } void sv_square_button_callback(void* ptr, float x, float y, int button, int action, int mods) { @@ -216,7 +249,7 @@ void hue_bar_set(ClientContext* context, float y) { 4*sizeof(vec4), context->render); - rgb_string_set(context, select->color[0][0], select->color[0][1], select->color[0][2]); + rgb_string_set(context, select->color[0]); } void hue_bar_scroll_callback(void* ptr, double x, double y) {