X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=laserbrain_demo;a=blobdiff_plain;f=src%2Fscene.cc;h=f116150396068e9a841a025dadbd13a3610a095b;hp=0d23930839bdba9b3e91604a526436cc43aee183;hb=d4d7f73284783d2a50d71014789d196bef7d0e0e;hpb=e8fe498f52ff5f3c87759623ce94726af0ef2890 diff --git a/src/scene.cc b/src/scene.cc index 0d23930..f116150 100644 --- a/src/scene.cc +++ b/src/scene.cc @@ -61,6 +61,56 @@ static void destroy_node_tree(SceneNode *n) // Scene::load defined in sceneload.cc +bool Scene::merge(Scene *scn) +{ + if(texset != scn->texset) { + // TODO handle this properly + error_log("for now only able to merge scenes using the same texture set\n"); + return false; + } + + if(walk_mesh) { + if(scn->walk_mesh) { + walk_mesh->append(*scn->walk_mesh); + delete scn->walk_mesh; + scn->walk_mesh = 0; + } + } else { + walk_mesh = scn->walk_mesh; + scn->walk_mesh = 0; + } + + int nmeshes = scn->meshes.size(); + for(int i=0; imeshes[i]); + } + scn->meshes.clear(); + + int nobj = scn->objects.size(); + for(int i=0; iobjects[i]); + } + scn->objects.clear(); + + if(nodes) { + int nchildren = scn->nodes ? scn->nodes->get_num_children() : 0; + for(int i=0; inodes->get_child(i); + scn->nodes->remove_child(n); + nodes->add_child(n); + } + if(scn->nodes && scn->nodes->get_num_objects() > 0) { + warning_log("merging with scene which has objects in its root node. these objects will not be merged!\n"); + } + delete scn->nodes; + } else { + nodes = scn->nodes; + } + scn->nodes = 0; + + return true; +} + void Scene::add_object(Object *obj) { objects.push_back(obj);