wasm, app

This commit is contained in:
Krzosa Karol
2025-01-22 10:06:30 +01:00
parent 61df7baed0
commit 802141a234
8 changed files with 103 additions and 119 deletions

View File

@@ -36,7 +36,7 @@ int main(int argc, char **argv) {
b32 run_server = false;
b32 core_test_target = true;
b32 win32_target = true;
b32 wasm_target = false;
b32 wasm_target = true;
if (run_server) {
os_systemf("start /D ..\\package ..\\package\\run_server.bat");
@@ -70,12 +70,17 @@ int main(int argc, char **argv) {
}
if (wasm_target && cache_code_modified(s8_lit("../src/wasm_app/main.c"), s8_lit("main.wasm"))) {
if (wasm_target) {
b32 html_code_modified = cache_code_modified(s8_lit("../src/app/app_wasm.html"), s8_lit("../package/index.html"));
b32 wasm_code_modified = cache_code_modified(s8_lit("../src/wasm_app/main.c"), s8_lit("main.wasm"));
if (html_code_modified) {
os_copy("../src/app/app_wasm.html", "../package/index.html", os_copy_overwrite);
}
if (wasm_code_modified) {
ok = os_systemf(
"clang.exe ../src/wasm_app/main.c -o main.wasm"
" -Oz -g -I../src"
" -Wall -Wno-missing-braces"
" -Wall -Wno-missing-braces -Wno-single-bit-bitfield-constant-conversion"
" -fdiagnostics-absolute-paths -fdiagnostics-format=msvc"
" --target=wasm32 -nostdlib -mbulk-memory -msimd128"
" -Wl,-export-dynamic,--allow-undefined,--import-memory,--no-entry,--initial-memory=131072000,--max-memory=4294967296"
@@ -83,6 +88,7 @@ int main(int argc, char **argv) {
os_copy("main.wasm", "../package/main.wasm", os_copy_overwrite);
if (ok != 0) return ok;
}
}
cache_save();
return ok;

View File

@@ -99,7 +99,6 @@ class memory_t {
const canvas = document.getElementById("canvas");
const ctx2d = canvas.getContext('2d');
const mem = new memory_t(new WebAssembly['Memory']({ initial: 2000, maximum: 65536 }));
(async function main() {
if (!ctx2d) {
@@ -107,6 +106,7 @@ const mem = new memory_t(new WebAssembly['Memory']({ initial: 2000, maximum: 655
return;
}
const mem = new memory_t(new WebAssembly['Memory']({ initial: 2000, maximum: 65536 }));
const request = await fetch('main.wasm');
const binary = await request.arrayBuffer();
@@ -139,7 +139,6 @@ const mem = new memory_t(new WebAssembly['Memory']({ initial: 2000, maximum: 655
};
let wasm_app_imports = {
// core
memory: mem.mem,
wasm_parse_float: (str, len) => { return parseFloat(mem.read_cstr(str, len)); },
@@ -192,7 +191,7 @@ const mem = new memory_t(new WebAssembly['Memory']({ initial: 2000, maximum: 655
mem.exports = wasm_exports;
wasm_exports['wasm_init']();
let awake = false;
let awake = true;
function wasm_update(time) {
const dpr = window.devicePixelRatio;

View File

@@ -1,95 +1,78 @@
/*
.doesn't miss events (always processes all key strokes and buttons etc.)
.sleeps properly when nothing is happening
.replayable (that is you can serialize all the events, replay them back and get the same results)
..rendering and update decoupled
..animations probably should be in the rendering part
void app_update(app_event_t *events, i32 event_count) {
update_result_t *state = NULL; // contains event
loop (events) {
state = update(it);
}
{
app_event_t *ev = state->ev;
f64 delta_time = app_anim_get_delta_time();
f64 time = app_anim_get_time();
animate(state, delta_time, time);
render(state);
}
}
*/
gb_wasm_export char wasm_temp_buff1[128] = {[127] = 0x13};
gb_wasm_export i32 wasm_temp_buff1_len = 127;
gb_wasm_export char wasm_temp_buff2[128] = {[127] = 0x13};
gb_wasm_export i32 wasm_temp_buff2_len = 127;
gb f64 wasm_dpr;
gb f64 wasm_delta_time;
gb f64 wasm_time;
gb f64 wasm_last_time;
gb app_event_list_t wasm_event_list;
gb f32 wasm_dpr;
gb f32 wasm_delta_time;
gb f32 wasm_time;
gb f32 wasm_last_time;
gb app_frame_t wasm_frame;
gb u64 wasm_frame_counter;
typedef struct wasm_cached_t wasm_cached_t;
struct wasm_cached_t {
v2f64_t mouse_pos;
b8 ctrl, alt, meta, shift;
v2f32_t mouse_pos;
v2f32_t mouse_delta;
b8 ctrl, alt, shift;
} wasm_cached;
fn b32 app_update(app_event_list_t);
fn void app_init(void);
fn b32 app_update(app_frame_t *frame);
fn void app_init(f32 dpr);
fn void wasm_add_event(app_event_t event) {
app_event_t *ev = ma_push_type(tcx.temp, app_event_t);
*ev = event;
ev->alt = wasm_cached.alt;
ev->ctrl = wasm_cached.ctrl;
ev->meta = wasm_cached.meta;
ev->shift = wasm_cached.shift;
ev->mouse_pos = wasm_cached.mouse_pos;
SLLQ_APPEND(wasm_event_list.first, wasm_event_list.last, ev);
wasm_event_list.len += 1;
ev->mouse_delta = wasm_cached.mouse_delta;
SLLQ_APPEND(wasm_frame.first_event, wasm_frame.last_event, ev);
wasm_frame.event_count += 1;
}
fn_wasm_export void wasm_mouse_move(f64 x, f64 y, b32 ctrl, b32 shift, b32 alt, b32 meta) {
wasm_cached.mouse_pos = (v2f64_t){x, y};
wasm_cached.ctrl = ctrl; wasm_cached.alt = alt; wasm_cached.meta = meta; wasm_cached.shift = shift;
wasm_add_event((app_event_t){
.kind = app_event_kind_mouse_move,
});
fn void wasm_set_cached_mouse(v2f32_t p) {
wasm_cached.mouse_delta = v2f32_sub(p, wasm_cached.mouse_pos);
wasm_cached.mouse_pos = p;
}
fn_wasm_export void wasm_mouse_down(f64 x, f64 y, i32 button, b32 ctrl, b32 shift, b32 alt, b32 meta) {
fn void wasm_set_cached_buttons(b32 ctrl, b32 shift, b32 alt) {
wasm_cached.ctrl = ctrl;
wasm_cached.alt = alt;
wasm_cached.shift = shift;
}
fn_wasm_export void wasm_mouse_move(f32 x, f32 y, b32 ctrl, b32 shift, b32 alt, b32 meta) {
wasm_set_cached_mouse((v2f32_t){x, y});
wasm_set_cached_buttons(ctrl, shift, alt);
}
fn_wasm_export void wasm_mouse_down(f32 x, f32 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_cached.ctrl = ctrl; wasm_cached.alt = alt; wasm_cached.meta = meta; wasm_cached.shift = shift;
wasm_cached.mouse_pos = (v2f64_t){x, y};
wasm_set_cached_buttons(ctrl, shift, alt);
wasm_set_cached_mouse((v2f32_t){x, y});
wasm_add_event((app_event_t){
.kind = app_event_kind_mouse_down,
.mouse_button = button,
});
}
fn_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(f32 x, f32 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_cached.ctrl = ctrl; wasm_cached.alt = alt; wasm_cached.meta = meta; wasm_cached.shift = shift;
wasm_cached.mouse_pos = (v2f64_t){x, y};
wasm_set_cached_buttons(ctrl, shift, alt);
wasm_set_cached_mouse((v2f32_t){x, y});
wasm_add_event((app_event_t){
.kind = app_event_kind_mouse_up,
.mouse_button = button,
});
}
fn_wasm_export void wasm_mouse_wheel(f64 x, f64 y, f64 delta_x, f64 delta_y, f64 delta_z, b32 ctrl, b32 shift, b32 alt, b32 meta) {
wasm_cached.mouse_pos = (v2f64_t){x, y};
wasm_cached.ctrl = ctrl; wasm_cached.alt = alt; wasm_cached.meta = meta; wasm_cached.shift = shift;
fn_wasm_export void wasm_mouse_wheel(f32 x, f32 y, f32 delta_x, f32 delta_y, f32 delta_z, b32 ctrl, b32 shift, b32 alt, b32 meta) {
wasm_set_cached_mouse((v2f32_t){x, y});
wasm_set_cached_buttons(ctrl, shift, alt);
wasm_add_event((app_event_t){
.kind = app_event_kind_mouse_wheel,
.mouse_wheel_delta = {delta_x, delta_y, delta_z},
@@ -97,7 +80,7 @@ fn_wasm_export void wasm_mouse_wheel(f64 x, f64 y, f64 delta_x, f64 delta_y, f64
}
fn_wasm_export void wasm_key_down(char *key, b32 ctrl, b32 shift, b32 alt, b32 meta) {
wasm_cached.ctrl = ctrl; wasm_cached.alt = alt; wasm_cached.meta = meta; wasm_cached.shift = shift;
wasm_set_cached_buttons(ctrl, shift, alt);
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);
@@ -122,7 +105,7 @@ fn_wasm_export void wasm_key_down(char *key, b32 ctrl, b32 shift, b32 alt, b32 m
}
fn_wasm_export void wasm_key_up(char *key, b32 ctrl, b32 shift, b32 alt, b32 meta) {
wasm_cached.ctrl = ctrl; wasm_cached.alt = alt; wasm_cached.meta = meta; wasm_cached.shift = shift;
wasm_set_cached_buttons(ctrl, shift, alt);
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);
@@ -136,40 +119,36 @@ fn_wasm_export void wasm_key_up(char *key, b32 ctrl, b32 shift, b32 alt, b32 met
}
}
fn_wasm_export b32 wasm_update(f64 time, f64 width, f64 height, f64 dpr) {
fn_wasm_export b32 wasm_update(f64 time, f32 width, f32 height, f32 dpr) {
wasm_time = time;
wasm_delta_time = wasm_time - wasm_last_time;
v2f64_t window_size = (v2f64_t){width / dpr, height / dpr};
wasm_dpr = dpr;
if (wasm_event_list.first == NULL) {
wasm_add_event((app_event_t){.kind = app_event_kind_update});
}
for (app_event_t *ev = wasm_event_list.first; ev; ev = ev->next) {
ev->dpr = dpr;
ev->window_size = window_size;
}
b32 animating = app_update(wasm_event_list);
if (wasm_frame.first_event == NULL) wasm_add_event((app_event_t){.kind = app_event_kind_update});
wasm_frame.window_size = (v2f32_t){width / dpr, height / dpr};
wasm_frame.dpr = wasm_dpr;
wasm_frame.mouse_pos = wasm_frame.last_event->mouse_pos;
wasm_frame.delta = wasm_delta_time;
wasm_frame.frame = wasm_frame_counter;
b32 animating = app_update(&wasm_frame);
ma_set0(tcx.temp);
zero_struct(&wasm_event_list);
zero_struct(&wasm_frame);
wasm_last_time = wasm_time;
wasm_frame_counter += 1;
return animating;
}
fn_wasm_export void wasm_init(void) {
core_init();
app_init();
app_init(1.0); //@todo: dpr
}
fn f64 app_get_anim_time(void) {
fn f32 app_get_anim_time(void) {
return wasm_time / 1000.0;
}
fn f64 app_get_anim_delta_time(void) {
fn f32 app_get_anim_delta_time(void) {
return wasm_delta_time / 1000.0;
}

View File

@@ -99,7 +99,6 @@ class memory_t {
const canvas = document.getElementById("canvas");
const ctx2d = canvas.getContext('2d');
const mem = new memory_t(new WebAssembly['Memory']({ initial: 2000, maximum: 65536 }));
(async function main() {
if (!ctx2d) {
@@ -107,6 +106,7 @@ const mem = new memory_t(new WebAssembly['Memory']({ initial: 2000, maximum: 655
return;
}
const mem = new memory_t(new WebAssembly['Memory']({ initial: 2000, maximum: 65536 }));
const request = await fetch('main.wasm');
const binary = await request.arrayBuffer();
@@ -139,7 +139,6 @@ const mem = new memory_t(new WebAssembly['Memory']({ initial: 2000, maximum: 655
};
let wasm_app_imports = {
// core
memory: mem.mem,
wasm_parse_float: (str, len) => { return parseFloat(mem.read_cstr(str, len)); },
@@ -192,7 +191,7 @@ const mem = new memory_t(new WebAssembly['Memory']({ initial: 2000, maximum: 655
mem.exports = wasm_exports;
wasm_exports['wasm_init']();
let awake = false;
let awake = true;
function wasm_update(time) {
const dpr = window.devicePixelRatio;

View File

@@ -23,8 +23,7 @@ fn void default_log_proc(log_level_t level, s8_t file_and_line, s8_t string) {
} break;
case log_level_fatal: {
os_error_box(s8_printf(scratch.arena, "%S: fatal error: %S\n", file_and_line, string).str);
if (tcx.log.break_on_fatal) debug_break();
exit(1);
debug_break();
} break;
default_is_invalid;
}

18
src/render/render_inc.c Normal file
View File

@@ -0,0 +1,18 @@
#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 "render/stb_truetype.h"
#include "render/render_font.c"
#include "render/render_opengl.c"

View File

@@ -4,45 +4,29 @@
#include "core/core_inc.c"
#include "app/app.c"
// #include "render/render_inc.c"
#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 "render/stb_truetype.h"
#include "render/font.c"
#include "render/render_opengl.c"
#include "wasm_app.gen.c"
#include "ui/ui_iter.c"
#include "ui/ui.gen.c"
#include "ui/ui.c"
// #include "ui/ui_iter.c"
// #include "ui/ui.gen.c"
// #include "ui/ui.c"
fn void app_init(f32 dpr) {
ma_arena_t *perm = &tcx._perm;
unused(perm);
mt_embed_file(font_data, "package/liberation-mono.ttf");
mt_tweak_f32(font_size, 50, 4, 200);
mt_tweak_f32(_font_size, 50, 50, 50);
rn_init(perm, font_data, font_size * dpr);
ui_demo_init(perm);
// rn_init(perm, font_data, font_size * dpr);
// ui_demo_init(perm);
}
fn b32 app_update(app_frame_t *frame) {
if (!f32_are_equal(font_size, _font_size)) {
_font_size = font_size;
rn_reload_font(font_data, font_size);
// rn_reload_font(font_data, font_size);
}
ui_demo_update(frame);
// ui_demo_update(frame);
return true;
}