don't include generated math into build_file, use cache, ui

This commit is contained in:
Krzosa Karol
2025-01-17 13:35:35 +01:00
parent 0ad84c9fc7
commit d3c84fd666
18 changed files with 255 additions and 164 deletions

View File

@@ -66,8 +66,8 @@ fn void ui_push_box(ui_box_t *parent, ui_box_t *box) {
parent->node_count += 1;
}
fn r2f32_t ui_next_rect(ui_op_t layout_op, r2f32_t *rect, v2f32_t required_size) {
switch (layout_op) {
fn r2f32_t ui_next_rect(ui_op_t op, r2f32_t *rect, v2f32_t required_size) {
switch (op) {
case ui_op_cut_top: return r2f32_cut_top_no_squash(rect, required_size.y); break;
case ui_op_cut_bottom: return r2f32_cut_bottom_no_squash(rect, required_size.y); break;
case ui_op_cut_left: return r2f32_cut_left_no_squash(rect, required_size.x); break;
@@ -95,8 +95,6 @@ fn ui_box_t *ui_build_box_from_id(ui_code_loc_t loc, ui_box_flags_t flags, ui_id
box->id = id;
box->flags = flags;
ui_push_box(ui->top, box);
r2f32_t rect = ui_next_rect(ui->top->layout_op, &ui->top->rect, rn_measure_string(&rn_state.main_font, box->string));
ui_set_rect(box, rect);
return box;
}
@@ -104,6 +102,10 @@ fn ui_box_t *ui_build_box_from_string(ui_code_loc_t loc, ui_box_flags_t flags, s
ui_id_t id = ui_id_from_string(ui_get_hash_string(string));
ui_box_t *box = ui_build_box_from_id(loc, flags, id);
box->string = ui_get_display_string(string);
v2f32_t string_size = rn_measure_string(&rn_state.main_font, box->string);
string_size.x += 50;
r2f32_t rect = ui_next_rect(ui->top->op, &ui->top->rect, string_size);
ui_set_rect(box, rect);
return box;
}
@@ -146,7 +148,7 @@ fn ui_signal_t ui_signal_from_box(ui_box_t *box) {
#define ui_button(...) ui__button(UILOC, __VA_ARGS__)
fn ui_signal_t ui__button(ui_code_loc_t loc, char *str, ...) {
S8_FMT(tcx.temp, str, string);
ui_box_t *box = ui_build_box_from_string(loc, (ui_box_flags_t){ .draw_rect = true, .draw_text = true }, string);
ui_box_t *box = ui_build_box_from_string(loc, (ui_box_flags_t){ .draw_rect = true, .draw_text = true, .fully_center_text = true }, string);
ui_signal_t signal = ui_signal_from_box(box);
return signal;
}
@@ -217,6 +219,7 @@ fn void ui_draw(app_frame_t *frame) {
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;
box->final_rect = box->full_rect;
r2f32_t rect = box->final_rect;
v4f32_t rect_color = primary_color_global;
v4f32_t text_color = black_color_global;
@@ -230,18 +233,21 @@ fn void ui_draw(app_frame_t *frame) {
}
if (box->flags.draw_rect) {
rn_draw_rect(box->full_rect, rect_color);
rn_draw_rect(rect, rect_color);
}
if (box->flags.draw_border) {
rn_draw_rect_border(box->full_rect, accent2_color_global);
rn_draw_rect_border(rect, accent2_color_global);
}
if (box->flags.draw_text) {
v2f32_t string_size = rn_measure_string(&rn_state.main_font, box->string);
v2f32_t rect_size = r2f32_get_size(box->full_rect);
v2f32_t rect_size = r2f32_get_size(rect);
v2f32_t rect_string_diff = v2f32_sub(rect_size, string_size);
v2f32_t center_pos = v2f32_divs(rect_string_diff, 2);
v2f32_t pos_in_rect = v2f32(box->full_rect.min.x, center_pos.y);
v2f32_t pos = v2f32_add(pos_in_rect, box->full_rect.min);
v2f32_t pos_in_rect = v2f32(0, center_pos.y);
if (box->flags.fully_center_text) {
pos_in_rect = center_pos;
}
v2f32_t pos = v2f32_add(pos_in_rect, rect.min);
rn_draw_string(&rn_state.main_font, pos, text_color, box->string);
}
}
@@ -256,13 +262,22 @@ fn void ui_demo_update(app_frame_t *frame) {
for (app_event_t *ev = frame->first_event; ev; ev = ev->next) {
ui_begin_build(UILOC, ev, window_rect_from_frame(frame));
ui->top->layout_op = ui_op_idle;
ui->top->op = ui_op_idle;
ui_box_t *top_box = ui_boxf((ui_box_flags_t){.draw_rect = true, .draw_border = true}, "top_box");
ui_set_rect(top_box, r2f32_cut_top(&ui->top->rect, ui_em(1)));
defer_block(ui_push_top(top_box), ui_pop_top()) {
top_box->op = ui_op_cut_left;
ui_button("file");
ui_button("edit");
}
ui_box_t *scroller_box = ui_boxf((ui_box_flags_t){.draw_rect = true}, "scroller");
ui_set_rect(scroller_box, r2f32_cut_right(&ui->top->rect, ui_em(1)));
ui_box_t *item_box = ui_boxf((ui_box_flags_t){.draw_rect = true}, "item_box");
ui_set_rect(item_box, r2f32_cut_left(&ui->top->rect, ui_max));
// @todo: now actually fill this out with struct data using type info
static f32 scroller_value;
defer_block(ui_push_top(item_box), ui_pop_top()) {
defer_if (ui_begin_expander("app_event_t").clicked, ui_end_expander()) {
@@ -295,7 +310,7 @@ fn void ui_demo_update(app_frame_t *frame) {
f32 scroller_percent = scroller_norm * scrollable_space;
f32 scroller_second = scrollable_space - scroller_percent;
scroller_box->layout_op = ui_op_idle;
scroller_box->op = ui_op_idle;
r2f32_cut_top(&ui->top->rect, scroller_percent * scroller_box_size);
ui_box_t *box = ui_build_box_from_id(UILOC, (ui_box_flags_t){.draw_border = true, .draw_rect = true}, ui_id_from_string(s8_lit("slider")));
ui_set_rect(box, r2f32_cut_top(&ui->top->rect, scroller_size * scroller_box_size));

View File

@@ -15,6 +15,8 @@ struct ui_box_flags_t {
b8 draw_rect: 1;
b8 draw_border: 1;
b8 draw_text: 1;
b8 fully_center_text : 1;
};
typedef enum {
@@ -34,21 +36,24 @@ struct ui_box_t {
ui_box_t *parent;
i32 node_count;
ui_code_loc_t loc;
s8_t string;
r2f32_t full_rect;
r2f32_t rect;
ui_op_t layout_op;
ui_box_flags_t flags;
b8 created_new;
ui_code_loc_t loc;
s8_t string;
ui_box_flags_t flags;
b8 created_new;
ui_op_t op;
r2f32_t full_rect;
r2f32_t rect;
// state
ui_id_t id;
ui_box_t *hash_next;
ui_box_t *hash_prev;
u64 last_touched_event_id;
r2f32_t final_rect;
b32 expanded;
b32 expanded;
};
typedef struct ui_signal_t ui_signal_t;

View File

@@ -85,7 +85,7 @@ fn void ui_test_iterator(void) {
}
s8_t iter_string = sb8_serial_end(scratch.arena, sb);
assert(s8_equal(recursive_string, iter_string));
assert(s8_are_equal(recursive_string, iter_string));
ma_end_scratch(scratch);
}
@@ -102,7 +102,7 @@ fn void ui_test_iterator(void) {
}
s8_t iter_string = sb8_serial_end(scratch.arena, sb);
assert(s8_equal(recursive_string, iter_string));
assert(s8_are_equal(recursive_string, iter_string));
ma_end_scratch(scratch);
}