| 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 |