diff options
Diffstat (limited to 'gui.h')
-rw-r--r-- | gui.h | 67 |
1 files changed, 67 insertions, 0 deletions
@@ -0,0 +1,67 @@ +ui_t beginui(prge_window_t window, input_t input, shader_t shader, rect_t rect, arena_t *arena, f32 padding) +{ + assert(arena); + assert(shader.id); + assert(window.width && window.height); + + v2 start = {rect.start.x, rect.end.y}; + ui_t ui = {window, input, shader, rect, ui_list, start, arena, padding}; + glUseProgram(ui.shader.id); + mat4 projection = ortho(0.0f, ui.window.width, 0.0f, ui.window.height, -1.0f, 1.0f); + shader_set_mat4(ui.shader, SHADER_PROJECTION_MATRIX, projection); + glDisable(GL_DEPTH_TEST); + + f32 width = rect.end.x - rect.start.x; + f32 height = rect.end.y - rect.start.y; + mesh_t background = gen_quad_mesh(ui.arena, DEFAULT_TRANSFORM, width, height); + v2 half_width_height = {width/2.0f, height/2.0f}; + start = v2_add(rect.start, half_width_height); + mat4 world = mat4_make_transl(v3_from_v2(start)); + shader_set_mat4(ui.shader, SHADER_MODEL_MATRIX, world); + v4 color = {0.149f, 0.4f, 0.42f, 1.0f}; + shader_set_v4(ui.shader, "color", color); + draw_mesh(background); + clear_mesh(&background); + + return ui; +} + +i32 button(ui_t *ui, const char *text, f32 width, f32 height) +{ + if (width <= 0.0f || height <= 0.0f) + return 0; + + v4 color = {0.075f, 0.525f, 0.549f, 1.0f}; + i32 pressed = 0; + + v2 last = {ui->last.x + ui->padding, ui->last.y - height - ui->padding}; + rect_t rect = {last, v2_add(last, (v2){width, height})}; + if (in_rect(ui->input.mouse.pos, rect) && !ui->input.mouse.capture) { + color = (v4){0.3f, 0.61f, 0.63f, 1.0f}; + if (is_key_pressed(ui->input.mouse.left)) { + pressed = 1; + printf("%s\n", text); + } + } + + v2 center = {width/2.0f, height/2.0f}; + v2 start = v2_add(last, center); + ui->last.x += width + 2.0f*ui->padding; + mat4 world = mat4_make_transl(v3_from_v2(start)); + + shader_set_mat4(ui->shader, SHADER_MODEL_MATRIX, world); + shader_set_v4(ui->shader, "color", color); + + mesh_t quad = gen_quad_mesh(ui->arena, DEFAULT_TRANSFORM, width, height); + + draw_mesh(quad); + clear_mesh(&quad); + + return pressed; +} + +void endui(void) +{ + glEnable(GL_DEPTH_TEST); + glUseProgram(0); +} |