(menu_display.c) Refactor draw functions

This commit is contained in:
twinaphex 2016-02-09 04:34:07 +01:00
parent 2dba1aaef4
commit 2b86b9dbe6
5 changed files with 195 additions and 149 deletions

View File

@ -185,6 +185,7 @@ static void mui_draw_icon(mui_handle_t *mui,
float rotation, float scale_factor,
float *color)
{
menu_display_ctx_draw_t draw;
struct gfx_coords coords;
math_matrix_4x4 mymat;
@ -199,13 +200,16 @@ static void mui_draw_icon(mui_handle_t *mui,
coords.lut_tex_coord = NULL;
coords.color = (const float*)color;
menu_display_draw(
x,
height - y - mui->icon_size,
mui->icon_size,
mui->icon_size,
&coords, &mymat, texture,
MENU_DISPLAY_PRIM_TRIANGLESTRIP);
draw.x = x;
draw.y = height - y - mui->icon_size;
draw.width = mui->icon_size;
draw.height = mui->icon_size;
draw.coords = &coords;
draw.matrix_data = &mymat;
draw.texture = texture;
draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP;
menu_display_ctl(MENU_DISPLAY_CTL_DRAW, &draw);
menu_display_ctl(MENU_DISPLAY_CTL_BLEND_END, NULL);
}
@ -271,6 +275,7 @@ static void mui_render_quad(mui_handle_t *mui,
unsigned width, unsigned height,
float *coord_color)
{
menu_display_ctx_draw_t draw;
struct gfx_coords coords;
coords.vertices = 4;
@ -281,13 +286,16 @@ static void mui_render_quad(mui_handle_t *mui,
menu_display_ctl(MENU_DISPLAY_CTL_BLEND_BEGIN, NULL);
menu_display_draw(
x,
(int)height - y - (int)h,
w,
h,
&coords, NULL, mui->textures.white,
MENU_DISPLAY_PRIM_TRIANGLESTRIP);
draw.x = x;
draw.y = (int)height - y - (int)h;
draw.width = w;
draw.height = h;
draw.coords = &coords;
draw.matrix_data = NULL;
draw.texture = mui->textures.white;
draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP;
menu_display_ctl(MENU_DISPLAY_CTL_DRAW, &draw);
menu_display_ctl(MENU_DISPLAY_CTL_BLEND_END, NULL);
}
@ -630,6 +638,7 @@ static void mui_draw_cursor(mui_handle_t *mui,
float *color,
float x, float y, unsigned width, unsigned height)
{
menu_display_ctx_draw_t draw;
struct gfx_coords coords;
coords.vertices = 4;
@ -640,14 +649,16 @@ static void mui_draw_cursor(mui_handle_t *mui,
menu_display_ctl(MENU_DISPLAY_CTL_BLEND_BEGIN, NULL);
menu_display_draw(
x - 32,
height - y - 32,
64,
64,
&coords, NULL,
mui->textures.list[MUI_TEXTURE_POINTER].id,
MENU_DISPLAY_PRIM_TRIANGLESTRIP);
draw.x = x - 32;
draw.y = (int)height - y - 32;
draw.width = 64;
draw.height = 64;
draw.coords = &coords;
draw.matrix_data = NULL;
draw.texture = mui->textures.list[MUI_TEXTURE_POINTER].id;
draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP;
menu_display_ctl(MENU_DISPLAY_CTL_DRAW, &draw);
menu_display_ctl(MENU_DISPLAY_CTL_BLEND_END, NULL);
}
@ -774,6 +785,7 @@ static void mui_frame(void *data)
size_t selection;
size_t title_margin;
uint64_t *frame_count;
menu_display_ctx_draw_t draw;
mui_handle_t *mui = (mui_handle_t*)data;
settings_t *settings = config_get_ptr();
const uint32_t normal_color = 0x212121ff;
@ -800,12 +812,21 @@ static void mui_frame(void *data)
if (libretro_running)
{
menu_display_draw_bg(
width, height,
mui->textures.white, 0.75f, false,
&white_transp_bg[0], &white_bg[0],
NULL, NULL, 4,
MENU_DISPLAY_PRIM_TRIANGLESTRIP);
memset(&draw, 0, sizeof(menu_display_ctx_draw_t));
draw.width = width;
draw.height = height;
draw.texture = mui->textures.white;
draw.handle_alpha = 0.75f;
draw.force_transparency = false;
draw.color = &white_transp_bg[0];
draw.color2 = &white_bg[0];
draw.vertex = NULL;
draw.tex_coord = NULL;
draw.vertex_count = 4;
draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP;
menu_display_ctl(MENU_DISPLAY_CTL_DRAW_BG, &draw);
}
else
{
@ -825,12 +846,21 @@ static void mui_frame(void *data)
/* Set new opacity for transposed white background */
bgcolor_setalpha(white_transp_bg, 0.30);
menu_display_draw_bg(
width, height,
mui->textures.bg.id, 0.75f, true,
&white_transp_bg[0], &white_bg[0],
NULL, NULL, 4,
MENU_DISPLAY_PRIM_TRIANGLESTRIP);
memset(&draw, 0, sizeof(menu_display_ctx_draw_t));
draw.width = width;
draw.height = height;
draw.texture = mui->textures.bg.id;
draw.handle_alpha = 0.75f;
draw.force_transparency = true;
draw.color = &white_transp_bg[0];
draw.color2 = &white_bg[0];
draw.vertex = NULL;
draw.tex_coord = NULL;
draw.vertex_count = 4;
draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP;
menu_display_ctl(MENU_DISPLAY_CTL_DRAW_BG, &draw);
/* Restore opacity of transposed white background */
bgcolor_setalpha(white_transp_bg, 0.90);

View File

@ -341,6 +341,7 @@ static void xmb_draw_icon(xmb_handle_t *xmb,
float rotation, float scale_factor,
float *color)
{
menu_display_ctx_draw_t draw;
struct gfx_coords coords;
math_matrix_4x4 mymat;
@ -360,13 +361,16 @@ static void xmb_draw_icon(xmb_handle_t *xmb,
coords.lut_tex_coord = NULL;
coords.color = (const float*)color;
menu_display_draw(
x,
height - y,
xmb->icon.size,
xmb->icon.size,
&coords, &mymat, texture,
MENU_DISPLAY_PRIM_TRIANGLESTRIP);
draw.x = x;
draw.y = height - y;
draw.width = xmb->icon.size;
draw.height = xmb->icon.size;
draw.coords = &coords;
draw.matrix_data = &mymat;
draw.texture = texture;
draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP;
menu_display_ctl(MENU_DISPLAY_CTL_DRAW, &draw);
}
static void xmb_draw_icon_predone(xmb_handle_t *xmb,
@ -377,6 +381,8 @@ static void xmb_draw_icon_predone(xmb_handle_t *xmb,
float alpha, float rotation, float scale_factor,
float *color)
{
menu_display_ctx_draw_t draw;
struct gfx_coords coords;
if (
@ -392,18 +398,22 @@ static void xmb_draw_icon_predone(xmb_handle_t *xmb,
coords.lut_tex_coord = NULL;
coords.color = color;
menu_display_draw(
x,
height - y,
xmb->icon.size,
xmb->icon.size,
&coords, mymat, texture,
MENU_DISPLAY_PRIM_TRIANGLESTRIP);
draw.x = x;
draw.y = height - y;
draw.width = xmb->icon.size;
draw.height = xmb->icon.size;
draw.coords = &coords;
draw.matrix_data = &mymat;
draw.texture = texture;
draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP;
menu_display_ctl(MENU_DISPLAY_CTL_DRAW, &draw);
}
static void xmb_draw_boxart(xmb_handle_t *xmb, float *color,
unsigned width, unsigned height)
{
menu_display_ctx_draw_t draw;
struct gfx_coords coords;
math_matrix_4x4 mymat;
float y = xmb->margins.screen.top + xmb->icon.size + xmb->boxart_height;
@ -418,13 +428,16 @@ static void xmb_draw_boxart(xmb_handle_t *xmb, float *color,
coords.lut_tex_coord = NULL;
coords.color = (const float*)color;
menu_display_draw(
x,
height - y,
xmb->boxart_width,
xmb->boxart_height,
&coords, &mymat, xmb->boxart,
MENU_DISPLAY_PRIM_TRIANGLESTRIP);
draw.x = x;
draw.y = height - y;
draw.width = xmb->boxart_width;
draw.height = xmb->boxart_height;
draw.coords = &coords;
draw.matrix_data = &mymat;
draw.texture = xmb->boxart;
draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP;
menu_display_ctl(MENU_DISPLAY_CTL_DRAW, &draw);
}
static void xmb_draw_text(xmb_handle_t *xmb,
@ -1575,6 +1588,7 @@ static void xmb_draw_cursor(xmb_handle_t *xmb,
float *color,
float x, float y, unsigned width, unsigned height)
{
menu_display_ctx_draw_t draw;
struct gfx_coords coords;
coords.vertices = 4;
@ -1585,13 +1599,16 @@ static void xmb_draw_cursor(xmb_handle_t *xmb,
menu_display_ctl(MENU_DISPLAY_CTL_BLEND_BEGIN, NULL);
menu_display_draw(
x - (xmb->cursor.size/2),
height - y - (xmb->cursor.size/2),
xmb->cursor.size,
xmb->cursor.size,
&coords, NULL, xmb->textures.list[XMB_TEXTURE_POINTER].id,
MENU_DISPLAY_PRIM_TRIANGLESTRIP);
draw.x = x - (xmb->cursor.size / 2);
draw.y = height - y - (xmb->cursor.size / 2);
draw.width = xmb->cursor.size;
draw.height = xmb->cursor.size;
draw.coords = &coords;
draw.matrix_data = NULL;
draw.texture = xmb->textures.list[XMB_TEXTURE_POINTER].id;
draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP;
menu_display_ctl(MENU_DISPLAY_CTL_DRAW, &draw);
menu_display_ctl(MENU_DISPLAY_CTL_BLEND_END, NULL);
}
@ -1701,6 +1718,7 @@ static void xmb_frame(void *data)
float item_color[16];
float coord_color[16];
float coord_color2[16];
menu_display_ctx_draw_t draw;
bool display_kb;
bool render_background = false;
xmb_handle_t *xmb = (xmb_handle_t*)data;
@ -1739,10 +1757,21 @@ static void xmb_frame(void *data)
coord_color2[3] = coord_color2[7] = coord_color2[11] = coord_color2[15] =
xmb->alpha;
menu_display_draw_bg(
width, height, xmb->textures.bg.id, xmb->alpha, false, &coord_color[0],
&coord_color2[0], NULL, NULL, 4,
MENU_DISPLAY_PRIM_TRIANGLESTRIP);
memset(&draw, 0, sizeof(menu_display_ctx_draw_t));
draw.width = width;
draw.height = height;
draw.texture = xmb->textures.bg.id;
draw.handle_alpha = xmb->alpha;
draw.force_transparency = false;
draw.color = &coord_color[0];
draw.color2 = &coord_color2[0];
draw.vertex = NULL;
draw.tex_coord = NULL;
draw.vertex_count = 4;
draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP;
menu_display_ctl(MENU_DISPLAY_CTL_DRAW_BG, &draw);
xmb_draw_text(xmb,
xmb->title_name, xmb->margins.title.left,
@ -1844,12 +1873,22 @@ static void xmb_frame(void *data)
if (render_background)
{
menu_display_draw_bg(
width, height,
xmb->textures.bg.id, xmb->alpha, true,
&coord_color[0], &coord_color2[0],
NULL, NULL, 4,
MENU_DISPLAY_PRIM_TRIANGLESTRIP);
memset(&draw, 0, sizeof(menu_display_ctx_draw_t));
draw.width = width;
draw.height = height;
draw.texture = xmb->textures.bg.id;
draw.handle_alpha = xmb->alpha;
draw.force_transparency = true;
draw.color = &coord_color[0];
draw.color2 = &coord_color2[0];
draw.vertex = NULL;
draw.tex_coord = NULL;
draw.vertex_count = 4;
draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP;
menu_display_ctl(MENU_DISPLAY_CTL_DRAW_BG, &draw);
xmb_render_messagebox_internal(xmb, msg);
}

View File

@ -959,6 +959,7 @@ static void zarch_frame(void *data)
unsigned i;
float coord_color[16];
float coord_color2[16];
menu_display_ctx_draw_t draw;
settings_t *settings = config_get_ptr();
zui_t *zui = (zui_t*)data;
@ -1019,7 +1020,9 @@ static void zarch_frame(void *data)
}
if (settings->menu.mouse.enable)
zarch_zui_draw_cursor(zarch_zui_input_state(zui, MENU_ZARCH_MOUSE_X), zarch_zui_input_state(zui, MENU_ZARCH_MOUSE_Y));
zarch_zui_draw_cursor(
zarch_zui_input_state(zui, MENU_ZARCH_MOUSE_X),
zarch_zui_input_state(zui, MENU_ZARCH_MOUSE_Y));
if (!zarch_zui_input_state(zui, MENU_ZARCH_PRESSED))
@ -1028,24 +1031,35 @@ static void zarch_frame(void *data)
zui->item.active = -1;
menu_display_ctl(MENU_DISPLAY_CTL_BLEND_BEGIN, NULL);
draw.x = 0;
draw.y = 0;
draw.width = zui->width;
draw.height = zui->height;
draw.coords = (struct gfx_coords*)&zui->ca;
draw.matrix_data = &zui->mvp;
draw.texture = zui->textures.white;
draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLES;
menu_display_draw(
0,
0,
zui->width,
zui->height,
(struct gfx_coords*)&zui->ca,
&zui->mvp, zui->textures.white,
MENU_DISPLAY_PRIM_TRIANGLES);
menu_display_ctl(MENU_DISPLAY_CTL_DRAW, &draw);
menu_display_ctl(MENU_DISPLAY_CTL_BLEND_END, NULL);
menu_display_draw_bg(
zui->width, zui->height,
zui->textures.bg.id, 0.75f, false,
&coord_color[0], &coord_color2[0],
NULL, menu_display_get_tex_coords(), 4,
MENU_DISPLAY_PRIM_TRIANGLESTRIP);
memset(&draw, 0, sizeof(menu_display_ctx_draw_t));
draw.width = zui->width;
draw.height = zui->height;
draw.texture = zui->textures.bg.id;
draw.handle_alpha = 0.75f;
draw.force_transparency = false;
draw.color = &coord_color[0];
draw.color2 = &coord_color2[0];
draw.vertex = NULL;
draw.tex_coord = menu_display_get_tex_coords();
draw.vertex_count = 4;
draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP;
menu_display_ctl(MENU_DISPLAY_CTL_DRAW_BG, &draw);
zui->rendering = false;

View File

@ -456,6 +456,28 @@ bool menu_display_ctl(enum menu_display_ctl_state state, void *data)
clearcolor->g, clearcolor->b, clearcolor->a);
}
break;
case MENU_DISPLAY_CTL_DRAW:
{
menu_display_ctx_draw_t *draw = (menu_display_ctx_draw_t*)data;
if (!menu_disp || !menu_disp->draw || !data)
return false;
menu_disp->draw(draw->x, draw->y, draw->width, draw->height,
draw->coords, draw->matrix_data, draw->texture, draw->prim_type);
}
break;
case MENU_DISPLAY_CTL_DRAW_BG:
{
menu_display_ctx_draw_t *draw = (menu_display_ctx_draw_t*)data;
if (!menu_disp || !menu_disp->draw_bg || !data)
return false;
menu_disp->draw_bg(draw->width, draw->height,
draw->texture, draw->handle_alpha,
draw->force_transparency, draw->color,
draw->color2, draw->vertex, draw->tex_coord,
draw->vertex_count, draw->prim_type);
}
break;
case MENU_DISPLAY_CTL_NONE:
default:
break;
@ -512,46 +534,6 @@ void menu_display_matrix_4x4_rotate_z(
matrix_4x4_multiply(matrix, &matrix_scaled, matrix);
}
void menu_display_draw(float x, float y,
unsigned width, unsigned height,
struct gfx_coords *coords,
void *matrix_data,
uintptr_t texture,
enum menu_display_prim_type prim_type
)
{
menu_display_ctx_driver_t *menu_disp =
menu_display_context_get_ptr();
if (!menu_disp || !menu_disp->draw)
return;
menu_disp->draw(x, y, width, height,
coords, matrix_data, texture, prim_type);
}
void menu_display_draw_bg(
unsigned width, unsigned height,
uintptr_t texture,
float handle_alpha,
bool force_transparency,
float *color,
float *color2,
const float *vertex,
const float *tex_coord,
size_t vertex_count,
enum menu_display_prim_type prim_type
)
{
menu_display_ctx_driver_t *menu_disp = menu_display_context_get_ptr();
if (!menu_disp || !menu_disp->draw_bg)
return;
menu_disp->draw_bg(width, height, texture, handle_alpha,
force_transparency, color,
color2, vertex, tex_coord, vertex_count, prim_type);
}
const float *menu_display_get_tex_coords(void)
{
menu_display_ctx_driver_t *menu_disp = menu_display_context_get_ptr();

View File

@ -74,7 +74,9 @@ enum menu_display_ctl_state
MENU_DISPLAY_CTL_BLEND_BEGIN,
MENU_DISPLAY_CTL_BLEND_END,
MENU_DISPLAY_CTL_RESTORE_CLEAR_COLOR,
MENU_DISPLAY_CTL_CLEAR_COLOR
MENU_DISPLAY_CTL_CLEAR_COLOR,
MENU_DISPLAY_CTL_DRAW,
MENU_DISPLAY_CTL_DRAW_BG
};
enum menu_display_prim_type
@ -177,27 +179,6 @@ bool menu_display_ctl(enum menu_display_ctl_state state, void *data);
void menu_display_timedate(char *s, size_t len, unsigned time_mode);
void menu_display_draw(float x, float y,
unsigned width, unsigned height,
struct gfx_coords *coords,
void *matrix_data,
uintptr_t texture,
enum menu_display_prim_type prim_type
);
void menu_display_draw_bg(
unsigned width, unsigned height,
uintptr_t texture,
float handle_alpha,
bool force_transparency,
float *color,
float *color2,
const float *vertex,
const float *tex_coord,
size_t vertex_count,
enum menu_display_prim_type prim_type
);
void menu_display_matrix_4x4_rotate_z(
math_matrix_4x4 *matrix, float rotation,
float scale_x, float scale_y, float scale_z,