From 1bbc2f09b574dc1c3257fb0d11f0a3e0dd525d7c Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 19 Apr 2016 23:00:55 +0200 Subject: [PATCH] (courtesy of teepee) Rewrite the ribbon code to use the coordinate array --- .../pipeline_xmb_ribbon.glsl.vert.h | 5 +- menu/drivers/xmb.c | 85 ++++++------------- 2 files changed, 29 insertions(+), 61 deletions(-) diff --git a/gfx/drivers/gl_shaders/pipeline_xmb_ribbon.glsl.vert.h b/gfx/drivers/gl_shaders/pipeline_xmb_ribbon.glsl.vert.h index 959464ce2e..bc9f80fda7 100644 --- a/gfx/drivers/gl_shaders/pipeline_xmb_ribbon.glsl.vert.h +++ b/gfx/drivers/gl_shaders/pipeline_xmb_ribbon.glsl.vert.h @@ -6,9 +6,8 @@ static const char *stock_vertex_xmb = "#define COMPAT_VARYING varying\n" "#define COMPAT_ATTRIBUTE attribute\n" "#endif\n" - "COMPAT_ATTRIBUTE vec3 vPosition;\n" + "COMPAT_ATTRIBUTE vec3 VertexCoord;\n" "uniform float time;\n" - "COMPAT_VARYING vec3 v;\n" "float iqhash( float n )\n" "{\n" " return fract(sin(n)*43758.5453);\n" @@ -26,7 +25,7 @@ static const char *stock_vertex_xmb = "}\n" "void main()\n" "{\n" - " v = vPosition;\n" + " vec3 v = vec3(VertexCoord.x, 0.0, VertexCoord.y);\n" " vec3 v2 = v;\n" " v2.x = v2.x + time/2.0;\n" " v2.z = v.z * 3.0;\n" diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 39eebcf97e..384d0f5a2f 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -53,8 +53,7 @@ #define XMB_RIBBON_ENABLE #define XMB_RIBBON_ROWS 16 #define XMB_RIBBON_COLS 32 -#define XMB_RIBBON_VERTICES XMB_RIBBON_COLS*XMB_RIBBON_ROWS*3 -#define XMB_RIBBON_INDEXES (XMB_RIBBON_COLS * 2 + 2) * XMB_RIBBON_ROWS + (XMB_RIBBON_ROWS - 1) * 2 +#define XMB_RIBBON_VERTICES 2*XMB_RIBBON_COLS*XMB_RIBBON_ROWS-2*XMB_RIBBON_COLS #endif #ifndef XMB_DELAY @@ -236,10 +235,6 @@ typedef struct xmb_handle gfx_font_raster_block_t raster_block; } xmb_handle_t; -#ifdef XMB_RIBBON_ENABLE -static unsigned ribbon_idx[XMB_RIBBON_INDEXES]; -#endif - static const char *xmb_theme_ident(void) { settings_t *settings = config_get_ptr(); @@ -1869,14 +1864,6 @@ static void xmb_draw_ribbon(xmb_handle_t *xmb, menu_display_ctx_draw_t *draw) struct uniform_info uniform_param = {0}; static float t = 0; video_shader_ctx_info_t shader_info; - math_matrix_4x4 mymat; - struct gfx_coords coords; - float white[16] = { - 1, 1, 1, 1, - 1, 1, 1, 1, - 1, 1, 1, 1, - 1, 1, 1, 1, - }; gfx_coord_array_t *ca = NULL; menu_display_ctl(MENU_DISPLAY_CTL_COORDS_ARRAY_GET, &ca); @@ -1890,14 +1877,10 @@ static void xmb_draw_ribbon(xmb_handle_t *xmb, menu_display_ctx_draw_t *draw) menu_display_ctl(MENU_DISPLAY_CTL_BLEND_BEGIN, NULL); - coords.vertex = ca->coords.vertex; - coords.index = ribbon_idx; - coords.color = white; - draw->x = 0; draw->y = 0; - draw->coords = &coords; - draw->matrix_data = &mymat; + draw->coords = (struct gfx_coords*)(&ca->coords); + draw->matrix_data = NULL; shader_info.data = NULL; shader_info.idx = VIDEO_SHADER_MENU; @@ -1917,13 +1900,7 @@ static void xmb_draw_ribbon(xmb_handle_t *xmb, menu_display_ctx_draw_t *draw) video_shader_driver_ctl(SHADER_CTL_SET_PARAMETER, &uniform_param); - menu_display_ctl(MENU_DISPLAY_CTL_SET_VIEWPORT, NULL); - - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, draw->coords->vertex); - glEnableVertexAttribArray(0); - - glDrawElements(GL_TRIANGLE_STRIP, - XMB_RIBBON_INDEXES, GL_UNSIGNED_INT, draw->coords->index); + menu_display_ctl(MENU_DISPLAY_CTL_DRAW, draw); menu_display_ctl(MENU_DISPLAY_CTL_BLEND_END, NULL); #else @@ -2307,55 +2284,45 @@ static void xmb_layout(xmb_handle_t *xmb) } } +#ifdef XMB_RIBBON_ENABLE +static void xmb_ribbon_set_vertex(float *ribbon_verts, unsigned idx, unsigned row, unsigned col) +{ + ribbon_verts[idx++] = ((float)col) / 15.5f - 1.0f; + ribbon_verts[idx++] = ((float)row) / 7.5f - 1.0f; +} static void xmb_init_ribbon(xmb_handle_t * xmb) { -#ifdef XMB_RIBBON_ENABLE gfx_coords_t coords; - menu_display_ctx_coord_draw_t coord_draw; - float ribbon_verts[XMB_RIBBON_VERTICES]; - unsigned r, c; - unsigned i = 0; - float white[XMB_RIBBON_VERTICES*4] = { 1.0f }; + float ribbon_verts[2 * XMB_RIBBON_VERTICES]; + unsigned i, r, c, col; gfx_coord_array_t *ca = NULL; + float dummy[4 * XMB_RIBBON_VERTICES] = { }; menu_display_ctl(MENU_DISPLAY_CTL_COORDS_ARRAY_GET, &ca); /* Set up vertices */ - for (r = 0; r < XMB_RIBBON_ROWS; ++r) + i = 0; + for (r = 0; r < XMB_RIBBON_ROWS - 1; r++) { - for (c = 0; c < XMB_RIBBON_COLS; ++c) + for (c = 0; c < XMB_RIBBON_COLS; c++) { - int index = r * XMB_RIBBON_COLS + 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; + col = r % 2 ? XMB_RIBBON_COLS - c - 1 : c; + xmb_ribbon_set_vertex(ribbon_verts, i, r, col); + xmb_ribbon_set_vertex(ribbon_verts, i + 2, r + 1, col); + i += 4; } } - menu_display_ctl(MENU_DISPLAY_CTL_TEX_COORDS_GET, &coord_draw); - - coords.color = white; - coords.vertex = ribbon_verts; - coords.tex_coord = coord_draw.ptr; - coords.lut_tex_coord = coord_draw.ptr; + coords.color = dummy; + coords.vertex = dummy; + coords.tex_coord = dummy; + coords.lut_tex_coord = ribbon_verts; coords.vertices = XMB_RIBBON_VERTICES; gfx_coord_array_append(ca, &coords, XMB_RIBBON_VERTICES); - - for (r = 0; r < XMB_RIBBON_ROWS - 1; ++r) - { - ribbon_idx[i++] = r * XMB_RIBBON_COLS; - - for (c = 0; c < XMB_RIBBON_COLS; ++c) - { - ribbon_idx[i++] = r * XMB_RIBBON_COLS + c; - ribbon_idx[i++] = (r + 1) * XMB_RIBBON_COLS + c; - } - ribbon_idx[i++] = (r + 1) * XMB_RIBBON_COLS + (XMB_RIBBON_COLS - 1); - } -#endif } +#endif static void *xmb_init(void **userdata) { @@ -2409,7 +2376,9 @@ static void *xmb_init(void **userdata) xmb_init_horizontal_list(xmb); xmb_font(xmb); +#ifdef XMB_RIBBON_ENABLE xmb_init_ribbon(xmb); +#endif return menu;