From d99a1117428716dee1fd33f76eb304eb99d67abd Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Wed, 15 Jan 2025 10:47:57 +0100 Subject: [PATCH] render set clip, fix render push vertex --- src/render/render_opengl.c | 13 ++++++++++++- src/wasm_app/ui.c | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/render/render_opengl.c b/src/render/render_opengl.c index 5df8f39..321869d 100644 --- a/src/render/render_opengl.c +++ b/src/render/render_opengl.c @@ -14,7 +14,6 @@ struct rn_vertex_t { typedef enum { rn_cmd_kind_null, - rn_cmd_kind_clear, rn_cmd_kind_quad, rn_cmd_kind_set_clip, } rn_cmd_kind_t; @@ -104,6 +103,7 @@ rn_cmd_t *rn_get_cmd(rn_cmd_kind_t kind) { rn_vertex_t *rn_push_vertex(rn_cmd_t *cmd, u32 count) { rn_vertex_t *result = cmd->vertex + cmd->len; + rn_state.len += count; cmd->len += count; return result; } @@ -201,6 +201,11 @@ v2f32_t rn_measure_string(rn_font_t *font, s8_t string) { return rn_base_draw_string(font, string, v2f32(0,0), v4f32(0,0,0,0), false); } +void rn_set_clip(r2f32_t rect) { + rn_cmd_t *cmd = rn_get_cmd(rn_cmd_kind_set_clip); + cmd->rect = rect; +} + void rn_init(ma_arena_t *perm, f32 _font_size) { rn_state.cap = 1024*256; rn_state.vertices = ma_push_array(perm, rn_vertex_t, rn_state.cap); @@ -323,6 +328,12 @@ void rn_end(v2f32_t window_size, v4f32_t color) { GLint s_texture = 0; // texture unit that sampler2D will use in GLSL code glBindTextureUnit(s_texture, rn_state.main_font.texture_id); glDrawArrays(GL_TRIANGLES, 0, it->len); + } else if (it->kind == rn_cmd_kind_set_clip) { + GLint x = (GLint)it->rect.min.x; + GLint y = (GLint)it->rect.min.y; + GLsizei w = (GLsizei)(it->rect.max.x - x); + GLsizei h = (GLsizei)(it->rect.max.y - y); + glScissor(x, (GLint)window_size.y - (GLint)it->rect.max.y, w, h); } else_is_invalid; } diff --git a/src/wasm_app/ui.c b/src/wasm_app/ui.c index 82ab615..fb7c820 100644 --- a/src/wasm_app/ui.c +++ b/src/wasm_app/ui.c @@ -373,6 +373,7 @@ fn void ui_draw(void) { rect_color = accent1_color_global; } + // rn_set_clip(box->parent->rect); if (is_flag_set(box->flags, ui_box_flag_draw_rect)) { rn_draw_rect(box->rect, rect_color); }