port os functions, add testing module

This commit is contained in:
Krzosa Karol
2025-02-02 17:34:06 +01:00
parent 85a6c218b2
commit 9f33ea0914
27 changed files with 1120 additions and 889 deletions

View File

@@ -1,129 +1,30 @@
fn rn_cmd_t *rn_get_cmd(rn_cmd_kind_t kind) {
b32 alloc_new = false;
if (rn->last_cmd == NULL) {
alloc_new = true;
} else if (rn->last_cmd->kind != kind) {
alloc_new = true;
}
#if PLATFORM_WINDOWS
#include "render.h"
#define STB_TRUETYPE_IMPLEMENTATION
#define STBTT_ifloor(x) ((int)f64_floor(x))
#define STBTT_iceil(x) ((int)f64_ceil(x))
#define STBTT_sqrt(x) (f64_sqrt(x))
#define STBTT_pow(x,y) (f64_pow(x,y))
#define STBTT_fmod(x,y) (f64_mod(x,y))
#define STBTT_cos(x) (f64_cos(x))
#define STBTT_acos(x) (f64_acos(x))
#define STBTT_fabs(x) (f64_abs(x))
#define STBTT_assert(x) (assert(x))
#define STBTT_malloc(x,u) (ma_push_size(tcx->temp, x))
#define STBTT_free(x,u)
#define STBTT_strlen(x) (str_len(x))
#define STBTT_memcpy memory_copy
#define STBTT_memset memory_set
#include "stb_truetype.h"
rn_cmd_t *result = rn->last_cmd;
if (alloc_new) {
result = ma_push_type(tcx->temp, rn_cmd_t);
result->kind = kind;
SLLQ_APPEND(rn->first_cmd, rn->last_cmd, result);
#include <windows.h>
#include "glad/glad.h"
#include "glad/glad.c"
if (rn_cmd_kind_quad) {
result->vertex = rn->vertices + rn->len;
}
}
return result;
}
fn rn_vertex_t *rn_push_vertex(rn_cmd_t *cmd, u32 count) {
rn_vertex_t *result = cmd->vertex + cmd->len;
assert(rn->cap >= rn->len + count);
rn->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->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->main_font->white_texture_bounding_box, color);
rn_push_quad(right, rn->main_font->white_texture_bounding_box, color);
rn_push_quad(top, rn->main_font->white_texture_bounding_box, color);
rn_push_quad(bottom, rn->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) {
// old formula :: pos.y += rn_get_line_spacing(font) + font->descent;
pos.y += font->ascent;
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_min_dim(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;
}
#include "render_font.c"
#include "render_basic.c"
#include "render.gen.c"
#include "render_opengl.c"
#else
#include "render_wasm_canvas.c"
#endif