src/scene.c

changeset 290
2eb3813562e7
parent 287
359eaf2a8bd2
equal deleted inserted replaced
289:237cb9038109 290:2eb3813562e7
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 }

mercurial