diff --git a/build_file.c b/build_file.c index 6b68b60..b930669 100644 --- a/build_file.c +++ b/build_file.c @@ -38,17 +38,28 @@ int main(int argc, char **argv) { b32 run_server = false; b32 core_test_target = true; b32 win32_target = true; + b32 standalone_w32_target = false; b32 wasm_target = false; if (run_server) { os_systemf("start /D ..\\package ..\\package\\run_server.bat"); } + if (standalone_w32_target && cache_code_modified(s8_lit("../src/wasm_app/main.c"), s8_lit("standalone_app.exe"))) { + ok = os_systemf( + "cl ../src/wasm_app/main.c -Fe:standalone_app.exe -Fd:standalone_app.pdb" + " -I ../src" + " /Zi /FC /nologo /Oi" + " /WX /W3 /wd4200 /diagnostics:column" + " /link /incremental:no /DEBUG:FULL" + ); + if (ok != 0) return ok; + } + if (win32_target && cache_code_modified(s8_lit("../src/wasm_app/main.c"), s8_lit("app.dll"))) { - os_delete_file(s8_lit("app_win32.pdb")); ok = os_systemf( "cl ../src/wasm_app/main.c -Fe:app.dll -Fd:app.pdb" - " -I ../src" + " -I ../src /DAPP_IS_DLL" " /Zi /FC /nologo /Oi" " /WX /W3 /wd4200 /diagnostics:column" " /link /incremental:no /DEBUG:FULL /DLL" @@ -57,7 +68,6 @@ int main(int argc, char **argv) { } if (win32_target && cache_code_modified(s8_lit("../src/app/app_win32_exe.c"), s8_lit("app_win32.exe"))) { - // os_delete_file(s8_lit("app_win32.pdb")); ok = os_systemf( "cl ../src/app/app_win32_exe.c -Fe:app_win32.exe -Fd:app_win32.pdb" " -I ../src" diff --git a/package/index.html b/package/index.html index 4dc37d0..a7c7af1 100644 --- a/package/index.html +++ b/package/index.html @@ -99,6 +99,45 @@ 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 })); +const wasm_app_imports = { + // core + memory: mem.mem, + wasm_parse_float: (str, len) => { return parseFloat(mem.read_cstr(str, len)); }, + wasm_alert: (str, len) => { alert(mem.read_cstr(str,len)); }, + wasm_trap: () => { throw new Error(); }, + wasm_write_to_console: (str, len) => { console.log(mem.read_cstr(str, len)); }, + + // gfx + wasm_draw_text: (str, len, x, y, font_str, font_len, font_size, r, g, b, a) => { + ctx2d.font = `${font_size}px ${mem.read_cstr(font_str, font_len)}`; + ctx2d.fillStyle = `rgba(${r}, ${g}, ${b}, ${a})`; + ctx2d.textBaseline = "top"; + ctx2d.fillText(mem.read_cstr(str, len), x, y); + }, + wasm_measure_text: (str, len, font_str, font_len, font_size) => { + ctx2d.font = `${font_size}px ${mem.read_cstr(font_str, font_len)}`; + ctx2d.textBaseline = "top"; + const metrics = ctx2d.measureText(mem.read_cstr(str, len)); + return metrics.width; + }, + wasm_draw_rect: (x, y, w, h, r, g, b, a) => { + ctx2d.beginPath(); + ctx2d.rect(x, y, w, h); + ctx2d.fillStyle = `rgba(${r}, ${g}, ${b}, ${a})`; + ctx2d.fill(); + }, + wasm_clear: () => { + ctx2d.clearRect(0, 0, canvas.width, canvas.height); + }, + wasm_set_clip: (x, y, w, h) => { + ctx2d.restore(); + ctx2d.save(); + ctx2d.beginPath(); + ctx2d.rect(x, y, w, h); + ctx2d.clip(); + }, +}; (async function main() { if (!ctx2d) { @@ -106,91 +145,13 @@ const ctx2d = canvas.getContext('2d'); return; } - const mem = new memory_t(new WebAssembly['Memory']({ initial: 2000, maximum: 65536 })); const request = await fetch('main.wasm'); const binary = await request.arrayBuffer(); - - const wasm_os_imports = { - wasm_local_time_now: (ptr, len) => { - const date = new Date(); - const stream = mem.stream_write(ptr, len); - stream.write_u16(date.getMilliseconds()); - stream.write_u16(date.getSeconds()); - stream.write_u16(date.getMinutes()); - stream.write_u16(date.getHours()); - stream.write_u16(date.getDate()); - stream.write_u16(date.getMonth()); - stream.write_u16(date.getFullYear()); - }, - - wasm_universal_time_now: (ptr, len) => { - const date = new Date(); - const stream = mem.stream_write(ptr, len); - stream.write_u16(date.getUTCMilliseconds()); - stream.write_u16(date.getUTCSeconds()); - stream.write_u16(date.getUTCMinutes()); - stream.write_u16(date.getUTCHours()); - stream.write_u16(date.getUTCDate()); - stream.write_u16(date.getUTCMonth()); - stream.write_u16(date.getUTCFullYear()); - }, - - wasm_milliseconds_now: () => { return performance.now(); }, - }; - - let wasm_app_imports = { - // core - memory: mem.mem, - wasm_parse_float: (str, len) => { return parseFloat(mem.read_cstr(str, len)); }, - wasm_alert: (str, len) => { alert(mem.read_cstr(str,len)); }, - wasm_trap: () => { throw new Error(); }, - wasm_write_to_console: (str, len) => { console.log(mem.read_cstr(str, len)); }, - - // gfx - wasm_draw_text: (str, len, x, y, font_str, font_len, font_size, r, g, b, a) => { - ctx2d.font = `${font_size}px ${mem.read_cstr(font_str, font_len)}`; - ctx2d.fillStyle = `rgba(${r}, ${g}, ${b}, ${a})`; - ctx2d.textBaseline = "top"; - ctx2d.fillText(mem.read_cstr(str, len), x, y); - }, - wasm_measure_text: (str, len, font_str, font_len, font_size) => { - ctx2d.font = `${font_size}px ${mem.read_cstr(font_str, font_len)}`; - ctx2d.textBaseline = "top"; - const metrics = ctx2d.measureText(mem.read_cstr(str, len)); - return metrics.width; - }, - // wasm_get_font_height: (font_str, font_len, font_size) => { - // ctx2d.font = `${font_size}px ${mem.read_cstr(font_str, font_len)}`; - // ctx2d.textBaseline = "top"; - // const v = ctx2d.measureText('NothinBelowTheBaseline'); - // return v.fontBoundingBoxDescent; - // }, - wasm_draw_rect: (x, y, w, h, r, g, b, a) => { - ctx2d.beginPath(); - ctx2d.rect(x, y, w, h); - ctx2d.fillStyle = `rgba(${r}, ${g}, ${b}, ${a})`; - ctx2d.fill(); - }, - wasm_clear: () => { - ctx2d.clearRect(0, 0, canvas.width, canvas.height); - }, - wasm_set_clip: (x, y, w, h) => { - ctx2d.restore(); - ctx2d.save(); - ctx2d.beginPath(); - ctx2d.rect(x, y, w, h); - ctx2d.clip(); - }, - - }; - - Object.assign(wasm_app_imports, wasm_os_imports); - const program = await WebAssembly['instantiate'](binary, { "env": wasm_app_imports }); const instance = program['instance']; const wasm_exports = instance['exports']; mem.exports = wasm_exports; - wasm_exports['wasm_init'](window.devicePixelRatio); + wasm_exports['wasm_init'](); let awake = true; diff --git a/src/app/app.c b/src/app/app.c index f6681d2..fab5c71 100644 --- a/src/app/app.c +++ b/src/app/app.c @@ -1,7 +1,9 @@ #include "app.gen.c" #if PLATFORM_WINDOWS +#ifndef APP_IS_DLL #include "app_win32.c" +#endif #elif PLATFORM_WASM #include "app_wasm.c" #endif diff --git a/src/app/app.gen.c b/src/app/app.gen.c index 61afa03..dde3dca 100644 --- a/src/app/app.gen.c +++ b/src/app/app.gen.c @@ -276,16 +276,14 @@ type_t type__app_event_t = { type_kind_struct, s8_const_lit("app_event_t"), size }; type_t type__app_frame_t = { type_kind_struct, s8_const_lit("app_frame_t"), sizeof(app_frame_t), .members = (type_member_t[]){ - {.name = s8_const_lit("next"), .type = &(type_t){type_kind_pointer, s8_const_lit("app_frame_t*"), sizeof(void *), .base = &type__app_frame_t}, .offset = offsetof(app_frame_t, next), .dont_serialize = 0}, - {.name = s8_const_lit("delta"), .type = &type__f64, .offset = offsetof(app_frame_t, delta), .dont_serialize = 0}, - {.name = s8_const_lit("dpr"), .type = &type__f32, .offset = offsetof(app_frame_t, dpr), .dont_serialize = 0}, - {.name = s8_const_lit("frame"), .type = &type__u64, .offset = offsetof(app_frame_t, frame), .dont_serialize = 0}, {.name = s8_const_lit("window_size"), .type = &type__v2f32_t, .offset = offsetof(app_frame_t, window_size), .dont_serialize = 0}, {.name = s8_const_lit("mouse_pos"), .type = &type__v2f32_t, .offset = offsetof(app_frame_t, mouse_pos), .dont_serialize = 0}, + {.name = s8_const_lit("dpr"), .type = &type__f32, .offset = offsetof(app_frame_t, dpr), .dont_serialize = 0}, + {.name = s8_const_lit("delta"), .type = &type__f64, .offset = offsetof(app_frame_t, delta), .dont_serialize = 0}, + {.name = s8_const_lit("frame"), .type = &type__u64, .offset = offsetof(app_frame_t, frame), .dont_serialize = 0}, {.name = s8_const_lit("event_count"), .type = &type__i32, .offset = offsetof(app_frame_t, event_count), .dont_serialize = 0}, {.name = s8_const_lit("first_event"), .type = &(type_t){type_kind_pointer, s8_const_lit("app_event_t*"), sizeof(void *), .base = &type__app_event_t}, .offset = offsetof(app_frame_t, first_event), .dont_serialize = 0}, {.name = s8_const_lit("last_event"), .type = &(type_t){type_kind_pointer, s8_const_lit("app_event_t*"), sizeof(void *), .base = &type__app_event_t}, .offset = offsetof(app_frame_t, last_event), .dont_serialize = 0}, - {.name = s8_const_lit("update"), .type = &type__f64, .offset = offsetof(app_frame_t, update), .dont_serialize = 0}, }, - .count = 10, + .count = 8, }; \ No newline at end of file diff --git a/src/app/app.gen.h b/src/app/app.gen.h index afde91a..d2c2a96 100644 --- a/src/app/app.gen.h +++ b/src/app/app.gen.h @@ -113,14 +113,12 @@ struct app_event_t { typedef struct app_frame_t app_frame_t; struct app_frame_t { - app_frame_t* next; - f64 delta; - f32 dpr; - u64 frame; v2f32_t window_size; v2f32_t mouse_pos; + f32 dpr; + f64 delta; + u64 frame; i32 event_count; app_event_t* first_event; app_event_t* last_event; - f64 update; }; \ No newline at end of file diff --git a/src/app/app.h b/src/app/app.h index 96ee8a5..8429ae4 100644 --- a/src/app/app.h +++ b/src/app/app.h @@ -1,4 +1,8 @@ #include "app.gen.h" typedef b32 app_update_t(thread_ctx_t *tcx, app_frame_t *frame); -#define fn_export __declspec(dllexport) \ No newline at end of file +#if PLATFORM_WINDOWS +#define fn_export __declspec(dllexport) +#else +#define fn_export +#endif \ No newline at end of file diff --git a/src/app/app.meta.c b/src/app/app.meta.c index 3be498b..038d009 100644 --- a/src/app/app.meta.c +++ b/src/app/app.meta.c @@ -145,7 +145,7 @@ void mt_app(ma_arena_t *arena) { typedef enum { app_event_kind_null, - app_event_kind_update, + app_event_kind_update, // update is send when there are no events in a frame app_event_kind_init, app_event_kind_reload, app_event_kind_unload, @@ -181,18 +181,16 @@ void mt_app(ma_arena_t *arena) { typedef struct app_frame_t app_frame_t; struct app_frame_t { - app_frame_t *next; - f64 delta; - f32 dpr; - u64 frame; v2f32_t window_size; v2f32_t mouse_pos; + f32 dpr; + + f64 delta; + u64 frame; i32 event_count; app_event_t *first_event; app_event_t *last_event; - - f64 update; }; )); diff --git a/src/app/app_wasm.c b/src/app/app_wasm.c index e5f4883..a3c99b2 100644 --- a/src/app/app_wasm.c +++ b/src/app/app_wasm.c @@ -18,8 +18,12 @@ struct wasm_cached_t { b8 ctrl, alt, shift; } wasm_cached; -fn b32 app_update(app_frame_t *frame); -fn void app_init(f32 dpr); +fn b32 app_update(thread_ctx_t *ctx, app_frame_t *frame); + +fn void wasm_add_event_ex(app_frame_t *frame, app_event_t *ev) { + SLLQ_APPEND(wasm_frame.first_event, wasm_frame.last_event, ev); + wasm_frame.event_count += 1; +} fn void wasm_add_event(app_event_t event) { app_event_t *ev = ma_push_type(tcx->temp, app_event_t); @@ -30,8 +34,7 @@ fn void wasm_add_event(app_event_t event) { ev->shift = wasm_cached.shift; ev->mouse_pos = wasm_cached.mouse_pos; ev->mouse_delta = wasm_cached.mouse_delta; - SLLQ_APPEND(wasm_frame.first_event, wasm_frame.last_event, ev); - wasm_frame.event_count += 1; + wasm_add_event_ex(&wasm_frame, ev); } fn void wasm_set_cached_mouse(v2f32_t p) { @@ -126,13 +129,22 @@ fn_wasm_export b32 wasm_update(f64 time, f32 width, f32 height, f32 dpr) { wasm_delta_time = wasm_time - wasm_last_time; wasm_dpr = dpr; - if (wasm_frame.first_event == NULL) wasm_add_event((app_event_t){.kind = app_event_kind_update}); wasm_frame.window_size = (v2f32_t){width, height}; wasm_frame.dpr = wasm_dpr; wasm_frame.mouse_pos = wasm_frame.last_event->mouse_pos; wasm_frame.delta = wasm_delta_time / 1000.0; wasm_frame.frame = wasm_frame_counter; - b32 animating = app_update(&wasm_frame); + if (wasm_frame.frame == 0) { + app_frame_t frame = wasm_frame; + frame.first_event = frame.last_event = NULL; + frame.event_count = 0; + wasm_add_event_ex(&frame, &(app_event_t){.kind = app_event_kind_init}); + app_update(tcx, &frame); + } + if (wasm_frame.first_event == NULL) { + wasm_add_event((app_event_t){.kind = app_event_kind_update}); + } + b32 animating = app_update(tcx, &wasm_frame); ma_set0(tcx->temp); zero_struct(&wasm_frame); @@ -142,7 +154,6 @@ fn_wasm_export b32 wasm_update(f64 time, f32 width, f32 height, f32 dpr) { return animating; } -fn_wasm_export void wasm_init(f32 dpr) { +fn_wasm_export void wasm_init(void) { core_init(); - app_init(dpr); } diff --git a/src/app/app_wasm.html b/src/app/app_wasm.html index 4dc37d0..a7c7af1 100644 --- a/src/app/app_wasm.html +++ b/src/app/app_wasm.html @@ -99,6 +99,45 @@ 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 })); +const wasm_app_imports = { + // core + memory: mem.mem, + wasm_parse_float: (str, len) => { return parseFloat(mem.read_cstr(str, len)); }, + wasm_alert: (str, len) => { alert(mem.read_cstr(str,len)); }, + wasm_trap: () => { throw new Error(); }, + wasm_write_to_console: (str, len) => { console.log(mem.read_cstr(str, len)); }, + + // gfx + wasm_draw_text: (str, len, x, y, font_str, font_len, font_size, r, g, b, a) => { + ctx2d.font = `${font_size}px ${mem.read_cstr(font_str, font_len)}`; + ctx2d.fillStyle = `rgba(${r}, ${g}, ${b}, ${a})`; + ctx2d.textBaseline = "top"; + ctx2d.fillText(mem.read_cstr(str, len), x, y); + }, + wasm_measure_text: (str, len, font_str, font_len, font_size) => { + ctx2d.font = `${font_size}px ${mem.read_cstr(font_str, font_len)}`; + ctx2d.textBaseline = "top"; + const metrics = ctx2d.measureText(mem.read_cstr(str, len)); + return metrics.width; + }, + wasm_draw_rect: (x, y, w, h, r, g, b, a) => { + ctx2d.beginPath(); + ctx2d.rect(x, y, w, h); + ctx2d.fillStyle = `rgba(${r}, ${g}, ${b}, ${a})`; + ctx2d.fill(); + }, + wasm_clear: () => { + ctx2d.clearRect(0, 0, canvas.width, canvas.height); + }, + wasm_set_clip: (x, y, w, h) => { + ctx2d.restore(); + ctx2d.save(); + ctx2d.beginPath(); + ctx2d.rect(x, y, w, h); + ctx2d.clip(); + }, +}; (async function main() { if (!ctx2d) { @@ -106,91 +145,13 @@ const ctx2d = canvas.getContext('2d'); return; } - const mem = new memory_t(new WebAssembly['Memory']({ initial: 2000, maximum: 65536 })); const request = await fetch('main.wasm'); const binary = await request.arrayBuffer(); - - const wasm_os_imports = { - wasm_local_time_now: (ptr, len) => { - const date = new Date(); - const stream = mem.stream_write(ptr, len); - stream.write_u16(date.getMilliseconds()); - stream.write_u16(date.getSeconds()); - stream.write_u16(date.getMinutes()); - stream.write_u16(date.getHours()); - stream.write_u16(date.getDate()); - stream.write_u16(date.getMonth()); - stream.write_u16(date.getFullYear()); - }, - - wasm_universal_time_now: (ptr, len) => { - const date = new Date(); - const stream = mem.stream_write(ptr, len); - stream.write_u16(date.getUTCMilliseconds()); - stream.write_u16(date.getUTCSeconds()); - stream.write_u16(date.getUTCMinutes()); - stream.write_u16(date.getUTCHours()); - stream.write_u16(date.getUTCDate()); - stream.write_u16(date.getUTCMonth()); - stream.write_u16(date.getUTCFullYear()); - }, - - wasm_milliseconds_now: () => { return performance.now(); }, - }; - - let wasm_app_imports = { - // core - memory: mem.mem, - wasm_parse_float: (str, len) => { return parseFloat(mem.read_cstr(str, len)); }, - wasm_alert: (str, len) => { alert(mem.read_cstr(str,len)); }, - wasm_trap: () => { throw new Error(); }, - wasm_write_to_console: (str, len) => { console.log(mem.read_cstr(str, len)); }, - - // gfx - wasm_draw_text: (str, len, x, y, font_str, font_len, font_size, r, g, b, a) => { - ctx2d.font = `${font_size}px ${mem.read_cstr(font_str, font_len)}`; - ctx2d.fillStyle = `rgba(${r}, ${g}, ${b}, ${a})`; - ctx2d.textBaseline = "top"; - ctx2d.fillText(mem.read_cstr(str, len), x, y); - }, - wasm_measure_text: (str, len, font_str, font_len, font_size) => { - ctx2d.font = `${font_size}px ${mem.read_cstr(font_str, font_len)}`; - ctx2d.textBaseline = "top"; - const metrics = ctx2d.measureText(mem.read_cstr(str, len)); - return metrics.width; - }, - // wasm_get_font_height: (font_str, font_len, font_size) => { - // ctx2d.font = `${font_size}px ${mem.read_cstr(font_str, font_len)}`; - // ctx2d.textBaseline = "top"; - // const v = ctx2d.measureText('NothinBelowTheBaseline'); - // return v.fontBoundingBoxDescent; - // }, - wasm_draw_rect: (x, y, w, h, r, g, b, a) => { - ctx2d.beginPath(); - ctx2d.rect(x, y, w, h); - ctx2d.fillStyle = `rgba(${r}, ${g}, ${b}, ${a})`; - ctx2d.fill(); - }, - wasm_clear: () => { - ctx2d.clearRect(0, 0, canvas.width, canvas.height); - }, - wasm_set_clip: (x, y, w, h) => { - ctx2d.restore(); - ctx2d.save(); - ctx2d.beginPath(); - ctx2d.rect(x, y, w, h); - ctx2d.clip(); - }, - - }; - - Object.assign(wasm_app_imports, wasm_os_imports); - const program = await WebAssembly['instantiate'](binary, { "env": wasm_app_imports }); const instance = program['instance']; const wasm_exports = instance['exports']; mem.exports = wasm_exports; - wasm_exports['wasm_init'](window.devicePixelRatio); + wasm_exports['wasm_init'](); let awake = true; diff --git a/src/app/app_win32.c b/src/app/app_win32.c index 69a9db1..503ad41 100644 --- a/src/app/app_win32.c +++ b/src/app/app_win32.c @@ -11,7 +11,7 @@ gb HWND w32_window_handle; gb HDC w32_dc; gb b32 w32_quit_app; -fn b32 app_update(thread_ctx_t *tcx, app_frame_t *frame); +fn_export b32 app_update(thread_ctx_t *thread_ctx, app_frame_t *frame); fn v2f32_t w32_get_window_size(HWND window) { RECT window_rect; @@ -420,17 +420,40 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int n w32_wc = wc; } - f64 primary_monitor_size_x = (f64)GetSystemMetrics(SM_CXSCREEN); - f64 primary_monitor_size_y = (f64)GetSystemMetrics(SM_CYSCREEN); +#define APP_MODE_T 1 +#define APP_MODE_HALF 2 +#define APP_WINDOW_MODE APP_MODE_HALF RECT window_rect = {0}; { - window_rect.left = 0 + 0; - window_rect.right = 0 + (int)(primary_monitor_size_x * 0.8); - window_rect.bottom = 30 + (int)(primary_monitor_size_y * 0.8); + f64 x = (f64)GetSystemMetrics(SM_CXSCREEN); + f64 y = (f64)GetSystemMetrics(SM_CYSCREEN); +#if APP_WINDOW_MODE == APP_MODE_T + window_rect.left = (int)(x*0.8); + window_rect.right = (int)(x*1.0); + window_rect.bottom = 30 + (int)(y * 0.4); window_rect.top = 30 + 0; +#elif APP_WINDOW_MODE == APP_MODE_HALF + window_rect.left = (int)(x * 0.0) + 0; + window_rect.right = (int)(x * 0.0) + (int)(x * 0.5); + window_rect.top = 30 + 0; + window_rect.bottom = (int)(y * 0.96); +#else + window_rect.left = (int)(x * 0.1) + 0; + window_rect.right = (int)(x * 0.1) + (int)(x * 0.8); + window_rect.bottom = (int)(y * 0.1) + (int)(y * 0.8); + window_rect.top = (int)(y * 0.1) + 0; +#endif AdjustWindowRectEx(&window_rect, WS_OVERLAPPEDWINDOW, false, 0); } - w32_window_handle = CreateWindowW(w32_wc.lpszClassName, L"Zzz... Window, hello!", WS_OVERLAPPEDWINDOW, window_rect.left, window_rect.top, window_rect.right - window_rect.left, window_rect.bottom - window_rect.top, NULL, NULL, hInstance, NULL); + DWORD ext_style = 0; +#if APP_WINDOW_MODE == APP_MODE_T + ext_style |= WS_EX_LAYERED | WS_EX_TOPMOST; +#endif + + w32_window_handle = CreateWindowExW(ext_style, w32_wc.lpszClassName, L"Zzz... Window, hello!", WS_OVERLAPPEDWINDOW, window_rect.left, window_rect.top, window_rect.right - window_rect.left, window_rect.bottom - window_rect.top, NULL, NULL, hInstance, NULL); +#if APP_WINDOW_MODE == APP_MODE_T + SetLayeredWindowAttributes(w32_window_handle, 0, 200, LWA_ALPHA); +#endif assert(w32_window_handle); w32_dc = GetDC(w32_window_handle); @@ -490,7 +513,6 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int n frame.dpr = w32_get_dpr(w32_window_handle); frame.mouse_pos = frame.last_event->mouse_pos; frame.delta = time_delta; - frame.update = time_update; frame.frame = frame_counter; b32 animating = true; diff --git a/src/core/core_ctx.c b/src/core/core_ctx.c index 4386eea..e3f6aef 100644 --- a/src/core/core_ctx.c +++ b/src/core/core_ctx.c @@ -9,7 +9,5 @@ gb_thread thread_ctx_t global_thread_context = { fn void core_init(void) { tcx = &global_thread_context; - tcx->temp = ma_create(ma_default_reserve_size); - ma_init(&tcx->perm, ma_default_reserve_size); os_core_init(); } \ No newline at end of file diff --git a/src/core/core_log.c b/src/core/core_log.c index ef78d5f..6df2fba 100644 --- a/src/core/core_log.c +++ b/src/core/core_log.c @@ -23,7 +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); - debug_break(); + if (tcx->log.break_on_fatal) debug_break(); } break; default_is_invalid; } diff --git a/src/core/core_platform_unix.c b/src/core/core_platform_unix.c index 19e7cf6..6c8b60d 100644 --- a/src/core/core_platform_unix.c +++ b/src/core/core_platform_unix.c @@ -34,4 +34,6 @@ fn f64 os_parse_float(char *str) { } fn void os_core_init(void) { + tcx->temp = ma_create(ma_default_reserve_size); + ma_init(&tcx->perm, ma_default_reserve_size); } \ No newline at end of file diff --git a/src/core/core_platform_wasm.c b/src/core/core_platform_wasm.c index 79616d6..97b1051 100644 --- a/src/core/core_platform_wasm.c +++ b/src/core/core_platform_wasm.c @@ -41,13 +41,13 @@ fn void os_core_init(void) { isize page_count = __builtin_wasm_memory_size(0); u8 *memory = (u8 *)&__heap_base; usize memory_size = page_count * (page_size) - (isize)memory; - tcx._perm.data = memory; - tcx._perm.commit = tcx._perm.reserve = memory_size; + tcx->perm.data = memory; + tcx->perm.commit = tcx->perm.reserve = memory_size; - ma_arena_t *perm = &tcx._perm; - ma_push_arena_ex(&tcx._perm, &tcx.scratch[0], mib(1)); - ma_push_arena_ex(&tcx._perm, &tcx.scratch[1], kib(256)); - ma_push_arena_ex(&tcx._perm, &tcx.scratch[2], kib(64)); + ma_arena_t *perm = &tcx->perm; + ma_push_arena_ex(&tcx->perm, &tcx->scratch[0], mib(1)); + ma_push_arena_ex(&tcx->perm, &tcx->scratch[1], kib(256)); + ma_push_arena_ex(&tcx->perm, &tcx->scratch[2], kib(64)); - tcx.temp = ma_push_arena(perm, mib(2)); + tcx->temp = ma_push_arena(perm, mib(2)); } \ No newline at end of file diff --git a/src/core/core_platform_win32.c b/src/core/core_platform_win32.c index 80475f9..df9336e 100644 --- a/src/core/core_platform_win32.c +++ b/src/core/core_platform_win32.c @@ -34,4 +34,6 @@ fn f64 os_parse_float(char *str) { } fn void os_core_init(void) { + tcx->temp = ma_create(ma_default_reserve_size); + ma_init(&tcx->perm, ma_default_reserve_size); } \ No newline at end of file diff --git a/src/render/render_wasm_canvas.c b/src/render/render_wasm_canvas.c index 03baf63..af35b5e 100644 --- a/src/render/render_wasm_canvas.c +++ b/src/render/render_wasm_canvas.c @@ -16,13 +16,16 @@ struct rn_state_t { rn_font_t *main_font; app_frame_t *frame; }; -rn_state_t rn_state; +rn_state_t *rn; fn void rn_reload_font(f32 font_size, f32 dpr) { rn->main_font->size = font_size * dpr; } fn void rn_init(ma_arena_t *perm, f32 font_size, f32 dpr) { + tcx->data[tcx_slot_rn] = ma_push_type(perm, rn_state_t); + rn = tcx->data[tcx_slot_rn]; + rn->main_font = ma_push_type(perm, rn_font_t); rn_reload_font(font_size, dpr); } @@ -54,7 +57,7 @@ fn v2f32_t rn_draw_string(rn_font_t *font, v2f32_t pos, v4f32_t color, s8_t stri } fn v2f32_t rn_draw_stringf(rn_font_t *font, v2f32_t pos, v4f32_t color, char *str, ...) { - S8_FMT(tcx.temp, str, string); + S8_FMT(tcx->temp, str, string); return rn_draw_string(font, pos, color, string); } @@ -62,12 +65,19 @@ fn void rn_set_clip(r2f32_t rect) { wasm_set_clip(rect.min.x, rect.min.y, (rect.max.x - rect.min.x), (rect.max.y - rect.min.y)); } -fn void rn_begin(app_frame_t *frame, v4f32_t clear_color) { - rn->frame = frame; +fn void rn_begin_frame(app_frame_t *frame) { + rn = tcx->data[tcx_slot_rn]; + rn->frame = frame; +} + +fn void rn_begin(v4f32_t clear_color) { r2f32_t window_rect = r2f32(0, 0, rn->frame->window_size.x, rn->frame->window_size.y); wasm_clear(); rn_draw_rect(window_rect, clear_color); } -fn void rn_end() { +fn void rn_end(void) { } + +fn void rn_reload(void) { +} \ No newline at end of file diff --git a/src/ui/ui.c b/src/ui/ui.c index 429e320..4f15be5 100644 --- a/src/ui/ui.c +++ b/src/ui/ui.c @@ -894,7 +894,6 @@ fn void ui_serial_subtype(void *p, type_t *type, s8_t name) { fn void ui_serial_type(void *p, type_t *type) { ui_serial_subtype(p, type, type->name); } -// fn void ui_reload(void) { ui_init_colors(); @@ -907,6 +906,7 @@ fn void ui_init(ma_arena_t *arena) { ui_reload(); } +gb app_event_t ui_test_event; gb i32 ui_g_panel = 1; fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_count) { ui_begin_frame(frame); @@ -921,12 +921,11 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co ui_set_lop(ui_lop_cut_left) ui_set_top(top_box) { ui_radio_button(&ui_g_panel, 1, "1"); - ui_radio_button(&ui_g_panel, 2, "4"); + ui_radio_button(&ui_g_panel, 2, "2"); } ui->top->rect = r2f32_shrinks(ui->top->rect, ui_em(1)); - if (ui_g_panel == 1) { ui_box_t *scroller_box = ui_boxf((ui_box_flags_t){.draw_rect = true, .clip_rect = true}, "scrollbar"); ui_set_rect(scroller_box, r2f32_cut_right(&ui->top->rect, 10 * frame->dpr), ui_lop_cut_right); @@ -969,7 +968,11 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co } else_is_invalid; } ui_label("allocated boxes: %d", ui->allocated_boxes); - // ui_serial_type(&ui_test_event, type(app_event_t)); + ui_serial_type(&ui_test_event, type(app_event_t)); + ui_set_id(ui_idf("a")) { + ui_serial_type(&ui_test_event, type(app_event_t)); + + } } locl f32 scroller_value; @@ -992,7 +995,7 @@ fn void ui_demo_update(app_frame_t *frame, mt_tweak_t *tweak_table, i32 tweak_co ui_set_rect(box, r2f32_cut_top(&ui->top->rect, scroller_size * scroller_box_size), ui_lop_cut_top); ui_signal_t signal = ui_signal_from_box(box); if (signal.dragging) { - scroller_value += (signal.drag.y / item_box_size * 2) * (all_items_size); + scroller_value += signal.drag.y; scroller_value = CLAMP(scroller_value, 0, all_items_size); } if (ev->kind == app_event_kind_mouse_wheel) { diff --git a/src/wasm_app/main.c b/src/wasm_app/main.c index 1a9440c..f2677bd 100644 --- a/src/wasm_app/main.c +++ b/src/wasm_app/main.c @@ -3,6 +3,7 @@ #include "ui/ui_inc.h" #include "core/core_inc.c" +#include "app/app.c" #include "render/render_inc.c" #include "ui/ui_inc.c"