it's working on web and in window, waow

This commit is contained in:
Krzosa Karol
2025-01-22 11:08:16 +01:00
parent 802141a234
commit e54265fcac
24 changed files with 3320 additions and 1957 deletions

126
src/render/render.c Normal file
View File

@@ -0,0 +1,126 @@
fn rn_cmd_t *rn_get_cmd(rn_cmd_kind_t kind) {
b32 alloc_new = false;
if (rn_state.last_cmd == NULL) {
alloc_new = true;
} else if (rn_state.last_cmd->kind != kind) {
alloc_new = true;
}
rn_cmd_t *result = rn_state.last_cmd;
if (alloc_new) {
result = ma_push_type(tcx.temp, rn_cmd_t);
result->kind = kind;
SLLQ_APPEND(rn_state.first_cmd, rn_state.last_cmd, result);
if (rn_cmd_kind_quad) {
result->vertex = rn_state.vertices + rn_state.len;
}
}
return result;
}
fn 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;
}
fn void rn_push_quad(r2f32_t rect, r2f32_t tex, v4f32_t color) {
rn_cmd_t *cmd = rn_get_cmd(rn_cmd_kind_quad);
rn_vertex_t *v = rn_push_vertex(cmd, 6);
v[0] = (rn_vertex_t){
{rect.min.x, rect.max.y},
{ tex.min.x, tex.max.y},
color
};
v[1] = (rn_vertex_t){
{rect.max.x, rect.max.y},
{ tex.max.x, tex.max.y},
color
};
v[2] = (rn_vertex_t){
{rect.min.x, rect.min.y},
{ tex.min.x, tex.min.y},
color
};
v[3] = (rn_vertex_t){
{rect.min.x, rect.min.y},
{ tex.min.x, tex.min.y},
color
};
v[4] = (rn_vertex_t){
{rect.max.x, rect.max.y},
{ tex.max.x, tex.max.y},
color
};
v[5] = (rn_vertex_t){
{rect.max.x, rect.min.y},
{ tex.max.x, tex.min.y},
color
};
}
fn void rn_draw_rect(r2f32_t rect, v4f32_t color) {
rn_push_quad(rect, rn_state.main_font->white_texture_bounding_box, color);
}
fn void rn_draw_rect_border(r2f32_t rect, v4f32_t color, f32 border_thickness) {
r2f32_t left = r2f32_cut_left(&rect, border_thickness);
r2f32_t right = r2f32_cut_right(&rect, border_thickness);
r2f32_t top = r2f32_cut_top(&rect, border_thickness);
r2f32_t bottom = r2f32_cut_bottom(&rect, border_thickness);
rn_push_quad(left, rn_state.main_font->white_texture_bounding_box, color);
rn_push_quad(right, rn_state.main_font->white_texture_bounding_box, color);
rn_push_quad(top, rn_state.main_font->white_texture_bounding_box, color);
rn_push_quad(bottom, rn_state.main_font->white_texture_bounding_box, color);
}
fn i64 rn_get_char_spacing(rn_font_t *font, u32 codepoint) {
rn_glyph_t *g = rn_get_glyph(font, codepoint);
if (g->xadvance) return (i64)g->xadvance;
return (i64)g->size.x;
}
fn i64 rn_get_line_spacing(rn_font_t *font) {
i64 result = (i64)(font->ascent - font->descent + font->line_gap);
return result;
}
fn v2f32_t rn_base_draw_string(rn_font_t *font, s8_t string, v2f32_t pos, v4f32_t color, b32 draw) {
pos.y += rn_get_line_spacing(font) + font->descent;
v2f32_t original_pos = pos;
for (utf8_iter_t iter = utf8_iterate_ex(string.str, (int)string.len); iter.item; utf8_advance(&iter)) {
u32 codepoint = iter.item;
rn_glyph_t *g = rn_get_glyph(font, codepoint);
r2f32_t rect = r2f32_mindim(v2f32_add(pos, g->offset), g->size);
if (draw && codepoint != '\n' && codepoint != ' ' && codepoint != '\t') {
rn_push_quad(rect, g->atlas_bounding_box, color);
}
pos.x += g->xadvance;
}
v2f32_t result = {pos.x - original_pos.x, font->size};
return result;
}
fn v2f32_t rn_draw_string(rn_font_t *font, v2f32_t pos, v4f32_t color, s8_t string) {
return rn_base_draw_string(font, string, pos, color, true);
}
fn v2f32_t rn_draw_stringf(rn_font_t *font, v2f32_t pos, v4f32_t color, char *str, ...) {
S8_FMT(tcx.temp, str, result);
return rn_draw_string(font, pos, color, result);
}
fn 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);
}
fn void rn_set_clip(r2f32_t rect) {
rn_cmd_t *cmd = rn_get_cmd(rn_cmd_kind_set_clip);
cmd->rect = rect;
}