src/window.c

changeset 288
8796f03aac26
parent 287
359eaf2a8bd2
--- 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++) {

mercurial