diff --git a/build_file.c b/build_file.c index 521745f..a1e3f63 100644 --- a/build_file.c +++ b/build_file.c @@ -25,12 +25,19 @@ int main(int argc, char **argv) { ma_arena_t *arena = ma_create(ma_default_reserve_size); meta_app(arena); - bool execute_python_snippets = true; // make sure to not abuse just for quick maths - bool run_server = false; + b32 generate_math_library = false; // WARNING: be wary of this, cause it might break build file + b32 execute_python_snippets = false; // make sure to not abuse just for quick maths + b32 run_server = false; - bool core_test_target = false; - bool win32_target = true; - bool wasm_target = false; + b32 core_test_target = false; + b32 win32_target = true; + b32 wasm_target = false; + + if (generate_math_library) { + os_set_working_dir("../src/core"); + os_systemf("py core_math_gen.py"); + os_set_working_dir("../../build"); + } if (execute_python_snippets) { sb8_t *sb = sb8_serial_begin(arena); @@ -38,11 +45,11 @@ int main(int argc, char **argv) { for (sb8_node_t *it = sb->first; it; it = it->next) { s8_t abs = it->string; - bool is_c_file = s8_ends_with(abs, s8_lit(".c"), true) || s8_ends_with(abs, s8_lit(".cpp"), true) || s8_ends_with(abs, s8_lit(".h"), true) || s8_ends_with(abs, s8_lit(".hpp"), true); + b32 is_c_file = s8_ends_with(abs, s8_lit(".c"), true) || s8_ends_with(abs, s8_lit(".cpp"), true) || s8_ends_with(abs, s8_lit(".h"), true) || s8_ends_with(abs, s8_lit(".hpp"), true); if (!is_c_file) { continue; } - bool is_build_file = s8_ends_with(abs, s8_lit("build_file.c"), true); + b32 is_build_file = s8_ends_with(abs, s8_lit("build_file.c"), true); if (is_build_file) { continue; } diff --git a/src/core/core_math.gen.c b/src/core/core_math.gen.c index ca25f46..47756d2 100644 --- a/src/core/core_math.gen.c +++ b/src/core/core_math.gen.c @@ -1,4 +1,4 @@ -// auto generated using: D:\dev\wasm\src\core\math_gen.py +// auto generated using: C:\dev\wasm\src\core\core_math_gen.py v2f32_t v2f32(f32 x, f32 y) { return (v2f32_t){ x, y }; } v2f32_t v2f32_add(v2f32_t a, v2f32_t b) { return (v2f32_t){ a.x + b.x, a.y + b.y }; } v2f32_t v2f32_adds(v2f32_t a, f32 b) { return (v2f32_t){ a.x + b, a.y + b }; } @@ -260,6 +260,9 @@ r2f32_t r2f32_shrink(r2f32_t rect, v2f32_t value) { return (r2f32_t){ v2f32_add( v2f32_t r2f32_get_size(r2f32_t r) { return (v2f32_t){r.max.x - r.min.x, r.max.y - r.min.y}; } v2f32_t r2f32_get_mid(r2f32_t r) { return v2f32_add(r.min, v2f32_divs(r2f32_get_size(r), 2)); } b32 r2f32_contains(r2f32_t rec, v2f32_t point) { return (point.x >= rec.min.x) && (point.x < rec.max.x) && (point.y >= rec.min.y) && (point.y < rec.max.y); } +r2f32_t r2f32_intersect(r2f32_t a, r2f32_t b) { return (r2f32_t){ .min.x = MAX(a.min.x, b.min.x), .min.y = MAX(a.min.y, b.min.y), .max.x = MIN(a.max.x, b.max.x), .max.y = MIN(a.max.y, b.max.y) }; } +r2f32_t r2f32_union(r2f32_t a, r2f32_t b) { return (r2f32_t){ .min.x = MIN(a.min.x, b.min.x), .min.y = MIN(a.min.y, b.min.y), .max.x = MAX(a.max.x, b.max.x), .max.y = MAX(a.max.y, b.max.y) }; } + r2f64_t r2f64_cut_left(r2f64_t *r, f64 value) { f64 minx = r->min.x; @@ -325,7 +328,9 @@ r2f64_t r2f64_shrink(r2f64_t rect, v2f64_t value) { return (r2f64_t){ v2f64_add( v2f64_t r2f64_get_size(r2f64_t r) { return (v2f64_t){r.max.x - r.min.x, r.max.y - r.min.y}; } v2f64_t r2f64_get_mid(r2f64_t r) { return v2f64_add(r.min, v2f64_divs(r2f64_get_size(r), 2)); } b32 r2f64_contains(r2f64_t rec, v2f64_t point) { return (point.x >= rec.min.x) && (point.x < rec.max.x) && (point.y >= rec.min.y) && (point.y < rec.max.y); } - +r2f64_t r2f64_intersect(r2f64_t a, r2f64_t b) { return (r2f64_t){ .min.x = MAX(a.min.x, b.min.x), .min.y = MAX(a.min.y, b.min.y), .max.x = MIN(a.max.x, b.max.x), .max.y = MIN(a.max.y, b.max.y) }; } +r2f64_t r2f64_union(r2f64_t a, r2f64_t b) { return (r2f64_t){ .min.x = MIN(a.min.x, b.min.x), .min.y = MIN(a.min.y, b.min.y), .max.x = MAX(a.max.x, b.max.x), .max.y = MAX(a.max.y, b.max.y) }; } + r2i32_t r2i32_cut_left(r2i32_t *r, i32 value) { i32 minx = r->min.x; @@ -391,6 +396,9 @@ r2i32_t r2i32_shrink(r2i32_t rect, v2i32_t value) { return (r2i32_t){ v2i32_add( v2i32_t r2i32_get_size(r2i32_t r) { return (v2i32_t){r.max.x - r.min.x, r.max.y - r.min.y}; } v2i32_t r2i32_get_mid(r2i32_t r) { return v2i32_add(r.min, v2i32_divs(r2i32_get_size(r), 2)); } b32 r2i32_contains(r2i32_t rec, v2i32_t point) { return (point.x >= rec.min.x) && (point.x < rec.max.x) && (point.y >= rec.min.y) && (point.y < rec.max.y); } +r2i32_t r2i32_intersect(r2i32_t a, r2i32_t b) { return (r2i32_t){ .min.x = MAX(a.min.x, b.min.x), .min.y = MAX(a.min.y, b.min.y), .max.x = MIN(a.max.x, b.max.x), .max.y = MIN(a.max.y, b.max.y) }; } +r2i32_t r2i32_union(r2i32_t a, r2i32_t b) { return (r2i32_t){ .min.x = MIN(a.min.x, b.min.x), .min.y = MIN(a.min.y, b.min.y), .max.x = MAX(a.max.x, b.max.x), .max.y = MAX(a.max.y, b.max.y) }; } + r2i64_t r2i64_cut_left(r2i64_t *r, i64 value) { i64 minx = r->min.x; @@ -456,7 +464,9 @@ r2i64_t r2i64_shrink(r2i64_t rect, v2i64_t value) { return (r2i64_t){ v2i64_add( v2i64_t r2i64_get_size(r2i64_t r) { return (v2i64_t){r.max.x - r.min.x, r.max.y - r.min.y}; } v2i64_t r2i64_get_mid(r2i64_t r) { return v2i64_add(r.min, v2i64_divs(r2i64_get_size(r), 2)); } b32 r2i64_contains(r2i64_t rec, v2i64_t point) { return (point.x >= rec.min.x) && (point.x < rec.max.x) && (point.y >= rec.min.y) && (point.y < rec.max.y); } - +r2i64_t r2i64_intersect(r2i64_t a, r2i64_t b) { return (r2i64_t){ .min.x = MAX(a.min.x, b.min.x), .min.y = MAX(a.min.y, b.min.y), .max.x = MIN(a.max.x, b.max.x), .max.y = MIN(a.max.y, b.max.y) }; } +r2i64_t r2i64_union(r2i64_t a, r2i64_t b) { return (r2i64_t){ .min.x = MIN(a.min.x, b.min.x), .min.y = MIN(a.min.y, b.min.y), .max.x = MAX(a.max.x, b.max.x), .max.y = MAX(a.max.y, b.max.y) }; } + v2f64_t v2f32_to_v2f64(v2f32_t v) { return (v2f64_t){ (f64)v.x, (f64)v.y }; } v3f64_t v3f32_to_v3f64(v3f32_t v) { return (v3f64_t){ (f64)v.x, (f64)v.y, (f64)v.z }; } v4f64_t v4f32_to_v4f64(v4f32_t v) { return (v4f64_t){ (f64)v.x, (f64)v.y, (f64)v.z, (f64)v.w }; } diff --git a/src/core/core_math_gen.py b/src/core/core_math_gen.py index c12478e..2f5c5d5 100644 --- a/src/core/core_math_gen.py +++ b/src/core/core_math_gen.py @@ -266,6 +266,8 @@ r2f64_t r2f64_shrink(r2f64_t rect, v2f64_t value) { return (r2f64_t){ v2f64_add( v2f64_t r2f64_get_size(r2f64_t r) { return (v2f64_t){r.max.x - r.min.x, r.max.y - r.min.y}; } v2f64_t r2f64_get_mid(r2f64_t r) { return v2f64_add(r.min, v2f64_divs(r2f64_get_size(r), 2)); } b32 r2f64_contains(r2f64_t rec, v2f64_t point) { return (point.x >= rec.min.x) && (point.x < rec.max.x) && (point.y >= rec.min.y) && (point.y < rec.max.y); } +r2f64_t r2f64_intersect(r2f64_t a, r2f64_t b) { return (r2f64_t){ .min.x = MAX(a.min.x, b.min.x), .min.y = MAX(a.min.y, b.min.y), .max.x = MIN(a.max.x, b.max.x), .max.y = MIN(a.max.y, b.max.y) }; } +r2f64_t r2f64_union(r2f64_t a, r2f64_t b) { return (r2f64_t){ .min.x = MIN(a.min.x, b.min.x), .min.y = MIN(a.min.y, b.min.y), .max.x = MAX(a.max.x, b.max.x), .max.y = MAX(a.max.y, b.max.y) }; } """ s = s.replace("r2f64", f"r2{basic_type}") s = s.replace("f64", basic_type) diff --git a/src/render/render_opengl.c b/src/render/render_opengl.c index 321869d..c20715e 100644 --- a/src/render/render_opengl.c +++ b/src/render/render_opengl.c @@ -333,6 +333,8 @@ void rn_end(v2f32_t window_size, v4f32_t color) { GLint y = (GLint)it->rect.min.y; GLsizei w = (GLsizei)(it->rect.max.x - x); GLsizei h = (GLsizei)(it->rect.max.y - y); + if (w <= 0) w = 0; + if (h <= 0) h = 0; glScissor(x, (GLint)window_size.y - (GLint)it->rect.max.y, w, h); } else_is_invalid; } diff --git a/src/wasm_app/main.c b/src/wasm_app/main.c index e270eec..dec5ba8 100644 --- a/src/wasm_app/main.c +++ b/src/wasm_app/main.c @@ -40,8 +40,6 @@ fn b32 app_update(app_frame_t *frame) { assert(frame != NULL); ui_begin_frame(frame); - v2f32_t size = rn_measure_string(&rn_state.main_font, s8_lit("a")); - unused(size); assert(frame->first_event); for (app_event_t *ev = frame->first_event; ev; ev = ev->next) { @@ -127,7 +125,6 @@ fn b32 app_update(app_frame_t *frame) { // scroller { - f32 all_items_size = (f32)item_box->node_count * get_font_size(); f32 item_box_size = r2f32_get_size(item_box->rect).y; diff --git a/src/wasm_app/ui.c b/src/wasm_app/ui.c index fb7c820..c685d9c 100644 --- a/src/wasm_app/ui.c +++ b/src/wasm_app/ui.c @@ -235,7 +235,7 @@ fn void ui_set_indented_string(ui_box_t *box, s8_t string) { box->string = s8_pr fn ui_signal_t ui_push_exp(ui_code_loc_t loc, char *str, ...) { S8_FMT(tcx.temp, str, string); - ui_box_t *box = ui_build_box_from_string(loc, flag2(ui_box_flag_draw_rect, ui_box_flag_draw_text), string); + ui_box_t *box = ui_build_box_from_string(loc, flag1(ui_box_flag_draw_text), string); ui_set_semantic_size(box, ui_percent(1), ui_text()); if (box->created_new) box->expanded = true; @@ -262,7 +262,7 @@ fn void ui_pop_exp(void) { fn ui_box_t *ui_label(ui_code_loc_t loc, char *fmt, ...) { S8_FMT(tcx.temp, fmt, string); - ui_box_t *box = ui_build_box_from_id(loc, flag2(ui_box_flag_draw_rect, ui_box_flag_draw_text), ui_null_id); + ui_box_t *box = ui_build_box_from_id(loc, flag1(ui_box_flag_draw_text), ui_null_id); ui_set_indented_string(box, string); ui_set_semantic_size(box, ui_text(), ui_text()); return box; @@ -364,16 +364,23 @@ fn void ui_draw(void) { // actually draw for (ui_preorder_iter_t it = ui_iterate_preorder(ui->root); ui_preorder_iter_is_valid(it); ui_iter_advance_preorder(&it)) { ui_box_t *box = it.box; + r2f32_t clip_rect = box->rect; + if (box->parent) { + clip_rect = r2f32_intersect(clip_rect, box->parent->rect); + } v4f32_t rect_color = primary_color_global; + v4f32_t text_color = black_color_global; if (ui_is_hot_box(box)) { rect_color = secondary_color_global; + text_color = accent2_color_global; } if (ui_is_active_box(box)) { rect_color = accent1_color_global; + text_color = accent1_color_global; } - // rn_set_clip(box->parent->rect); + rn_set_clip(clip_rect); if (is_flag_set(box->flags, ui_box_flag_draw_rect)) { rn_draw_rect(box->rect, rect_color); } @@ -381,7 +388,7 @@ fn void ui_draw(void) { rn_draw_rect_border(box->rect, accent2_color_global); } if (is_flag_set(box->flags, ui_box_flag_draw_text)) { - rn_draw_string(font, box->rect.min, black_color_global, box->string); + rn_draw_string(font, box->rect.min, text_color, box->string); } } }