src/scene.c

changeset 287
359eaf2a8bd2
parent 286
26a41832c81d
equal deleted inserted replaced
286:26a41832c81d 287:359eaf2a8bd2
26 */ 26 */
27 27
28 #include "ascension/error.h" 28 #include "ascension/error.h"
29 #include "ascension/context.h" 29 #include "ascension/context.h"
30 #include "ascension/scene.h" 30 #include "ascension/scene.h"
31 #include "ascension/camera.h"
31 #include "ascension/behavior.h" 32 #include "ascension/behavior.h"
32 #include "ascension/shader.h" 33 #include "ascension/shader.h"
33 #include "ascension/util.h" 34 #include "ascension/util.h"
34 35
35 #include <cx/tree.h> 36 #include <cx/tree.h>
37 38
38 #include <GL/glew.h> 39 #include <GL/glew.h>
39 40
40 #include <assert.h> 41 #include <assert.h>
41 42
42 void asc_scene_init_(AscScene *scene, const char *name, struct asc_camera_init_args args) { 43 void asc_scene_init(AscScene *scene, const char *name, AscCamera *camera) {
43 assert(scene->root == NULL); 44 assert(scene->root == NULL);
44 asc_camera_init_(&scene->camera, args); 45 scene->camera = camera;
45 scene->root = asc_scene_node_empty(); 46 scene->root = asc_scene_node_empty();
46 for (unsigned i = 0 ; i < ASC_RENDER_GROUP_COUNT ; i++) { 47 for (unsigned i = 0 ; i < ASC_RENDER_GROUP_COUNT ; i++) {
47 scene->internal.render_groups[i] = cxArrayListCreateSimple(CX_STORE_POINTERS, 32); 48 scene->internal.render_groups[i] = cxArrayListCreateSimple(CX_STORE_POINTERS, 32);
48 } 49 }
49 if (name == NULL) { 50 if (name == NULL) {
114 } 115 }
115 } 116 }
116 } 117 }
117 118
118 void asc_scene_draw(AscScene *scene) { 119 void asc_scene_draw(AscScene *scene) {
119 if (scene->root == NULL) return; 120 if (!asc_scene_active(scene)) return;
120 121
121 // when the viewport is zero, exit immediately 122 // when the viewport is zero, exit immediately
122 if (scene->camera.viewport.size.width == 0 || scene->camera.viewport.size.height == 0) { 123 const AscCamera *camera = asc_scene_camera(scene);
124 if (camera == NULL ||
125 camera->viewport.size.width == 0 ||
126 camera->viewport.size.height == 0) {
123 return; 127 return;
124 } 128 }
125 129
126 // reset render groups 130 // reset render groups
127 CxList **render_group = scene->internal.render_groups; 131 CxList **render_group = scene->internal.render_groups;
179 } 183 }
180 } 184 }
181 185
182 // set the viewport 186 // set the viewport
183 glViewport( 187 glViewport(
184 scene->camera.viewport.pos.x, 188 camera->viewport.pos.x,
185 scene->camera.viewport.pos.y, 189 camera->viewport.pos.y,
186 scene->camera.viewport.size.width, 190 camera->viewport.size.width,
187 scene->camera.viewport.size.height 191 camera->viewport.size.height
188 ); 192 );
189 if (scene->camera.viewport_clear) { 193 if (camera->viewport_clear) {
190 glScissor( 194 glScissor(
191 scene->camera.viewport.pos.x, 195 camera->viewport.pos.x,
192 scene->camera.viewport.pos.y, 196 camera->viewport.pos.y,
193 scene->camera.viewport.size.width, 197 camera->viewport.size.width,
194 scene->camera.viewport.size.height 198 camera->viewport.size.height
195 ); 199 );
196 glEnable(GL_SCISSOR_TEST); 200 glEnable(GL_SCISSOR_TEST);
197 const asc_color col = scene->camera.clear_color; 201 const asc_color col = camera->clear_color;
198 glClearColor(col.red, col.green, col.blue, col.alpha); 202 glClearColor(col.red, col.green, col.blue, col.alpha);
199 glClear(GL_COLOR_BUFFER_BIT); 203 glClear(GL_COLOR_BUFFER_BIT);
200 glDisable(GL_SCISSOR_TEST); 204 glDisable(GL_SCISSOR_TEST);
201 } 205 }
202 206

mercurial