app_update, print events

This commit is contained in:
krzosa
2024-12-29 10:26:42 +01:00
parent a30a897272
commit 6939170478
11 changed files with 68 additions and 68 deletions

View File

@@ -80,10 +80,10 @@ void meta_app(ma_arena_t *arena) {
// Javascript // Javascript
{ {
int name_idx = row_findi(keys->first, "name"); i32 name_idx = row_findi(keys->first, "name");
int js1_idx = row_findi(keys->first, "js1"); i32 js1_idx = row_findi(keys->first, "js1");
int js2_idx = row_findi(keys->first, "js2"); i32 js2_idx = row_findi(keys->first, "js2");
int filter_out_idx = row_findi(keys->first, "jf"); i32 filter_out_idx = row_findi(keys->first, "jf");
sb8_stmtf(c, "\n#if PLATFORM_WASM"); sb8_stmtf(c, "\n#if PLATFORM_WASM");
@@ -99,7 +99,7 @@ void meta_app(ma_arena_t *arena) {
s8_t js[] = {row_geti(row, js1_idx)->string, row_geti(row, js2_idx)->string}; s8_t js[] = {row_geti(row, js1_idx)->string, row_geti(row, js2_idx)->string};
for (i32 i = 0; i < lengthof(js); i += 1) { for (i32 i = 0; i < lengthof(js); i += 1) {
if (s8_equal(js[i], s8_lit("XXX"))) continue; if (s8_equal(js[i], s8_lit("XXX"))) continue;
sb8_stmtf(c, "else if (s8_equal_ex(key, s8_lit(\"%S\"), s8_ignore_case)) return (wasm_key_map_t){app_key_%S, %d};", js[i], name, (int)filter_out); sb8_stmtf(c, "else if (s8_equal_ex(key, s8_lit(\"%S\"), s8_ignore_case)) return (wasm_key_map_t){app_key_%S, %d};", js[i], name, (i32)filter_out);
} }
} }
sb8_stmtf(c, "return (wasm_key_map_t){0};"); sb8_stmtf(c, "return (wasm_key_map_t){0};");
@@ -110,9 +110,9 @@ void meta_app(ma_arena_t *arena) {
// Windows // Windows
{ {
int name_idx = row_findi(keys->first, "name"); i32 name_idx = row_findi(keys->first, "name");
int w1i = row_findi(keys->first, "windows1"); i32 w1i = row_findi(keys->first, "windows1");
int w2i = row_findi(keys->first, "windows2"); i32 w2i = row_findi(keys->first, "windows2");
sb8_stmtf(c, "\n#if PLATFORM_WINDOWS"); sb8_stmtf(c, "\n#if PLATFORM_WINDOWS");
sb8_stmtf(c, "void w32_key_dispatch(WPARAM wparam, void (*handle_key)(app_key_t)) {"); sb8_stmtf(c, "void w32_key_dispatch(WPARAM wparam, void (*handle_key)(app_key_t)) {");

View File

@@ -8,8 +8,7 @@ f64 wasm_measure_text(isize str, i32 len, isize font_str, i32 font_len, i32 fon
f64 wasm_get_font_height(isize font_str, i32 font_len, i32 font_size); f64 wasm_get_font_height(isize font_str, i32 font_len, i32 font_size);
void wasm_set_clip(f64 x, f64 y, f64 w, f64 h); void wasm_set_clip(f64 x, f64 y, f64 w, f64 h);
void on_update(); void app_update(ma_arena_t *perm_arena, app_event_t *events, i32 event_count);
void app_update(app_event_t *events);
extern char __heap_base; extern char __heap_base;
ma_arena_t wasm_perm_arena; ma_arena_t wasm_perm_arena;
@@ -30,7 +29,7 @@ b32 wasm_event_failed_to_queue;
f64 wasm_last_time = 0; f64 wasm_last_time = 0;
void write_to_console(char *string) { void write_to_console(char *string) {
int len = str_len(string); i32 len = str_len(string);
wasm_write_to_console((isize)string, len); wasm_write_to_console((isize)string, len);
} }
@@ -47,7 +46,7 @@ f64 get_font_height(void) {
return wasm_get_font_height((isize) font_face, font_face_len, 20*wasm_dpr) / wasm_dpr; return wasm_get_font_height((isize) font_face, font_face_len, 20*wasm_dpr) / wasm_dpr;
} }
f64 measure_text_ex(char *str, int len) { f64 measure_text_ex(char *str, i32 len) {
return wasm_measure_text((isize)str, len, (isize) font_face, font_face_len, 20*wasm_dpr) / wasm_dpr; return wasm_measure_text((isize)str, len, (isize) font_face, font_face_len, 20*wasm_dpr) / wasm_dpr;
} }
@@ -55,15 +54,15 @@ f64 measure_text(char *str) {
return measure_text_ex(str, str_len(str)); return measure_text_ex(str, str_len(str));
} }
void draw_text(v2f64_t pos, v4f32_t color, char *str, int len) { void draw_text(v2f64_t pos, v4f32_t color, s8_t string) {
wasm_draw_text((isize)str, len, wasm_dpr * pos.x, wasm_dpr * pos.y, (isize) font_face, font_face_len, 20*wasm_dpr, color.r * 255.f, color.g * 255.f, color.b * 255.f, color.a); wasm_draw_text((isize)string.str, string.len, wasm_dpr * pos.x, wasm_dpr * pos.y, (isize) font_face, font_face_len, 20*wasm_dpr, color.r * 255.f, color.g * 255.f, color.b * 255.f, color.a);
} }
void draw_textf(v2f64_t pos, char *str, ...) { void draw_textf(v2f64_t pos, char *str, ...) {
char buff[1024]; char buff[1024];
va_list args; va_list args;
va_start(args, str); va_start(args, str);
int len = stbsp_vsnprintf(buff, sizeof(buff), str, args); i32 len = stbsp_vsnprintf(buff, sizeof(buff), str, args);
va_end(args); va_end(args);
wasm_draw_text((isize)buff, len, wasm_dpr * pos.x, wasm_dpr * pos.y, (isize) font_face, font_face_len, 20*wasm_dpr, 0, 0, 0, 1); wasm_draw_text((isize)buff, len, wasm_dpr * pos.x, wasm_dpr * pos.y, (isize) font_face, font_face_len, 20*wasm_dpr, 0, 0, 0, 1);
@@ -173,7 +172,7 @@ WASM_EXPORT void wasm_key_up(char *key, b32 ctrl, b32 shift, b32 alt, b32 meta)
wasm_key_map_t map = wasm_map_key_string_to_app_key(key8); wasm_key_map_t map = wasm_map_key_string_to_app_key(key8);
if (map.key != app_key_invalid) { if (map.key != app_key_invalid) {
wasm_add_event((app_event_t){ wasm_add_event((app_event_t){
.kind = app_event_kind_key_down, .kind = app_event_kind_key_up,
.key = map.key, .key = map.key,
.ctrl = ctrl, .ctrl = ctrl,
.shift = shift, .shift = shift,
@@ -193,7 +192,7 @@ WASM_EXPORT void wasm_update(f64 time, f64 width, f64 height, f64 dpr) {
} }
wasm_dpr = dpr; wasm_dpr = dpr;
on_update(); app_update(&wasm_perm_arena, wasm_events.data, wasm_events.len);
wasm_events.len = 0; wasm_events.len = 0;
wasm_last_time = time; wasm_last_time = time;

View File

@@ -117,8 +117,8 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int n
continue; continue;
} }
for (int y = 0; y < 720; y++) { for (i32 y = 0; y < 720; y++) {
for (int x = 0; x < 1280; x++) { for (i32 x = 0; x < 1280; x++) {
mem[x + y * 1280] = 0xFFFF0000; mem[x + y * 1280] = 0xFFFF0000;
} }
} }

View File

@@ -1,4 +1,4 @@
void memory_copy(void *dst, void *src, size_t n) { void memory_copy(void *dst, void *src, usize n) {
#if PLATFORM_CLANG #if PLATFORM_CLANG
__builtin_memcpy(dst, src, n); __builtin_memcpy(dst, src, n);
#else #else
@@ -6,7 +6,7 @@ void memory_copy(void *dst, void *src, size_t n) {
#endif #endif
} }
void memory_move(void *dest, const void *src, size_t n) { void memory_move(void *dest, const void *src, usize n) {
#if PLATFORM_CLANG #if PLATFORM_CLANG
__builtin_memmove(dest, src, n); __builtin_memmove(dest, src, n);
#else #else
@@ -14,7 +14,7 @@ void memory_move(void *dest, const void *src, size_t n) {
#endif #endif
} }
void memory_set(void *dst, int c, size_t size) { void memory_set(void *dst, i32 c, usize size) {
#if PLATFORM_CLANG #if PLATFORM_CLANG
__builtin_memset(dst, c, size); __builtin_memset(dst, c, size);
#else #else
@@ -53,11 +53,11 @@ f32 f32_mod(f32 a, f32 b) { return fmodf(a, b); }
#endif #endif
#if PLATFORM_WINDOWS #if PLATFORM_WINDOWS
void *vmem_reserve(size_t size) { void *vmem_reserve(usize size) {
void *result = (uint8_t *)VirtualAlloc(0, size, MEM_RESERVE, PAGE_READWRITE); void *result = (uint8_t *)VirtualAlloc(0, size, MEM_RESERVE, PAGE_READWRITE);
return result; return result;
} }
b32 vmem_commit(void *p, size_t size) { b32 vmem_commit(void *p, usize size) {
void *result = VirtualAlloc(p, size, MEM_COMMIT, PAGE_READWRITE); void *result = VirtualAlloc(p, size, MEM_COMMIT, PAGE_READWRITE);
return result ? true : false; return result ? true : false;
} }
@@ -65,15 +65,15 @@ b32 vmem_release(void *p) {
BOOL result = VirtualFree(p, 0, MEM_RELEASE); BOOL result = VirtualFree(p, 0, MEM_RELEASE);
return result ? true : false; return result ? true : false;
} }
b32 vmem_decommit(void *p, size_t size) { b32 vmem_decommit(void *p, usize size) {
BOOL result = VirtualFree(p, size, MEM_DECOMMIT); BOOL result = VirtualFree(p, size, MEM_DECOMMIT);
return result ? true : false; return result ? true : false;
} }
#else #else
void *vmem_reserve(size_t size) { return NULL; } void *vmem_reserve(usize size) { return NULL; }
b32 vmem_commit(void *p, size_t size) { return false; } b32 vmem_commit(void *p, usize size) { return false; }
b32 vmem_release(void *p) { return true; } b32 vmem_release(void *p) { return true; }
b32 vmem_decommit(void *p, size_t size) { return true; } b32 vmem_decommit(void *p, usize size) { return true; }
#endif #endif
#if PLATFORM_WASM #if PLATFORM_WASM

View File

@@ -2,7 +2,7 @@ typedef enum lex_kind_t lex_kind_t;
enum lex_kind_t { enum lex_kind_t {
#define LEX_KIND_XLIST\ #define LEX_KIND_XLIST\
X(eof, "end of file", "---")\ X(eof, "end of file", "---")\
X(int, "integer", "---")\ X(integer, "integer", "---")\
X(real, "real", "---")\ X(real, "real", "---")\
X(ident, "identifier", "---")\ X(ident, "identifier", "---")\
X(string, "string", "---")\ X(string, "string", "---")\
@@ -84,8 +84,8 @@ struct lex_t {
s8_t s8; s8_t s8;
}; };
int line; i32 line;
int column; i32 column;
char *file_name; char *file_name;
union { union {
@@ -99,14 +99,14 @@ typedef struct lexer_t lexer_t;
struct lexer_t { struct lexer_t {
char *at; char *at;
char *file_name; char *file_name;
int line; i32 line;
int column; i32 column;
}; };
typedef struct lex_array_t lex_array_t; typedef struct lex_array_t lex_array_t;
struct lex_array_t { struct lex_array_t {
lex_t *data; lex_t *data;
int len; i32 len;
}; };
void lex_panicf(lex_t *token, const char *str, ...) { void lex_panicf(lex_t *token, const char *str, ...) {
@@ -184,7 +184,7 @@ u64 lex_deserial_u64(char *string, i64 len, u64 base) {
} }
void lex_eat_number(lexer_t *lex, lex_t *token) { void lex_eat_number(lexer_t *lex, lex_t *token) {
token->kind = lex_kind_int; token->kind = lex_kind_integer;
for (;;) { for (;;) {
if (char_is_digit(lex->at[0])) { if (char_is_digit(lex->at[0])) {
lex_advance(lex); lex_advance(lex);
@@ -208,16 +208,16 @@ void lex_eat_number(lexer_t *lex, lex_t *token) {
} else if (lex_match(lex, 'd')) { } else if (lex_match(lex, 'd')) {
token->kind = lex_kind_real; token->kind = lex_kind_real;
token->suffix = lex_suffix_d; token->suffix = lex_suffix_d;
} else if (token->kind == lex_kind_int && ((lex->at[0] == 'u' && lex->at[1] == 'l' && lex->at[2] == 'l') || (lex->at[0] == 'U' && lex->at[1] == 'L' && lex->at[2] == 'L'))) { } else if (token->kind == lex_kind_integer && ((lex->at[0] == 'u' && lex->at[1] == 'l' && lex->at[2] == 'l') || (lex->at[0] == 'U' && lex->at[1] == 'L' && lex->at[2] == 'L'))) {
token->suffix = lex_suffix_ull; token->suffix = lex_suffix_ull;
lex_advance(lex); lex_advance(lex); lex_advance(lex); lex_advance(lex); lex_advance(lex); lex_advance(lex);
} else if (token->kind == lex_kind_int && ((lex->at[0] == 'u' && lex->at[1] == 'l') || (lex->at[0] == 'U' && lex->at[1] == 'L'))) { } else if (token->kind == lex_kind_integer && ((lex->at[0] == 'u' && lex->at[1] == 'l') || (lex->at[0] == 'U' && lex->at[1] == 'L'))) {
token->suffix = lex_suffix_ul; token->suffix = lex_suffix_ul;
lex_advance(lex); lex_advance(lex); lex_advance(lex); lex_advance(lex);
} else if (token->kind == lex_kind_int && (lex->at[0] == 'l' || lex->at[0] == 'L')) { } else if (token->kind == lex_kind_integer && (lex->at[0] == 'l' || lex->at[0] == 'L')) {
token->suffix = lex_suffix_l; token->suffix = lex_suffix_l;
lex_advance(lex); lex_advance(lex);
} else if (token->kind == lex_kind_int && ((lex->at[0] == 'l' && lex->at[1] == 'l') || (lex->at[0] == 'L' && lex->at[1] == 'L'))) { } else if (token->kind == lex_kind_integer && ((lex->at[0] == 'l' && lex->at[1] == 'l') || (lex->at[0] == 'L' && lex->at[1] == 'L'))) {
token->suffix = lex_suffix_ll; token->suffix = lex_suffix_ll;
lex_advance(lex); lex_advance(lex); lex_advance(lex); lex_advance(lex);
} }
@@ -366,9 +366,9 @@ void lex_token_ex(lexer_t *lex, lex_t *token) {
} }
} }
token->len = (int)(lex->at - token->str); token->len = (i32)(lex->at - token->str);
if (token->kind == lex_kind_int) { if (token->kind == lex_kind_integer) {
token->integer = lex_deserial_u64(token->str, token->len, 10); token->integer = lex_deserial_u64(token->str, token->len, 10);
} else if (token->kind == lex_kind_real) { } else if (token->kind == lex_kind_real) {
token->real = s8_deserial_f64(token->s8); token->real = s8_deserial_f64(token->s8);

View File

@@ -1,11 +1,11 @@
#define STR_FMT(buff, str) \ #define STR_FMT(buff, str) \
va_list args1; \ va_list args1; \
va_start(args1, str); \ va_start(args1, str); \
int len = stbsp_vsnprintf(buff, sizeof(buff), str, args1); \ i32 len = stbsp_vsnprintf(buff, sizeof(buff), str, args1); \
va_end(args1) va_end(args1)
int str_len(char *str) { i32 str_len(char *str) {
int i = 0; i32 i = 0;
while (str[i]) i += 1; while (str[i]) i += 1;
return i; return i;
} }

View File

@@ -160,7 +160,7 @@ s8_t s8_trim_end(s8_t string) {
return result; return result;
} }
typedef int s8_seek_t; typedef i32 s8_seek_t;
enum { enum {
s8_seek_none = 0, s8_seek_none = 0,
s8_seek_ignore_case = 1, s8_seek_ignore_case = 1,
@@ -296,7 +296,7 @@ s8_t s8_vfmt(ma_arena_t *ma, const char *str, va_list args1) {
va_end(args2); va_end(args2);
char *result = (char *)ma_push_size(ma, sizeof(char) * (len + 1)); char *result = (char *)ma_push_size(ma, sizeof(char) * (len + 1));
s8_vsnprintf(result, (int)(len + 1), str, args1); s8_vsnprintf(result, (i32)(len + 1), str, args1);
s8_t res = s8(result, len); s8_t res = s8(result, len);
return res; return res;
} }
@@ -358,7 +358,7 @@ s8_t sb8_merge(sb8_t *sb) {
return result; return result;
} }
typedef int s8_split_t; typedef i32 s8_split_t;
enum { enum {
s8_split_none = 0, s8_split_none = 0,
s8_split_ignore_case = 1, s8_split_ignore_case = 1,

View File

@@ -206,7 +206,7 @@ i64 parser__match_i64(parser_t *par) {
if (parser_match(par, lex_kind_minus)) { if (parser_match(par, lex_kind_minus)) {
minus = -1; minus = -1;
} }
lex_t *token = parser_expect(par, lex_kind_int); lex_t *token = parser_expect(par, lex_kind_integer);
i64 result = (i64)token->integer * minus; i64 result = (i64)token->integer * minus;
return result; return result;
} }
@@ -254,25 +254,25 @@ void s8_deserial_data_ex(ma_arena_t *arena, parser_t *par, void *p, type_t *type
return; return;
} break; } break;
case type_kind_u8: { case type_kind_u8: {
lex_t *token = parser_expect(par, lex_kind_int); lex_t *token = parser_expect(par, lex_kind_integer);
u8 *n = (u8 *)p; u8 *n = (u8 *)p;
n[0] = (u8)token->integer; n[0] = (u8)token->integer;
return; return;
} break; } break;
case type_kind_u16: { case type_kind_u16: {
lex_t *token = parser_expect(par, lex_kind_int); lex_t *token = parser_expect(par, lex_kind_integer);
u16 *n = (u16 *)p; u16 *n = (u16 *)p;
n[0] = (u16)token->integer; n[0] = (u16)token->integer;
return; return;
} break; } break;
case type_kind_u32: { case type_kind_u32: {
lex_t *token = parser_expect(par, lex_kind_int); lex_t *token = parser_expect(par, lex_kind_integer);
u32 *n = (u32 *)p; u32 *n = (u32 *)p;
n[0] = (u32)token->integer; n[0] = (u32)token->integer;
return; return;
} break; } break;
case type_kind_u64: { case type_kind_u64: {
lex_t *token = parser_expect(par, lex_kind_int); lex_t *token = parser_expect(par, lex_kind_integer);
u64 *n = (u64 *)p; u64 *n = (u64 *)p;
n[0] = (u64)token->integer; n[0] = (u64)token->integer;
return; return;
@@ -295,7 +295,7 @@ void s8_deserial_data_ex(ma_arena_t *arena, parser_t *par, void *p, type_t *type
return; return;
} break; } break;
case type_kind_usize: { case type_kind_usize: {
lex_t *token = parser_expect(par, lex_kind_int); lex_t *token = parser_expect(par, lex_kind_integer);
usize *n = (usize *)p; usize *n = (usize *)p;
n[0] = (usize)token->integer; n[0] = (usize)token->integer;
return; return;

View File

@@ -42,7 +42,7 @@ typedef double f64;
#define mib(x) (1024ULL * kib(x)) #define mib(x) (1024ULL * kib(x))
#define gib(x) (1024ULL * mib(x)) #define gib(x) (1024ULL * mib(x))
#define DEFER_LOOP(begin, end) for (int PASTE(_i_, __LINE__) = (begin, 0); !PASTE(_i_, __LINE__); PASTE(_i_, __LINE__) += (end, 1)) #define DEFER_LOOP(begin, end) for (i32 PASTE(_i_, __LINE__) = (begin, 0); !PASTE(_i_, __LINE__); PASTE(_i_, __LINE__) += (end, 1))
#define STACK(type, size) struct { type data[size]; i32 len; } #define STACK(type, size) struct { type data[size]; i32 len; }
#define STACK_PUSH(stack, ...) (assert((stack).len < lengthof((stack).data)), (stack).data[(stack).len++] = __VA_ARGS__) #define STACK_PUSH(stack, ...) (assert((stack).len < lengthof((stack).data)), (stack).data[(stack).len++] = __VA_ARGS__)
#define STACK_POP(stack) (assert((stack).len > 0), (stack).data[--(stack).len]) #define STACK_POP(stack) (assert((stack).len > 0), (stack).data[--(stack).len])
@@ -297,11 +297,11 @@ struct sb8_t {
sb8_node_t *first; sb8_node_t *first;
sb8_node_t *last; sb8_node_t *last;
int indent; i32 indent;
}; };
i64 wstr_len(wchar_t *string); i64 wstr_len(wchar_t *string);
int str_len(char *str); i32 str_len(char *str);
char char_to_lower_case(char a); char char_to_lower_case(char a);
char char_to_upper_case(char a); char char_to_upper_case(char a);

View File

@@ -69,7 +69,7 @@ ast_t *create_ast_binary(parser_t *par, lex_t *pos, ast_t *left, lex_kind_t op,
ast_t *parse_expr(parser_t *par); ast_t *parse_expr(parser_t *par);
ast_t *parse_lit_expr(parser_t *par) { ast_t *parse_lit_expr(parser_t *par) {
lex_t *token = parser_next(par); lex_t *token = parser_next(par);
if (token->kind == lex_kind_int) { if (token->kind == lex_kind_integer) {
ast_t *result = create_ast(par, token, set_bit(ast_flag_integer) | set_bit(ast_flag_string)); ast_t *result = create_ast(par, token, set_bit(ast_flag_integer) | set_bit(ast_flag_string));
result->integer = token->integer; result->integer = token->integer;
result->string = token->s8; result->string = token->s8;
@@ -203,7 +203,7 @@ ast_t *parse_struct_mem(parser_t *par, s8_t *name) {
while (parser_match(par, lex_kind_open_bracket)) { while (parser_match(par, lex_kind_open_bracket)) {
ast_t *array = create_ast(par, par->at, set_bit(ast_flag_type_array) | set_bit(ast_flag_string)); ast_t *array = create_ast(par, par->at, set_bit(ast_flag_type_array) | set_bit(ast_flag_string));
ast_append(array, type); ast_append(array, type);
lex_t *num = parser_match(par, lex_kind_int); lex_t *num = parser_match(par, lex_kind_integer);
if (num) { if (num) {
array->flags |= set_bit(ast_flag_integer); array->flags |= set_bit(ast_flag_integer);
array->integer = (int)num->integer; array->integer = (int)num->integer;
@@ -286,7 +286,7 @@ ast_t *parse_table(ma_arena_t *arena, char *file, char *code) {
ast_t *col = create_ast(par, par->at, set_bit(ast_flag_string)); ast_t *col = create_ast(par, par->at, set_bit(ast_flag_string));
ast_append(row, col); ast_append(row, col);
col->string = token->s8; col->string = token->s8;
} else if (parser_match(par, lex_kind_int)) { } else if (parser_match(par, lex_kind_integer)) {
ast_t *col = create_ast(par, par->at, set_bit(ast_flag_string) | set_bit(ast_flag_integer)); ast_t *col = create_ast(par, par->at, set_bit(ast_flag_string) | set_bit(ast_flag_integer));
ast_append(row, col); ast_append(row, col);
col->string = token->s8; col->string = token->s8;

View File

@@ -5,15 +5,16 @@
// #include "debug.c" // #include "debug.c"
// #include "ui2.c" // #include "ui2.c"
void on_update() { ma_arena_t *frame_arena;
// r2f64_t rect = {0, 0, 200, 200};
// draw_rect(rect, (v4f32_t){0, 0, 0, 1});
// draw_textf((v2f64_t){10 + i, 100}, "time = %f, dt = %f", time_g / 1000, dt_g);
// f64_mod(4, 2); void app_update(ma_arena_t *perm_arena, app_event_t *events, i32 event_count) {
if (frame_arena == NULL) {
// i += 1; frame_arena = ma_push_arena(perm_arena, kib(32));
// if (i > 200) i = 0; }
for (i32 i = 0; i < event_count; i += 1) {
// ui_demo(); s8_t string = s8_serial_data(frame_arena, events + i, &type__app_event_t);
draw_text((v2f64_t){0, (f64)i*20.0}, white_color_global, string);
}
ma_set0(frame_arena);
} }