summaryrefslogtreecommitdiff
path: root/gui.h
diff options
context:
space:
mode:
Diffstat (limited to 'gui.h')
-rw-r--r--gui.h67
1 files changed, 67 insertions, 0 deletions
diff --git a/gui.h b/gui.h
new file mode 100644
index 0000000..e94267a
--- /dev/null
+++ b/gui.h
@@ -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);
+}