src/scene.c

changeset 287
359eaf2a8bd2
parent 286
26a41832c81d
--- a/src/scene.c	Sun Nov 16 21:12:20 2025 +0100
+++ b/src/scene.c	Sun Nov 16 22:00:13 2025 +0100
@@ -28,6 +28,7 @@
 #include "ascension/error.h"
 #include "ascension/context.h"
 #include "ascension/scene.h"
+#include "ascension/camera.h"
 #include "ascension/behavior.h"
 #include "ascension/shader.h"
 #include "ascension/util.h"
@@ -39,9 +40,9 @@
 
 #include <assert.h>
 
-void asc_scene_init_(AscScene *scene, const char *name, struct asc_camera_init_args args) {
+void asc_scene_init(AscScene *scene, const char *name, AscCamera *camera) {
     assert(scene->root == NULL);
-    asc_camera_init_(&scene->camera, args);
+    scene->camera = camera;
     scene->root = asc_scene_node_empty();
     for (unsigned i = 0 ; i < ASC_RENDER_GROUP_COUNT ; i++) {
         scene->internal.render_groups[i] = cxArrayListCreateSimple(CX_STORE_POINTERS, 32);
@@ -116,10 +117,13 @@
 }
 
 void asc_scene_draw(AscScene *scene) {
-    if (scene->root == NULL) return;
+    if (!asc_scene_active(scene)) return;
 
     // when the viewport is zero, exit immediately
-    if (scene->camera.viewport.size.width == 0 || scene->camera.viewport.size.height == 0) {
+    const AscCamera *camera = asc_scene_camera(scene);
+    if (camera == NULL ||
+            camera->viewport.size.width == 0 ||
+            camera->viewport.size.height == 0) {
         return;
     }
 
@@ -181,20 +185,20 @@
 
     // set the viewport
     glViewport(
-            scene->camera.viewport.pos.x,
-            scene->camera.viewport.pos.y,
-            scene->camera.viewport.size.width,
-            scene->camera.viewport.size.height
+            camera->viewport.pos.x,
+            camera->viewport.pos.y,
+            camera->viewport.size.width,
+            camera->viewport.size.height
     );
-    if (scene->camera.viewport_clear) {
+    if (camera->viewport_clear) {
         glScissor(
-            scene->camera.viewport.pos.x,
-            scene->camera.viewport.pos.y,
-            scene->camera.viewport.size.width,
-            scene->camera.viewport.size.height
+            camera->viewport.pos.x,
+            camera->viewport.pos.y,
+            camera->viewport.size.width,
+            camera->viewport.size.height
         );
         glEnable(GL_SCISSOR_TEST);
-        const asc_color col = scene->camera.clear_color;
+        const asc_color col = camera->clear_color;
         glClearColor(col.red, col.green, col.blue, col.alpha);
         glClear(GL_COLOR_BUFFER_BIT);
         glDisable(GL_SCISSOR_TEST);

mercurial