small hto load improvements
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
@@ -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;
|
||||
};
|
||||
@@ -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)
|
||||
#if PLATFORM_WINDOWS
|
||||
#define fn_export __declspec(dllexport)
|
||||
#else
|
||||
#define fn_export
|
||||
#endif
|
||||
@@ -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;
|
||||
};
|
||||
));
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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) {
|
||||
}
|
||||
13
src/ui/ui.c
13
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) {
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user