--- a/src/window.c Sun Nov 16 22:00:13 2025 +0100 +++ b/src/window.c Sun Nov 16 23:02:11 2025 +0100 @@ -69,7 +69,7 @@ snprintf(ui_scene_name, sizeof(ui_scene_name), "Window %u UI", index); asc_camera_init(&window->ui_camera, .type = ASC_CAMERA_ORTHO, .ortho.rect = ASC_RECT(0, 0, window->dimensions.width, window->dimensions.height), - .projection_update_func = asc_camera_ortho_update_size); + .viewport_update_func = asc_camera_ortho_update_size); asc_scene_init(&window->ui, ui_scene_name, &window->ui_camera); asc_dprintf("Window %u initialized at index %u", window->id, index); asc_context.active_window = index; @@ -121,6 +121,21 @@ memset(window, 0, sizeof(AscWindow)); } +static void asc_window_update_viewport(AscCamera *camera, asc_vec2u window_size) { + if (camera->viewport_update_func == NULL) { + // this assumes the viewport was initialized with zeros! + camera->viewport.size = window_size; + } else { + camera->viewport_update_func(camera, window_size); + } +} + +static void asc_window_update_camera(AscCamera *camera) { + if (camera->update_func != NULL) { + camera->update_func(camera); + } +} + void asc_window_sync(unsigned int index) { if (index > ASC_MAX_WINDOWS) { asc_error("Index for syncing window out of bounds (%u/%u).", index, ASC_MAX_WINDOWS); @@ -146,12 +161,20 @@ if (window->resized) { for (unsigned int i = 0; i < ASC_MAX_SCENES; i++) { if (asc_scene_active(&window->scenes[i])) { - asc_camera_update_viewport(window->scenes[i].camera, window->dimensions); + asc_window_update_viewport(window->scenes[i].camera, window->dimensions); } } - asc_camera_update_viewport(window->ui.camera, window->dimensions); + asc_window_update_viewport(window->ui.camera, window->dimensions); } + // Execute camera updates + for (unsigned int i = 0; i < ASC_MAX_SCENES; i++) { + if (asc_scene_active(&window->scenes[i])) { + asc_window_update_camera(window->scenes[i].camera); + } + } + asc_window_update_camera(window->ui.camera); + // Execute all behaviors // TODO: this can eventually be parallelized for (unsigned int i = 0; i < ASC_MAX_SCENES; i++) {