This commit is contained in:
krzosa
2024-12-30 16:09:02 +01:00
parent bfdd384f90
commit 578fa33605
21 changed files with 494 additions and 259 deletions

View File

@@ -1,62 +1,63 @@
#define WASM_EXPORT __attribute__((visibility("default")))
#define glb_wasm_export __attribute__((visibility("default")))
#define fn_wasm_export __attribute__((visibility("default")))
#define fn_wasm_import
f64 wasm_parse_float(isize str, i32 len);
void wasm_write_to_console(isize str, i32 len);
void wasm_draw_text(isize str, i32 len, f64 x, f64 y, isize font_str, i32 font_len, i32 font_size, f32 r, f32 g, f32 b, f32 a);
void wasm_draw_rect(f64 x, f64 y, f64 w, f64 h, f32 r, f32 g, f32 b, f32 a);
f64 wasm_measure_text(isize str, i32 len, 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);
fn_wasm_import f64 wasm_parse_float(isize str, i32 len);
fn_wasm_import void wasm_write_to_console(isize str, i32 len);
fn_wasm_import void wasm_draw_text(isize str, i32 len, f64 x, f64 y, isize font_str, i32 font_len, i32 font_size, f32 r, f32 g, f32 b, f32 a);
fn_wasm_import void wasm_draw_rect(f64 x, f64 y, f64 w, f64 h, f32 r, f32 g, f32 b, f32 a);
fn_wasm_import f64 wasm_measure_text(isize str, i32 len, isize font_str, i32 font_len, i32 font_size);
fn_wasm_import f64 wasm_get_font_height(isize font_str, i32 font_len, i32 font_size);
fn_wasm_import void wasm_set_clip(f64 x, f64 y, f64 w, f64 h);
void app_update(ma_arena_t *perm_arena, app_event_t *events, i32 event_count);
glb_wasm_export char wasm_temp_buff1[128] = {[127] = 0x13};
glb_wasm_export i32 wasm_temp_buff1_len = 127;
glb_wasm_export char wasm_temp_buff2[128] = {[127] = 0x13};
glb_wasm_export i32 wasm_temp_buff2_len = 127;
extern char __heap_base;
ma_arena_t wasm_perm_arena;
extern char __heap_base;
glb ma_arena_t wasm_perm_arena;
glb char *font_face = "fira";
glb i32 font_face_len = 4;
glb f64 wasm_dpr;
glb ma_arena_t *wasm_input_text_arena;
glb STACK(app_event_t, 64) wasm_events;
glb b32 wasm_event_failed_to_queue;
glb f64 wasm_last_time = 0;
WASM_EXPORT char wasm_temp_buff1[128] = {[127] = 0x13};
WASM_EXPORT i32 wasm_temp_buff1_len = 127;
WASM_EXPORT char wasm_temp_buff2[128] = {[127] = 0x13};
WASM_EXPORT i32 wasm_temp_buff2_len = 127;
fn void app_update(ma_arena_t *perm_arena, app_event_t *events, i32 event_count);
char *font_face = "fira";
i32 font_face_len = 4;
f64 wasm_dpr;
ma_arena_t *wasm_input_text_arena;
STACK(app_event_t, 64) wasm_events;
b32 wasm_event_failed_to_queue;
f64 wasm_last_time = 0;
void write_to_console(s8_t string) {
wasm_write_to_console((isize)string.str, (i32)string.len);
fn void puts(const char *string) {
wasm_write_to_console((isize)string, (i32)str_len((char *)string));
}
f64 f64_from_s8(s8_t string) {
return wasm_parse_float((isize)string.str, (i32)string.len);
fn double strtod(const char *str, char **end_unused) {
assertf(end_unused == NULL, "second parameter should be null!!");
return wasm_parse_float((isize)str, str_len((char *)str));
}
void set_clip(r2f64_t rect) {
fn void set_clip(r2f64_t rect) {
wasm_set_clip(wasm_dpr * rect.min.x, wasm_dpr * rect.min.y, wasm_dpr * (rect.max.x - rect.min.x), wasm_dpr * (rect.max.y - rect.min.y));
}
f64 get_font_height(void) {
fn f64 get_font_height(void) {
return wasm_get_font_height((isize) font_face, font_face_len, 20*wasm_dpr) / wasm_dpr;
}
f64 measure_text_ex(char *str, i32 len) {
fn 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;
}
f64 measure_text(char *str) {
fn f64 measure_text(char *str) {
return measure_text_ex(str, str_len(str));
}
void draw_text(v2f64_t pos, v4f32_t color, s8_t string) {
fn void draw_text(v2f64_t pos, v4f32_t color, s8_t string) {
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, ...) {
fn void draw_textf(v2f64_t pos, char *str, ...) {
char buff[1024];
va_list args;
va_start(args, str);
@@ -66,11 +67,11 @@ void draw_textf(v2f64_t pos, char *str, ...) {
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);
}
void draw_rect(r2f64_t rect, v4f32_t color) {
fn void draw_rect(r2f64_t rect, v4f32_t color) {
wasm_draw_rect(wasm_dpr * rect.min.x, wasm_dpr * rect.min.y, wasm_dpr * (rect.max.x - rect.min.x), wasm_dpr * (rect.max.y - rect.min.y), color.r * 255.f, color.g * 255.f, color.b * 255.f, color.a);
}
void wasm_add_event(app_event_t event) {
fn void wasm_add_event(app_event_t event) {
if (wasm_events.len < lengthof(wasm_events.data)) {
STACK_PUSH(wasm_events, event);
} else if (wasm_event_failed_to_queue == false) {
@@ -79,7 +80,7 @@ void wasm_add_event(app_event_t event) {
}
}
WASM_EXPORT void wasm_mouse_move(f64 x, f64 y, b32 ctrl, b32 shift, b32 alt, b32 meta) {
fn_wasm_export void wasm_mouse_move(f64 x, f64 y, b32 ctrl, b32 shift, b32 alt, b32 meta) {
wasm_add_event((app_event_t){
.kind = app_event_kind_mouse_move,
.mouse_pos = {x, y},
@@ -90,7 +91,7 @@ WASM_EXPORT void wasm_mouse_move(f64 x, f64 y, b32 ctrl, b32 shift, b32 alt, b32
});
}
WASM_EXPORT void wasm_mouse_down(f64 x, f64 y, i32 button, b32 ctrl, b32 shift, b32 alt, b32 meta) {
fn_wasm_export void wasm_mouse_down(f64 x, f64 y, i32 button, b32 ctrl, b32 shift, b32 alt, b32 meta) {
button += 1;
assert(button >= app_mouse_button_left && button <= app_mouse_button_right);
wasm_add_event((app_event_t){
@@ -104,7 +105,7 @@ WASM_EXPORT void wasm_mouse_down(f64 x, f64 y, i32 button, b32 ctrl, b32 shift,
});
}
WASM_EXPORT void wasm_mouse_up(f64 x, f64 y, i32 button, b32 ctrl, b32 shift, b32 alt, b32 meta) {
fn_wasm_export void wasm_mouse_up(f64 x, f64 y, i32 button, b32 ctrl, b32 shift, b32 alt, b32 meta) {
button += 1;
assert(button >= app_mouse_button_left && button <= app_mouse_button_right);
wasm_add_event((app_event_t){
@@ -118,7 +119,7 @@ WASM_EXPORT void wasm_mouse_up(f64 x, f64 y, i32 button, b32 ctrl, b32 shift, b3
});
}
WASM_EXPORT void wasm_mouse_wheel(f64 delta_x, f64 delta_y, f64 delta_z, b32 ctrl, b32 shift, b32 alt, b32 meta) {
fn_wasm_export void wasm_mouse_wheel(f64 delta_x, f64 delta_y, f64 delta_z, b32 ctrl, b32 shift, b32 alt, b32 meta) {
wasm_add_event((app_event_t){
.kind = app_event_kind_mouse_wheel,
.mouse_wheel_delta = {delta_x, delta_y, delta_z},
@@ -129,7 +130,7 @@ WASM_EXPORT void wasm_mouse_wheel(f64 delta_x, f64 delta_y, f64 delta_z, b32 ctr
});
}
WASM_EXPORT void wasm_key_down(char *key, b32 ctrl, b32 shift, b32 alt, b32 meta) {
fn_wasm_export void wasm_key_down(char *key, b32 ctrl, b32 shift, b32 alt, b32 meta) {
assert(wasm_temp_buff1[127] == 0x13); // make sure we didn't overwrite memory in JS
assert(wasm_temp_buff2[127] == 0x13);
s8_t key8 = s8_from_char(key);
@@ -162,7 +163,7 @@ WASM_EXPORT void wasm_key_down(char *key, b32 ctrl, b32 shift, b32 alt, b32 meta
});
}
WASM_EXPORT void wasm_key_up(char *key, b32 ctrl, b32 shift, b32 alt, b32 meta) {
fn_wasm_export void wasm_key_up(char *key, b32 ctrl, b32 shift, b32 alt, b32 meta) {
assert(wasm_temp_buff1[127] == 0x13); // make sure we didn't overwrite memory in JS
assert(wasm_temp_buff2[127] == 0x13);
s8_t key8 = s8_from_char(key);
@@ -180,7 +181,7 @@ WASM_EXPORT void wasm_key_up(char *key, b32 ctrl, b32 shift, b32 alt, b32 meta)
}
}
WASM_EXPORT void wasm_update(f64 time, f64 width, f64 height, f64 dpr) {
fn_wasm_export void wasm_update(f64 time, f64 width, f64 height, f64 dpr) {
f64 delta_time = (time - wasm_last_time);
for (i32 i = 0; i < wasm_events.len; i += 1) {
wasm_events.data[i].dpr = dpr;
@@ -197,7 +198,7 @@ WASM_EXPORT void wasm_update(f64 time, f64 width, f64 height, f64 dpr) {
ma_set0(wasm_input_text_arena);
}
WASM_EXPORT void wasm_init(void) {
fn_wasm_export void wasm_init(void) {
isize page_size = kib(64);
isize page_count = __builtin_wasm_memory_size(0);
u8 *memory = (u8 *)&__heap_base;
@@ -205,5 +206,5 @@ WASM_EXPORT void wasm_init(void) {
wasm_perm_arena.data = memory;
wasm_perm_arena.commit = wasm_perm_arena.reserve = memory_size;
wasm_input_text_arena = ma_push_arena(&wasm_perm_arena, kib(1));
debugexf("on_init, __builtin_wasm_memory_size(0) = %d(%d)", page_count, memory_size);
debugf("on_init, __builtin_wasm_memory_size(0) = %d(%d)", page_count, memory_size);
}