diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 37a696c91b..d3132157c7 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -1510,40 +1510,7 @@ static uintptr_t xmb_icon_get_id(xmb_handle_t *xmb, static void xmb_blend_begin(void) { -#ifdef XMB_RIBBON_ENABLE - unsigned r, c; - unsigned i = 0; - const unsigned ribbon_rows = 16; - const unsigned ribbon_columns = 32; -#endif - menu_display_ctl(MENU_DISPLAY_CTL_BLEND_BEGIN, NULL); - -#ifdef XMB_RIBBON_ENABLE - /* Set up vertices */ - for (r = 0; r < ribbon_rows; ++r) - { - for (c = 0; c < ribbon_columns; ++c) - { - int index = r * ribbon_columns + c; - ribbon_verts[3*index + 0] = ((float) c)/15.0f - 1.0; - ribbon_verts[3*index + 1] = 0.0f; - ribbon_verts[3*index + 2] = ((float) r)/8.0f - 1.0; - } - } - - for (r = 0; r < ribbon_rows - 1; ++r) - { - ribbon_idx[i++] = r * ribbon_columns; - - for (c = 0; c < ribbon_columns; ++c) - { - ribbon_idx[i++] = r * ribbon_columns + c; - ribbon_idx[i++] = (r + 1) * ribbon_columns + c; - } - ribbon_idx[i++] = (r + 1) * ribbon_columns + (ribbon_columns - 1); - } -#endif } static void xmb_blend_end(void) @@ -1942,18 +1909,20 @@ static void xmb_draw_ribbon(menu_display_ctx_draw_t *draw) video_shader_ctx_info_t shader_info; math_matrix_4x4 mymat; struct gfx_coords coords; - float bg[16] = { - 1, 0, 0.1, 1, - 1, 0.1, 0, 1, - 0.05, 0, 0.05, 1, - 0.05, 0, 0.05, 1 + float white[16] = { + 1, 1, 1, 1, + 1, 1, 1, 1, + 1, 1, 1, 1, + 1, 1, 1, 1, }; - coords.vertices = draw->vertex_count; - coords.color = bg; + menu_display_ctl(MENU_DISPLAY_CTL_DRAW_GRADIENT, draw); xmb_blend_begin(); + coords.vertices = draw->vertex_count; + coords.color = white; + draw->x = 0; draw->y = 0; draw->coords = &coords; @@ -1964,7 +1933,7 @@ static void xmb_draw_ribbon(menu_display_ctx_draw_t *draw) video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); - t += 0.02; + t += 0.01; uniform_param.lookup.enable = true; uniform_param.lookup.idx = VIDEO_SHADER_MENU; @@ -2356,6 +2325,41 @@ static void xmb_layout(xmb_handle_t *xmb) } } + +static void xmb_init_ribbon() +{ +#ifdef XMB_RIBBON_ENABLE + unsigned r, c; + unsigned i = 0; + const unsigned ribbon_rows = 16; + const unsigned ribbon_columns = 32; + + /* Set up vertices */ + for (r = 0; r < ribbon_rows; ++r) + { + for (c = 0; c < ribbon_columns; ++c) + { + int index = r * ribbon_columns + c; + ribbon_verts[3*index + 0] = ((float) c)/15.0f - 1.0; + ribbon_verts[3*index + 1] = 0.0f; + ribbon_verts[3*index + 2] = ((float) r)/8.0f - 1.0; + } + } + + for (r = 0; r < ribbon_rows - 1; ++r) + { + ribbon_idx[i++] = r * ribbon_columns; + + for (c = 0; c < ribbon_columns; ++c) + { + ribbon_idx[i++] = r * ribbon_columns + c; + ribbon_idx[i++] = (r + 1) * ribbon_columns + c; + } + ribbon_idx[i++] = (r + 1) * ribbon_columns + (ribbon_columns - 1); + } +#endif +} + static void *xmb_init(void **userdata) { unsigned width, height; @@ -2408,6 +2412,7 @@ static void *xmb_init(void **userdata) xmb_init_horizontal_list(xmb); xmb_font(xmb); + xmb_init_ribbon(); return menu; diff --git a/menu/menu_display.c b/menu/menu_display.c index 9a4390220f..713c61fc16 100644 --- a/menu/menu_display.c +++ b/menu/menu_display.c @@ -497,6 +497,46 @@ bool menu_display_ctl(enum menu_display_ctl_state state, void *data) menu_disp->draw(draw); } break; + case MENU_DISPLAY_CTL_DRAW_GRADIENT: + { + struct gfx_coords coords; + const float *new_vertex = NULL; + const float *new_tex_coord = NULL; + menu_display_ctx_draw_t *draw = (menu_display_ctx_draw_t*)data; + float bg[16] = { + 1, 0, 0.1, 1, + 1, 0.1, 0, 1, + 0.05, 0, 0.05, 1, + 0.05, 0, 0.05, 1 + }; + + if (!menu_disp || !draw) + return false; + + new_vertex = draw->vertex; + new_tex_coord = draw->tex_coord; + + if (!new_vertex) + new_vertex = menu_disp->get_default_vertices(); + if (!new_tex_coord) + new_tex_coord = menu_disp->get_default_tex_coords(); + + coords.vertices = draw->vertex_count; + coords.vertex = new_vertex; + coords.tex_coord = new_tex_coord; + coords.lut_tex_coord = new_tex_coord; + coords.color = bg; + + draw->x = 0; + draw->y = 0; + draw->coords = &coords; + draw->texture = menu_display_white_texture; + + draw->matrix_data = (math_matrix_4x4*)menu_disp->get_default_mvp(); + + menu_disp->draw(draw); + } + break; case MENU_DISPLAY_CTL_ROTATE_Z: { math_matrix_4x4 matrix_rotated, matrix_scaled; diff --git a/menu/menu_display.h b/menu/menu_display.h index 9c79e71660..d5fd7dd419 100644 --- a/menu/menu_display.h +++ b/menu/menu_display.h @@ -75,6 +75,7 @@ enum menu_display_ctl_state MENU_DISPLAY_CTL_CLEAR_COLOR, MENU_DISPLAY_CTL_DRAW, MENU_DISPLAY_CTL_DRAW_BG, + MENU_DISPLAY_CTL_DRAW_GRADIENT, MENU_DISPLAY_CTL_ROTATE_Z, MENU_DISPLAY_CTL_TEX_COORDS_GET, MENU_DISPLAY_CTL_TIMEDATE