| 43 void asc_scene_init(AscScene *scene, const char *name, AscCamera *camera) { |
43 void asc_scene_init(AscScene *scene, const char *name, AscCamera *camera) { |
| 44 assert(scene->root == NULL); |
44 assert(scene->root == NULL); |
| 45 scene->camera = camera; |
45 scene->camera = camera; |
| 46 scene->root = asc_scene_node_empty(); |
46 scene->root = asc_scene_node_empty(); |
| 47 for (unsigned i = 0 ; i < ASC_RENDER_GROUP_COUNT ; i++) { |
47 for (unsigned i = 0 ; i < ASC_RENDER_GROUP_COUNT ; i++) { |
| 48 scene->internal.render_groups[i] = cxArrayListCreateSimple(CX_STORE_POINTERS, 32); |
48 scene->internal.render_groups[i] = cxArrayListCreate(NULL, CX_STORE_POINTERS, 32); |
| 49 } |
49 } |
| 50 if (name == NULL) { |
50 if (name == NULL) { |
| 51 scene->name = asc_util_gen_name("scene"); |
51 scene->name = asc_util_gen_name("scene"); |
| 52 } else { |
52 } else { |
| 53 scene->name.ptr = strdup(name); |
53 scene->name.ptr = strdup(name); |
| 67 asc_dprintf("Destroyed scene %"CX_PRIstr, CX_SFMT(scene->name)); |
67 asc_dprintf("Destroyed scene %"CX_PRIstr, CX_SFMT(scene->name)); |
| 68 cx_strfree(&scene->name); |
68 cx_strfree(&scene->name); |
| 69 } |
69 } |
| 70 |
70 |
| 71 void asc_scene_execute_behaviors(AscScene *scene) { |
71 void asc_scene_execute_behaviors(AscScene *scene) { |
| 72 CxTreeVisitor iter = cx_tree_visitor(scene->root, |
72 CxTreeIterator iter = cx_tree_visitor(scene->root, |
| 73 offsetof(AscSceneNode, children), |
73 offsetof(AscSceneNode, children), |
| 74 offsetof(AscSceneNode, next) |
74 offsetof(AscSceneNode, next) |
| 75 ); |
75 ); |
| 76 cx_foreach(AscSceneNode*, node, iter) { |
76 cx_foreach(AscSceneNode*, node, iter) { |
| 77 CxIterator behavior_iter = cxListIterator(node->behaviors); |
77 CxIterator behavior_iter = cxListIterator(node->behaviors); |
| 132 for (unsigned i = 0 ; i < ASC_RENDER_GROUP_COUNT ; i++) { |
132 for (unsigned i = 0 ; i < ASC_RENDER_GROUP_COUNT ; i++) { |
| 133 cxListClear(render_group[i]); |
133 cxListClear(render_group[i]); |
| 134 } |
134 } |
| 135 |
135 |
| 136 // update the scene graph and add nodes to their render groups |
136 // update the scene graph and add nodes to their render groups |
| 137 CxTreeVisitor iter = cx_tree_visitor(scene->root, |
137 CxTreeIterator iter = cx_tree_visitor(scene->root, |
| 138 offsetof(AscSceneNode, children), |
138 offsetof(AscSceneNode, children), |
| 139 offsetof(AscSceneNode, next) |
139 offsetof(AscSceneNode, next) |
| 140 ); |
140 ); |
| 141 cx_foreach(AscSceneNode*, node, iter) { |
141 cx_foreach(AscSceneNode*, node, iter) { |
| 142 // skip hidden nodes (and all their children) |
142 // skip hidden nodes (and all their children) |
| 143 if (asc_scene_node_is_hidden(node)) { |
143 if (asc_scene_node_is_hidden(node)) { |
| 144 cxTreeVisitorContinue(iter); |
144 cxTreeIteratorContinue(iter); |
| 145 } |
145 } |
| 146 |
146 |
| 147 // TODO: implement culling |
147 // TODO: implement culling |
| 148 |
148 |
| 149 // clear information flags from the previous frame |
149 // clear information flags from the previous frame |
| 217 render_group[ASC_RENDER_GROUP_2D_BLEND] |
217 render_group[ASC_RENDER_GROUP_2D_BLEND] |
| 218 ); |
218 ); |
| 219 } |
219 } |
| 220 |
220 |
| 221 void asc_scene_add_node(AscScene *scene, AscSceneNode *node) { |
221 void asc_scene_add_node(AscScene *scene, AscSceneNode *node) { |
| 222 asc_scene_node_link(scene->root, node); |
222 asc_scene_node_add(scene->root, node); |
| 223 } |
223 } |
| 224 |
224 |
| 225 void asc_scene_remove_node(AscSceneNode *node) { |
225 void asc_scene_remove_node(AscSceneNode *node) { |
| 226 asc_scene_node_unlink(node); |
226 asc_scene_node_remove(node); |
| 227 } |
227 } |