app_frame, ui layout, draw the list
This commit is contained in:
@@ -260,22 +260,25 @@ type_t type__app_event_t = { type_kind_struct, s8_const_lit("app_event_t"), size
|
||||
{.name = s8_const_lit("mouse_button"), .type = &type__app_mouse_button_t, .offset = offsetof(app_event_t, mouse_button), .dont_serialize = 0},
|
||||
{.name = s8_const_lit("key"), .type = &type__app_key_t, .offset = offsetof(app_event_t, key), .dont_serialize = 0},
|
||||
{.name = s8_const_lit("text"), .type = &type__s8_t, .offset = offsetof(app_event_t, text), .dont_serialize = 0},
|
||||
{.name = s8_const_lit("mouse_wheel_delta"), .type = &type__v3f64_t, .offset = offsetof(app_event_t, mouse_wheel_delta), .dont_serialize = 0},
|
||||
{.name = s8_const_lit("mouse_wheel_delta"), .type = &type__v3f32_t, .offset = offsetof(app_event_t, mouse_wheel_delta), .dont_serialize = 0},
|
||||
{.name = s8_const_lit("mouse_pos"), .type = &type__v2f32_t, .offset = offsetof(app_event_t, mouse_pos), .dont_serialize = 0},
|
||||
{.name = s8_const_lit("ctrl"), .type = &type__b8, .offset = offsetof(app_event_t, ctrl), .dont_serialize = 0},
|
||||
{.name = s8_const_lit("shift"), .type = &type__b8, .offset = offsetof(app_event_t, shift), .dont_serialize = 0},
|
||||
{.name = s8_const_lit("alt"), .type = &type__b8, .offset = offsetof(app_event_t, alt), .dont_serialize = 0},
|
||||
{.name = s8_const_lit("meta"), .type = &type__b8, .offset = offsetof(app_event_t, meta), .dont_serialize = 0},
|
||||
{.name = s8_const_lit("dpr"), .type = &type__f64, .offset = offsetof(app_event_t, dpr), .dont_serialize = 0},
|
||||
{.name = s8_const_lit("window_size"), .type = &type__v2f64_t, .offset = offsetof(app_event_t, window_size), .dont_serialize = 0},
|
||||
{.name = s8_const_lit("mouse_pos"), .type = &type__v2f64_t, .offset = offsetof(app_event_t, mouse_pos), .dont_serialize = 0},
|
||||
},
|
||||
.count = 13,
|
||||
.count = 10,
|
||||
};
|
||||
type_t type__app_event_list_t = { type_kind_struct, s8_const_lit("app_event_list_t"), sizeof(app_event_list_t),
|
||||
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("first"), .type = &(type_t){type_kind_pointer, s8_const_lit("app_event_t*"), sizeof(void *), .base = &type__app_event_t}, .offset = offsetof(app_event_list_t, first), .dont_serialize = 1},
|
||||
{.name = s8_const_lit("last"), .type = &(type_t){type_kind_pointer, s8_const_lit("app_event_t*"), sizeof(void *), .base = &type__app_event_t}, .offset = offsetof(app_event_list_t, last), .dont_serialize = 0},
|
||||
{.name = s8_const_lit("len"), .type = &type__i32, .offset = offsetof(app_event_list_t, len), .dont_serialize = 0},
|
||||
{.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("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("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 = 3,
|
||||
.count = 9,
|
||||
};
|
||||
@@ -98,19 +98,22 @@ struct app_event_t {
|
||||
app_mouse_button_t mouse_button;
|
||||
app_key_t key;
|
||||
s8_t text;
|
||||
v3f64_t mouse_wheel_delta;
|
||||
v3f32_t mouse_wheel_delta;
|
||||
v2f32_t mouse_pos;
|
||||
b8 ctrl;
|
||||
b8 shift;
|
||||
b8 alt;
|
||||
b8 meta;
|
||||
f64 dpr;
|
||||
v2f64_t window_size;
|
||||
v2f64_t mouse_pos;
|
||||
};
|
||||
|
||||
typedef struct app_event_list_t app_event_list_t;
|
||||
struct app_event_list_t {
|
||||
app_event_t* first;
|
||||
app_event_t* last;
|
||||
i32 len;
|
||||
typedef struct app_frame_t app_frame_t;
|
||||
struct app_frame_t {
|
||||
app_frame_t* next;
|
||||
f64 delta;
|
||||
f32 dpr;
|
||||
v2f32_t window_size;
|
||||
v2f32_t mouse_pos;
|
||||
i32 event_count;
|
||||
app_event_t* first_event;
|
||||
app_event_t* last_event;
|
||||
f64 update;
|
||||
};
|
||||
@@ -166,32 +166,28 @@ void meta_app(ma_arena_t *arena) {
|
||||
app_mouse_button_t mouse_button; // @mouse_down @mouse_up
|
||||
app_key_t key; // @key_down @key_up
|
||||
s8_t text; // @text
|
||||
|
||||
// @todo: test why xyz in js????????????
|
||||
v3f64_t mouse_wheel_delta; // @mouse_wheel
|
||||
v3f32_t mouse_wheel_delta; // @mouse_wheel
|
||||
v2f32_t mouse_pos; // @mouse_move
|
||||
|
||||
// always present data
|
||||
b8 ctrl;
|
||||
b8 shift;
|
||||
b8 alt;
|
||||
b8 meta;
|
||||
|
||||
f64 dpr;
|
||||
v2f64_t window_size;
|
||||
v2f64_t mouse_pos;
|
||||
};
|
||||
|
||||
struct app_event_list_t {
|
||||
app_event_t *first; @dont_serialize
|
||||
app_event_t *last;
|
||||
i32 len;
|
||||
};
|
||||
struct app_frame_t {
|
||||
app_frame_t *next;
|
||||
f64 delta;
|
||||
f32 dpr;
|
||||
v2f32_t window_size;
|
||||
v2f32_t mouse_pos;
|
||||
|
||||
// struct app_frame_t {
|
||||
// f64 delta;
|
||||
// f64 time;
|
||||
// app_event_list_t event_list;
|
||||
// };
|
||||
i32 event_count;
|
||||
app_event_t *first_event;
|
||||
app_event_t *last_event;
|
||||
|
||||
f64 update;
|
||||
};
|
||||
));
|
||||
|
||||
sb8_serial_ast_to_code(h, decls);
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#pragma comment(lib, "winmm.lib")
|
||||
|
||||
fn void app_init(void);
|
||||
fn b32 app_update(app_event_list_t events);
|
||||
fn b32 app_update(app_frame_t *frame);
|
||||
|
||||
gb b32 w32_good_scheduling;
|
||||
gb WNDCLASSW w32_wc;
|
||||
@@ -16,27 +16,27 @@ gb HWND w32_window_handle;
|
||||
gb HDC w32_dc;
|
||||
gb b32 w32_quit_app;
|
||||
|
||||
fn v2f64_t w32_get_window_size(HWND window) {
|
||||
fn v2f32_t w32_get_window_size(HWND window) {
|
||||
RECT window_rect;
|
||||
GetClientRect(window, &window_rect);
|
||||
f64 x = window_rect.right - window_rect.left;
|
||||
f64 y = window_rect.bottom - window_rect.top;
|
||||
return (v2f64_t){x, y};
|
||||
f32 x = (f32)(window_rect.right - window_rect.left);
|
||||
f32 y = (f32)(window_rect.bottom - window_rect.top);
|
||||
return (v2f32_t){x, y};
|
||||
}
|
||||
|
||||
fn v2f64_t w32_get_mouse_pos(HWND window) {
|
||||
fn v2f32_t w32_get_mouse_pos(HWND window) {
|
||||
POINT p;
|
||||
GetCursorPos(&p);
|
||||
ScreenToClient(window, &p);
|
||||
return (v2f64_t){p.x, p.y};
|
||||
return (v2f32_t){(f32)p.x, (f32)p.y};
|
||||
}
|
||||
|
||||
fn f64 w32_get_dpr(HWND window_handle) {
|
||||
fn f32 w32_get_dpr(HWND window_handle) {
|
||||
UINT dpi = GetDpiForWindow(window_handle);
|
||||
if (dpi == 0) {
|
||||
return 1.0;
|
||||
}
|
||||
f64 result = (f64)dpi / 96.0;
|
||||
f32 result = (f32)dpi / 96.0f;
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -57,22 +57,19 @@ fn f64 w32_seconds_now(void) {
|
||||
///////////////////////////////
|
||||
// event processing
|
||||
|
||||
gb app_event_list_t w32_event_list;
|
||||
gb app_frame_t *w32_frame;
|
||||
gb ma_arena_t *w32_event_arena;
|
||||
|
||||
fn void w32_push_event(app_event_t event) {
|
||||
fn void w32_push_event(app_frame_t *frame, app_event_t event) {
|
||||
app_event_t *ev = ma_push_type(w32_event_arena, app_event_t);
|
||||
*ev = event;
|
||||
|
||||
if (GetKeyState(VK_CONTROL) & 0x8000) ev->ctrl = true;
|
||||
if (GetKeyState(VK_SHIFT) & 0x8000) ev->shift = true;
|
||||
if (GetKeyState(VK_MENU) & 0x8000) ev->alt = true;
|
||||
ev->window_size = w32_get_window_size(w32_window_handle);
|
||||
ev->mouse_pos = w32_get_mouse_pos(w32_window_handle);
|
||||
ev->dpr = w32_get_dpr(w32_window_handle);
|
||||
|
||||
SLLQ_APPEND(w32_event_list.first, w32_event_list.last, ev);
|
||||
w32_event_list.len += 1;
|
||||
SLLQ_APPEND(frame->first_event, frame->last_event, ev);
|
||||
frame->event_count += 1;
|
||||
}
|
||||
|
||||
fn void w32_push_wm_char_event(WPARAM wparam) {
|
||||
@@ -88,7 +85,7 @@ fn void w32_push_wm_char_event(WPARAM wparam) {
|
||||
}
|
||||
}
|
||||
|
||||
w32_push_event((app_event_t){
|
||||
w32_push_event(w32_frame, (app_event_t){
|
||||
.kind = app_event_kind_text,
|
||||
.text = string,
|
||||
});
|
||||
@@ -101,13 +98,13 @@ fn LRESULT CALLBACK w32_window_proc(HWND wnd, UINT msg, WPARAM wparam, LPARAM lp
|
||||
} break;
|
||||
|
||||
case WM_KEYDOWN: {
|
||||
w32_push_event((app_event_t){
|
||||
w32_push_event(w32_frame, (app_event_t){
|
||||
.kind = app_event_kind_key_down,
|
||||
.key = w32_map_wparam_to_app_key(wparam)
|
||||
});
|
||||
} break;
|
||||
case WM_KEYUP: {
|
||||
w32_push_event((app_event_t){
|
||||
w32_push_event(w32_frame, (app_event_t){
|
||||
.kind = app_event_kind_key_up,
|
||||
.key = w32_map_wparam_to_app_key(wparam)
|
||||
});
|
||||
@@ -116,14 +113,14 @@ fn LRESULT CALLBACK w32_window_proc(HWND wnd, UINT msg, WPARAM wparam, LPARAM lp
|
||||
|
||||
case WM_LBUTTONDOWN: {
|
||||
SetCapture(wnd);
|
||||
w32_push_event((app_event_t){
|
||||
w32_push_event(w32_frame, (app_event_t){
|
||||
.kind = app_event_kind_mouse_down,
|
||||
.mouse_button = app_mouse_button_left,
|
||||
});
|
||||
} break;
|
||||
case WM_LBUTTONUP: {
|
||||
ReleaseCapture();
|
||||
w32_push_event((app_event_t){
|
||||
w32_push_event(w32_frame, (app_event_t){
|
||||
.kind = app_event_kind_mouse_up,
|
||||
.mouse_button = app_mouse_button_left,
|
||||
});
|
||||
@@ -131,13 +128,13 @@ fn LRESULT CALLBACK w32_window_proc(HWND wnd, UINT msg, WPARAM wparam, LPARAM lp
|
||||
|
||||
|
||||
case WM_RBUTTONDOWN: {
|
||||
w32_push_event((app_event_t){
|
||||
w32_push_event(w32_frame, (app_event_t){
|
||||
.kind = app_event_kind_mouse_down,
|
||||
.mouse_button = app_mouse_button_right,
|
||||
});
|
||||
} break;
|
||||
case WM_RBUTTONUP: {
|
||||
w32_push_event((app_event_t){
|
||||
w32_push_event(w32_frame, (app_event_t){
|
||||
.kind = app_event_kind_mouse_up,
|
||||
.mouse_button = app_mouse_button_right,
|
||||
});
|
||||
@@ -146,14 +143,14 @@ fn LRESULT CALLBACK w32_window_proc(HWND wnd, UINT msg, WPARAM wparam, LPARAM lp
|
||||
|
||||
case WM_MBUTTONDOWN: {
|
||||
SetCapture(wnd);
|
||||
w32_push_event((app_event_t){
|
||||
w32_push_event(w32_frame, (app_event_t){
|
||||
.kind = app_event_kind_mouse_down,
|
||||
.mouse_button = app_mouse_button_middle,
|
||||
});
|
||||
} break;
|
||||
case WM_MBUTTONUP: {
|
||||
ReleaseCapture();
|
||||
w32_push_event((app_event_t){
|
||||
w32_push_event(w32_frame, (app_event_t){
|
||||
.kind = app_event_kind_mouse_up,
|
||||
.mouse_button = app_mouse_button_middle,
|
||||
});
|
||||
@@ -161,9 +158,9 @@ fn LRESULT CALLBACK w32_window_proc(HWND wnd, UINT msg, WPARAM wparam, LPARAM lp
|
||||
|
||||
case WM_MOUSEWHEEL: {
|
||||
int zDelta = GET_WHEEL_DELTA_WPARAM(wparam);
|
||||
w32_push_event((app_event_t){
|
||||
w32_push_event(w32_frame, (app_event_t){
|
||||
.kind = app_event_kind_mouse_wheel,
|
||||
.mouse_wheel_delta = (v3f64_t){0, zDelta},
|
||||
.mouse_wheel_delta = (v3f32_t){0, (f32)zDelta},
|
||||
});
|
||||
} break;
|
||||
|
||||
@@ -179,15 +176,15 @@ fn LRESULT CALLBACK w32_window_proc(HWND wnd, UINT msg, WPARAM wparam, LPARAM lp
|
||||
return 0;
|
||||
}
|
||||
|
||||
app_event_list_t w32_get_events(ma_arena_t *arena, b32 wait, b32 *waited) {
|
||||
b32 w32_get_events(ma_arena_t *arena, app_frame_t *frame, b32 wait) {
|
||||
w32_event_arena = arena;
|
||||
zero_struct(&w32_event_list);
|
||||
*waited = false;
|
||||
w32_frame = frame;
|
||||
b32 waited = false;
|
||||
|
||||
MSG msg;
|
||||
if (wait) {
|
||||
if (PeekMessageW(&msg, NULL, 0, 0, PM_NOREMOVE) == 0) {
|
||||
*waited = true;
|
||||
waited = true;
|
||||
}
|
||||
|
||||
GetMessageW(&msg, NULL, 0, 0);
|
||||
@@ -200,7 +197,7 @@ app_event_list_t w32_get_events(ma_arena_t *arena, b32 wait, b32 *waited) {
|
||||
DispatchMessageW(&msg);
|
||||
}
|
||||
|
||||
return w32_event_list;
|
||||
return waited;
|
||||
}
|
||||
|
||||
///////////////////////////////
|
||||
@@ -212,11 +209,11 @@ struct w32_canvas_t {
|
||||
HWND window_handle;
|
||||
HBITMAP dib;
|
||||
HDC dib_dc;
|
||||
v2f64_t window_size;
|
||||
v2f32_t window_size;
|
||||
};
|
||||
|
||||
w32_canvas_t w32_create_canvas(HWND window_handle) {
|
||||
v2f64_t window_size = w32_get_window_size(window_handle);
|
||||
v2f32_t window_size = w32_get_window_size(window_handle);
|
||||
w32_canvas_t result = {.window_handle = window_handle, .window_size = window_size};
|
||||
HDC window_dc = GetDC(window_handle);
|
||||
BITMAPINFO bminfo = {0};
|
||||
@@ -252,7 +249,7 @@ void w32_present_canvas(w32_canvas_t *canvas) {
|
||||
}
|
||||
|
||||
void w32_try_resizing_canvas(w32_canvas_t *canvas, HWND window_handle) {
|
||||
v2f64_t window_size = w32_get_window_size(window_handle);
|
||||
v2f32_t window_size = w32_get_window_size(window_handle);
|
||||
if (canvas->window_size.x != window_size.x || canvas->window_size.y != window_size.y) {
|
||||
w32_destroy_canvas(canvas);
|
||||
*canvas = w32_create_canvas(window_handle);
|
||||
@@ -354,32 +351,36 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int n
|
||||
|
||||
f64 time_frame_start = w32_seconds_now();
|
||||
f64 time_delta = 1.0 / refresh_rate;
|
||||
f64 time_total = 0.0;
|
||||
f64 time_update = 0.0;
|
||||
b32 wait_for_events = false;
|
||||
|
||||
u64 consecutive_missed_frames = 0;
|
||||
u64 missed_frames = 0;
|
||||
u64 frame = 0;
|
||||
u64 frame_counter = 0;
|
||||
for (;;) {
|
||||
b32 waited_for_events = false;
|
||||
app_event_list_t event_list = w32_get_events(tcx.temp, wait_for_events, &waited_for_events);
|
||||
if (waited_for_events) {
|
||||
// delta_time = 0.0001
|
||||
app_frame_t frame = {0};
|
||||
frame.window_size = w32_get_window_size(w32_window_handle);
|
||||
frame.dpr = w32_get_dpr(w32_window_handle);
|
||||
frame.mouse_pos = w32_get_mouse_pos(w32_window_handle);
|
||||
frame.delta = time_delta;
|
||||
frame.update = time_update;
|
||||
|
||||
b32 waited = w32_get_events(tcx.temp, &frame, wait_for_events);
|
||||
if (waited) {
|
||||
frame.delta = 0.00001;
|
||||
}
|
||||
|
||||
for (app_event_t *ev = event_list.first; ev; ev = ev->next) {
|
||||
for (app_event_t *ev = frame.first_event; ev; ev = ev->next) {
|
||||
if (ev->kind == app_event_kind_key_down && ev->key == app_key_escape) {
|
||||
ExitProcess(0);
|
||||
}
|
||||
}
|
||||
|
||||
if (event_list.len == 0) {
|
||||
w32_push_event((app_event_t){.kind = app_event_kind_update});
|
||||
event_list = w32_event_list;
|
||||
if (frame.event_count == 0) {
|
||||
w32_push_event(&frame, (app_event_t){.kind = app_event_kind_update});
|
||||
}
|
||||
|
||||
b32 animating = app_update(event_list);
|
||||
b32 animating = app_update(&frame);
|
||||
wait_for_events = !animating;
|
||||
|
||||
SwapBuffers(w32_dc);
|
||||
@@ -417,13 +418,12 @@ int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int n
|
||||
consecutive_missed_frames += 1;
|
||||
}
|
||||
|
||||
frame += 1;
|
||||
frame_counter += 1;
|
||||
|
||||
// @todo:
|
||||
// should this be time_delta or time_update ????
|
||||
// probably want the locked frame rate and total should reflect that, so choosing
|
||||
// time_delta seems the correct choice but not really sure what is correct.
|
||||
time_total += time_delta;
|
||||
time_frame_start = w32_seconds_now();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user